最近在做项目的过程中,做过这样一个功能,通过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并传输到前台展示成列表相关推荐

  1. python获取当前时间的函数_java/python中获取当前系统时间,并与字符串相互转换格式,或者转化成秒数,天数等整数...

    java转换成秒数 Date类有一个getTime()可以换回秒数,例如: public classDateToSecond {public static voidmain(String[] args ...

  2. 如何获取表格中的数据并以json格式存储?

    在开发的过程中,不一定所有数据都是单条存储的,有的时候也会出现将多条数据进行 整合,以另外一种形式存储数据库. 这篇文章介绍的就是将一个表格形式的数据转化成json格式进行存储. 此处给出的实例图如下 ...

  3. python 爬虫 获取bilibili search搜索数据,返回json格式

    话不多说直接上代码 测试用例 : 搜索java为关键词的 时长在60分钟以上的视频 import requests import json import osheaders = {"user ...

  4. json数据解析,json数据转为java对象

    在Android开发过程中,经常需要与后台进行数据的交互,JSON作为一种轻量级的数据格式,经常被 后台作为传输数据的格式,将数据传输到客户端.JSON有两种格式,一种是对象格式的,另一种是数组格式的 ...

  5. JSON基础与数据解析、JSON方法、AJAX初识

    JSON JavaScript Object Notation js对象标记 是对象,是轻量级数据交互的格式,不能有方法 它基于 JavaScript 语法,但与之不同:JavaScript不是JSO ...

  6. java pdf输出图片_Java PDF转换成图片并输出给前台展示

    首先需要导入所需工具类 org.apache.pdfbox fontbox 2.0.1 org.apache.pdfbox pdfbox 2.0.1 cn.hutool hutool-all 4.1. ...

  7. 从mysql取出数据封装成json中遇到特殊字符自动转成unicode解决方案

    @Testpublic void xxx() throws ParseException, UnsupportedEncodingException, Exception {ArrayList< ...

  8. linux下json数据解析,JSON数据解析 - iOS学习笔记_Linux编程_Linux公社-Linux系统门户网站...

    在之前的<iOS学习--xml数据解析(九)>http://www.linuxidc.com/Linux/2014-02/97020p9.htm 介绍了xml数据解析,这一篇简单介绍一下J ...

  9. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObjectpublic class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mark ...

最新文章

  1. 【图论】图,实现图(三种方式),二分图 详解
  2. Ehcache 缓存监控配置
  3. 广州程序员辞职创业卖菠萝油,放弃30万年薪
  4. 科技感大屏展示设计,数据可视化设计
  5. 答题获得思科T-shirt
  6. 使用Linq时要注意的事项
  7. java 控件汉字显示方格
  8. 下载faceScrub人脸数据库(单线程版本)
  9. JAVA设对话框的位置,setLocation/setBounds皆可
  10. 5元的小乌龟吃什么_小乌龟吃什么最好?
  11. JsDroid2开发教程
  12. 论文阅读: 3D Human Pose Estimation in the Wild by Adversarial Learning
  13. spark性能优化(二)数据倾斜问题
  14. Pytorch实现人脸多属性识别
  15. 五险一金 | 养老保险及其退休金计算
  16. 百度地图爬虫——小试牛刀
  17. Google Chrome误删书签的恢复方式!
  18. CAD图纸如何批量转换JPG格式?
  19. 五分钟学后端技术:一篇文章告诉你如何学习云计算!
  20. python 随机森林参数说明

热门文章

  1. 应用程序逆向分析 有道词典_逆向工程媒体应用程序(并使其中的所有故事免费)...
  2. 裁员!又裁员!!!功能测试一个组直接裁掉?
  3. EPLAN元件符号--电机保护开关
  4. SB1:spring boot简单的使用Idea开发
  5. Linux中Netlink实现热插拔监控——内核与用户空间通信
  6. 2021-06-02Leetcode49.字母异位词分组
  7. dsp广告和信息流广告区别_信息流、DSP、联盟广告、SEM有什么区别?
  8. 科汛CMS中栏目的顺序调整后栏目错位的解决办法
  9. 用Docker安装Redmine
  10. windows软件-----办公效率提高