- 浏览: 156689 次
文章分类
- 全部博客 (141)
- js 异步加载 (1)
- 延迟触发 jquery (1)
- android (2)
- Maven Spring Ibatis (1)
- android多线程 (1)
- 技术文章 (2)
- 面试总结 (3)
- Java (3)
- Java程序员 (1)
- linux (2)
- 【Android开发学习之路】 (1)
- ios 技术点 (1)
- Javascript (2)
- 心得 8月 (1)
- 架构师之路 (1)
- leopard dm365 gstreamer (1)
- Oracle (2)
- VC++ (1)
- BFS (1)
- [C++] (1)
- 管理 (1)
- 图像处理 (1)
- DP (2)
- 数据库(SQL Server) (1)
- 系统分析 (1)
- ACM ----- 做不出来刷水题健身 (1)
- 错误笔记 (1)
- 数据库学习 (1)
- Android学习记录 (1)
- 数据库 (1)
- 排序 (1)
- 线段树 (1)
- 散文 (1)
- android开发 (1)
- 杂谈 (1)
- 业务逻辑层 (1)
- 微软等数据结构与算法面试100题 (1)
- c++ (1)
- 数据结构 (1)
- ACM ----基础题 (1)
- ACM_计算几何 (1)
- 学习 (1)
- python与网络编程 (1)
最新评论
-
不死咸鱼:
需要购买视频
JBPM4+ExtJS实战视频教程 -
iame:
good,打算在新项目中使用,thanks
javascript模版引擎-tmpl的bug修复与性能优化 -
lhf1990729:
图片打不开啊。少年。。
[置顶] 通向架构师的道路(第十四天)Axis2 Web Service安全(二) -
gtrgtr:
不错...
java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor错误解决办法 -
nodejs:
这个世界这是怎么了?http://nodejs.iteye.c ...
代码之谜 - 为什么 jdk 中把 String 类设计成 final
SpringMVC 中整合JSON、XML视图一
SpringMVC中整合了JSON、XML的视图,可以通过这些视图完成Java对象到XML、JSON的转换。转换XML提供了MarshallingView,开发者只需用注入相应的marshaller、和属性配置,即可自动完成Java的Model对象中的数据到XML的编组。
Email:hoojo_@126.com
Blog:http://blog.csdn.net/IBM_hoojo
一、 准备工作
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包
4、 当前工程的web.xml配置
?xml version="1.0" encoding="UTF-8"?>
<!--CRLF-->
web-app version="2.4"
<!--CRLF-->
xmlns="http://java.sun.com/xml/ns/j2ee"
<!--CRLF-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--CRLF-->
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
<!--CRLF-->
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--CRLF-->
<!--CRLF-->
-- 配置Spring核心控制器 -->
<!--CRLF-->
servlet>
<!--CRLF-->
servlet-name>dispatcher/servlet-name>
<!--CRLF-->
servlet-class>org.springframework.web.servlet.DispatcherServlet/servlet-class>
<!--CRLF-->
init-param>
<!--CRLF-->
param-name>contextConfigLocation/param-name>
<!--CRLF-->
param-value>/WEB-INF/dispatcher.xml/param-value>
<!--CRLF-->
/init-param>
<!--CRLF-->
load-on-startup>1/load-on-startup>
<!--CRLF-->
/servlet>
<!--CRLF-->
<!--CRLF-->
servlet-mapping>
<!--CRLF-->
servlet-name>dispatcher/servlet-name>
<!--CRLF-->
url-pattern>*.do/url-pattern>
<!--CRLF-->
/servlet-mapping>
<!--CRLF-->
<!--CRLF-->
-- 解决工程编码过滤器 -->
<!--CRLF-->
filter>
<!--CRLF-->
filter-name>characterEncodingFilter/filter-name>
<!--CRLF-->
filter-class>org.springframework.web.filter.CharacterEncodingFilter/filter-class>
<!--CRLF-->
init-param>
<!--CRLF-->
param-name>encoding/param-name>
<!--CRLF-->
param-value>UTF-8/param-value>
<!--CRLF-->
/init-param>
<!--CRLF-->
/filter>
<!--CRLF-->
<!--CRLF-->
filter-mapping>
<!--CRLF-->
filter-name>characterEncodingFilter/filter-name>
<!--CRLF-->
url-pattern>/*/url-pattern>
<!--CRLF-->
/filter-mapping>
<!--CRLF-->
<!--CRLF-->
welcome-file-list>
<!--CRLF-->
welcome-file>index.jsp/welcome-file>
<!--CRLF-->
/welcome-file-list>
<!--CRLF-->
/web-app>
<!--CRLF-->
5、 WEB-INF中的dispatcher.xml配置
?xml version="1.0" encoding="UTF-8"?>
<!--CRLF-->
beans xmlns="http://www.springframework.org/schema/beans"
<!--CRLF-->
xmlns:mvc="http://www.springframework.org/schema/mvc"
<!--CRLF-->
xmlns:context="http://www.springframework.org/schema/context"
<!--CRLF-->
xmlns:util="http://www.springframework.org/schema/util"
<!--CRLF-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--CRLF-->
xsi:schemaLocation="http://www.springframework.org/schema/beans
<!--CRLF-->
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
<!--CRLF-->
http://www.springframework.org/schema/mvc
<!--CRLF-->
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
<!--CRLF-->
http://www.springframework.org/schema/context
<!--CRLF-->
http://www.springframework.org/schema/context/spring-context-3.0.xsd
<!--CRLF-->
http://www.springframework.org/schema/util
<!--CRLF-->
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<!--CRLF-->
<!--CRLF-->
-- 注解探测器 -->
<!--CRLF-->
context:component-scan base-package="com.hoo.controller"/>
<!--CRLF-->
<!--CRLF-->
-- 视图解析器,根据视图的名称new ModelAndView(name),在配置文件查找对应的bean配置 -->
<!--CRLF-->
bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<!--CRLF-->
property name="order" value="1"/>
<!--CRLF-->
/bean>
<!--CRLF-->
<!--CRLF-->
bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--CRLF-->
property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!--CRLF-->
/bean>
<!--CRLF-->
/beans>
<!--CRLF-->
启动后,可以看到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的视图,配置如下:
-- xml视图,Jaxb2Marshaller,需要配置对象和对象添加Annotation xml注解,不需要添加额外的jar包 -->
<!--CRLF-->
bean name="jaxb2MarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
<!--CRLF-->
constructor-arg>
<!--CRLF-->
bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<!--CRLF-->
property name="classesToBeBound">
<!--CRLF-->
array>
<!--CRLF-->
value>com.hoo.entity.User/value>
<!--CRLF-->
value>com.hoo.entity.AccountBean/value>
<!--CRLF-->
value>com.hoo.entity.MapBean/value>
<!--CRLF-->
value>com.hoo.entity.ListBean/value>
<!--CRLF-->
/array>
<!--CRLF-->
/property>
<!--CRLF-->
/bean>
<!--CRLF-->
/constructor-arg>
<!--CRLF-->
/bean>
<!--CRLF-->
Jaxb2的jar在jdk中已经包含,所以不需要添加额外的jar包。详细信息你可以参考1中的博文。上面的jaxb2MarshallingView视图的class是MarshallingView,它有一个构造器需要传递一个Marshaller。Marshaller主要完成编组,即将Java对象转换成XML的这么一个东东。我们在这个构造器中注入了Jaxb2Marshaller这个类,这个bean有一个classesToBeBound属性,这个属性是一个数组。需要将即将转换成XML的Java对象配置在这里。而且这些对象需要进行Annotation注解。
3、 创建Jaxb2MarshallingViewController,完成Java对象到XML的转换
单个JavaBean的转换,代码如下:
package com.hoo.controller;
<!--CRLF-->
<!--CRLF-->
import java.util.ArrayList;
<!--CRLF-->
import java.util.Date;
<!--CRLF-->
import java.util.List;
<!--CRLF-->
import org.springframework.stereotype.Controller;
<!--CRLF-->
import org.springframework.web.bind.annotation.RequestMapping;
<!--CRLF-->
import org.springframework.web.servlet.ModelAndView;
<!--CRLF-->
import com.hoo.entity.AccountBean;
<!--CRLF-->
import com.hoo.entity.Brithday;
<!--CRLF-->
import com.hoo.entity.DifferBean;
<!--CRLF-->
import com.hoo.entity.ListBean;
<!--CRLF-->
import com.hoo.entity.MoreBean;
<!--CRLF-->
import com.hoo.entity.User;
<!--CRLF-->
<!--CRLF-->
/**
<!--CRLF-->
* function:Jaxb2MarshallingView 视图,利用Jaxb2进行Java对象到XML的转换技术
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午03:20:23
<!--CRLF-->
* @file Jaxb2MarshallingViewController.java
<!--CRLF-->
* @package com.hoo.controller
<!--CRLF-->
* @project SpringMVC4View
<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
* @email hoojo_@126.com
<!--CRLF-->
* @version 1.0
<!--CRLF-->
*/
<!--CRLF-->
@Controller<!--CRLF-->
@RequestMapping("/jaxb2/view")
<!--CRLF-->
public class Jaxb2MarshallingViewController {<!--CRLF-->
<!--CRLF-->
/*
<!--CRLF-->
* MarshallingView Jaxb2Marshaller 需要配置转换成xml的java对象的Annotation
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doXMLJaxb2")
<!--CRLF-->
public ModelAndView doXMLJaxb2View() {
<!--CRLF-->
System.out.println("#################ViewController doXMLJaxb2View##################");
<!--CRLF-->
ModelAndView mav = new ModelAndView("jaxb2MarshallingView");<!--CRLF-->
<!--CRLF-->
AccountBean bean = new AccountBean();
<!--CRLF-->
bean.setAddress("address");
<!--CRLF-->
bean.setEmail("email");
<!--CRLF-->
bean.setId(1);<!--CRLF-->
bean.setName("haha");
<!--CRLF-->
Brithday day = new Brithday();
<!--CRLF-->
day.setBrithday("2010-11-22");
<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
<!--CRLF-->
mav.addObject(bean);<!--CRLF-->
<!--CRLF-->
return mav;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
上面的代码的ModelAndView配置了jaxb2MarshallingView这个视图,就表示结果集会通过这个视图进行编组后显示。上面需要转换的AccountBean和Birthday对象,这些对象需要配置annotation,前面已经讲到annotation对JavaBean转换XML的作用。我们来看看AccountBean对象代码:
package com.hoo.entity;
<!--CRLF-->
<!--CRLF-->
import javax.xml.bind.annotation.XmlElement;
<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;
<!--CRLF-->
<!--CRLF-->
@XmlRootElement(name = "account")
<!--CRLF-->
public class AccountBean {<!--CRLF-->
private int id;<!--CRLF-->
private String name;
<!--CRLF-->
private String email;
<!--CRLF-->
private String address;
<!--CRLF-->
private Brithday brithday;
<!--CRLF-->
<!--CRLF-->
@XmlElement<!--CRLF-->
public Brithday getBrithday() {
<!--CRLF-->
return brithday;
<!--CRLF-->
}<!--CRLF-->
public void setBrithday(Brithday brithday) {<!--CRLF-->
this.brithday = brithday;
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@XmlElement<!--CRLF-->
public int getId() {<!--CRLF-->
return id;
<!--CRLF-->
}<!--CRLF-->
public void setId(int id) {<!--CRLF-->
this.id = id;
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@XmlElement<!--CRLF-->
public String getName() {
<!--CRLF-->
return name;
<!--CRLF-->
}<!--CRLF-->
public void setName(String name) {<!--CRLF-->
this.name = name;
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@XmlElement<!--CRLF-->
public String getEmail() {
<!--CRLF-->
return email;
<!--CRLF-->
}<!--CRLF-->
public void setEmail(String email) {<!--CRLF-->
this.email = email;
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@XmlElement<!--CRLF-->
public String getAddress() {
<!--CRLF-->
return address;
<!--CRLF-->
}<!--CRLF-->
public void setAddress(String address) {<!--CRLF-->
this.address = address;
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
@Override<!--CRLF-->
public String toString() {
<!--CRLF-->
return this.name + "#" + this.id + "#" + this.address + "#" + this.brithday + "#" + this.email;<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
在getter方法都有部分注解,如果你想了解更多的jaxb2的相关技术,参考:http://www.cnblogs.com/hoojo/archive/2011/04/26/2029011.html
Brithday
package com.hoo.entity;
<!--CRLF-->
<!--CRLF-->
public class Brithday {<!--CRLF-->
private String brithday;
<!--CRLF-->
<!--CRLF-->
public Brithday() {}
<!--CRLF-->
<!--CRLF-->
public Brithday(String brithday) {
<!--CRLF-->
this.brithday = brithday;
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
public String getBrithday() {
<!--CRLF-->
return brithday;
<!--CRLF-->
}<!--CRLF--> <!--CRLF-->
public void setBrithday(String brithday) {<!--CRLF-->
this.brithday = brithday;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
Brithday是AccountBean中的一个属性,在AccountBean中已经注解过。这里就不需要进行注解配置。
通过浏览器请求:http://localhost:8080/SpringMVC4View/jaxb2/view/doXMLJaxb2.do
结果如下:
?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--CRLF-->
account>address>address/address>brithday>brithday>2010-11-22/brithday>/brithday>
<!--CRLF-->
email>email/email>id>1/id>name>haha/name>/account>
<!--CRLF-->
4、 转换带List属性的JavaEntity
/**
<!--CRLF-->
* function:转换带有List属性的JavaBean
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午05:32:22
<!--CRLF-->
* @return
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doListXMLJaxb2")<!--CRLF-->
public ModelAndView doListXMLJaxb2View() {<!--CRLF-->
System.out.println("#################ViewController doListXMLJaxb2View##################");<!--CRLF-->
ModelAndView mav = new ModelAndView("jaxb2MarshallingView");<!--CRLF-->
ListObject> beans = new ArrayListObject>();
<!--CRLF-->
for (int i = 0; i 3; i++) {<!--CRLF-->
AccountBean bean = new AccountBean();<!--CRLF-->
bean.setAddress("address#" + i);<!--CRLF-->
bean.setEmail("email" + i + "@12" + i + ".com");<!--CRLF-->
bean.setId(1 + i);<!--CRLF-->
bean.setName("haha#" + i);<!--CRLF-->
Brithday day = new Brithday();<!--CRLF-->
day.setBrithday("2010-11-2" + i);<!--CRLF-->
bean.setBrithday(day);
<!--CRLF-->
beans.add(bean);
<!--CRLF-->
<!--CRLF-->
User user = new User();<!--CRLF-->
user.setAddress("china GuangZhou# " + i);<!--CRLF-->
user.setAge(23 + i);<!--CRLF-->
user.setBrithday(new Date());
<!--CRLF-->
user.setName("jack#" + i);<!--CRLF-->
user.setSex(Boolean.parseBoolean(i + ""));<!--CRLF-->
beans.add(user);
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
ListBean list = new ListBean();<!--CRLF-->
list.setList(beans);
<!--CRLF-->
mav.addObject(list);<!--CRLF-->
<!--CRLF-->
return mav;<!--CRLF-->
}<!--CRLF-->
package com.hoo.entity;
<!--CRLF-->
<!--CRLF-->
import java.util.List;
<!--CRLF-->
import javax.xml.bind.annotation.XmlElement;
<!--CRLF-->
import javax.xml.bind.annotation.XmlElements;
<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;
<!--CRLF-->
<!--CRLF-->
@SuppressWarnings("unchecked")
<!--CRLF-->
@XmlRootElement<!--CRLF-->
public class ListBean {<!--CRLF-->
private String name;
<!--CRLF-->
private List list;
<!--CRLF-->
<!--CRLF-->
@XmlElements({<!--CRLF-->
@XmlElement(name = "user", type = User.class),<!--CRLF-->
@XmlElement(name = "account", type = AccountBean.class),<!--CRLF-->
})<!--CRLF-->
public List getList() {
<!--CRLF-->
return list;
<!--CRLF-->
}<!--CRLF--> <!--CRLF-->
public void setList(List list) {<!--CRLF-->
this.list = list;
<!--CRLF-->
}<!--CRLF--> <!--CRLF-->
public String getName() {
<!--CRLF-->
return name;
<!--CRLF-->
}<!--CRLF--> <!--CRLF-->
public void setName(String name) {<!--CRLF-->
this.name = name;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
通过上面的注解可以看出List中只能存储User、AccountBean对象,关于User对象的代码和AccountBean对象的是一样的,只是类名不同而已。读者可以自己添加。在WebBrowser中请求:http://localhost:8080/SpringMVC4View/jaxb2/view/doListXMLJaxb2.do
结果如下:
?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--CRLF-->
listBean>
<!--CRLF-->
account>address>address#0/address>brithday>brithday>2010-11-20/brithday>/brithday>
<!--CRLF-->
email>email0@120.com/email>id>1/id>name>haha#0/name>/account>
<!--CRLF-->
user>address>china GuangZhou# 0/address>age>23/age>
<!--CRLF-->
brithday>2011-04-27T17:02:38.028+08:00/brithday>name>jack#0/name>sex>false/sex>/user>
<!--CRLF-->
account>address>address#1/address>brithday>brithday>2010-11-21/brithday>/brithday>
<!--CRLF-->
email>email1@121.com/email>id>2/id>name>haha#1/name>/account>
<!--CRLF-->
user>address>china GuangZhou# 1/address>age>24/age>
<!--CRLF-->
brithday>2011-04-27T17:02:38.028+08:00/brithday>name>jack#1/name>sex>false/sex>/user>
<!--CRLF-->
account>address>address#2/address>brithday>brithday>2010-11-22/brithday>/brithday>
<!--CRLF-->
email>email2@122.com/email>id>3/id>name>haha#2/name>/account>
<!--CRLF-->
user>address>china GuangZhou# 2/address>age>25/age>
<!--CRLF-->
brithday>2011-04-27T17:02:38.028+08:00/brithday>name>jack#2/name>sex>false/sex>/user>
<!--CRLF-->
/listBean>
<!--CRLF-->
5、 转换带有Map属性的JavaBean,Jaxb2转换Map有点复杂,先看看代码:
/**
<!--CRLF-->
* function:转换带有Map属性的JavaBean
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午05:32:42
<!--CRLF-->
* @return
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doMapXMLJaxb2")
<!--CRLF-->
public ModelAndView doMapXMLJaxb2View() {
<!--CRLF-->
System.out.println("#################ViewController doMapXMLJaxb2View##################");
<!--CRLF-->
ModelAndView mav = new ModelAndView("jaxb2MarshallingView");<!--CRLF-->
<!--CRLF-->
MapBean mapBean = new MapBean();
<!--CRLF-->
<!--CRLF-->
HashMap<string accountbean> map = <span style="color: #0000ff">new</span> HashMap<string accountbean>();</string></string><!--CRLF-->
AccountBean bean = new AccountBean();
<!--CRLF-->
bean.setAddress("北京");
<!--CRLF-->
bean.setEmail("email");
<!--CRLF-->
bean.setId(1);<!--CRLF-->
bean.setName("jack");
<!--CRLF-->
Brithday day = new Brithday();
<!--CRLF-->
day.setBrithday("2010-11-22");
<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
map.put("NO1", bean);
<!--CRLF-->
<!--CRLF-->
bean = new AccountBean();
<!--CRLF-->
bean.setAddress("china");
<!--CRLF-->
bean.setEmail("tom@125.com");
<!--CRLF-->
bean.setId(2);<!--CRLF-->
bean.setName("tom");
<!--CRLF-->
day = new Brithday("2011-11-22");<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
map.put("NO2", bean);
<!--CRLF-->
<!--CRLF-->
mapBean.setMap(map);<!--CRLF-->
<!--CRLF-->
mav.addObject(mapBean);<!--CRLF-->
<!--CRLF-->
return mav;
<!--CRLF-->
}<!--CRLF-->
首先看看MapBean的代码,代码很简单就一个Map的属性。
package com.hoo.entity;
<!--CRLF-->
<!--CRLF-->
import java.util.HashMap;
<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;
<!--CRLF-->
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
<!--CRLF-->
import com.hoo.util.MapAdapter;
<!--CRLF-->
<!--CRLF-->
@XmlRootElement<!--CRLF-->
public class MapBean {<!--CRLF-->
private HashMap<string accountbean> map;</string>
<!--CRLF-->
<!--CRLF-->
@XmlJavaTypeAdapter(MapAdapter.class)
<!--CRLF-->
public HashMap<string accountbean> getMap() {</string>
<!--CRLF-->
return map;
<!--CRLF-->
}<!--CRLF-->
public void setMap(HashMap<string accountbean> map) {</string><!--CRLF-->
this.map = map;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
上面的代码的getMap方法设置了XmlJavaTypeAdapter这个注解,注解里面的MapAdapter是我们自己实现的,而且还要构建一个MapElements数组元素。主要是继承XmlAdapter重写里面的几个方法完成的。
MapAdapter代码
package com.hoo.util;
<!--CRLF-->
<!--CRLF-->
import java.util.HashMap;
<!--CRLF-->
import java.util.Map;
<!--CRLF-->
import javax.xml.bind.annotation.adapters.XmlAdapter;
<!--CRLF-->
import com.hoo.entity.AccountBean;
<!--CRLF-->
<!--CRLF-->
/**
<!--CRLF-->
* function:AccountBean 编组、解组的XmlAdapter
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-25 下午05:03:18
<!--CRLF-->
* @file MyAdetper.java
<!--CRLF-->
* @package com.hoo.util
<!--CRLF-->
* @project WebHttpUtils
<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
* @email hoojo_@126.com
<!--CRLF-->
* @version 1.0
<!--CRLF-->
*/
<!--CRLF-->
public class MapAdapter extends XmlAdapter<mapelements map accountbean>> {</mapelements><!--CRLF-->
public MapElements[] marshal(Map<string accountbean> arg0) <span style="color: #0000ff">throws</span> Exception {</string>
<!--CRLF-->
MapElements[] mapElements = new MapElements[arg0.size()];
<!--CRLF-->
<!--CRLF-->
int i = 0;
<!--CRLF-->
for (Map.Entry<string accountbean> entry : arg0.entrySet())</string>
<!--CRLF-->
mapElements[i++] = new MapElements(entry.getKey(), entry.getValue());
<!--CRLF-->
<!--CRLF-->
return mapElements;
<!--CRLF-->
}<!--CRLF--> <!--CRLF-->
public Map<string accountbean> unmarshal(MapElements[] arg0) <span style="color: #0000ff">throws</span> Exception {</string>
<!--CRLF-->
Map<string accountbean> r = <span style="color: #0000ff">new</span> HashMap<string accountbean>();</string></string><!--CRLF-->
for (MapElements mapelement : arg0)
<!--CRLF-->
r.put(mapelement.key, mapelement.value);<!--CRLF-->
return r;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
MapElements代码
package com.hoo.util;
<!--CRLF-->
<!--CRLF-->
import javax.xml.bind.annotation.XmlElement;
<!--CRLF-->
import com.hoo.entity.AccountBean;
<!--CRLF-->
<!--CRLF-->
/**
<!--CRLF-->
* function: MapElements
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-25 下午05:04:04
<!--CRLF-->
* @file MyElements.java
<!--CRLF-->
* @package com.hoo.util
<!--CRLF-->
* @project WebHttpUtils
<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
* @email hoojo_@126.com
<!--CRLF-->
* @version 1.0
<!--CRLF-->
*/
<!--CRLF-->
public class MapElements {<!--CRLF-->
@XmlElement<!--CRLF-->
public String key;
<!--CRLF-->
<!--CRLF-->
@XmlElement<!--CRLF-->
public AccountBean value;
<!--CRLF-->
<!--CRLF-->
@SuppressWarnings("unused")
<!--CRLF-->
private MapElements() {
<!--CRLF-->
} // Required by JAXB
<!--CRLF-->
<!--CRLF-->
public MapElements(String key, AccountBean value) {
<!--CRLF-->
this.key = key;
<!--CRLF-->
this.value = value;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
在浏览器中请求:http://localhost:8080/SpringMVC4View/jaxb2/view/doMapXMLJaxb2.do
结果如下:
?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--CRLF-->
mapBean>map>item>key>NO2/key>value>address>china/address>
<!--CRLF-->
brithday>brithday>2011-11-22/brithday>/brithday>
<!--CRLF-->
email>tom@125.com/email>id>2/id>name>tom/name>/value>/item>
<!--CRLF-->
item>key>NO1/key>value>address>北京/address>brithday>brithday>2010-11-22/brithday>/brithday>
<!--CRLF-->
email>email/email>id>1/id>name>jack/name>/value>/item>/map>
<!--CRLF-->
/mapBean>
<!--CRLF-->
总结,如果你想将一些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中添加如下配置
-- xml视图,XStreamMarshaller,可以转换任何形式的java对象,需要添加xStream jar包 -->
<!--CRLF-->
bean name="xStreamMarshallingView" class="org.springframework.web.servlet.view.xml.MarshallingView">
<!--CRLF-->
property name="marshaller">
<!--CRLF-->
bean class="org.springframework.oxm.xstream.XStreamMarshaller">
<!--CRLF-->
-- 启用annotation -->
<!--CRLF-->
property name="autodetectAnnotations" value="true"/>
<!--CRLF-->
-- 类名别名 -->
<!--CRLF-->
property name="aliases">
<!--CRLF-->
map>
<!--CRLF-->
-- Account这个类的别名就变成了myBeans,那么转换后的xml中就是myBeans -->
<!--CRLF-->
entry key="myBeans" value="com.hoo.entity.Account"/>
<!--CRLF-->
/map>
<!--CRLF-->
/property>
<!--CRLF-->
-- 基本属性别名 -->
<!--CRLF-->
property name="fieldAliases">
<!--CRLF-->
map>
<!--CRLF-->
-- Account中的brithday这个属性 -->
<!--CRLF-->
entry key="com.hoo.entity.Account.brithday" value="生日"/>
<!--CRLF-->
/map>
<!--CRLF-->
/property>
<!--CRLF-->
/bean>
<!--CRLF-->
/property>
<!--CRLF-->
/bean>
<!--CRLF-->
上次配置的参数有注释描述,还要没有配置的参数。如: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
package com.hoo.controller;
<!--CRLF-->
<!--CRLF-->
import java.util.ArrayList;
<!--CRLF-->
import java.util.Date;
<!--CRLF-->
import java.util.HashMap;
<!--CRLF-->
import java.util.List;
<!--CRLF-->
import java.util.Map;
<!--CRLF-->
import org.springframework.stereotype.Controller;
<!--CRLF-->
import org.springframework.web.bind.annotation.RequestMapping;
<!--CRLF-->
import org.springframework.web.servlet.ModelAndView;
<!--CRLF-->
import com.hoo.entity.Account;
<!--CRLF-->
import com.hoo.entity.AccountArray;
<!--CRLF-->
import com.hoo.entity.AccountBean;
<!--CRLF-->
import com.hoo.entity.Brithday;
<!--CRLF-->
import com.hoo.entity.DifferBean;
<!--CRLF-->
import com.hoo.entity.ListBean;
<!--CRLF-->
import com.hoo.entity.MapBean;
<!--CRLF-->
import com.hoo.entity.MoreBean;
<!--CRLF-->
import com.hoo.entity.User;
<!--CRLF-->
<!--CRLF-->
/**
<!--CRLF-->
* function:Jaxb2MarshallingView 视图,利用Jaxb2进行Java对象到XML的转换技术
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午03:20:23
<!--CRLF-->
* @file Jaxb2MarshallingViewController.java
<!--CRLF-->
* @package com.hoo.controller
<!--CRLF-->
* @project SpringMVC4View
<!--CRLF-->
* @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
* @email hoojo_@126.com
<!--CRLF-->
* @version 1.0
<!--CRLF-->
*/
<!--CRLF-->
@Controller<!--CRLF-->
@RequestMapping("/jaxb2/view")
<!--CRLF-->
public class Jaxb2MarshallingViewController {<!--CRLF-->
<!--CRLF-->
/*
<!--CRLF-->
* MarshallingView Jaxb2Marshaller 需要配置转换成xml的java对象的Annotation
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doXMLJaxb2")
<!--CRLF-->
public ModelAndView doXMLJaxb2View() {
<!--CRLF-->
System.out.println("#################ViewController doXMLJaxb2View##################");
<!--CRLF-->
ModelAndView mav = new ModelAndView("jaxb2MarshallingView");<!--CRLF-->
<!--CRLF-->
AccountBean bean = new AccountBean();
<!--CRLF-->
bean.setAddress("address");
<!--CRLF-->
bean.setEmail("email");
<!--CRLF-->
bean.setId(1);<!--CRLF-->
bean.setName("haha");
<!--CRLF-->
Brithday day = new Brithday();
<!--CRLF-->
day.setBrithday("2010-11-22");
<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
<!--CRLF-->
mav.addObject(bean);<!--CRLF-->
<!--CRLF-->
return mav;
<!--CRLF-->
}<!--CRLF-->
}<!--CRLF-->
AccountBean上面的代码已经给出,这里就不重复了。值得说明的是xStream在ModelAndView中,直接用addObject方法添加时,有时候出现一些不是我们转换的对象的信息,一般是BindingResult的xml信息。解决办法就是设置addObject的key。Key设置为BindingResult.MODEL_KEY_PREFIX这样就可以了,代码上面已经给出。
在浏览器中请求:http://localhost:8080/SpringMVC4View/xStream/view/doXMLXStream.do
结果如下:
com.hoo.entity.AccountBean>id>1/id>name>haha/name>email>email/email>address>北京/address>
<!--CRLF-->
brithday>brithday>2010-11-22/brithday>/brithday>/com.hoo.entity.AccountBean>
<!--CRLF-->
4、 转换对象数组
代码如下:
/**
<!--CRLF-->
* function:转换对象数组
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午06:19:40
<!--CRLF-->
* @return
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doMoreXMLXStream")
<!--CRLF-->
public ModelAndView doMoreXMLXStreamView() {
<!--CRLF-->
System.out.println("#################ViewController doMoreXMLXStreamView##################");
<!--CRLF-->
ModelAndView mav = new ModelAndView("xStreamMarshallingView");<!--CRLF-->
Account[] accs = new Account[2];
<!--CRLF-->
Account bean = new Account();
<!--CRLF-->
bean.setAddress("北京");
<!--CRLF-->
bean.setEmail("email");
<!--CRLF-->
bean.setId(1);<!--CRLF-->
bean.setName("haha");
<!--CRLF-->
Brithday day = new Brithday();
<!--CRLF-->
day.setBrithday("2010-11-22");
<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
accs[0] = bean;<!--CRLF-->
<!--CRLF-->
bean = new Account();
<!--CRLF-->
bean.setAddress("上海");
<!--CRLF-->
bean.setEmail("email");
<!--CRLF-->
bean.setId(1);<!--CRLF-->
bean.setName("haha");
<!--CRLF-->
day = new Brithday();
<!--CRLF-->
day.setBrithday("2010-11-22");
<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
accs[1] = bean;<!--CRLF-->
mav.addObject(accs);<!--CRLF-->
return mav;
<!--CRLF-->
}<!--CRLF-->
在WebBrowser中请求http://localhost:8080/SpringMVC4View/xStream/view/doMoreXMLXStream.do
结果如下:
myBeans-array>myBeans>id>1/id>name>haha/name>email>email/email>
<!--CRLF-->
address>北京/address>生日>brithday>2010-11-22/brithday>/生日>/myBeans>
<!--CRLF-->
myBeans>id>1/id>name>haha/name>email>email/email>address>上海/address>
<!--CRLF-->
生日>brithday>2010-11-22/brithday>/生日>/myBeans>/myBeans-array>
<!--CRLF-->
结果中的myBeans、生日就是在dispatcher配置文件中重命名的对象属性名称。
5、 转换Map集合
/**
<!--CRLF-->
* function:转换Map对象
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午06:19:48
<!--CRLF-->
* @return
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doDifferXMLXStream")
<!--CRLF-->
public ModelAndView doDifferXMLXStreamView() {
<!--CRLF-->
System.out.println("#################ViewController doDifferXMLXStreamView##################");
<!--CRLF-->
ModelAndView mav = new ModelAndView("xStreamMarshallingView");<!--CRLF-->
<!--CRLF-->
Account bean = new Account();
<!--CRLF-->
bean.setAddress("广东");
<!--CRLF-->
bean.setEmail("email");
<!--CRLF-->
bean.setId(1);<!--CRLF-->
bean.setName("haha");
<!--CRLF-->
Brithday day = new Brithday();
<!--CRLF-->
day.setBrithday("2010-11-22");
<!--CRLF-->
bean.setBrithday(day);<!--CRLF-->
<!--CRLF-->
User user = new User();
<!--CRLF-->
user.setAddress("china GuangZhou");
<!--CRLF-->
user.setAge(23);<!--CRLF-->
user.setBrithday(new Date());
<!--CRLF-->
user.setName("jack");
<!--CRLF-->
user.setSex(true);<!--CRLF-->
<!--CRLF-->
Map<string object> map = <span style="color: #0000ff">new</span> HashMap<string object>();</string></string><!--CRLF-->
map.put("bean", bean);
<!--CRLF-->
map.put("user", user);
<!--CRLF-->
mav.addObject(map);<!--CRLF-->
return mav;
<!--CRLF-->
}<!--CRLF-->
在WebBrowser中请求http://localhost:8080/SpringMVC4View/xStream/view/doDifferXMLXStream.do
结果如下:
map>entry>
<!--CRLF-->
string>bean/string>myBeans>id>1/id>name>haha/name>email>email/email>
<!--CRLF-->
address>广东/address>生日>brithday>2010-11-22/brithday>/生日>/myBeans>
<!--CRLF-->
/entry>entry>string>user/string>com.hoo.entity.User>name>jack/name>age>23/age>sex>true/sex>
<!--CRLF-->
address>china GuangZhou/address>brithday>2011-04-27 19:02:13.747 CST/brithday>/com.hoo.entity.User>
<!--CRLF-->
/entry>/map>
<!--CRLF-->
6、 转换List集合
/**
<!--CRLF-->
* function:转换List对象
<!--CRLF-->
* @author hoojo
<!--CRLF-->
* @createDate 2011-4-27 下午06:20:02
<!--CRLF-->
* @return
<!--CRLF-->
*/
<!--CRLF-->
@RequestMapping("/doListXMLXStream")<!--CRLF-->
public ModelAndView doListXMLXStreamView() {<!--CRLF-->
System.out.println("#################ViewController doListXMLXStreamView##################");<!--CRLF-->
ModelAndView mav = new ModelAndView("xStreamMarshallingView");<!--CRLF-->
ListObject> beans = new ArrayListObject>();
<!--CRLF-->
for (int i = 0; i 3; i++) {<!--CRLF-->
Account bean = new Account();<!--CRLF-->
bean.setAddress("北京#" + i);<!--CRLF-->
bean.setEmail("email" + i + "@12" + i + ".com");<!--CRLF-->
bean.setId(1 + i);<!--CRLF-->
bean.setName("haha#" + i);<!--CRLF-->
Brithday day = new Brithday();<!--CRLF-->
day.setBrithday("2010-11-2" + i);<!--CRLF-->
bean.setBrithday(day);
<!--CRLF-->
beans.add(bean);
<!--CRLF-->
<!--CRLF-->
User user = new User();<!--CRLF-->
user.setAddress("china GuangZhou 广州# " + i);<!--CRLF-->
user.setAge(23 + i);<!--CRLF-->
user.setBrithday(new Date());
<!--CRLF-->
user.setName("jack#" + i);<!--CRLF-->
user.setSex(Boolean.parseBoolean(i + ""));<!--CRLF-->
beans.add(user);
<!--CRLF-->
}<!--CRLF-->
<!--CRLF-->
mav.addObject(beans);<!--CRLF-->
return mav;<!--CRLF-->
}<!--CRLF-->
在WebBrowser中请求http://localhost:8080/SpringMVC4View/xStream/view/doListXMLXStream.do
结果如下:
list>
<!--CRLF-->
myBeans>id>1/id>name>haha#0/name>email>email0@120.com/email>address>北京#0/address>生日>
<!--CRLF-->
brithday>2010-11-20/brithday>/生日>/myBeans>
<!--CRLF-->
com.hoo.entity.User>name>jack#0/name>age>23/age>sex>false/sex>address>china GuangZhou 广州# 0/address>
<!--CRLF-->
brithday>2011-04-27 19:08:40.106 CST/brithday>/com.hoo.entity.User>
<!--CRLF-->
myBeans>id>2/id>name>haha#1/name>email>email1@121.com/email>address>北京#1/address>生日>
<!--CRLF-->
brithday>2010-11-21/brithday>/生日>/myBeans>
<!--CRLF-->
com.hoo.entity.User>name>jack#1/name>age>24/age>sex>false/sex>address>china GuangZhou 广州# 1/address>
<!--CRLF-->
brithday>2011-04-27 19:08:40.106 CST/brithday>/com.hoo.entity.User>
<!--CRLF-->
myBeans>id>3/id>name>haha#2/name>email>email2@122.com/email>address>北京#2/address>生日>
<!--CRLF-->
brithday>2010-11-22/brithday>/生日>/myBeans>
<!--CRLF-->
com.hoo.entity.User>name>jack#2/name>age>25/age>sex>false/sex>address>china GuangZhou 广州# 2/address>
<!--CRLF-->
brithday>2011-04-27 19:08:40.106 CST/brithday>/com.hoo.entity.User>/list>
<!--CRLF-->
总结,xStream相对jaxb2要简单些。而且相对比较灵活,可以轻易的转换Java普通类型。
下次会介绍castor转换XML、jibx转换XML、Jackson转换JSON 以及自定义Jsonlib视图转换Json。
相关推荐
.SpringMVC中整合JSON、XML视图.pdf
.SpringMVC中整合JSON、XML视图.docx
本文将详细介绍如何在SpringMVC中集成并使用JSON和XML视图,以及相关的库如json-lib、Jackson、xStream、Jibx和Jaxb2。 首先,让我们理解JSON和XML的作用。JSON(JavaScript Object Notation)是一种轻量级的数据...
Jackson是Java中最流行的JSON库之一,它提供了解析JSON到Java对象和将Java对象序列化为JSON的能力。 1. **Jackson库**:Jackson库是Spring MVC支持JSON的核心。它包含三个主要模块:`jackson-core`、`jackson-...
在Spring MVC框架中,JSON(JavaScript Object Notation)是一种常用的数据交换格式,它被广泛用于前后端交互,尤其是在Ajax请求中。JSON因其简洁、易读的特性,成为了现代Web开发中的首选数据格式。本篇文章将深入...
《SpringMVC与JSON库的整合详解》 在现代Web开发中,SpringMVC作为一款强大的MVC框架,被广泛应用于构建企业级的Java应用程序。而JSON作为一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析和...
1. **引入依赖**:在项目中,你需要添加Spring、SpringMVC、iBatis和Json库的jar包。这些jar包包括了框架的基本功能和所需的依赖。 2. **配置Spring**:创建Spring的配置文件,配置Bean、数据源、事务管理器等,...
在这个"springMVC 多视图配置(Jsp Freemarket Json)实例"中,我们将探讨如何在 SpringMVC 中设置多种视图解析器来支持 Jsp、FreeMarker 和 Json 格式的响应。 **1. 视图解析器 (View Resolver)** 在 SpringMVC ...
SpringMVC是一个强大的Java web框架,它提供了许多高级特性,包括自动将Java对象转换为JSON或XML格式,以便与前端交互。在这个过程中,SpringMVC使用了一种称为“消息转换器”(HttpMessageConverter)的机制。让...
在这个"SpringMVC整合jdbc+json实例"中,我们将探讨如何将SpringMVC与Java数据库连接(JDBC)以及JSON数据格式相结合,以创建一个功能完善的Web应用。 首先,我们需要理解SpringMVC的核心组件: 1. **...
**SpringMVC整合jdbc+json** 是一个典型的后端开发示例,主要展示了如何在SpringMVC框架下,结合JDBC进行数据操作,并利用JSON进行数据传输。这个项目适合初学者学习,它提供了完整的配置和代码,使得可以直接运行。...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。在现代Web开发中,JSON(JavaScript Object Notation)已成为数据交换的主要格式,尤其是在前后端分离的架构中。SpringMVC...
SpringMVC作为Spring框架的一部分,提供了强大的模型-视图-控制器(MVC)架构支持,而JSON则是一种轻量级的数据交换格式,常用于前后端的数据传输。接下来,我们将深入探讨如何在MyEclipse环境下,利用SpringMVC框架...
同时,在SpringMVC配置文件中启用Json处理器,例如`dispatcher-servlet.xml`: ```xml <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> ``` 2. **...
1. **创建项目**:首先,使用Maven创建一个新的Java Web项目,设置正确的`pom.xml`文件,引入SpringMVC和相关依赖。 2. **配置SpringMVC**:在`src/main/webapp/WEB-INF`目录下创建`servlet-context.xml`,配置...
本资源提供了一个基于这些技术的实例Demo,旨在帮助开发者理解如何在IDEA中利用Gradle构建一个整合Spring MVC和Json功能的应用。 首先,我们来看**IntelliJ IDEA**。作为JetBrains公司出品的Java开发工具,IDEA以其...
spring mvc的json和xml视图,dwr及静态资源等不同种类url整合,对应博客教程地址: http://blog.csdn.net/qgmzzn1/article/details/8465969
本文将详细介绍SpringMVC与Hibernate整合所需的jar文件以及它们在整合过程中的作用。 首先,我们需要理解SpringMVC的核心组件。它包括DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、...
首先,"springmvc整合hibernate所需jar包"意味着我们需要确保项目中包含了所有必要的库文件。Spring MVC和Hibernate整合所需的jar包通常包括以下几类: 1. **Spring框架**:包括spring-context、spring-beans、...