示例 接收XML格式的数据 示例 返回XML格式的数据

示例 接收XML格式的数据

创建一个XmlTest项目,在WebContent目录下创建一个js目录,加入jQueryjson2js文件。

项目结构

展开/折叠
G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\03\XmlTest
├─src\
│ ├─book.xml
│ └─org\
│   └─fkit\
│     ├─controller\
│     │ └─BookController.java
│     └─domain\
│       └─Book.java
└─WebContent\
  ├─js\
  │ ├─jquery-1.11.0.min.js
  │ ├─jquery-migrate-1.2.1.min.js
  │ └─json2.js
  ├─META-INF\
  │ └─MANIFEST.MF
  ├─readxml.jsp
  ├─sendxml.jsp
  └─WEB-INF\
    ├─lib\
    │ ├─commons-logging-1.2.jar
    │ ├─spring-aop-5.0.1.RELEASE.jar
    │ ├─spring-aspects-5.0.1.RELEASE.jar
    │ ├─spring-beans-5.0.1.RELEASE.jar
    │ ├─spring-context-5.0.1.RELEASE.jar
    │ ├─spring-context-indexer-5.0.1.RELEASE.jar
    │ ├─spring-context-support-5.0.1.RELEASE.jar
    │ ├─spring-core-5.0.1.RELEASE.jar
    │ ├─spring-expression-5.0.1.RELEASE.jar
    │ ├─spring-instrument-5.0.1.RELEASE.jar
    │ ├─spring-jcl-5.0.1.RELEASE.jar
    │ ├─spring-jdbc-5.0.1.RELEASE.jar
    │ ├─spring-jms-5.0.1.RELEASE.jar
    │ ├─spring-messaging-5.0.1.RELEASE.jar
    │ ├─spring-orm-5.0.1.RELEASE.jar
    │ ├─spring-oxm-5.0.1.RELEASE.jar
    │ ├─spring-test-5.0.1.RELEASE.jar
    │ ├─spring-tx-5.0.1.RELEASE.jar
    │ ├─spring-web-5.0.1.RELEASE.jar
    │ ├─spring-webflux-5.0.1.RELEASE.jar
    │ ├─spring-webmvc-5.0.1.RELEASE.jar
    │ └─spring-websocket-5.0.1.RELEASE.jar
    ├─springmvc-config.xml
    └─web.xml

sendxml.jsp

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试接收XML格式的数据</title>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript">
$(document).ready(function() {
sendxml();
});
function sendxml() {
var xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+
"<book><id>1</id><name>书的名称</name><author>作者</author></book>";
$.ajax("${pageContext.request.contextPath}/sendxml",// 发送请求的URL字符串。
{
type : "POST", // 请求方式 POST或GET
contentType : "application/xml", // 发送信息至服务器时的内容编码类型
// 发送到服务器的数据。
data : xmlData,
async : true, // 默认设置下,所有请求均为异步请求。如果设置为false,则发送同步请求
});
}
</script>
</head>
<body>
</body>
</html>

分析

sendxml.jsp页面代码分析如下:
(1)页面使用jQuery发送JSON数据,在页面的<head>部分,引入了jQueryjson2的js文件
(2)载入页面时调用sendxml函数。
(3)sendxml函数发送异步请求到"sendxml",

  • ajax方法的contentType选项:contentType:"application/xml"表示发送的内容编码格式为XML;
  • ajax方法的data选项表示要发送的数据是XML数据。

Book.java

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package org.fkit.domain;

import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

// @XmlRootElement表示XML文档的根元素
@XmlRootElement
public class Book implements Serializable
{
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String author;
public Book()
{
super();
}
public Book(Integer id, String name, String author)
{
super();
this.id = id;
this.name = name;
this.author = author;
}
public Integer getId()
{
return id;
}
// 该属性作为xml的element
@XmlElement
public void setId(Integer id)
{
this.id = id;
}

public String getName()
{
return name;
}
@XmlElement
public void setName(String name)
{
this.name = name;
}
public String getAuthor()
{
return author;
}
@XmlElement
public void setAuthor(String author)
{
this.author = author;
}
@Override
public String toString()
{
return "Book [id=" + id + ", name=" + name + ", author=" + author + "]";
}
}

分析

