SpringMVC整合JSON、XML视图

原创不易,转载请注明出处:SpringMVC整合JSON、XML视图

代码下载地址:http://www.zuidaima.com/share/1751862737554432.htm

SpringMVC中整合了JSON、XML的视图,可以通过这些视图完成Java对象 到XML、JSON的转换。转换XML提供了MarshallingView,开发者只需用注入相应的marshaller、和属性配置,即可自动完成 Java的Model对象中的数据到XML的编组。

Email:[email protected]

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

一、 准备工作

1、 本次程序会涉及到Jackson、xStream、Jibx、Jaxb2、castor等技术,如果你对这些技术还不是很了解。建议阅读:http://www.cnblogs.com/hoojo/archive/2011/04/27/2030264.html

这篇文章中涉及到的内容应该对你有不少帮助。

2、 jar包下载

spring各版本jar下载地址:http://ebr.springsource.com/repository/app/library/detail?name=org.springframework.spring

相关的依赖包也可以在这里找到:http://ebr.springsource.com/repository/app/library

3、 至少需要以下jar包

SpringMVC整合JSON、XML视图_第1张图片

4、 当前工程的web.xml配置

[java]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.     
  8.   
  9.     <-- 配置Spring核心控制器 -->  
  10.     <servlet>  
  11.         <servlet-name>dispatcher</servlet-name>  
  12.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  13.         <init-param>  
  14.             <param-name>contextConfigLocation</param-name>  
  15.             <param-value>/WEB-INF/dispatcher.xml</param-value>  
  16.         </init-param>  
  17.         <load-on-startup>1</load-on-startup>  
  18.     </servlet>   
  19.   
  20.     <servlet-mapping>  
  21.         <servlet-name>dispatcher</servlet-name>  
  22.         <url-pattern>*.do</url-pattern>  
  23.     </servlet-mapping>  
  24. <-- 解决工程编码过滤器 -->  
  25.     <filter>  
  26.         <filter-name>characterEncodingFilter</filter-name>  
  27.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  28.         <init-param>  
  29.             <param-name>encoding</param-name>  
  30.             <param-value>UTF-8</param-value>  
  31.         </init-param>  
  32.     </filter>  
  33.      
  34.   
  35.     <filter-mapping>  
  36.         <filter-name>characterEncodingFilter</filter-name>  
  37.         <url-pattern>/*</url-pattern>  
  38.     </filter-mapping>      
  39.   
  40.     <welcome-file-list>  
  41.       <welcome-file>index.jsp</welcome-file>  
  42.     </welcome-file-list>  
  43. </web-app>  

5、 WEB-INF中的dispatcher.xml配置

[java]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.   
  5.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  6.   
  7.     xmlns:context="http://www.springframework.org/schema/context"  
  8.   
  9.     xmlns:util="http://www.springframework.org/schema/util"  
  10.   
  11.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  12.   
  13.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  14.   
  15.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  16.   
  17.     http://www.springframework.org/schema/mvc  
  18.   
  19.     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
  20.   
  21.     http://www.springframework.org/schema/context   
  22.   
  23.     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  24.   
  25.     http://www.springframework.org/schema/util  
  26.   
  27.     http://www.springframework.org/schema/util/spring-util-3.0.xsd">  
  28.   
  29.       
  30.   
  31.     <-- 注解探测器 -->  
  32.   
  33.     <context:component-scan base-package="com.hoo.controller"/>  
  34.   
  35.       
  36.   
  37.     <-- 视图解析器,根据视图的名称new ModelAndView(name),在配置文件查找对应的bean配置 -->  
  38.   
  39.     <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">  
  40.   
  41.         <property name="order" value="1"/>  
  42.   
  43.     </bean>  
  44.   
  45.       
  46.   
  47.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  48.   
  49.         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  50.   
  51.     </bean>  
  52.   
  53. </beans>  

启动后,可以看到index.jsp 没有出现异常或错误。那么当前SpringMVC的配置就成功了。

 

二、 利用Jaxb2编组XML

1、 Jaxb2可以完成XML和Java的相互转换,在WebService中用得较多。前面也介绍过Jaxb2 的用法。

在线博文:

For cnblogs:http://www.cnblogs.com/hoojo/archive/2011/04/26/2029011.html

For csdn:http://blog.csdn.net/IBM_hoojo/archive/2011/04/26/6363491.aspx

2、 首先在dispatcher.xml中配置Jaxb2的marshaller的视图,配置如下:

[java]  view plain copy
  1. <bean name="jaxb2MarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">  
  2.   
  3.   <constructor-arg>  
  4.   
  5.       <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">  
  6.   
  7.           <property name="classesToBeBound">  
  8.   
  9.               <array>  
  10.   
  11.                   <value>com.hoo.entity.User</value>  
  12.   
  13.                   <value>com.hoo.entity.AccountBean</value>  
  14.   
  15.                   <value>com.hoo.entity.MapBean</value>  
  16.   
  17.                   <value>com.hoo.entity.ListBean</value>  
  18.   
  19.               </array>  
  20.   
  21.           </property>  
  22.   
  23.       </bean>  
  24.   
  25.   </constructor-arg>  
  26.   
  27. t;/bean>  

Jaxb2的jar在jdk中已经包含,所以不需要添加额外的jar包。详细信息你可以参考1中的博文。上面的 jaxb2MarshallingView视图的class是MarshallingView,它有一个构造器需要传递一个Marshaller。 Marshaller主要完成编组,即将Java对象转换成XML的这么一个东东。我们在这个构造器中注入了Jaxb2Marshaller这个类,这个 bean有一个classesToBeBound属性,这个属性是一个数组。需要将即将转换成XML的Java对象配置在这里。而且这些对象需要进行 Annotation注解。

3、 创建Jaxb2MarshallingViewController,完成Java对象到XML的转换

单个JavaBean的转换,代码如下:

[java]  view plain copy
  1. package com.hoo.controller;  
  2.   
  3.    
  4.   
  5. import java.util.ArrayList;  
  6.   
  7. import java.util.Date;  
  8.   
  9. import java.util.List;  
  10.   
  11. import org.springframework.stereotype.Controller;  
  12.   
  13. import org.springframework.web.bind.annotation.RequestMapping;  
  14.   
  15. import org.springframework.web.servlet.ModelAndView;  
  16.   
  17. import com.hoo.entity.AccountBean;  
  18.   
  19. import com.hoo.entity.Brithday;  
  20.   
  21. import com.hoo.entity.DifferBean;  
  22.   
  23. import com.hoo.entity.ListBean;  
  24.   
  25. import com.hoo.entity.MoreBean;  
  26.   
  27. import com.hoo.entity.User;  
  28.   
  29.    
  30.   
  31. /** 
  32.  
  33.  * <b>function:</b>Jaxb2MarshallingView 视图,利用Jaxb2进行Java对象到XML的转换技术 
  34.  
  35.  * @author hoojo 
  36.  
  37.  * @createDate 2011-4-27 下午03:20:23 
  38.  
  39.  * @file Jaxb2MarshallingViewController.java 
  40.  
  41.  * @package com.hoo.controller 
  42.  
  43.  * @project SpringMVC4View 
  44.  
  45.  * @blog http://blog.csdn.net/IBM_hoojo 
  46.  
  47.  * @email [email protected] 
  48.  
  49.  * @version 1.0 
  50.  
  51.  */  
  52.   
  53. @Controller  
  54.   
  55. @RequestMapping("/jaxb2/view")  
  56.   
  57. public class Jaxb2MarshallingViewController {  
  58.   
  59.       
  60.   
  61.     /* 
  62.  
  63.      * MarshallingView Jaxb2Marshaller 需要配置转换成xml的java对象的Annotation 
  64.  
  65.      */  
  66.   
  67.     @RequestMapping("/doXMLJaxb2")  
  68.   
  69.     public ModelAndView doXMLJaxb2View() {  
  70.   
  71.         System.out.println("#################ViewController doXMLJaxb2View##################");  
  72.   
  73.         ModelAndView mav = new ModelAndView("jaxb2MarshallingView");  
  74.   
  75.           
  76.   
  77.         AccountBean bean = new AccountBean();  
  78.   
  79.         bean.setAddress("address");  
  80.   
  81.         bean.setEmail("email");  
  82.   
  83.         bean.setId(1);  
  84.   
  85.         bean.setName("haha");  
  86.   
  87.         Brithday day = new Brithday();  
  88.   
  89.         day.setBrithday("2010-11-22");  
  90.   
  91.         bean.setBrithday(day);  
  92.   
  93.           
  94.   
  95.         mav.addObject(bean);  
  96.   
  97.           
  98.   
  99.         return mav;  
  100.   
  101.     }  
  102.   
  103. }  

