JAVA处理含有DataSet的web services
本篇文章将讲述如何通过axis取得.net发布的Web services,并处理返回含有DataSet的处理结果,展现在页面上。
涉及到的知识有:
AXIS
SAXBuilder
xml
步骤如下:
1)、生成client stub文件。
必备条件axis开源包。JDK
A)、比如AXIS包放在你的C盘,则需要在环境变量当中设定的东东有:
AXIS_HOME=C:\AXIS
AXIS_CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;%AXIS_HOME%\lib\activation.jar;%AXIS_HOME%\lib\mail.jar
然后加入到PATH当中:.;% AXIS_CLASSPATH% (加入就可以了)
注意:很多人因为以上的配置不对,导致对AXIS学习的信心下降,其实,仔细一点就会发现在CLASSPATH当中找一找有没有版本区别。也就是每一个JAR包是不是真的存在就可以了。(哈哈,我曾为之付出了两天的时间娞!)
B)、进入DOS模式,转到D盘,执行如下代码:
java org.apache.axis.wsdl.WSDL2Java -p <名称,最好是包名> http://10.2.10.80/FocService/FocService.asmx?wsdl,看到了吧。对.net发布为asmx的文件后面加入?wsdl就可以解决了。
然后就会在这个<名称,最好是包名>下就会有一堆的JAVA文件,一般的话会有:
xxxx.java
xxxxLocator.java
xxxxSoap.java
xxxxSoapStub.java
其次还有以下划线_xxxx????.java的文件都是序列化的对象,也就是返回的结果对应元素。可以暂时不理它。下面就以作者生成的示例做一个引用webservice的操作。作者得到的文件如下:
SearchFlightInfo.java
SearchFlightInfoLocator.java
SearchFlightInfoSoap.java
SearchFlightInfoSoapStub.java
-----------------------------------------------------------------------
_GetFlightInfoResponse_GetFlightInfoResult.java
_GetstrFlightInfo.java
_GetstrFlightInfoResponse.java
C)、引用方法:
基本思想是从得到web services后取得他的主体信息(返回的数据信息),然后生成XML文件,然后再把XML文件转换成一个JAVA序列化对象就可以了。
如下是序列化对象的代码。
try {/**
* 取得前台的参数 1、航班日期 2、航班号
*/
String planDate = request.getParameter("day");
String flyNo = request.getParameter("hanbanno");
/**
* 按照最新版本制作,最新位置在:http://10.2.10.62/OPCFltWS/SearchFlightInfo.asmx
*/
SearchFlightInfo service = new SearchFlightInfoLocator();
SearchFlightInfoSoap client = service.getSearchFlightInfoSoap();
_GetFlightInfoResponse_GetFlightInfoResult FOCInfo=client.getFlightInfo(planDate, flyNo);
String ErrorInfo = client.getstrFlightInfo(planDate, flyNo);//错误警告信息
MessageElement[] FOCElement = FOCInfo.get_any();//取得xml信息
List FOCElementHead = FOCElement[0].getChildren();//消息头,DataSet对象
List FOCElementBody = FOCElement[1].getChildren();//消息体信息,DataSet对象
if (FOCElementBody.size() <= 0){
//无返回记录,则无输出
return mapping.findForward("NoRecord");
}
String nn = FOCElementBody.get(0).toString();//消息体的字符串形式
String path = request.getRealPath("");
CommonTools.saveXMLString(nn,path+"\\FOC\\heweiya1.xml");//保存为XML形式,其中FOC目录做为固定目录
/**
* 使用DOM4J来解析这个序列化的对象
*/
//String path = request.getRealPath("");
Vector OutFoc = CommonTools.LoadXML(path + "\\FOC\\heweiya1.xml");
request.setAttribute("OutFoc", OutFoc);
if (request.getParameter("as") != null) {
return mapping.findForward("Foc1");
}
return mapping.findForward("Foc");
} catch (Exception e) {
/**
* 服务有异常,或者服务没有启动!
*/
request.setAttribute("UserMsg", "Public.FocError");
return mapping.findForward("Fail");
}
package com.travelsky.kams.front.foc.webservices;public class FocBean implements java.io.Serializable{
private String acown;//航班1
private String fltid;//航班2
private String datop;//查询日期
private String std;
private String sta;
private String etd;//
private String eta;//
private String atd;
private String toff;//滑出时间
private String tdwn;//滑到位时间
private String ata;//飞行状态
private String actyp;//机型
private String depstn;//起始机场
private String arrstn;//到达机场
private String plnid;//机号
/** default constructor */
public FocBean() {
}
public String getAcown() {
return this.acown;
}
public void setAcown(String acown) {
this.acown = acown;
}
public String getDatop() {
return this.datop;
}
public void setDatop(String datop) {
this.datop = datop;
}
public String getFltid() {
return this.fltid;
}
public void setFltid(String fltid) {
this.fltid = fltid;
}
public String getStd() {
return this.std;
}
public void setStd(String std) {
this.std = std;
}
public String getSta() {
return this.sta;
}
public void setSta(String sta) {
this.sta = sta;
}
public String getEtd() {
return this.etd;
}
public void setEtd(String etd) {
this.etd = etd;
}
public String getEta() {
return this.eta;
}
public void setEta(String eta) {
this.eta = eta;
}
public String getAtd() {
return this.atd;
}
public void setAtd(String atd) {
this.atd = atd;
}
public String getToff() {
return this.toff;
}
public void setToff(String toff) {
this.toff = toff;
}
public String getTdwn() {
return this.tdwn;
}
public void setTdwn(String tdwn) {
this.tdwn = tdwn;
}
public String getAta() {
return this.ata;
}
public void setAta(String ata) {
this.ata = ata;
}
public String getActyp() {
return this.actyp;
}
public void setActyp(String actyp) {
this.actyp = actyp;
}
public String getDepstn() {
return this.depstn;
}
public void setDepstn(String depstn) {
this.depstn = depstn;
}
public String getArrstn() {
return this.arrstn;
}
public void setArrstn(String arrstn) {
this.arrstn = arrstn;
}
public String getPlnid() {
return this.plnid;
}
public void setPlnid(String plnid) {
this.plnid = plnid;
}
}
如下是解析XML文件变换成一个序列化的对象的JAVA代码:(其中Vecto就相关于安全的LIST了)
/*** 读取XML文件所有信息
*/
public static Vector LoadXML(String path) throws Exception {
Vector xmlVector = null;
FileInputStream fi = null;
try {
fi = new FileInputStream(path);
xmlVector = new Vector();
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(fi);
Element root = doc.getRootElement(); // 得到根元素
List focs = root.getChildren(); // 得到根元素所有子元素的集合
Element foc = null;
FocBean xml = null;
/**
* 从1开始,因为0为错误警告信息
*/
for (int i = 1; i < focs.size(); i++) {
xml = new FocBean();
foc = (Element) focs.get(i); // 得到第一本书元素
/* xml.setAta(foc.getChild("ATA").getText());
xml.setAtd(foc.getChild("ATD").getText());
xml.setEta(foc.getChild("ETA").getText());
xml.setEtd(foc.getChild("ETD").getText());
xml.setFltid(foc.getChild("FLTID").getText());
xml.setSta(foc.getChild("STA").getText());
xml.setStd(foc.getChild("STD").getText());
xml.setTdwn(foc.getChild("TDWN").getText());
xml.setToff(foc.getChild("TOFF").getText());*/
/**
* 如下是最新版本的取得实体对象的方法
* modify by heweiya 2006-12-14
*/
xml.setAta(foc.getChild("ATA").getText());
xml.setAtd(foc.getChild("ATD").getText());
xml.setEta(foc.getChild("ETA").getText());
xml.setEtd(foc.getChild("ETD").getText());
xml.setFltid(foc.getChild("FLTID").getText());
xml.setSta(foc.getChild("STA").getText());
xml.setStd(foc.getChild("STD").getText());
xml.setTdwn(foc.getChild("TDWN").getText());
xml.setToff(foc.getChild("TOFF").getText());
xml.setAcown(foc.getChild("ACOWN").getText());
xml.setActyp(foc.getChild("ACTYP").getText());
xml.setArrstn(foc.getChild("ARRSTN").getText());
xml.setDatop(foc.getChild("DATOP").getText());
xml.setDepstn(foc.getChild("DEPSTN").getText());
xml.setPlnid(foc.getChild("Plnid").getText());
xmlVector.add(xml);
}
} catch (Exception e) {
System.err.println(e + "error");
} finally {
try {
fi.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return xmlVector;
}
还有一个代码如下:
// 把String 保存为文件public static void saveXMLString(String XMLString, String fileName)
throws IOException {
File file = new File(fileName);
if (file.exists()) {
file.delete();
}
file.createNewFile();
if (file.canWrite()) {
FileWriter fileOut = new FileWriter(file);
fileOut.write(XMLString);
fileOut.close();
}
}
以上所述是作者调试通过。使用STRUTS做为前台,然后输出就可以了。本文章只讨论技术问题,示例当中的代码
只做为研究学习使用,并无它意。
转:http://www.iteye.com/topic/39025
以上是 JAVA处理含有DataSet的web services 的全部内容, 来源链接: utcz.com/z/392144.html