概述
最近在做项目的过程中,做过这样一个功能,通过soap协议跨平台获取外部系统文件柜的信息,并将所需要的字段解析出来传输至前台页面上展示成列表的形式。说实话,做了这么多的soap协议项目,做过编写PC服务端webservice服务并将服务提供给外部系统移动端APP调用、当然也给自己做的app调用。做过三方接口相互调用桥接的服务,中间穿插中间件总线服务,将网闸打通,实现内外网服务互通;做过客户端调用服务端接口实现数据传输的服务。诸如此类的项目都是基于webservice服务发布及调用。当然也做过http服务的发布,http服务的发布则涉及到struts配置文件将发布的服务映射到发布服务的地址上,通过外部系统调用的方式,把json数据传输给外部系统。现在这个项目中则与之前的大不一样,虽然看上去是接收服务作为客户端将数据解析。但这个对于数据的实时性要求比较高,且打通自己前台跟后台数据的传输,这其实也是一种http的服务。以下是代码部分:
package com.strongit.oa.filebox;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import net.sf.json.JSONArray;
import org.apache.axis.Constants;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.struts2.config.ParentPackage;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import org.apache.struts2.dispatcher.ServletActionRedirectResult;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Autowired;
import com.strongit.oa.common.user.IUserService;
import com.strongit.oa.common.user.model.Organization;
import com.strongmvc.webapp.action.BaseActionSupport;
/**
* @desc 获取取件箱信息action类
* @author lanyq
*
*/
@SuppressWarnings("unchecked")
@ParentPackage("default")
@Results( { @Result(name = BaseActionSupport.RELOAD, value = "filebox.action", type = ServletActionRedirectResult.class) })
public class FileBoxAction extends BaseActionSupport{
private IUserService userService;
@Autowired
public void setUserService(IUserService userService) {
this.userService = userService;
}
public IUserService getUserService() {
return userService;
}
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* @desc 获取待取件列表
*
*/
public String getToDoFileBoxList() throws Exception{
List<String> lst=new ArrayList<String>();
JSONArray json=new JSONArray();
//获取当前用户所在机构单位的名称
String curOrg="";
List<Organization> list=userService.getCurrentUserOrgAndDept();
if(list!=null&&list.size()>0){
curOrg=list.get(0).toString();
}
//创建XML文档对象
Document xmlDoc = DocumentHelper.createDocument();
xmlDoc.setXMLEncoding("utf-8");
//创建根元素节点
Element rootElement = xmlDoc.addElement("GetFileBoxs");
//创建根元素节点下的子节点,设置节点值
Element element1 = rootElement.addElement("DeptList");
Element element2 = element1.addElement("DeptName");
element2.addText(curOrg);
String xml = xmlDoc.toString();
String url="http://130.14.5.3/efiles/webservice/webserver.asmx";
Service service = new Service();
Call call = null;
try {
call = (Call)service.createCall();
call.setSOAPActionURI("http://www.Htky.com.cn/");
}catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
call.setTargetEndpointAddress(new URL("http://130.14.5.3/efiles/webservice/webserver.asmx"));
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
call.setOperationName(new QName("http://www.Htky.com.cn/","GetFileBoxs"));
//call.setOperationName("GetFileBoxs");
call.setSOAPActionURI("http://www.Htky.com.cn/GetFileBoxs");
call.addParameter(new QName("http://www.Htky.com.cn/","_Xml"), XMLType.SOAP_VECTOR, ParameterMode.IN);
call.setUseSOAPAction(true);
//call.setReturnType(XMLType.SOAP_VECTOR);
call.setEncodingStyle(Constants.NS_URI_XMLSOAP);
Object[] params = new Object[]{xmlDoc.asXML()};
String resultStr = "";
try {
resultStr = (String)call.invoke(params);
// resultStr = (String)call.invoke("http://www.Htky.com.cn/GetFileBoxs", "GetFileBoxs", params);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(resultStr);
if(resultStr!=null){
try {
Document document=DocumentHelper.parseText(resultStr);
List<?> fileboxIdList=document.selectNodes("//*[name()='ns0:FileBoxId'");//投箱ID号
List<?> fileCodeList=document.selectNodes("//*[name()='ns0:FileCode'");//条码编号
List<?> numberIdList=document.selectNodes("//*[name()='ns0:NumberId'");//文件份号
List<?> comeDeptList=document.selectNodes("//*[name()='ns0:ComeDept'");//发文单位
List<?> comeNoList=document.selectNodes("//*[name()='ns0:ComeNo'");//发文文号
List<?> outerFileNoList= document.selectNodes("//*[name()='ns0:OuterFileNo'");//发文文号
List<?> fileNameList=document.selectNodes("//*[name()='ns0:FileName'");//文种或刊名
List<?> fileTitleList=document.selectNodes("//*[name()='ns0:FileTitle'");//文件标题
List<?> fileSecretList=document.selectNodes("//*[name()='ns0:FileSecret'");//密级
List<?> fileEmergList=document.selectNodes("//*[name()='ns0:FileEmerg'");//紧急程度
List<?> remarkList=document.selectNodes("//*[name()='ns0:Remark'");//备注
List<?> sendTimeList=document.selectNodes("//*[name()='ns0:SendTime'");//投箱时间
List<?> alreadyCountList=document.selectNodes("//*[name()='ns0:AlreadyCount'");//份数
for(int a=0;a<fileboxIdList.size();a++){
Element fileboxIdElement=(Element) fileboxIdList.get(a);
lst.add(fileboxIdElement.getText());
Element fileTitleElement=(Element) fileTitleList.get(a);
lst.add(fileTitleElement.getText());
Element fileCodeElement=(Element) fileCodeList.get(a);
lst.add(fileCodeElement.getText());
Element comeDeptElement=(Element) comeDeptList.get(a);
lst.add(comeDeptElement.getText());
Element fileEmergElement=(Element) fileEmergList.get(a);
lst.add(fileEmergElement.getText());
Element alreadyCountElement=(Element) alreadyCountList.get(a);
lst.add(alreadyCountElement.getText());
Element fileSecretElement=(Element) fileSecretList.get(a);
lst.add(fileSecretElement.getText());
Element sendTimeElement=(Element) sendTimeList.get(a);
lst.add(sendTimeElement.getText());
Element remarkElement=(Element) remarkList.get(a);
lst.add(remarkElement.getText());
}
json=JSONArray.fromObject(lst);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return json.toString();
}
以下是调用成功返回的数据:
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="http://www.Htky.com.cn/">
<NewDataSet>
<Table>
<FileBoxId>33790</FileBoxId>
<FileCode>002010216001433</FileCode>
<NumId>000</NumId>
<ComeDept>省政府办公厅</ComeDept>
<ComeNo>2016 68号</ComeNo>
<OuterFileNo></OuterFileNo>
<FileName></FileName>
<FileTitle>政府办公厅关于印发债务管理办法的通知</FileTitle>
<FileSecret>无</FileSecret>
<FileEmerg>无</FileEmerg>
<Remark></Remark>
<SendTime>2016-10-27 00;00:00</SendTime>
<AlreadyCount>1</AlreadyCount>
</Table>
<Table>
<FileBoxId>33757</FileBoxId>
<FileCode>002010216001432</FileCode>
<NumId>000</NumId>
<ComeDept>省政府办公厅</ComeDept>
<ComeNo>2016 86号</ComeNo>
<OuterFileNo></OuterFileNo>
<FileName></FileName>
<FileTitle>省政府关于表彰参加里约奥运会和残奥会有功人员及单位的决定</FileTitle>
<FileSecret>无</FileSecret>
<FileEmerg>无</FileEmerg>
<Remark></Remark>
<SendTime>2016-10-28 00;00:00</SendTime>
<AlreadyCount>1</AlreadyCount>
</Table>
..............
</string>
拿到这些xml数据,我要一个个字段解析,将我需要的字段展示在前台,不需要的我就不解析。注意:在解析的过程中大家要注意这点,众所周知,dom4j解析数据用的比较多,其中sax解析是在这里面用的比较多的,saxreader解析IO流,解析xml一直是主流的方式解析数据。其中,解析的时候需要构造文档对象,然后把所需要的节点数据解析出来,如上代码所示。
说实话,后台做完解析之后,我有个地方很困惑,json是用list好呢?还是用map的方式好呢?还是将所有解析出来的的属性都通过一个bean的方式封装一次转化成json再传到前台来解析呢?这个问题想了好久。到最后决定使用json list去解析,为什么这样说,因为不管怎么样,bean也好,map也好都是要转成前台能解析的,其实map也可以解析。本人使用list的方式,根据构造的数据去解析字段。
前台通过解析json数据:
以下是我在网上找的一个事例:由于事情没做完,我只能做这么一个设想了,大家可以发挥自己的聪明才智,多评论才是哈。
前台解析的时候bean用easyui-datagrid控件去解析里面的属性。
<script type="text/javascript">
$(function () { //
debugger;
$.ajax({
type: "get",
url: "../App_Code/MaterialInfo.cs",
dataType: "json",
success: function (Json) {
alert(Json);
var obj = eval(Json);
$("#maintable tbody tr").remove();
for (var i = 0; i < obj.length; i++) {
var row = $("#content").clone();
row.find("#ID").text(obj[i].ID);
row.find("#MaterialCode").text(obj[i].MaterialCode); row.find("#MaterialName").text(obj[i].MaterialName);
row.find("#Size").text(obj[i].Size);
row.find("#Unit").text(obj[i].Unit);
row.find("#Type").text(obj[i].Type);
row.find("#Mangent").text(obj[i].Mangent);
row.find("#text").text(obj[i].text);
row.appendTo("#maintable");
}
},
error: function () {
alert("加载失败");
}
})
})
</script>
HTML:
<table id="maintable" class="table" width="100%" layoutH="138">
<thead>
<tr>
<th width="80"></th>
<th width="80">ID</th>
<th width="120">物料编码</th>
<th width="120">物料名称</th>
<th width="100">规格</th>
<th width="150">单位</th>
<th width="80" align="center">类型</th>
<th width="80">生产部门</th>
<th width="80">备注</th>
</tr>
</thead>
<tbody>
<tr id="content" target="sid_user" rel="1">
<td width="80"></td>
<td id="ID" width="80">2</td>
<td id="MaterialCode" width="120">2</td>
<td id="MaterialName" width="120">2</td>
<td id="Size" width="100">2</td>
<td id="Unit" width="150">2</td>
<td id="Type" width="80" align="center">2</td>
<td id="Mangent" width="80">2</td>
<td id="text" width="80">2</td>
</tr>
</tbody>
</table>
使用list去解析如下:
<s:iterator var="ent" value="list">
<s:if test="%{#statu.odd}">
<font color="red"><s:property value="#ent" />
</font>
</s:if>
<s:else>
<s:property value="#ent" />
</s:else>
</s:iterator>
最后
以上就是狂野红酒为你收集整理的跨平台获取外部系统的数据解析成json并传输到前台展示成列表的全部内容,希望文章能够帮你解决跨平台获取外部系统的数据解析成json并传输到前台展示成列表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复