上面的代码的ModelAndView配置了jaxb2MarshallingView这个视图,就表示结果集会通过这个视图进行编组后显示。上面需要转换的AccountBean和Birthday对象,这些对象需要配置annotation,前面已经讲到annotation对JavaBean转换XML的作用。我们来看看AccountBean对象代码:

[java]  view plain copy
  1. package com.hoo.entity;  
  2.   
  3.    
  4.   
  5. import javax.xml.bind.annotation.XmlElement;  
  6.   
  7. import javax.xml.bind.annotation.XmlRootElement;  
  8.   
  9.    
  10.   
  11. @XmlRootElement(name = "account")  
  12.   
  13. public class AccountBean {  
  14.   
  15.     private int id;  
  16.   
  17.     private String name;  
  18.   
  19.     private String email;  
  20.   
  21.     private String address;  
  22.   
  23.     private Brithday brithday;  
  24.   
  25.       
  26.   
  27.     @XmlElement  
  28.   
  29.     public Brithday getBrithday() {  
  30.   
  31.         return brithday;  
  32.   
  33.     }  
  34.   
  35.     public void setBrithday(Brithday brithday) {  
  36.   
  37.         this.brithday = brithday;  
  38.   
  39.     }  
  40.   
  41.       
  42.   
  43.     @XmlElement  
  44.   
  45.     public int getId() {  
  46.   
  47.         return id;  
  48.   
  49.     }  
  50.   
  51.     public void setId(int id) {  
  52.   
  53.         this.id = id;  
  54.   
  55.     }  
  56.   
  57.       
  58.   
  59.     @XmlElement  
  60.   
  61.     public String getName() {  
  62.   
  63.         return name;  
  64.   
  65.     }  
  66.   
  67.     public void setName(String name) {  
  68.   
  69.         this.name = name;  
  70.   
  71.     }  
  72.   
  73.       
  74.   
  75.     @XmlElement  
  76.   
  77.     public String getEmail() {  
  78.   
  79.         return email;  
  80.   
  81.     }  
  82.   
  83.     public void setEmail(String email) {  
  84.   
  85.         this.email = email;  
  86.   
  87.     }  
  88.   
  89.       
  90.   
  91.     @XmlElement  
  92.   
  93.     public String getAddress() {  
  94.   
  95.         return address;  
  96.   
  97.     }  
  98.   
  99.     public void setAddress(String address) {  
  100.   
  101.         this.address = address;  
  102.   
  103.     }  
  104.   
  105.       
  106.   
  107.     @Override  
  108.   
  109.     public String toString() {  
  110.   
  111.         return this.name + "#" + this.id + "#" + this.address + "#" + this.brithday + "#" + this.email;  
  112.   
  113.     }  
  114.   
  115. }  

