本节摘要:前面介绍了Object to xml ,先把每个javabean字段的值用set方法设置值,然后通过通过xstream.jar包的相关类封装为xml输出;
本节主要是采用更加简单的方法给javabean的字段设置值。主要是应用了Map对象结合BeanInfo/Introspector/PropertyDescriptor/Method的使用来set字段的值。
preparation
1.项目环境介绍:
myeclipse6.5 、tomcat5.0、system:xp、JDK:开发和编译都是1.5
2.导入jar包
新建一个普通的java工程然后导入xstream.jar包即可.
3.类&方法介绍
BeanInfo/Introspector/PropertyDescriptor/Method
这些类和方法请参考JDK API,程序中我也对用到的方法做了一个简单的介绍
xstream.jar
用到的类在前面介绍过,这里就不再赘述
4.假设需要返回XML的格式如下:
<user_info>
<username>testuser</username>
<password>password</password>
</user_info>
start
新建一个类XML_OBJTOXML
XML_OBJTOXML.java的代码如下:


1 package com.xml;
2
3 import java.beans.BeanInfo;
4 import java.beans.Introspector;
5 import java.beans.PropertyDescriptor;
6 import java.lang.reflect.Method;
7 import java.util.HashMap;
8 import java.util.Map;
9 import com.thoughtworks.xstream.XStream;
10 import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer;
11 import com.thoughtworks.xstream.io.xml.XppDriver;
12
13 /**
14 *Module: XML_OBJTOXML.java
15 *Description: 报文的封装
16 *Company:
17 *Author: pantp
18 *Date: Feb 23, 2012
19 */
20
21 /*
22 * 用到的主要知识如下:
23 * 1.BeanInfo/Introspector/PropertyDescriptor/Method的使用
24 * 2.XStream.jar包相关类及方法的使用
25 * 3.javabean
26 */
27
28 /*
29 假设报文格式如下:
30 <user_info>
31 <username>testuser</username>
32 <password>password</password>
33 </user_info>
34 */
35
36 /**
37 * 定义一个javabean,实际开发中javabean是一个单独的类,这里为了方便就放在了一个类中
38 * 实际开发中是先定义报文格式和字段,然后根据定义的报文建立javabean以及属性字段名称
39 */
40 class UserInfo{
41 //此处的属性名称就是最后发送报文中的字段名称
42 private String username;
43 private String password;
44 //这几个类的使用时javabean的属性的类型不能有多种(如:String和int不能共存、但是int和long可以共存),否则后面会报异常
45
46 public String getUsername() {
47 return username;
48 }
49 public void setUsername(String username) {
50 this.username = username;
51 }
52 public String getPassword() {
53 return password;
54 }
55 public void setPassword(String password) {
56 this.password = password;
57 }
58 }
59
60 //=========================================【javabean定义完成】============================================================
61
62 public class XML_OBJTOXML {
63
64 private static Map parameter = new HashMap();
65 private static UserInfo userInfo=null;
66
67 /**
68 * 整合4个方法,提供一个程序的访问的接口
69 * @return
70 * @throws Exception
71 */
72 public static String returnXML() throws Exception{
73 /*
74 * 1.放值到map对象中
75 */
76 putValue(parameter);
77
78 /*
79 * 2.把map中的值set到对应Object对象pt中
80 */
81 userInfo = new UserInfo();
82 setBeanProperty(userInfo,parameter);
83
84 /*
85 * 3.采用object to xml 的方式封装xml字符串
86 */
87 String xml=getXML();
88
89 /*
90 * 4.释放资源
91 */
92 close();
93
94 return xml;
95 }
96
97 /**
98 * 放值到Map对象中
99 * @param parameter
100 */
101 private static void putValue(Map parameter){
102 /*
103 * 实际开发中是查询数据库然后把相应的值put到Map的对象中,
104 * 但是此处的键key的值必须要和javabean中的字段名称一模一样,
105 * 多一个空格,大小写不一样的话都不行,这样后面都没有办法把值set到对象中
106 */
107 parameter.put("username", "testuser");
108 parameter.put("password", "123456");
109 }
110
111 /**
112 * 把map中的值set到对应Object对象pt中
113 * @param pt
114 * @param map
115 * @throws Exception
116 */
117 private static void setBeanProperty(Object obj, Map map) throws Exception {
118 /*
119 *全面地对类进行查询,返回一个我们可以进行详细研究以发现其属性、方法和事件的BeanInfo对象
120 */
121 BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
122 /*
123 * BeanInfo 返回这些信息的方法如下:
124 * getBeanDescriptor(): 返回一个Bean叙词表(BeanDescriptor),包含bean的多方面信息(图标,显示名等)
125 * getPropertyDescriptors(): 返回一属性叙词表,返回的每个元素是一个PropertyDescriptor对象
126 * getMethodDescriptors(): 返回一方法叙词表 ,返回的每个元素是一个MethodDescriptor对象
127 * getEventSetDescriptors(): 返回一事件集叙词表 ,返回的每个元素是一个EventSetDescriptor对象
128 */
129 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
130 for (int i = 0; i < pds.length; i++) {
131 PropertyDescriptor pd = pds[i];
132 Method methodGetX = pd.getWriteMethod();//getWriteMethod()获得应该用于写入属性值的方法
133 if (map.containsKey(pd.getName())) {//pd.getName()的值即username、password
134 String value = (map.get(pd.getName())) == null ? "" : map.get(
135 pd.getName()).toString();// 取得属性值
136 if (value != null && value.trim() != "") {
137 /*
138 * Object invoke(Object obj, Object... args)
139 * 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法
140 * obj - 从中调用底层方法的对象
141 * args - 用于方法调用的参数
142 * 通俗点说就是,调用obj对象中value属性对应的set方法把值放入到obj对象中
143 */
144 methodGetX.invoke(obj, new Object[] { value });
145 }
146 }
147 }
148 }
149
150 /**
151 * 通过XStream类采用object to xml 的方式封装xml字符串
152 * @return
153 */
154 private static String getXML(){
155 XStream xstream = new XStream(new XppDriver(new XmlFriendlyReplacer(
156 "-_", "_")));//用此种构造方法是为了去掉报文中下划线占两个字符的问题
157
158 xstream.alias("user_info", UserInfo.class);//设置别名
159 // addImplicitCollection
160
161 StringBuffer sb = new StringBuffer();
162 sb.append("<?xml version=\"1.0\" encoding=\"gbk\"?>");
163 sb.append("\n");
164 sb.append(xstream.toXML(userInfo));
165
166 return sb.toString();
167 }
168
169 /**
170 * 释放Map对象中的资源
171 */
172 private static void close(){
173 if(parameter!=null&&!parameter.isEmpty())
174 parameter.clear();
175 }
176
177 //=========================================【报文封装完成】============================================================
178
179 /**
180 * 测试的main方法
181 * @param args
182 * @throws Exception
183 */
184 public static void main(String[] args) throws Exception {
185 String result = returnXML();// 实际开发中,可以把这个返回值通过调用webservice接口或者是HTTP接口发送报文到交互的系统中
186
187 //打印看看结果
188 System.out.println("================================\n");
189 System.out.println(result);
190 System.out.println("\n================================");
191 }
192 }
result
运行程序截图如下: