最近公司要求为系统做个离线版,在此之前,我已经提交辞职申请准备离开公司了。临走之际先把工作做好,这是对自己的工作负责。所以,也算是在这告诫大家,就算提交辞职报告了,也尽量把该做的工作做好,不要去说爱做不做之类的,大家好聚好散。好了,接下来进入正题。
1、使用工具:Tomcat、JRE、迷你SQL2000
近期公司想弄一个离线版系统,以便客户在断网状态下仍可使用系统某些功能。
首先,打包好离线版项目、Tomcat、JRE和迷你SQL2000等,然后创建自解压文件,添加一键安装注释,最后双击发布运行。
1、使用工具:Tomcat、JRE、迷你SQL2000
2、离线版制作步骤
[2.1]将Tomcat和JRE运行环境放到离线版文件夹下,修改初始化.bat文件注册Java环境变量
@echo off cls color 2f echo. echo ********************************************** echo. echo 一键安装 Java SE Development Kit 到 C 盘 echo. echo 安装请按任意键,退出直接关闭窗口 echo. echo ********************************************** echo. pause set myjavapath=C:\BJCAROOT\jre1.8.0_161 set nowpath=%~dp0 IF EXIST %myjavapath%\bin\java.exe ( echo. 自动配置java环境变量— echo. echo 在 C 盘发现java程序,注册环境变量请按任意键 echo. echo 退出直接关闭窗口 echo. pause goto SETENV ) echo. echo 正在安装jdk,请不要执行其他操作 echo. ::echo 请稍等......这个时间大约需要二、三分钟 echo. ::start /WAIT %nowpath%jdk-7u79-windows-i586.exe /s /norestart /v /qn INSTALLDIR=C:\Java\jdk echo 程序安装完毕,正在注册环境变量 echo. goto SETENV :SETENV setx JAVA_HOME %myjavapath% setx CLASSPATH .;%myjavapath%\lib setx PATH %myjavapath%\bin echo. echo JDK环境变量设置成功 echo. echo 安装完毕,JDK版本为: echo. call %myjavapath%\bin\java.exe -version echo. if %errorlevel% == 0 ( echo 祝贺您成功安装了Java SE Development Kit ! echo. goto END ) echo 貌似安装不成功,您得自己想办法了,请联系QQ客服12121212! echo. goto END :END pause这里注意绿色高亮的部分,由于是自解压模式,所以我们要把JRE解压到我们自定义的文件夹下,用于环境变量设置。这里jre的版本是在电脑安装解压后拷贝到离线版根目录下的。
[2.2]修改Tomcat bin目录下的startup.bat文件,添加迷你SQL2000随着Tomcat启动
SET JAVA_HOME=C:\BJCAROOT\jre1.8.0_161 SET CATALINA_HOME=C:\BJCAROOT\XXXweb\Tomcat 8.0 @echo off setlocal rem Guess CATALINA_HOME if not defined set "CURRENT_DIR=%cd%" set b=%cd% start /min "" "%b%\SQL2000\Sql2k.exe" if not "%CATALINA_HOME%" == "" goto gotHome set "CATALINA_HOME=%CURRENT_DIR%" if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome cd .. set "CATALINA_HOME=%cd%" cd "%CURRENT_DIR%" :gotHome if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome echo The CATALINA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program goto end :okHome注意绿色高亮部分,在startup.bat文件开头设置好Tomcat的java环境变量和Tomcat的环境变量,防止Tom启动时运行用户电脑的Tomcat环境。迷你SQL2000的文件夹放在bin根目录下。
[2.3]创建自解压文件
前面两句是解压到的文件夹,后面是发送Tomcat启动bat文件和系统URL到桌面
URL代码:
[DEFAULT] BASEURL=http://localhost:8080/xxx/ [{000214A0-0000-0000-C000-000000000046}] Prop3=19,2 [InternetShortcut] URL=http://localhost:8080/xxx/ IDList=
3、离线端代码
[3.1]离线端service代码//ServiceImpl代码: //服务器接口地址 public static final String httpURL = "http://localhost:8090/offLine.do?"; //核心代码: //调用传参代码 result = doUpload(httpURL + "uploadNID",array); //返回json字符串 /** * @details 发送请求到服务器并返回结果 * @param url 请求地址 * @param array 发送参数 JSONArray类型 * @author src * @Date 2018-03-02 */ public String doUpload(String url , JSONArray array)throws IOException{ HttpURLConnection httpURLConnection = null; OutputStream out = null; //写 InputStream in = null; //读 int responseCode = 0; //远程主机响应的HTTP状态码 String result=""; try{ URL sendUrl = new URL(url); httpURLConnection = (HttpURLConnection)sendUrl.openConnection(); //post方式请求 httpURLConnection.setRequestMethod("POST"); //设置头部信息 httpURLConnection.setRequestProperty("headerdata", "ceshiyongde"); //一定要设置 Content-Type 要不然服务端接收不到参数 httpURLConnection.setRequestProperty("Content-Type", "application/Json; charset=UTF-8"); //指示应用程序要将数据写入URL连接,其值默认为false(是否传参) httpURLConnection.setDoOutput(true); httpURLConnection.setUseCaches(false); httpURLConnection.setConnectTimeout(30000); //30秒连接超时 httpURLConnection.setReadTimeout(30000); //30秒读取超时 //传入参数 out = httpURLConnection.getOutputStream(); out.write(array.toString().getBytes()); out.flush(); //清空缓冲区,发送数据 out.close(); responseCode = httpURLConnection.getResponseCode(); //获取请求的资源 BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(),"UTF-8")); result =br.readLine(); }catch(Exception e) { HashMap map = new HashMap(); map.put("status","500"); map.put("detail","抱歉,服务器内部错误!"); result = JSONObject.fromObject(map).toString(); e.printStackTrace(); } return result; }[3.2]离线端js代码
/** * @details 上传问卷 * @author src * @Date 2018-03-02 */ function upLoadQue(){ //[1] 获取要上传的问卷id var options = $('#dg').datagrid('getSelections'); var ids = ""; for(var i in options){ if(i==options.length-1){ ids += options[i].id+","; }else{ ids += options[i].id; } } // alert(JSON.stringify(ids)); //[2]将id数组传至后台 $.ajax({ url:"offLineController.do?uploadNID", type:"POST", data:{ ids:ids }, success: function (data) { //[3]当返回状态码为200时,删除离线版本地问卷报表数据 } }); }
4、服务器端代码
[4.1]控制器代码
/** * @details 接收离线版客户端传递的数据 * @author src * @Date 2018-03-03 */ @RequestMapping(params = "getOffLine") public JSONArray getOffLine(HttpServletRequest request) throws Exception { request.setCharacterEncoding("UTF-8"); BufferedReader br=new BufferedReader(new InputStreamReader(request.getInputStream(), "GB2312")); String line=""; String res=""; while(null!=(line=br.readLine())){ res+=line; } JSONArray array=JSONArray.fromObject(res); return array; } /** * @details 返回状态到离线版客户端 * @param result 带状态码的结果 * @author src * @Date 2018-03-03 */ @RequestMapping(params = "responseToOffLine") public void responseToOffLine(HttpServletResponse response ,String result ) throws IOException { response.setCharacterEncoding("utf-8"); response.getWriter().append(result); }[4.2]service层代码
/** * @details 队列上报问卷 * @author src * @Date 2018-03-02 */ public String uploadNID(HttpServletRequest request , JSONArray array){ HashMap<String,Object> map = new HashMap<>(); try{ for(int i=0;i<array.size();i++){ JSONObject list = array.getJSONObject(i); List<Map<String,Object>> list1 = (List<Map<String,Object>>)list.get("renyxxList"); List<Map<String,Object>> list2 = (List<Map<String,Object>>)list.get("renqkqkList"); if(list.size()>0){ System.out.println("现住址是:" + list1.get(0).get("xianzz")); } if(list2.size()>0) { System.out.println("所属队列:" + list2.get(0).get("suosdl")); } } map.put("status",ResultCodeUtil.CODE_404); map.put("detail",ResultCodeUtil.CODE_404_DETAIL); }catch (Exception e){ map.put("status",ResultCodeUtil.CODE_500); map.put("detail",ResultCodeUtil.CODE_500_DETAIL); e.printStackTrace(); } String jsonStr = JSONObject.fromObject(map).toString();//输出json字符串形式 return jsonStr; }[4.3]状态码工具类
/** * @author src * @details json返回状态码工具类 * @date 2018-03-03 */ public class ResultCodeUtil { public static final String CODE_200 = "200"; public static final String CODE_404 = "404"; public static final String CODE_500 = "500"; public static final String CODE_504 = "504"; public static final String CODE_505 = "505"; public static final String CODE_200_DETAIL = "恭喜您,请求成功!"; public static final String CODE_404_DETAIL = "很抱歉,请求资源找不到了!"; public static final String CODE_500_DETAIL = "很抱歉,服务器运行错误!"; public static final String CODE_504_DETAIL = "很抱歉,数据返回为null!"; public static final String CODE_505_DETAIL = "很抱歉,请求超时!"; }
5、调用结果
最后发布的时候,把离线版编译后的war包打包到离线版的Tomcat下,用户自解压的项目运行。下面送上自解压目录结构图
整体结构:
web目录
Tomcat和迷你SQL2000
好了,到这里离线版和服务器端就搭建好了,以后再需要到就回来复习复习。