在getter方法都有部分注解,如果你想了解更多的jaxb2的相关技术,参考:http://www.cnblogs.com/hoojo/archive/2011/04/26/2029011.html

Brithday

[java]  view plain copy
  1. package com.hoo.entity;  
  2.   
  3.    
  4.   
  5. public class Brithday {  
  6.   
  7.     private String brithday;  
  8.   
  9.       
  10.   
  11.     public Brithday() {}  
  12.   
  13.       
  14.   
  15.     public Brithday(String brithday) {  
  16.   
  17.         this.brithday = brithday;  
  18.   
  19.     }  
  20.   
  21.       
  22.   
  23.     public String getBrithday() {  
  24.   
  25.         return brithday;  
  26.   
  27.     }  
  28.   
  29.    
  30.   
  31.     public void setBrithday(String brithday) {  
  32.   
  33.         this.brithday = brithday;  
  34.   
  35.     }  
  36.   
  37. }  

Brithday是AccountBean中的一个属性,在AccountBean中已经注解过。这里就不需要进行注解配置。

通过浏览器请求:http://localhost:8080/SpringMVC4View/jaxb2/view/doXMLJaxb2.do

结果如下:

[java]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2.   
  3. <account><address>address</address><brithday><brithday>2010-11-22</brithday></brithday>  
  4.   
  5. <email>email</email><id>1</id><name>haha</name></account>  

4、 转换带List属性的JavaEntity

[java]  view plain copy
  1. /** 
  2.  
  3.  * <b>function:</b>转换带有List属性的JavaBean 
  4.  
  5.  * @author hoojo 
  6.  
  7.  * @createDate 2011-4-27 下午05:32:22 
  8.  
  9.  * @return 
  10.  
  11.  */  
  12.   
  13. @RequestMapping("/doListXMLJaxb2")  
  14.   
  15. public ModelAndView doListXMLJaxb2View() {  
  16.   
  17.     System.out.println("#################ViewController doListXMLJaxb2View##################");  
  18.   
  19.     ModelAndView mav = new ModelAndView("jaxb2MarshallingView");  
  20.   
  21.     List<Object> beans = new ArrayList<Object>();   
  22.   
  23.     for (int i = 0; i < 3; i++) {  
  24.   
  25.         AccountBean bean = new AccountBean();  
  26.   
  27.         bean.setAddress("address#" + i);  
  28.   
  29.         bean.setEmail("email" + i + "@12" + i + ".com");  
  30.   
  31.         bean.setId(1 + i);  
  32.   
  33.         bean.setName("haha#" + i);  
  34.   
  35.         Brithday day = new Brithday();  
  36.   
  37.         day.setBrithday("2010-11-2" + i);  
  38.   
  39.         bean.setBrithday(day);  
  40.   
  41.         beans.add(bean);  
  42.   
  43.           
  44.   
  45.         User user = new User();  
  46.   
  47.         user.setAddress("china GuangZhou# " + i);  
  48.   
  49.         user.setAge(23 + i);  
  50.   
  51.         user.setBrithday(new Date());  
  52.   
  53.         user.setName("jack#" + i);  
  54.   
  55.         user.setSex(Boolean.parseBoolean(i + ""));  
  56.   
  57.         beans.add(user);  
  58.   
  59.     }  
  60.   
  61.       
  62.   
  63.     ListBean list = new ListBean();  
  64.   
  65.     list.setList(beans);  
  66.   
  67.     mav.addObject(list);  
  68.   
  69.       
  70.   
  71.     return mav;  
  72.   
  73. }  

ListBean注解过的代码

