示例 接收XML格式的数据 创建一个XmlTest
项目,在WebContent
目录下创建一个js
目录,加入jQuery
和json2
的js
文件。
项目结构 展开/折叠
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" , { type : "POST" , contentType : "application/xml" , data : xmlData, async : true , }); } </script > </head > <body > </body > </html >
分析 sendxml.jsp
页面代码分析如下: (1)页面使用jQuery
发送JSON
数据,在页面的<head>
部分,引入了jQuery
和json2
的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 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; } @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个属性:id
、nane
和author
,分别对应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 { @PostMapping(value = "/sendxml") public void sendxml (@RequestBody Book book) { System.out.println("接收XML数据成功" ); System.out.println(book); } @PostMapping(value = "/readxml") @ResponseBody public Book readXml () throws Exception { JAXBContext context = JAXBContext.newInstance(Book.class); Unmarshaller unmar = context.createUnmarshaller(); InputStream is = this .getClass().getResourceAsStream("/book.xml" ); 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
数据传递的id
、name
、 author
元素被赋值到了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" , { dataType : "text" , type : "POST" , async : true , success : function(xml) { 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>
部分,引入了jQuery
和json2
的js文件。 (2)载入页面时调用readxml
函数。 (3) readxml
函数发送异步请求到readxml
,请求成功将返回一个XML
数据,接到返回的数据后将XML
数据中的元素读取出来并将其设置到页面的<span>
中。BookController
的readxml
方法使用JAXB
读取一个XML
文件的数据并生成一个Book
对象返回。@ResponseBody
会将Book
对象转换成XML
数据返回到前台JSP
页面。
测试 在浏览器中输入如下URL
来测试应用:
1 http://localhost:8080/XmlTest/readxml.jsp
浏览器显示内容如下:
这表示Spring MVC
成功将XML
数据返回到客户端。