Spring MVC接收和返回XML格式

  Spring MVC提供了处理XML格式请求响的 HttpMessageConverter,只需在 Spring Web容器中为RequestMappingHandlerAdapter装配处理XMLHttpMessageConverter,并在交互过程中通过请求Accept指定MIME类型,Sping MVC就可以使服务端的处理方法和客户端XML格式的消息进行通信。开发者无须关心通信层的数据格式,可以将精力集中到业务处理上。

  Spring MVC默认使用Jaxb2RootElementHttpMessageConverter转换XML格式的数据,JAXB(Java Architecture for XML Binding)可以很方便地生成XML,也能很方便地生成JSON,这样可以很方便地在XML 和 JSON之间进行转换。

  JAXB是一个业界标准,是一项可以根据XML Schema产生Java类的技术。在该过程中,JAXB提供了将XML文档反向生成Java对象的方法,并能将Java对象内容重新写到XML实例文档中,从而使得 Java 开发者在 Java 应用中能够很方便地处理XML数据。

  JAXB 常用的注解包括:@XmlRootElement, @XmlElement等。

  springmvc.xml文件添加注解驱动<mvc:annotation-driven />,该配置默认装配了Jaxb2RootElementHttpMessageConverter来处理XML数据的转换。

接收XML格式数据

  1. 前端发送Ajax请求,data是xml数据,contentType指定发送的数据格式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script type="text/javascript">
function sendXMLData(){
var xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone = \"yes\" ?><user><userName>admin</userName><password>admin112233</password><age>33</age></user>";
$.ajax({
url: '${pageContext.request.contextPath}/api/getXMLData',
type: 'post',
data: xmlData,
// dataType: 'text',
contentType: "application/xml",
success: function(data){
// alert(data);
console.log(data);
}
});
}
</script>
  1. 定义之实体类接收XML数据,添加XML注解
    @XmlRootElement:XML根元素,默认是实体类类名首字母小写;可设置根元素名称,但必须与接收到的XML数据的根元素名一致,如:@XmlRootElement = (name = “user”)。
    @XmlElement:设置XML内部元素,注解放在
    set
    方法上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@XmlRootElement
public class User {

private String userName;
private String password;
private int age;


public User() {
super();
}
public User(String userName, String password, int age) {
super();
this.userName = userName;
this.password = password;
this.age = age;
}
public String getUserName() {
return userName;
}
@XmlElement
public User setUserName(String userName) {
this.userName = userName;
return this;
}
public String getPassword() {
return password;
}
@XmlElement
public User setPassword(String password) {
this.password = password;
return this;
}
public int getAge() {
return age;
}
@XmlElement
public User setAge(int age) {
this.age = age;
return this;
}
@Override
public String toString() {
return "User [userName=" + userName + ", password=" + password + ", age=" + age + "]";
}
}
  1. 后台Controller接受数据
    @RequestBody将请求数据绑定到实体对象中。
    @ResponseBody返回的是实体数据,实体类加了XML注解,则会自动将实体数据转换为XML数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Controller
@RequestMapping("/api")
public class XMLController {

@RequestMapping(value = "/xml")
public String returnXMLView() {
return "sendxml";
}

/**
* 获取XML数据
* @param user
* @return
*/
@RequestMapping(value = "/getXMLData", method = {RequestMethod.POST})
@ResponseBody
public User getXMLData(@RequestBody User user) {
user.setAge(88);
System.out.println(user);
return user;
}
}

//----------上面返回的数数-------------------------------------------------
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<user>
<age>88</age>
<password>admin112233</password>
<userName>admin</userName>
</user>

返回XML格式数据

XML文件读取数据绑定到实体类,将该实体类转换成XML格式返回给前端。

  1. 前端jsp和ajax请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript" src="../static/js/jquery-1.11.3.js"></script>
<script type="text/javascript" src="../static/js/json2.js"></script>

<script type="text/javascript">

$(document).ready(function(){
getXMLData();
});

function getXMLData(){
$.ajax({
url: '${pageContext.request.contextPath}/api/reSTXMLData',
type: 'post',
dataType: 'text',
success: function(data){
alert(data);
var name = $("name", data).text();
var age = $("age", data).text();
var address = $("address", data).text();
$('#nameId').html(name);
$('#ageId').html(age);
$('#addressId').html(address);
console.log(data);
alert(JSON.stringify(data));
}
});
}

</script>

</head>
<body>
<h3>SendXML</h3>
name: <span id="nameId"></span><br>
age: <span id="ageId"></span><br>
address: <span id="addressId"></span>
</body>
</html>
  1. 创建XML文档,填入数据,文档放到项目的src根目录。
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<student>
<name>李小虎</name>
<age>15</age>
<address>广东广州</address>
</student>
  1. 创建实体类并添加xml注解
1
2
3
4
5
6
7
8
9
10
11
@XmlRootElement
//@XmlRootElement(name = "xml")//这里的xml是别名,不写则是实体类首字母小与的名称
public class Student {

private String name;
private int age;
private String address;

....set/get方法....

}
  1. 后台Controller层处理方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Controller
@RequestMapping("/api")
public class XMLController {

@RequestMapping(value = "/xml")
public String returnXMLView() {
return "sendxml";
}

/**
* 读取XML文件里的数据并返回给Ajax请求
* @return
* @throws JAXBException
*/
@RequestMapping(value = "/reSTXMLData", method = {RequestMethod.POST})
@ResponseBody
public Student reSTXMLData() throws JAXBException {
//传递一个class,获得上下文
JAXBContext ctx = JAXBContext.newInstance(Student.class);
//创建Unmarshaller对象
Unmarshaller unmar = ctx.createUnmarshaller();
//读取src根目录下的xml文档
InputStream inputStream = this.getClass().getResourceAsStream("/student.xml");
//Unmarshaller对象的unmarshal可以将XML转换到java对象
Student st = (Student) unmar.unmarshal(inputStream);

/* Student st = new Student()
.setName("张三")
.setAge(26)
.setAddress("广东深圳");
*/
return st;
}
}
作者

光星

发布于

2018-02-08

更新于

2022-06-17

许可协议

评论