[java]  view plain copy
  1. package com.hoo.entity;  
  2.   
  3.    
  4.   
  5. import java.util.List;  
  6.   
  7. import javax.xml.bind.annotation.XmlElement;  
  8.   
  9. import javax.xml.bind.annotation.XmlElements;  
  10.   
  11. import javax.xml.bind.annotation.XmlRootElement;  
  12.   
  13.    
  14.   
  15. @SuppressWarnings("unchecked")  
  16.   
  17. @XmlRootElement  
  18.   
  19. public class ListBean {  
  20.   
  21.     private String name;  
  22.   
  23.     private List list;  
  24.   
  25.       
  26.   
  27.     @XmlElements({  
  28.   
  29.         @XmlElement(name = "user", type = User.class),  
  30.   
  31.         @XmlElement(name = "account", type = AccountBean.class),  
  32.   
  33.     })  
  34.   
  35.     public List getList() {  
  36.   
  37.         return list;  
  38.   
  39.     }  
  40.   
  41.    
  42.   
  43.     public void setList(List list) {  
  44.   
  45.         this.list = list;  
  46.   
  47.     }  
  48.   
  49.    
  50.   
  51.     public String getName() {  
  52.   
  53.         return name;  
  54.   
  55.     }  
  56.   
  57.    
  58.   
  59.     public void setName(String name) {  
  60.   
  61.         this.name = name;  
  62.   
  63.     }  
  64.   
  65. }  

通过上面的注解可以看出List中只能存储User、AccountBean对象,关于User对象的代码和AccountBean对象的是一样的,只是类名不同而已。读者可以自己添加。在WebBrowser中请求:http://localhost:8080/SpringMVC4View/jaxb2/view/doListXMLJaxb2.do

结果如下:

[xml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2.   
  3. <listBean>  
  4.   
  5. <account><address>address#0</address><brithday><brithday>2010-11-20</brithday></brithday>  
  6.   
  7. <email>[email protected]</email><id>1</id><name>haha#0</name></account>  
  8.   
  9. <user><address>china GuangZhou# 0</address><age>23</age>  
  10.   
  11. <brithday>2011-04-27T17:02:38.028+08:00</brithday><name>jack#0</name><sex>false</sex></user>  
  12.   
  13. <account><address>address#1</address><brithday><brithday>2010-11-21</brithday></brithday>  
  14.   
  15. <email>[email protected]</email><id>2</id><name>haha#1</name></account>  
  16.   
  17. <user><address>china GuangZhou# 1</address><age>24</age>  
  18.   
  19. <brithday>2011-04-27T17:02:38.028+08:00</brithday><name>jack#1</name><sex>false</sex></user>  
  20.   
  21. <account><address>address#2</address><brithday><brithday>2010-11-22</brithday></brithday>  
  22.   
  23. <email>[email protected]</email><id>3</id><name>haha#2</name></account>  
  24.   
  25. <user><address>china GuangZhou# 2</address><age>25</age>  
  26.   
  27. <brithday>2011-04-27T17:02:38.028+08:00</brithday><name>jack#2</name><sex>false</sex></user>  
  28.   
  29. </listBean>  

5、 转换带有Map属性的JavaBean,Jaxb2转换Map有点复杂,先看看代码:

[java]  view plain copy
  1. /** 
  2.  
  3.  * <b>function:</b>转换带有Map属性的JavaBean 
  4.  
  5.  * @author hoojo 
  6.  
  7.  * @createDate 2011-4-27 下午05:32:42 
  8.  
  9.  * @return 
  10.  
  11.  */  
  12.   
  13. @RequestMapping("/doMapXMLJaxb2")  
  14.   
  15. public ModelAndView doMapXMLJaxb2View() {  
  16.   
  17.     System.out.println("#################ViewController doMapXMLJaxb2View##################");  
  18.   
  19.     ModelAndView mav = new ModelAndView("jaxb2MarshallingView");  
  20.   
  21.       
  22.   
  23.     MapBean mapBean = new MapBean();  
  24.   
  25.       
  26.   
  27.     HashMap<String, AccountBean> map = new HashMap<String, AccountBean>();  
  28.   
  29.     AccountBean bean = new AccountBean();  
  30.   
  31.     bean.setAddress("北京");  
  32.   
  33.     bean.setEmail("email");  
  34.   
  35.     bean.setId(1);  
  36.   
  37.     bean.setName("jack");  
  38.   
  39.     Brithday day = new Brithday();  
  40.   
  41.     day.setBrithday("2010-11-22");  
  42.   
  43.     bean.setBrithday(day);  
  44.   
  45.     map.put("NO1", bean);  
  46.   
  47.       
  48.   
  49.     bean = new AccountBean();  
  50.   
  51.     bean.setAddress("china");  
  52.   
  53.     bean.setEmail("[email protected]");  
  54.   
  55.     bean.setId(2);  
  56.   
  57.     bean.setName("tom");  
  58.   
  59.     day = new Brithday("2011-11-22");  
  60.   
  61.     bean.setBrithday(day);  
  62.   
  63.     map.put("NO2", bean);  
  64.   
  65.       
  66.   
  67.     mapBean.setMap(map);  
  68.   
  69.       
  70.   
  71.     mav.addObject(mapBean);  
  72.   
  73.       
  74.   
  75.     return mav;  
  76.   
  77. }  

首先看看MapBean的代码,代码很简单就一个Map的属性。

[java]  view plain copy
  1. package com.hoo.entity;  
  2.   
  3.    
  4.   
  5. import java.util.HashMap;  
  6.   
  7. import javax.xml.bind.annotation.XmlRootElement;  
  8.   
  9. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;  
  10.   
  11. import com.hoo.util.MapAdapter;  
  12.   
  13.    
  14.   
  15. @XmlRootElement  
  16.   
  17. public class MapBean {  
  18.   
  19.     private HashMap<String, AccountBean> map;  
  20.   
  21.       
  22.   
  23.     @XmlJavaTypeAdapter(MapAdapter.class)  
  24.   
  25.     public HashMap<String, AccountBean> getMap() {  
  26.   
  27.         return map;  
  28.   
  29.     }  
  30.   
  31.     public void setMap(HashMap<String, AccountBean> map) {  
  32.   
  33.         this.map = map;  
  34.   
  35.     }  
  36.   
  37. }  

上面的代码的getMap方法设置了XmlJavaTypeAdapter这个注解,注解里面的MapAdapter是我们自己实现的,而且还要构建一个MapElements数组元素。主要是继承XmlAdapter重写里面的几个方法完成的。

MapAdapter代码

[java]  view plain copy
  1. package com.hoo.util;  
  2.   
  3.    
  4.   
  5. import java.util.HashMap;  
  6.   
  7. import java.util.Map;  
  8.   
  9. import javax.xml.bind.annotation.adapters.XmlAdapter;  
  10.   
  11. import com.hoo.entity.AccountBean;  
  12.   
  13.    
  14.   
  15. /** 
  16.  
  17.  * <b>function:</b>AccountBean 编组、解组的XmlAdapter 
  18.  
  19.  * @author hoojo 
  20.  
  21.  * @createDate 2011-4-25 下午05:03:18 
  22.  
  23.  * @file MyAdetper.java 
  24.  
  25.  * @package com.hoo.util 
  26.  
  27.  * @project WebHttpUtils 
  28.  
  29.  * @blog http://blog.csdn.net/IBM_hoojo 
  30.  
  31.  * @email [email protected] 
  32.  
  33.  * @version 1.0 
  34.  
  35.  */  
  36.   
  37. public class MapAdapter extends XmlAdapter<MapElements[], Map<String, AccountBean>> {  
  38.   
  39.     public MapElements[] marshal(Map<String, AccountBean> arg0) throws Exception {  
  40.   
  41.         MapElements[] mapElements = new MapElements[arg0.size()];  
  42.   
  43.    
  44.   
  45.         int i = 0;  
  46.   
  47.         for (Map.Entry<String, AccountBean> entry : arg0.entrySet())  
  48.   
  49.             mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());  
  50.   
  51.    
  52.   
  53.         return mapElements;  
  54.   
  55.     }  
  56.   
  57.    
  58.   
  59.     public Map<String, AccountBean> unmarshal(MapElements[] arg0) throws Exception {  
  60.   
  61.         Map<String, AccountBean> r = new HashMap<String, AccountBean>();  
  62.   
  63.         for (MapElements mapelement : arg0)  
  64.   
  65.             r.put(mapelement.key, mapelement.value);  
  66.   
  67.         return r;  
  68.   
  69.     }  
  70.   
  71. }  

