您的位置:首页 > Web前端 > JavaScript

跨平台获取外部系统的数据解析成json并传输到前台展示成列表

2016-11-11 17:23 841 查看
最近在做项目的过程中,做过这样一个功能,通过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>

  &l
bc86
t;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>

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