近日,在做项目的时候,有用到JAVA调用制卡机的一个功能。在之前的博客中,有提到过,参照api文档和相关的SDK,已经成功的在本地代码中调用到了制卡机,实现制卡的打印功能。but,后来测试才发现,原来本地代码调用成功了,但是相关的加载制卡机的USB驱动都是在本地代码中执行的,而不是在浏览器端执行的。额,知道这意味着什么吗?一个字描述,“ 坑 ”,真是坑死人不偿命呀。
当时我以为功能开发完了,就直接把代码SVN提交了上去,但是在部署到正式服务器的时候,却怎么也调不了,一直提示“ 制卡失败 ”。当时以后失败的原因是dll 文件加载失败,因为正式服务器上的中间件是WebSphere,而本地的中间件是Tomcat,Tomcat加载制卡机的DLL文件的时候,只需要将其放置在bin目录下就可以了,但是WebSphere之前没用过,我尝试着将dll文件放到了WebSphere下的所有bin目录文件夹下,但是还是不成功。后来公司同事提醒说,加载制卡机的代码都在Action后台执行的,会不会制卡机必须放在服务器端才可以调用成功。当时听到这,第一感觉就是TMD的坑了,当然也怪自己之前光顾着实现功能去了,没有全局思考考虑,这也是我的失误。
有了这个思路,就开始考虑,怎么在本地调用制卡功能,起初想了很多办法,比如什么把Action的代码给放到JSP中,打开JSP执行,后来发现JSP其实也是在后台变成Servlet中执行的,所以这个方案失败。后来又想过更改官方的JAR包代码,但是后来测试还是不行。尝试了很多办法,最后的话,想出了一个简单粗暴的方案,那就是服务器端调用客户端的代码。也就是说把制卡的代码打包到Tomcat中,然后Tomcat放到本地,需要用制卡的功能的时候,点击系统的制卡菜单,系统会用AJAX或者WebService远程调用相关的服务,执行代码,最后调用本地的Tomcat启动制卡机。当然了,这个方法总感觉比较LOW,但是没办法呀,时间有限,工作中还有其他的任务,加之客户也催的很紧,情急之下,只能先应急了。

在这个过程中,之前已经把JAVA调用制卡的功能都写好了,现在只需要在系统的相关JSP页面中,当用户访问这个JSP页面的时候,获取其真实的IP地址,然后根据其IP地址,访问其提供的制卡服务地址就OK了。在这里的话,就涉及到AJAX远程跨域访问的问题,最终找到的跨域解决方案是使用JSONP的方案:(这个githup上的一个开源项目,如要使用,先下载 https://github.com/webmodules/jsonp)
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%@ page import="com.wonders.yksx.salvation.model.*"%>
<%@ page import="com.wonders.yksx.common.model.*"%>
<%@ page import="com.wonders.yksx.common.util.*"%>
<%@ page isELIgnored="false"%>
<%@ page import="java.io.IOException"%>
<%@ page import="java.io.PrintWriter"%>
<%@ page import="java.net.Inet4Address"%>
<%@ page import="java.net.InetAddress"%>
<%@ page import="java.net.NetworkInterface"%>
<%@ page import="java.util.Enumeration"%>
<%@ page import="javax.servlet.ServletException"%>
<%@ page import="javax.servlet.http.HttpServletRequest"%>
<%@ page import="javax.servlet.http.HttpServletResponse"%>
<jsp:useBean id="pageStyle" class="java.lang.String" scope="session" />
<%
ListOfDicModel listOfHospitalModel = (ListOfDicModel) session
.getAttribute("listOfHospitalModel");
ListOfOtherInfoModel listOfOtherInfoModel = (ListOfOtherInfoModel) request
.getAttribute("listOfOtherInfoModel");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<link href="css/<%=pageStyle%>" rel="stylesheet" type="text/css">
<script src="http://apps.bdimg.com/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
/**
*打印采用8*6inch的纸张设置(203.2*152.4mm)
*/
var PRINT_UNIT = "mm";
var PRINT_WINDOW_WIDTH = 203.2;
var PRINT_WINDOW_HEIGHT = 152.4;
var PRINT_WORD_TOP = 82.9;
var PRINT_WORD_HEIGHT = 4.5;
var PRINT_WORD_INTERVAL = 5;
var PRINT_WORD_LEFT = 65.2;
var PRINT_OFFSET = 1;
var IPAddress;
//获取IP地址
getIPAddr();
function getNewWindowContent(i)
{
var str = "<html>";
str += "<head><title>医疗帮困就医记录册封面打印</title></head>";
str += "<body font-size='"+PRINT_WORD_HEIGHT+PRINT_UNIT+"' style='filter:flipv()fliph();'>";
str += "<div id='box' background-color=blue style='width:"+PRINT_WINDOW_WIDTH+PRINT_UNIT+";height:"+PRINT_WINDOW_HEIGHT+PRINT_UNIT+"'></div>";
//str += "<form action=