MapElements代码

[java]  view plain copy
  1. package com.hoo.util;  
  2.   
  3.    
  4.   
  5. import javax.xml.bind.annotation.XmlElement;  
  6.   
  7. import com.hoo.entity.AccountBean;  
  8.   
  9.    
  10.   
  11. /** 
  12.  
  13.  * <b>function:</b> MapElements 
  14.  
  15.  * @author hoojo 
  16.  
  17.  * @createDate 2011-4-25 下午05:04:04 
  18.  
  19.  * @file MyElements.java 
  20.  
  21.  * @package com.hoo.util 
  22.  
  23.  * @project WebHttpUtils 
  24.  
  25.  * @blog http://blog.csdn.net/IBM_hoojo 
  26.  
  27.  * @email [email protected] 
  28.  
  29.  * @version 1.0 
  30.  
  31.  */  
  32.   
  33. public class MapElements {  
  34.   
  35.     @XmlElement  
  36.   
  37.     public String key;  
  38.   
  39.       
  40.   
  41.     @XmlElement  
  42.   
  43.     public AccountBean value;  
  44.   
  45.    
  46.   
  47.     @SuppressWarnings("unused")  
  48.   
  49.     private MapElements() {  
  50.   
  51.     } // Required by JAXB  
  52.   
  53.    
  54.   
  55.     public MapElements(String key, AccountBean value) {  
  56.   
  57.         this.key = key;  
  58.   
  59.         this.value = value;  
  60.   
  61.     }  
  62.   
  63. }  

在浏览器中请求:http://localhost:8080/SpringMVC4View/jaxb2/view/doMapXMLJaxb2.do

结果如下:

