最近在做通讯方面的一些东西,移动端与服务器之间的通讯采用HttpUrlConnection以xml文件流的方式进行通讯。xml文件解析后,通常要给对应的数据模型(javabean)赋值,从而进行一些列的验证,入库,日志操作等。
1、通过HttpUrlConnection获取输入流,解码后生成xml文件字符串
2、使用dom4j解析此字符串生成Document对象
3、对Document对象递归遍历收集节点名称和节点值,并根据节点名称拼接set方法,用以和javabean反射后得到的set方法做匹配
具体代码如下:
1、模拟客户端发送xml数据流至服务器 Client.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.net.URLDecoder;
public class Client {
private static final String POST = "http://localhost:8080/mobileCharge/charge/chargeAction!getMpay.action";
public static void main(String[] args){
sendXml();
}
public static String createXml() {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<mpay>"
+ "<methodName>getMpay</methodName>" + "<params>" + "<param>"
+ "<type>1</type>" + "<terminalid>91300021</terminalid>"
+ "<money>100.00</money>" + "<csn>02570001</csn>"
+ "<password>1f3259007db02194cd134f18513dd00e</password>"
+ "</param>" + "</params>" + "</mpay>";
return xml;
}
public static void sendXml(){
try {
URL url = new URL(POST);
//根据Url地址打开一个连接
URLConnection urlConnection = url.openConnection();
HttpURLConnection httpUrlConnection = (HttpURLConnection)urlConnection;
//允许输出流
httpUrlConnection.setDoOutput(true);
//允许写入流
httpUrlConnection.setDoInput(true);
//post方式提交不可以使用缓存
httpUrlConnection.setUseCaches(false);
//请求类型
httpUrlConnection.setRequestProperty("Content-Type", "text/html");
httpUrlConnection.setRequestMethod("POST");
//设置连接、读取超时
httpUrlConnection.setConnectTimeout(30000);
httpUrlConnection.setReadTimeout(30000);
httpUrlConnection.connect();
//使用缓冲流将xml字符串发送给服务器
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpUrlConnection.getOutputStream()));
writer.write(URLEncoder.encode(createXml(),"UTF-8"));
writer.flush();
writer.close();
writer = null;
//关闭连接
httpUrlConnection.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、服务端获取到此输入流后转换为字符串,这个很简单,贴出主要代码即可
public String getXmlText(){
//使用的是struts2 ,获取request很方便 O(∩_∩)O~
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
String xmlText=null;
try{
//同样使用缓冲流
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
StringBuffer sb = new StringBuffer();
String lines;
while((lines = reader.readLine())!=null){
sb.append(lines);
}
//客户端使用了UTF-8编码,这里使用同样使用UTF-8解码
xmlText = URLDecoder.decode(sb.toString(),"UTF-8");
reader.close();
reader = null;
}catch(Exception e){
e.printStackTrace();
}
return xmlText;
}
一下就是xmlText与javabean之间的转换了,今天只写了上部分 xml - javabean 改天再写下部分 javabean - xml
3、xmlText - javabean 的转换
/**
* 根据xml文件流对xmlModel赋值
* @param xmlText
* @param xmlModel
* @return
*/
@SuppressWarnings("unchecked")
public static synchronized Object parseXml4Bean(String xmlText,Object xmlModel){
try {
//解析字符串生成docment对象
Document xmlDoc = DocumentHelper.parseText(xmlText);
//获取根节点
Element element = xmlDoc.getRootElement();
List<Map<String,String>> propsList = new ArrayList<Map<String,String>>();
//解析xml中的节点名称和节点值,详细见下面parseXml
propsList = parseXml(element, propsList);
if(propsList.size()==0){
return null;
}
//获取Method对象数组
Method[] methods = xmlModel.getClass().getDeclaredMethods();
for(int i=0;i<propsList.size();i++){
for(int j=0;j<methods.length;j++){
Method m = methods[j];
if(propsList.get(i).containsKey(m.getName())){
try {
//执行set方法,将xml中的textNode值赋予Model中
m.invoke(xmlModel, new Object[]{propsList.get(i).get(m.getName())});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
return xmlModel;
}
4、子方法 ,用以解析xml,拼接set方法匹配与Method数组
/**
* 获取xml文件中叶结点名称和节点值
* @param element
* @param propsList
* @return
*/
@SuppressWarnings("unchecked")
private static List<Map<String,String>> parseXml(Element element,List<Map<String,String>> propsList){
if(element.isTextOnly()){
HashMap<String,String> map = new HashMap<String,String>();
String key = element.getName();
key = METHOD_SET+key.substring(0,1).toUpperCase().concat(key.substring(1,key.length()));
map.put(key,element.getTextTrim());
propsList.add(map);
}else{
List<Element> tmpList = element.elements();
for(Element e : tmpList){
parseXml(e, propsList);
}
}
return propsList;
}
5、java bean
package com.eptok.business.charge;
public class ChargeXmlModel {
private String methodName;
private String type;
private String terminalid;
private String money;
private String csn;
private String password;
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getTerminalid() {
return terminalid;
}
public void setTerminalid(String terminalid) {
this.terminalid = terminalid;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
public String getCsn() {
return csn;
}
public void setCsn(String csn) {
this.csn = csn;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
6、测试调用 。。。。
附件中有dom4j的jar ,可以下载
分享到:
相关推荐
JavaBean和XML之间的转换是Java开发中常见的数据交换方式,特别是在处理配置文件或者进行数据持久化时。这两种格式都有其独特的优势:JavaBean是面向对象的,方便编程,而XML则是一种通用的数据交换格式,易于人阅读...
通过定义符合JavaBean规范的类,并利用JAXB的序列化和反序列化功能,我们可以方便地在Java对象和XML文档之间进行数据转换。这在处理Web服务、配置文件或跨平台数据交换时非常有用。在实际开发中,确保对这些基本概念...
Java 对象与 XML 之间的转换 Java 对象与 XML 之间的转换是 Java programming 中的一个重要话题。随着软件开发的复杂化,数据交换变得越来越频繁,而 XML 作为一种通用的数据交换格式,渐渐成为开发者们的选择之一...
当需要在Java程序中处理XML数据时,JAXB(Java Architecture for XML Binding)提供了一种方便、高效的方法,将Java对象和XML文档之间进行映射,实现了JavaBean与XML之间的自动转换。本篇将深入探讨JAXB2在实现...
首先,为JavaBean创建一个对应的XML Schema(XSD),然后使用JAXB将JavaBean对象转换成XML文档。 3. **PDF**:生成PDF文件可以使用iText库。创建一个`Document`对象,然后添加`Paragraph`、`Table`等元素,将...
JavaBean是一种符合特定规范的Java类,常用于封装业务逻辑和数据,而XML则是一种通用的数据交换格式,常用于配置文件和数据传输。 ### JavaBean JavaBean是一种遵循特定规则的Java类,它主要用于封装数据和提供可...
**XMLBean**是一款类似于Hibernate这样的对象关系映射(Object Relational Mapping,ORM)工具的产品,它将复杂的XML读写操作简化为对JavaBean的操作,从而极大地简化了XML的读写过程,使得即使是不熟悉XML的开发者...
4. **对象映射(对象-XML/JSON映射)**:这是一种将数据结构(如Bean)与数据格式(如XML或JSON)之间进行转换的技术。比如,使用Jackson库的`ObjectMapper`可以方便地将JSON字符串解析成Bean,反之亦然。 5. **...
总之,Castor框架是Java开发者处理XML数据的一个强大工具,它通过数据绑定简化了XML与Java对象之间的转换,减少了编程复杂性,提高了效率。对于那些主要关心XML数据内容而非其结构的项目,采用Castor进行数据绑定是...
总的来说,JSP+XML架构网站的实例展示了如何利用XML进行数据标准化,动态生成XML文档,并通过XSL进行数据转换,以实现灵活且高效的网页呈现。这种技术组合在处理复杂数据和构建可扩展的Web应用程序时具有显著优势。
总的来说,"jsp+javabean+servlet 权限管理系统"是一个基于Java Web技术的权限控制解决方案,它涵盖了用户认证、授权的基本流程,以及与数据库交互、视图展示和业务逻辑处理的关键环节。通过学习和理解这个系统,...
在Java Web应用程序中,JSP主要用于创建动态网页,而XML则是一种通用的数据交换格式,常用于存储和传输结构化数据。 **Java JSP技术** 1. **JSP概述**:JSP是Java平台上的服务器端脚本语言,它允许开发者在HTML...
其设计原则是使得操作更加简洁,避免资源泄露,并提供了一些实用的功能,如字符串与流之间的转换、文件的读写等。 1. **流的复制与粘贴**: IOUtils的`copy()`方法非常实用,它可以将一个输入流的数据复制到另一个...
UI层负责用户交互,DAO层用于数据库或文件的读写,JavaBean封装业务对象,工具类(Util)则包含静态方法,提供通用的功能,如日期转换、字符串处理等。 5. **异常处理**: Java中的异常分为两种类型:编译时异常...
此外,还需要定义映射文件,用于描述Java对象与数据库表之间的映射关系。 #### 七、DTD的作用与意义 DTD(Document Type Definition)是XML文档类型定义的一种标准,它用于描述XML文档的结构。在iBatis中,DTD文件...
配置文件允许用户定义生成的类的命名规则、字段名的转换策略、是否生成通用的CRUD方法等。 3. **Java实体类** MBG根据数据库中的表生成对应的Java实体类。每个实体类代表一个数据库表,包含表中的所有字段,且每个...
JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
在这个场景中,它可能被JSON-lib用来辅助处理Java集合与JSON之间的转换。 3. xom-1.2.4.jar:XOM(XML Object Model)是一个用于处理XML的Java库,它提供了一个简洁且一致的API来操作XML文档。虽然JSON-lib主要处理...
4. **jaxen-1.1-beta-6.jar**:Jaxen是一个通用的XPath库,可以在各种XML API(如DOM、JDOM、XOM等)之间提供统一的XPath实现。Spring框架在进行基于XPath的XML配置文件解析时,可能会利用到Jaxen。 5. **commons-...