项目分4个部分:服务器端程序(eclipse)、服务器为Apache tomcat、axis下wsdd方式发布程序、调用对方(营销系统)服务器接口的客户端。
项目所需工具以及环境:
WindowsXP
JDK1.5.0 //java_home = C:/Program Files/Java/jdk1.5.0
Oracle8i
Eclipse3.2 + MyEclipse5.5
Axis1.4 //axis_home = D:/axis/axis-1_4
Tomcat5.5 //tomcat_home = D:/tomcat5.5
(一)服务器端程序
eclipse下建工程 V_Gsystem 工程下建4个包
cn.spume.server 服务器接口包
此包下有1个类 是描述服务器接口类 HningWQ.java
cn.spume.logic 逻辑处理包
此包下有4个类 分别为 QryCustomerAmeterData.java MsgCustomerInfo.java
MsgCustomerAmeterInfo.java MsgCBQInfo.java
cn.spume.tools 工具包
此包下有1个类 是序列化和反序列化数据类 DataParse.java
cn.spume.test 测试包
此包下有4个类 分别为 TestQryCustomerAmeterData.java TestMsgCustomerInfo.java
TestMsgCustomerAmeterInfo.java TestMsgCBQInfo.java
cn.spume.server 服务器接口包 HningWQ.java
package cn.spume.server; import cn.spume.logic.MsgCBQInfo; import cn.spume.logic.MsgCustomerAmeterInfo; import cn.spume.logic.MsgCustomerInfo; import cn.spume.logic.QryCustomerAmeterData; public class HningWQ { public static int msgCustomerInfo(String parameter){ String clientData = parameter; int result; result = new MsgCustomerInfo().xmlParse(clientData); return result; } public static int msgCustomerAmeterInfo(String parameter){ String clientData = parameter; int result; result = new MsgCustomerAmeterInfo().xmlParse(clientData); return result; } public static String msgCBQInfo(String parameter){ String clientData = parameter; String result =""; result = new MsgCBQInfo().xmlParse(clientData); return result; } public static String qryCustomerAmeterData(String parameter){ String clientData = parameter; String result =""; result = new QryCustomerAmeterData().xmlParse(clientData); return result; } }
cn.spume.logic 逻辑处理包 QryCustomerAmeterData.java
package cn.spume.logic; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.xml.sax.InputSource; import cn.spume.tool.DataParse; public class QryCustomerAmeterData{ public String xmlParse (String xmlDoc){ //测试服务器接口是否被调用and客户端参数是什么 //把客户端参数保存到d:/VG/取抄表数据Catch.txt String st = "服务器正在被访问>>>>"; File write = new File("d://VG//取抄表数据Catch.txt"); try { BufferedWriter bw = new BufferedWriter(new FileWriter(write)); bw.write(st + "客户端参数是: " + xmlDoc); bw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //用JDOM对数据进行处理 StringReader read = new StringReader(xmlDoc); InputSource source = new InputSource(read); SAXBuilder sb = new SAXBuilder(); String backData = ""; String [] s = new String [100]; String [] ss = new String [100]; try { Document doc = sb.build(source); Element root = doc.getRootElement(); List node = root.getChildren(); Element et = null; for(int i = 0; i < node.size(); i++){ et = (Element)node.get(i); s [i] = et.getName(); ss [i] = et.getText(); } backData = this.qryData(s,ss); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return backData; } //操作数据库 private String qryData (String [] s, String [] ss){ int flag1 = 0; //取得实际数组元素长度所需要的变量 int flag2 = 0; //取得得到实际数组元素长度所需要的变量 int r = 0; //取得实际数组元素长度所需要的变量 String[] t = s; String[] tt = ss; String sumData [] = new String [10000]; String resultString = ""; String cbqm = ""; String hh = ""; String fdts = ""; String rq = ""; for(int i = 0; i < t.length; i++){ if("HH".equals(t[i])){ hh = tt[i]; break; } } for(int i = 0; i < t.length; i++){ if("CBQM".equals(t[i])){ cbqm = tt[i]; break; } } for(int i = 0; i < t.length; i++){ if("RQ".equals(t[i])){ rq = tt[i]; break; } } for(int i = 0; i < t.length; i++){ if("FDTS".equals(t[i])){ fdts = tt[i]; break; } } String query1 = "select hh,jh,data01,data02,dtime from gatherdata a,ammeter b where " + "a.aid(+)=b.aid and to_char(dtime+" + fdts + ",'YYYY-MM-DD')>='" + rq + "' and to_char(dtime,'YYYY-MM-DD')<='" + rq + "' and to_char(dtime,'HH24')='00' and data01>=0 and " + "hh=" + hh + " order by dtime desc"; String query2 = "select hh,jh,data01,data02,dtime from gatherdata a,ammeter b where " + "a.aid(+)=b.aid and to_char(dtime+" + fdts + ",'YYYY-MM-DD')>='" + rq + "' and to_char(dtime,'YYYY-MM-DD')<='" + rq + "' and to_char(dtime,'HH24')='00' and data01>=0 and " + "cbqm=" + cbqm + " order by a.aid,dtime desc"; Connection conn = null; //连接字符串格式: "jdbc:数据库驱动名称:连接模式:@数据库服务器ip:端口号:数据库SID" String url = "jdbc:oracle:thin:@XXXXXX"; //此处信息隐藏 String username = "XXXXXX"; String password = "XXXXXX"; try { //创建oracle数据库驱动实例 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //获得与数据库的连接 conn = DriverManager.getConnection(url,username,password); //创建执行语句对象 Statement stmt = conn.createStatement(); ResultSet rs1 = null; ResultSet rs2 = null; //执行sql语句,返回结果集 if((hh == null && cbqm == null) || ("".equals(hh) && "".equals(cbqm))) { return "-1"; } if(!"".equals(hh)){ rs1 = stmt.executeQuery(query1); while(rs1.next()){ for(int j = 1; j <= rs1.getMetaData().getColumnCount(); j++){ sumData [j-1] = rs1.getString(j); r++; flag1 = r; //得到数组长度 } } rs1.close(); }else{ rs2 = stmt.executeQuery(query2); int count = 0; while(rs2.next()){ for(int j = 1; j <= rs2.getMetaData().getColumnCount(); j++){ sumData [count] = rs2.getString(j); count++; r++; //得到实际数组元素长度 flag2 = r; } } rs2.close(); } stmt.close(); conn.close(); //分2种情况重新赋值 String [] sumData1 = new String [flag1]; String [] sumData2 = new String [flag2]; for(int i = 0; i < flag1; i++){ sumData1[i] = sumData[i]; } for(int i = 0; i < flag2; i++){ sumData2[i] = sumData[i]; } //判断之后再调用序列化方法 DataParse dp = new DataParse(); if(rs1 == null){ resultString = dp.StoX2(sumData2); }else{ resultString = dp.StoX1(sumData1); } } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //把服务器端返回结果保存到d:/VG/取抄表数据Return.txt File write = new File("d://VG//取抄表数据Return.txt"); try { BufferedWriter bw = new BufferedWriter(new FileWriter(write)); bw.write(resultString + "服务器访问完毕!"); bw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return resultString; } }
cn.spume.logic 逻辑处理包 MsgCustomerInfo.java
package cn.spume.logic; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.xml.sax.InputSource; public class MsgCustomerInfo { //解析营销系统通知参数数据,如果参数正确调用saveData方法 public int xmlParse (String xmlDoc){ //把客户端参数保存到d:/VG/客户档案变更Catch.txt String st = "服务器已被访问>>>>"; File write = new File("d://VG//客户档案变更Catch.txt"); try { BufferedWriter bw = new BufferedWriter(new FileWriter(write)); bw.write(st + "客户端参数是: " + xmlDoc); bw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //用JDOM对数据进行处理 StringReader read = new StringReader(xmlDoc); InputSource source = new InputSource(read); SAXBuilder sb = new SAXBuilder(); boolean flag = false; boolean flag2 = false; String [] s = new String [10]; String [] ss = new String [10]; try { Document doc = sb.build(source); Element root = doc.getRootElement(); List node = root.getChildren(); Element et = null; for(int i = 0; i < node.size(); i++){ et = (Element)node.get(i); s [i] = et.getName(); ss [i] = et.getText(); } for(int j = 0; j < s.length; j++){ if("DW".equals(s[j]) || "HH".equals(s[j]) || "SQLB".equals(s[j])){ flag = true; break; }else{ flag = false; } } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if(flag){ flag2 = this.saveData(s,ss); if(flag2){ return 0; }else{ return -1; } }else{ return -1; } } //把营销系统的有用数据保存到数据库表msgcustomer private boolean saveData (String [] s, String [] ss){ String dw = ""; String hh = ""; String sqlb = ""; boolean flag = false; for(int i = 0; i < s.length; i++){ if("DW".equals(s[i])){ dw = ss[i]; continue; } if("HH".equals(s[i])){ hh = ss[i]; continue; } if("SQLB".equals(s[i])){ sqlb = ss[i]; continue; } } Date date = new Date(); java.sql.Date date2 = new java.sql.Date(date.getTime()); String dataInsert = "insert into msgcustomer (dw,hh,msgtime,bgnr,sqlb,dealt) values (" + "'" + dw + "'" + "," + "'" + hh + "'" + "," + "to_date(" + "'" + date2 + "', 'YYYY-MM-DD'" + ")" + "," + "0" + "," + "'" + sqlb + "'" + "," + "1)" ; Connection conn = null; //连接字符串格式: "jdbc:数据库驱动名称:连接模式:@数据库服务器ip:端口号:数据库SID" String url = "jdbc:oracle:thin:@XXXXXX"; //此处信息隐藏 String username = "XXXXXX"; String password = "XXXXXX"; try { //创建oracle数据库驱动实例 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); //获得与数据库的连接 conn = DriverManager.getConnection(url,username,password); //创建执行语句对象 Statement stmt = conn.createStatement(); //执行sql语句,返回结果集 int rs = stmt.executeUpdate(dataInsert); if(rs <= 0){ flag = false; }else{ flag = true; } stmt.close(); conn.commit(); conn.close(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //把服务器端返回结果保存到d://VG//客户档案变更Return.txt File write = new File("d:/VG/客户档案变更Return.txt"); try { BufferedWriter bw = new BufferedWriter(new FileWriter(write)); bw.write(flag + ">>>>" + "服务器访问完毕!!"); bw.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return flag; } }cn.spume.logic 逻辑处理包 MsgCustomerAmeterInfo.java MsgCBQInfo.java略......cn.spume.tools 工具包 DataParse.javapackage cn.spume.tools; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.XMLOutputter; public class DataParse { //序列化数据方法(qryCustomerAmeterData接口当根据HH查询的时候) public String StoX1(String [] dbData){ String [] ziduan = new String []{"HH","ZDJH","JH","SJBH","SJZ","SJCBRQ"}; String [] zhi = new String []{dbData[0],"",dbData[1],"106,104",dbData[2] + "," + dbData[3],dbData[4].substring(0,19)}; Element rootElement = new Element("DBSET"); rootElement.setAttribute(new Attribute("RESULT",1 + "")); Document myDocument = new Document(rootElement); Element [] element = new Element[6]; for(int i = 0; i < 6; i++){ element[i] = new Element(ziduan[i]); element[i].addContent(zhi[i]); rootElement.addContent(element[i]); } XMLOutputter xmlOut = new XMLOutputter(" ",true); String outString = xmlOut.outputString(myDocument); return outString; } //序列化数据方法(qryCustomerAmeterData接口当根据CBQM查询的时候) public String StoX2(String [] dbData){ String [] ziduan = new String []{"HH","ZDJH","JH","SJBH","SJZ","SJCBRQ"}; String [][] zhi = new String [dbData.length/5][6]; for(int i = 0; i < dbData.length/5; i++){ zhi[i][0] = dbData[i * 5]; zhi[i][1] = ""; zhi[i][2] = dbData[i * 5 + 1]; zhi[i][3] = "106,104"; zhi[i][4] = dbData[i * 5 + 2] + "," + dbData[i * 5 + 3]; zhi[i][5] = dbData[i * 5 + 4].substring(0,19); } Element rootElement = new Element("DBSET"); Element rowElement [] = new Element[dbData.length/5]; rootElement.setAttribute(new Attribute("RESULT",dbData.length/5 + "")); Document myDocument = new Document(rootElement); Element [][] element = new Element[dbData.length/5][6]; for(int i = 0; i < dbData.length/5; i++){ rowElement[i] = new Element("ROW"); } for(int i = 0; i < dbData.length/5 ; i++){ for(int j = 0; j < 6; j++){ element[i][j] = new Element(ziduan[j]); element[i][j].addContent(zhi[i][j]); rowElement[i].addContent(element[i][j]); } rootElement.addContent(rowElement[i]); } XMLOutputter xmlOut = new XMLOutputter(" ",true); String outString = xmlOut.outputString(myDocument); return outString; } }
cn.spume.test 测试包 略......