[java]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2.   
  3. <mapBean><map><item><key>NO2</key><value><address>china</address>  
  4.   
  5. <brithday><brithday>2011-11-22</brithday></brithday>  
  6.   
  7. <email>tom@125.com</email><id>2</id><name>tom</name></value></item>  
  8.   
  9. <item><key>NO1</key><value><address>北京</address><brithday><brithday>2010-11-22</brithday></brithday>  
  10.   
  11. <email>email</email><id>1</id><name>jack</name></value></item></map>  
  12.   
  13. </mapBean>  

总结,如果你想将一些Java的基本类型转换成XML。那么你得创建一个带getter、setter方法的JavaBean。然后在Bean的getter方法进行相应的Annotation注解即可完成转换。

 

三、 利用xStream转换XML

1、 xStream可以轻易的将Java对象转换成XML、JSON,Spring整合利用xStream转换xml。需要添加xStream相关的xstream-1.3.1.jar包。 如果你对xStream不上很了解,你可以先阅读这篇文章:

For csblogs:http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

For csdn:http://blog.csdn.net/IBM_hoojo/archive/2011/04/22/6342386.aspx

2、 然后在dispatcher.xml中添加如下配置

[java]  view plain copy
  1. <-- xml视图,XStreamMarshaller,可以转换任何形式的java对象,需要添加xStream jar包 -->  
  2.   
  3. <bean name="xStreamMarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">  
  4.   
  5.     <property name="marshaller">  
  6.   
  7.         <bean class="org.springframework.oxm.xstream.XStreamMarshaller">    
  8.   
  9.                <--  启用annotation -->  
  10.   
  11.                <property name="autodetectAnnotations" value="true"/>    
  12.   
  13.                <-- 类名别名 -->  
  14.   
  15.             <property name="aliases">  
  16.   
  17.                 <map>  
  18.   
  19.                     <-- Account这个类的别名就变成了myBeans,那么转换后的xml中就是myBeans -->  
  20.   
  21.                     <entry key="myBeans" value="com.hoo.entity.Account"/>  
  22.   
  23.                 </map>  
  24.   
  25.             </property>  
  26.   
  27.             <-- 基本属性别名 -->  
  28.   
  29.             <property name="fieldAliases">  
  30.   
  31.                 <map>  
  32.   
  33.                     <-- Account中的brithday这个属性 -->  
  34.   
  35.                     <entry key="com.hoo.entity.Account.brithday" value="生日"/>  
  36.   
  37.                 </map>  
  38.   
  39.             </property>  
  40.   
  41.            </bean>    
  42.   
  43.     </property>  
  44.   
  45. </bean>  

上次配置的参数有注释描述,还要没有配置的参数。如:annotatedClass、annotatedClasses是当没有配置启用 annotation的时候,可以用这2个属性进行配置你指定的class启用annotation注解。streamDriver是配置驱动用的,默认 可以不要驱动,你可以配置DomDriver、JSON相关的驱动。encoding是设置编码,关于XStreamMarshaller还要更多的参数 配置和上面xStream 的博文中讲解的一样使用,只是通过配置,而博文中是直接在代码中写的。当然也可以通过annotation进行注解哦;如果你想了解更多xStream的 用法,请你仔细阅读:http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

3、 普通JavaBean转换XML

[java]  view plain copy
  1. package com.hoo.controller;  
  2.   
  3.    
  4.   
  5. import java.util.ArrayList;  
  6.   
  7. import java.util.Date;  
  8.   
  9. import java.util.HashMap;  
  10.   
  11. import java.util.List;  
  12.   
  13. import java.util.Map;  
  14.   
  15. import org.springframework.stereotype.Controller;  
  16.   
  17. import org.springframework.web.bind.annotation.RequestMapping;  
  18.   
  19. import org.springframework.web.servlet.ModelAndView;  
  20.   
  21. import com.hoo.entity.Account;  
  22.   
  23. import com.hoo.entity.AccountArray;  
  24.   
  25. import com.hoo.entity.AccountBean;  
  26.   
  27. import com.hoo.entity.Brithday;  
  28.   
  29. import com.hoo.entity.DifferBean;  
  30.   
  31. import com.hoo.entity.ListBean;  
  32.   
  33. import com.hoo.entity.MapBean;  
  34.   
  35. import com.hoo.entity.MoreBean;  
  36.   
  37. import com.hoo.entity.User;  
  38.   
  39.    
  40.   
  41. /** 
  42.  
  43.  * <b>function:</b>Jaxb2MarshallingView 视图,利用Jaxb2进行Java对象到XML的转换技术 
  44.  
  45.  * @author hoojo 
  46.  
  47.  * @createDate 2011-4-27 下午03:20:23 
  48.  
  49.  * @file Jaxb2MarshallingViewController.java 
  50.  
  51.  * @package com.hoo.controller 
  52.  
  53.  * @project SpringMVC4View 
  54.  
  55.  * @blog http://blog.csdn.net/IBM_hoojo 
  56.  
  57.  * @email [email protected] 
  58.  
  59.  * @version 1.0 
  60.  
  61.  */  
  62.   
  63. @Controller  
  64.   
  65. @RequestMapping("/jaxb2/view")  
  66.   
  67. public class Jaxb2MarshallingViewController {  
  68.   
  69.       
  70.   
  71.     /* 
  72.  
  73.      * MarshallingView Jaxb2Marshaller 需要配置转换成xml的java对象的Annotation 
  74.  
  75.      */  
  76.   
  77.     @RequestMapping("/doXMLJaxb2")  
  78.   
  79.     public ModelAndView doXMLJaxb2View() {  
  80.   
  81.         System.out.println("#################ViewController doXMLJaxb2View##################");  
  82.   
  83.         ModelAndView mav = new ModelAndView("jaxb2MarshallingView");  
  84.   
  85.           
  86.   
  87.         AccountBean bean = new AccountBean();  
  88.   
  89.         bean.setAddress("address");  
  90.   
  91.         bean.setEmail("email");  
  92.   
  93.         bean.setId(1);  
  94.   
  95.         bean.setName("haha");  
  96.   
  97.         Brithday day = new Brithday();  
  98.   
  99.         day.setBrithday("2010-11-22");  
  100.   
  101.         bean.setBrithday(day);  
  102.   
  103.           
  104.   
  105.         mav.addObject(bean);  
  106.   
  107.           
  108.   
  109.         return mav;  
  110.   
  111.     }  
  112.   
  113. }  

