SpringMVC(三十二):接收和返回XML格式

star2017 1年前 ⋅ 426 阅读

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 指定发送的数据格式。

     <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>
    
  2. 定义之实体类接收XML数据,添加XML注解
    @XmlRootElement:XML根元素,默认是实体类类名首字母小写;可设置根元素名称,但必须与接收到的XML数据的根元素名一致,如:@XmlRootElement = (name = "user")
    @XmlElement:设置XML内部元素,注解放在set方法上。

     @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 + "]";
         }
     }
    
  3. 后台Controller接受数据
    @RequestBody将请求数据绑定到实体对象中。
    @ResponseBody返回的是实体数据,实体类加了XML注解,则会自动将实体数据转换为XML数据。

     @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请求

     <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>
    
  2. 创建XML文档,填入数据,文档放到项目的src根目录。

     <?xml version="1.0" encoding="UTF-8"?>
     <student>
         <name>李小虎</name>
         <age>15</age>
         <address>广东广州</address>
     </student>
    
  3. 创建实体类并添加xml注解

     @XmlRootElement
     //@XmlRootElement(name = "xml")//这里的xml是别名,不写则是实体类首字母小与的名称
     public class Student {
    
         private String name;
         private int age;
         private String address;
    
         ....set/get方法....
    
     }
    
  4. 后台Controller层处理方法

     @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;
         }
     }
    
更多内容请访问:IT源点

全部评论: 0

    我有话说: