zoukankan      html  css  js  c++  java
  • 09springMVC对ajax的支持

    • u  最直接的Ajax处理
    • u  数据绑定@RequestBody/@ResponseBody
    • u  使用@RequestBody/@ResponseBody来支持Ajax
    • u  使用HttpEntity/ResponseEntity来支持Ajax
    • u  对Ajax返回xml的支持
    • u  HttpMessageConverter
    • u  内容协商

    1      最直接的Ajax处理

    只要在Controller的方法里面,直接使用response输出你要返回的的Ajax数据,然后return null就可以了,示例如下:

    Controller示例

    @RequestMapping(value = "/hello")
    
    public ModelAndView handleRequest(UserModel um,HttpServletResponse response)throws IOException {
    
       response.setCharacterEncoding("utf-8");
    
       response.getWriter().println("{uuid:'"+um.getUuid()+"', name:'"+um.getName()+"'}");
    
       return null;
    
    }

    客户端示例,使用jQuery

    <%@ page language="java" contentType="text/html; charset=UTF-8 " pageEncoding="UTF-8"%>
    
    <head>
    
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
    </head>
    
    <script language="javascript“ src="/mvcexample/static/js/jquery-1.3.2.min.js"></script>
    
    <script language="javascript">
    
      $().ready(function(){
    
      $.getJSON('/mvcexample/hello',{uuid:'1',name:'test'},
    
         function(data){
    
         alert(data.uuid+" , "+data.name);
    
         });
    
       });
    
    </script>
    
    </html>

    然后就可以启动服务器测试了。

    2      数据绑定@RequestBody/@ResponseBody

    @RequestBody

      功能:用于将HttpServletRequest的getInputStream()内容绑定到入参

     例子:

     @RequestMapping(value = "/hello")
    
      public byte[] handleRequest(@RequestBody String body)

    @ResponseBody

    功能:用于将ResponseBody方法的返回值作为响应体

    例子:

    @RequestMapping(value = “/hello")
    
    @ResponseBody
    
    public byte[] handleRequest(@RequestBody String body)

    注意:他们都只能访问报文体,不能访问报文头

    3      使用@RequestBody/@ResponseBody来支持Ajax

    可以使用@RequestBody来自动获取Ajax上传的数据,同时也可以使用@ResponseBody,把要返回的对象自动拼成JSON的格式返回。当然,需要加入几个jackson的包,这里加入了:

    jackson-core-2.1.2.jar、jackson-annotations-2.1.2.jar、jackson-databind-2.1.2.jar

    测试使用的Controller的方法:

    @RequestMapping(value = "/hello")
    
    @ResponseBody
    
    public UserModel handleRequest(@RequestBody String reqBody, UserModel um){
    
        System.out.println("the reqBody="+reqBody);
    
        um.setName(um.getName()+",server");
    
        return um;
    
    }

    测试使用的页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
      <html>
    
        <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
       </head>
    
    <script language="javascript"src="/mvcexample/static/js/jquery-
    
    1.3.2.min.js">
    
    </script>
    
    <script language="javascript">
    
      $().ready(function(){
    
      $.getJSON('/mvcexample/hello',{uuid:'1',name:'test'},
    
        function(data){
    
        alert(data.uuid+" , "+data.name);
    
        });
    
      });
    
    </script>

    去测试看看吧,可以看到Controller的方法直接返回一个um对象,但是@ResponseBody会把这个对象自动变成json格式的,再传回客户端,非常方便。

        当然,@ResponseBody也支持集合对象自动变成json格式,比如:

    测试使用的Controller方法

    @RequestMapping(value = "/hello")
    
    @ResponseBody
    
    public List<UserModel> handleRequest(@RequestBody String reqBody,UserModel um) {
    
        System.out.println("the reqBody="+reqBody);
    
        um.setName(um.getName()+",server");
    
        List<UserModel> list = new ArrayList<UserModel>();
    
        list.add(um);
    
        UserModel um2 = new UserModel();
    
        um2.setUuid("22");
    
        um2.setName("222");
    
        list.add(um2);
    
        return list;
    
    }

    测试使用的页面

    <%@ page language="java" contentType="text/html; charset=UTF-8 " pageEncoding="UTF-8"%>
    
      <html>
    
         <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
         </head>
    
      <script  language="javascript“
    
          src="/mvcexample/static/js/jquery-1.3.2.min.js">
    
      </script>
    
    <script language="javascript">
    
      $().ready(function(){
    
      $.getJSON('/mvcexample/hello',{uuid:'1',name:'test'},
    
      function(data){
    
      $.each(data,function(index,v){
    
      alert("tr="+v.uuid+",v="+v.name);
    
      });
    
     });
    
    });
    
    </script>

    4      使用HttpEntity/ResponseEntity来支持Ajax

    使用HttpEntity/ResponseEntity不但能访问到报文体,还可以访问报文头

    示例,主要的变化在Controller的方法上,页面不用变化,如下:

    @RequestMapping(value = "/hello")
    
    public ResponseEntity<List<UserModel>> handleRequest(HttpEntity<String> req, UserModel um) {
    
      System.out.println("req headers="+req.getHeaders()+",    reqBody="+req.getBody());
    
    um.setName(um.getName()+",server");
    
       List<UserModel> list = new ArrayList<UserModel>();
    
       list.add(um);
    
       UserModel um2 = new UserModel();
    
       um2.setUuid("22");
    
       um2.setName("222");
    
       list.add(um2);
    
       ResponseEntity<List<UserModel>> ret = new
    
          ResponseEntity<List<UserModel>>(list,HttpStatus.OK);
    
       return ret;
    
    }

    5      对Ajax返回xml的支持

    前面的Ajax使用的是json格式,下面看看对xml的支持

    要让Spring Web MVC支持xml格式,需要加入如下jar包:jaxb-api-2.2.5.jar,jaxb-impl-2.2.5.jar

    在要返回的对象头上使用如下注解,例如:

       @XmlRootElement(name = "testxml")

       public class UserModel {

    • u  这表明返回的xml的根元素名称为testxml,注意:由于xml是单根的,所以只能返回一个对象,而不能返回一个list,如果要返回多条值,可以在这个对象中包含多个其他对象
    • u  返回的结果同样用@ResponseBody注解即可,这个注解会根据请求的类型,自动决定是返回json还是xml,当然默认是返回json格式的,如果要返回xml格式,那么请求的时候,要指定accept=application/xml
    • u  示例的Controller方法
    @RequestMapping(value = "/hello")
    
    @ResponseBody
    
    public UserModel handleRequest(HttpEntity<String> req, UserModel um) {
    
       System.out.println("req headers="+req.getHeaders()+",     reqBody="+req.getBody());
    
       um.setName(um.getName()+",server");
    
       PhoneNumberModel pnm = new PhoneNumberModel("123","321");
    
       PhoneNumberModel pnm2 = new    
    
            PhoneNumberModel("2222","333");
    
       List<PhoneNumberModel> tempList = new 
    
          ArrayList<PhoneNumberModel>();
    
       tempList.add(pnm2);
    
       tempList.add(pnm);
    
       um.setPm(tempList);
    
      return um;
    
    }

    示例的页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    
    <html>
    
       <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    
       </head>
    
      <script language="javascript"
    
           src="/mvcexample/static/js/jquery-1.3.2.min.js">
    
      </script>
    
    <script language="javascript">
    
       $().ready(function(){
    
       $.ajax({
    
             url:'/mvcexample/hello',
    
             type: 'POST',
    
             dataType: 'xml',
    
             data: {uuid:'1',name:'test'},
    
             timeout: 1000,
    
             error: function(){ alert('Error loading XMLdocument'); },
    
             success: function(xml){
    
    $(xml).find("testxml").children("pm").each(function(i){
    
           var uuid=$(this).children("areaCode").text();
    
           var name=$(this).children("phoneNumber").text();
    
           alert("uuid="+uuid+",name="+name);
    
        });} });});
    
    </script>

    返回的xml形如

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    
    <testxml>
    
       <age>0</age>
    
       <name>test,server</name>
    
       <pm>
    
          <areaCode>2222</areaCode>
    
          <phoneNumber>333</phoneNumber>
    
        </pm>
    
         <pm>
    
             <areaCode>123</areaCode>
    
             <phoneNumber>321</phoneNumber>
    
         </pm>
    
        <uuid>1</uuid>
    
    </testxml>

    6      HttpMessageConverter

    其实前面的程序实现对json和xml的支持,之所以能正常运行,幕后英雄就是HttpMessageConverter,它负责对http传入和传出的内容进行格式转换。比如前面学的@RequestBody是将Http请求正文插入方法中,其实它就会使用适合的HttpMessageConverter将请求体写入某个对象。比如前面学的@ResponseBody是将内容或对象作为Http响应正文返回,使用@ResponseBody将会跳过视图处理部分,直接调用合适的HttpMessageConverter,将返回值写入输出流

    现在只要你开启了<mvc:annotation-driven />,它会给AnnotationMethodHandlerAdapter初始化7个转换器,可以通过调用AnnotationMethodHandlerAdapter类的getMessageConverts()方法来获取转换器的一个集合List<HttpMessageConverter>,默认开启的有:

    • u  ByteArrayHttpMessageConverter
    • u  StringHttpMessageConverter
    • u  ResourceHttpMessageConverter
    • u  SourceHttpMessageConverter<T>
    • u  XmlAwareFormHttpMessageConverter
    • u  Jaxb2RootElementHttpMessageConverter
    • u  MappingJacksonHttpMessageConverter

    Spring是如何寻找最佳的HttpMessageConverter呢?

    最基本的方式就是通过请求的accept里面的格式来匹配,如果accept=application/json之类的,就使用json的HttpMessageConverter,如果accept=application/xml之类的,就使用xml的HttpMessageConverter。

    7      内容协商

    什么是内容协商?

        简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。

        这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。

  • 相关阅读:
    没有比脚更长的路 没有比人更高的山
    Nginx---应用场景小结
    程序员北漂6年,活着 ---纪念逝去的青春
    程序员/PM怎么让项目预估的时间更加准确
    程序员从技术开发到项目管理PM--思维转变
    什么是MSF
    程序员有七个等级?你又属于哪个等级呢?
    linux之 sed 基础
    linux之awk基础
    centos 7 jenkins 部署
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/9008452.html
Copyright © 2011-2022 走看看