AccountBean上面的代码已经给出,这里就不重复了。值得说明的是xStream在ModelAndView中,直接用addObject 方法添加时,有时候出现一些不是我们转换的对象的信息,一般是BindingResult的xml信息。解决办法就是设置addObject的key。 Key设置为BindingResult.MODEL_KEY_PREFIX这样就可以了,代码上面已经给出。

在浏览器中请求:http://localhost:8080/SpringMVC4View/xStream/view/doXMLXStream.do

结果如下:

[java]  view plain copy
  1. <com.hoo.entity.AccountBean><id>1</id><name>haha</name><email>email</email><address>北京</address>  
  2. <brithday><brithday>2010-11-22</brithday></brithday></com.hoo.entity.AccountBean>  

4、 转换对象数组

代码如下:

[java]  view plain copy
  1. /** 
  2.  
  3.  * <b>function:</b>转换对象数组 
  4.  
  5.  * @author hoojo 
  6.  
  7.  * @createDate 2011-4-27 下午06:19:40 
  8.  
  9.  * @return 
  10.  
  11.  */  
  12.   
  13. @RequestMapping("/doMoreXMLXStream")  
  14.   
  15. public ModelAndView doMoreXMLXStreamView() {  
  16.   
  17.     System.out.println("#################ViewController doMoreXMLXStreamView##################");  
  18.   
  19.     ModelAndView mav = new ModelAndView("xStreamMarshallingView");      
  20.   
  21.     Account[] accs = new Account[2];  
  22.   
  23.     Account bean = new Account();  
  24.   
  25.     bean.setAddress("北京");  
  26.   
  27.     bean.setEmail("email");  
  28.   
  29.     bean.setId(1);  
  30.   
  31.     bean.setName("haha");  
  32.   
  33.     Brithday day = new Brithday();  
  34.   
  35.     day.setBrithday("2010-11-22");  
  36.   
  37.     bean.setBrithday(day);  
  38.   
  39.     accs[0] = bean;  
  40.   
  41.       
  42.   
  43.     bean = new Account();  
  44.   
  45.     bean.setAddress("上海");  
  46.   
  47.     bean.setEmail("email");  
  48.   
  49.     bean.setId(1);  
  50.   
  51.     bean.setName("haha");  
  52.   
  53.     day = new Brithday();  
  54.   
  55.     day.setBrithday("2010-11-22");  
  56.   
  57.     bean.setBrithday(day);  
  58.   
  59.     accs[1] = bean;  
  60.   
  61.     mav.addObject(accs);  
  62.   
  63.     return mav;  
  64.   
  65. }  

在WebBrowser中请求http://localhost:8080/SpringMVC4View/xStream/view/doMoreXMLXStream.do

结果如下:

[java]  view plain copy
  1. <myBeans-array><myBeans><id>1</id><name>haha</name><email>email</email> <address>北京</address><生日><brithday>2010-11-22</brithday></生日></myBeans> <myBeans><id>1</id><name>haha</name><email>email</email><address>上海</address> <生日><brithday>2010-11-22</brithday></生日></myBeans></myBeans-array>  

结果中的myBeans、生日就是在dispatcher配置文件中重命名的对象属性名称。

5、 转换Map集合

