工作中,我需要和另一个公司(A公司)共同开发一个模块,我写一个servlet接口,A公司携带xml格式的报文来访问。我采用流的形式读取,在处理后以流的形式写入,在返回(相应)给A公司。

demo:

 package com.sinosoft.undwrt.bl.facade;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringBufferInputStream;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException; import com.sinosoft.sysframework.reference.DBManager;
import com.sinosoft.utiall.schema.PrpDriskSchema;
import com.sinosoft.utility.error.UserException; public class CheckIfPassFacade extends HttpServlet { /**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
} /**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doPost(request, response);
} /**
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
* @author yaowengang
* @time 2016-1-26
* @desc 共享平台访问此servlet,以流的形式返回passFlag(是否审核通过true or false),passTime(审核通过时间),undwrter(审核通过人)
* @desc underwriteflag 1审核通过,9提交到核赔/核保(在双核或共享平台),6注销,
2下发修改,0暂存(在核心) ;
3自动核保(自核单子审核通过后);4无需核保(自核单子审核通过前的标识)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] arrs= analyzeXML(request);
//获取指定元素的内容
String taskId= arrs[0];//businessNo
String businessType= arrs[1]; boolean isT= businessType.equals("T")? true: false;
DBManager dbManager = new DBManager();
List list= new ArrayList<String>();
ResultSet resultSet= null;
String underwriteFlag= null;
String passTime= null;
Boolean passFlag= null ;//true:审核通过,false:未审核通过
String undwrter =null;//核保人
BufferedOutputStream ou= null;
try {
if (taskId!=null&&!"".equals(taskId)) {
// boolean isT= taskId.startsWith("T") ? true :false ;//需要改,让平台作为参数传给我
dbManager.open("ddccDataSource");
if (isT) {//投保单
String sqlT= "select underwriteflag,passtime,underwritecode from prptmain where proposalno=?";
dbManager.prepareStatement(sqlT);
dbManager.setString(1, taskId);
resultSet = dbManager.executePreparedQuery();
while (resultSet.next()) {
underwriteFlag= resultSet.getString("underwriteflag");
passTime= resultSet.getString("passtime");
undwrter= resultSet.getString("underwritecode");
passFlag= underwriteFlag.equals("1");
if (!passFlag) {
passTime=null;
undwrter=null;
}
break;
}
/*if (passFlag) {
resultSet= null;
String sql2= "select passtime,underwritecode from prptmain where proposalno=?";
dbManager.prepareStatement(sql2);
dbManager.setString(1, taskId);
resultSet = dbManager.executePreparedQuery();
while (resultSet.next()) {
passTime= resultSet.getString("passtime");
undwrter= resultSet.getString("underwritecode");
break;
}
if (passTime==null) {
passTime="";
}
}*/ }else {//批单
String sqlP= "select underwriteflag,passtime,underwritecode from prpphead where endorseno=?";
dbManager.prepareStatement(sqlP);
dbManager.setString(1, taskId);
resultSet = dbManager.executePreparedQuery();
while (resultSet.next()) {
underwriteFlag= resultSet.getString("underwriteflag");
passTime= resultSet.getString("passtime");
undwrter= resultSet.getString("underwritecode");
passFlag= underwriteFlag.equals("1");
if (!passFlag) {
passTime=null;
undwrter=null;
}
/*passTime= resultSet.getString("passtime");
undwrter= resultSet.getString("underwritecode");*/
/*if (passTime==null) {
passTime="";
}*/
break;
}
/*if (passFlag) {
resultSet= null;
String sql2= "select passtime,underwritecode from prpphead where endorseno=?";
dbManager.prepareStatement(sql2);
dbManager.setString(1, taskId);
resultSet = dbManager.executePreparedQuery();
while (resultSet.next()) {
passTime= resultSet.getString("passtime");
undwrter= resultSet.getString("underwritecode");
break;
}
if (passTime==null) {
passTime="";
}
}*/
} }else {
throw new Exception("解析报文失败!请检查报文是否正确。");
} list.add(""+passFlag);
list.add(passTime);
list.add(undwrter);
String resultXML= assembleXML(list);
System.out.println("给平台返回的xml :"+resultXML);
ou = new BufferedOutputStream(response.getOutputStream());
ou.write(resultXML.getBytes());
ou.flush();
ou.close();
}catch (IOException e1) {
e1.printStackTrace();
}catch (SQLException e2) {
e2.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
if (dbManager!=null) {
try {
dbManager.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
} /**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
} /**
* @desc 将查询所得数据构造成xml格式,便于传送
* @param
* @throws UserException, ParserConfigurationException, FactoryConfigurationError, SAXException,Exception
*/
public String assembleXML(List<String> list) throws UserException, ParserConfigurationException, FactoryConfigurationError, SAXException,Exception {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
strBuilder.append("<ROOT>");
strBuilder.append("<HEAD>");
strBuilder.append("<INFO>");
strBuilder.append("<PASSFLAG>"+ list.get(0)+ "</PASSFLAG>");
strBuilder.append("<PASSTIME>"+ list.get(1)+ "</PASSTIME>");
strBuilder.append("<UNDWRTER>"+ list.get(2)+ "</UNDWRTER>");
strBuilder.append("</INFO>");
strBuilder.append("</HEAD>");
strBuilder.append("</ROOT>");
return strBuilder.toString();
} /**
* @desc dom4j框架解析来自request的报文
* @author yaowengang
* @throws IOException
* @date 20160224
* */
public String[] analyzeXML(HttpServletRequest request) throws IOException {// String[] datas= new String[2];
InputStream XMLInputStream= request.getInputStream();
BufferedReader XMLBuffReader= new BufferedReader(new InputStreamReader(XMLInputStream));
StringBuilder requestXMLSB= new StringBuilder("");
InputStream in= null;
try {
String tempXML;
while (true) {
tempXML= XMLBuffReader.readLine();
if (tempXML==null) {
break;
}
requestXMLSB.append(tempXML);
}
String requestXML= requestXMLSB.toString();
System.out.println("平台发的报文 :"+requestXML);
//解析收到的报文--采用dom4j框架
in= new StringBufferInputStream(requestXML);
SAXReader saxReader= new SAXReader();
Document document= null;
document = saxReader.read(in);
//获取根元素
Element root= document.getRootElement();
Element headElement= root.element("HEAD");
Element infoElement= headElement.element("INFO");
Element businessNoElement= infoElement.element("BUSINESSNO");
Element businessTypeElement= infoElement.element("BUSINESSTYPE");
//获取指定元素的内容
String businessNo= businessNoElement.getText();
String businessType= businessTypeElement.getText();
datas[0]= businessNo;
datas[1]= businessType; }catch (DocumentException e1) {
e1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
if (XMLBuffReader!=null) {
XMLBuffReader.close();
}
if (in!=null) {
in.close();
}
}
return datas;
} }

[工作代码]dom4j解析实例的更多相关文章

  1. XML—代码—DOM4J解析

    什么是xml: 众所周知,xml常用语数据存储和传输,文件后缀为 .xml: 它是可扩展标记语言(Extensible Markup Language,简称XML),是一种标记语言. 如何定义这些标记 ...

  2. dom4j解析xml格式文件实例

    以下给4种常见的xml文件的解析方式的分析对比: DOM  DOM4J  JDOM  SAX Dom解析    在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作.由于它是基于信息层次 ...

  3. dom4j解析xml字符串实例

    DOM4J 与利用DOM.SAX.JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml ...

  4. java dom4j解析xml实例(2)

    java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...

  5. java dom4j解析xml实例

    java利用dom4j解析xml 需要的jar包: dom4j官方网站在 http://www.dom4j.org/ 下载dom4j-1.6.1.zip 解开后有两个包,仅操作XML文档的话把dom4 ...

  6. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  7. dom4j解析xml文档全面介绍

    一.dom4j介绍 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点, ...

  8. 源生API解析XML文档与dom4j解析XML文档

    一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...

  9. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

随机推荐

  1. ubuntu下git clone 提速

    环境:ubuntu16.04 方法:通过socks5代理并且使用http链接 步骤: 1.设置全局使用socks5代理,并且使用http传输 git config --global http.prox ...

  2. spring集成mybatis后,打印SQL语句

    网上说mybatis的早前版本配置打印sql还比较简单,在3.0.6之后配置方式修改了. 现在的spring-mybatis.xml配置如下: <bean id="sqlSession ...

  3. [BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树

    Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那 里的交通情况还是很糟糕.所以,OIER Association组 ...

  4. 论文笔记——ThiNet: A Filter Level Pruning Method for Deep Neural Network Compreesion

    论文地址:https://arxiv.org/abs/1707.06342 主要思想 选择一个channel的子集,然后让通过样本以后得到的误差最小(最小二乘),将裁剪问题转换成了优化问题. 这篇论文 ...

  5. Spring 入门 web.xml配置详解

    Spring 入门 web.xml配置详解 https://www.cnblogs.com/cczz_11/p/4363314.html https://blog.csdn.net/hellolove ...

  6. c++ 二分法查找(binary_search)

    #include <iostream> // cout #include <algorithm> // binary_search, sort #include <vec ...

  7. S3 对象

    在 R 中,S3 对象系统是一个简单且宽松的面向对象系统.每个基本对象的类型都有一个 S3 类名称.例如:integer.numeric.character.logical.list 和 data.f ...

  8. 《剑指offer》第三十二题(之字形打印二叉树)

    // 面试题32(三):之字形打印二叉树 // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺 // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, / ...

  9. 音视频学习系列第(七)篇---MediaCodec的使用

    音视频系列 什么是MediaCodec MediaCodec是安卓官方提供的一套用于音视频编码和解码的API,该API是在安卓4.1(API 16)引入的,因此只能用于4.1以上的手机 MediaCo ...

  10. Codeforces 285C - Building Permutation

    285C - Building Permutation 思路:贪心.因为每个数都不同且不超过n,而且长度也为n,所有排列只能为1 2 3 ......n.所以排好序后与对应元素的差值的绝对值加起来就是 ...