Book类中定义了3个属性:idnaneauthor,分别对应XML的元素。 toString方法用来输出获取的数据对象信息。

BookController.java

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
package org.fkit.controller;

import java.io.InputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import org.fkit.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BookController
{
// @RequestBody Book book会将传递的xml数据自动绑定到Book对象
@PostMapping(value = "/sendxml")
public void sendxml(@RequestBody Book book)
{
System.out.println("接收XML数据成功");
System.out.println(book);
}
// @ResponseBody 会将Book自动转成XML数据返回
@PostMapping(value = "/readxml")
// @ResponseBody注解把方法返回的Book对象转换成XML并发给客户端.
@ResponseBody
public Book readXml() throws Exception
{
// 通过JAXBContext的newInstance方法,传递一个class就可以获得一个上下文
JAXBContext context = JAXBContext.newInstance(Book.class);
// 创建一个Unmarshall对象
Unmarshaller unmar = context.createUnmarshaller();
// 读取资源目录下的文件
InputStream is = this.getClass().getResourceAsStream("/book.xml");
// Unmarshall对象的unmarshal方法可以进行xml到Java对象的转换
Book book = (Book) unmar.unmarshal(is);
System.out.println(book);
return book;
}
}

分析

sendxml方法中的第一个参数@RequestBody Book book表示,使用@RequestBody注解获取到XML数据后,将XML数据设置到Book对象的对应属性中。为了测试接收数据,将接收到XML数据的Book对象打印在控制台上。
springmvc-config.xml文件和JsonRequestTest项目的一致,重点在于<mvc:annotation-driven />,该配置默认装配了Jaxb2RootElementHttpMessageConverter来处理XML数据的转换。

测试

部署XmlTest这个Web应用,在浏览器中输入如下URL来测试应用:

1
http://localhost:8080/XmlTest/sendxml.jsp

载入sendxml.jsp页面时会发送Ajax请求,传递XML数据。BookController接收到请求后,@RequestBody注解会将XML数据设置到Book参数对应的属性中。控制台输出如下:

1
2
接收XML数据成功
Book [id=1, name=书的名称, author=作者]

可以看到,XML数据传递的idnameauthor元素被赋值到了Book对象对应的属性当中。

示例 返回XML格式的数据

readxml.jsp

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
47
48
49
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试返回XML格式的数据</title>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript">
$(document).ready(function() {
readxml();
});
function readxml() {
$.ajax("${pageContext.request.contextPath}/readxml",// 发送请求的URL字符串。
{
dataType : "text", // 预期服务器返回的数据类型。
type : "POST", // 请求方式 POST或GET
async : true, // 默认设置下,所有请求均为异步请求。如果设置为false,则发送同步请求
// 请求成功后的回调函数。
success : function(xml) {
// 获得xml数据的id,name,author
var id = $("id", xml).text();
var name = $("name", xml).text();
var author = $("author", xml).text();
var tr = $("<tr align='center'/>");
$("<td/>").html(id).appendTo(tr);
$("<td/>").html(name).appendTo(tr);
$("<td/>").html(author).appendTo(tr);
$("#booktable").append(tr);
},
// 请求出错时调用的函数
error : function() {
alert("数据接收失败");
}
});
}
</script>
</head>
<body>
<table id="booktable" border="1" style="border-collapse: collapse;">
<tr align="center">
<th>编号</th>
<th>书名</th>
<th>作者</th>
</tr>
</table>
</body>
</html>

分析

readxml.jsp页面代码分析如下:
(1)页面使用jQuery发送M数据,在页面的<head>部分,引入了jQueryjson2的js文件。
(2)载入页面时调用readxml函数。
(3) readxml函数发送异步请求到readxml,请求成功将返回一个XML数据,接到返回的数据后将XML数据中的元素读取出来并将其设置到页面的<span>中。
BookControllerreadxml方法使用JAXB读取一个XML文件的数据并生成一个Book对象返回。@ResponseBody会将Book对象转换成XML数据返回到前台JSP页面。

测试

在浏览器中输入如下URL来测试应用:

1
http://localhost:8080/XmlTest/readxml.jsp

浏览器显示内容如下:

1
2
编号     书名     作者
1 书的名称 书的作者

这表示Spring MVC成功将XML数据返回到客户端。