[java]  view plain copy
  1. /** 
  2.  
  3.  * <b>function:</b>转换Map对象 
  4.  
  5.  * @author hoojo 
  6.  
  7.  * @createDate 2011-4-27 下午06:19:48 
  8.  
  9.  * @return 
  10.  
  11.  */  
  12.   
  13. @RequestMapping("/doDifferXMLXStream")  
  14.   
  15. public ModelAndView doDifferXMLXStreamView() {  
  16.   
  17.     System.out.println("#################ViewController doDifferXMLXStreamView##################");  
  18.   
  19.     ModelAndView mav = new ModelAndView("xStreamMarshallingView");  
  20.   
  21.       
  22.   
  23.     Account bean = new Account();  
  24.   
  25.     bean.setAddress("广东");  
  26.   
  27.     bean.setEmail("email");  
  28.   
  29.     bean.setId(1);  
  30.   
  31.     bean.setName("haha");  
  32.   
  33.     Brithday day = new Brithday();  
  34.   
  35.     day.setBrithday("2010-11-22");  
  36.   
  37.     bean.setBrithday(day);  
  38.   
  39.       
  40.   
  41.     User user = new User();  
  42.   
  43.     user.setAddress("china GuangZhou");  
  44.   
  45.     user.setAge(23);  
  46.   
  47.     user.setBrithday(new Date());  
  48.   
  49.     user.setName("jack");  
  50.   
  51.     user.setSex(true);  
  52.   
  53.       
  54.   
  55.     Map<String, Object> map = new HashMap<String, Object>();  
  56.   
  57.     map.put("bean", bean);  
  58.   
  59.     map.put("user", user);  
  60.   
  61.     mav.addObject(map);  
  62.   
  63.     return mav;  
  64.   
  65. }  

在WebBrowser中请求http://localhost:8080/SpringMVC4View/xStream/view/doDifferXMLXStream.do

结果如下:

[java]  view plain copy
  1. <map><entry>  
  2. <string>bean</string><myBeans><id>1</id><name>haha</name><email>email</email><address>广东</address><生日><brithday>2010-11-22</brithday></生日></myBeans></entry><entry><string>user</string><com.hoo.entity.User><name>jack</name><age>23</age><sex>true</sex><address>china GuangZhou</address><brithday>2011-04-27 19:02:13.747 CST</brithday></com.hoo.entity.User></entry></map>  

6、 转换List集合

[java]  view plain copy
  1. /** 
  2.  
  3.  * <b>function:</b>转换List对象 
  4.  
  5.  * @author hoojo 
  6.  
  7.  * @createDate 2011-4-27 下午06:20:02 
  8.  
  9.  * @return 
  10.  
  11.  */  
  12.   
  13. @RequestMapping("/doListXMLXStream")  
  14.   
  15. public ModelAndView doListXMLXStreamView() {  
  16.   
  17.     System.out.println("#################ViewController doListXMLXStreamView##################");  
  18.   
  19.     ModelAndView mav = new ModelAndView("xStreamMarshallingView");  
  20.   
  21.     List<Object> beans = new ArrayList<Object>();   
  22.   
  23.     for (int i = 0; i < 3; i++) {  
  24.   
  25.         Account bean = new Account();  
  26.   
  27.         bean.setAddress("北京#" + i);  
  28.   
  29.         bean.setEmail("email" + i + "@12" + i + ".com");  
  30.   
  31.         bean.setId(1 + i);  
  32.   
  33.         bean.setName("haha#" + i);  
  34.   
  35.         Brithday day = new Brithday();  
  36.   
  37.         day.setBrithday("2010-11-2" + i);  
  38.   
  39.         bean.setBrithday(day);  
  40.   
  41.         beans.add(bean);  
  42.   
  43.           
  44.   
  45.         User user = new User();  
  46.   
  47.         user.setAddress("china GuangZhou 广州# " + i);  
  48.   
  49.         user.setAge(23 + i);  
  50.   
  51.         user.setBrithday(new Date());  
  52.   
  53.         user.setName("jack#" + i);  
  54.   
  55.         user.setSex(Boolean.parseBoolean(i + ""));  
  56.   
  57.         beans.add(user);  
  58.   
  59.     }  
  60.   
  61.       
  62.   
  63.     mav.addObject(beans);  
  64.   
  65.     return mav;  
  66.   
  67. }  

在WebBrowser中请求http://localhost:8080/SpringMVC4View/xStream/view/doListXMLXStream.do

结果如下:

[java]  view plain copy
  1. <list>  
  2. <myBeans><id>1</id><name>haha#0</name><email>email0@120.com</email><address>北京#0</address><生日><brithday>2010-11-20</brithday></生日></myBeans><com.hoo.entity.User><name>jack#0</name><age>23</age><sex>false</sex><address>china GuangZhou 广州# 0</address><brithday>2011-04-27 19:08:40.106 CST</brithday></com.hoo.entity.User><myBeans><id>2</id><name>haha#1</name><email>email1@121.com</email><address>北京#1</address><生日><brithday>2010-11-21</brithday></生日></myBeans><com.hoo.entity.User><name>jack#1</name><age>24</age><sex>false</sex><address>china GuangZhou 广州# 1</address><brithday>2011-04-27 19:08:40.106 CST</brithday></com.hoo.entity.User><myBeans><id>3</id><name>haha#2</name><email>email2@122.com</email><address>北京#2</address><生日><brithday>2010-11-22</brithday></生日></myBeans><com.hoo.entity.User><name>jack#2</name><age>25</age><sex>false</sex><address>china GuangZhou 广州# 2</address><brithday>2011-04-27 19:08:40.106 CST</brithday></com.hoo.entity.User></list>  

总结,xStream相对jaxb2要简单些。而且相对比较灵活,可以轻易的转换Java普通类型。

 

下次会介绍castor转换XML、jibx转换XML、Jackson转换JSON 以及自定义Jsonlib视图转换Json。



你可能感兴趣的:(springMVC)