zoukankan      html  css  js  c++  java
  • Spring mvc 原理浅析

    2.2. 数据的绑定
    前面说过了,SpringMVC是方法级的映射,那么Spring是如何处理方法签名的,又是如何将表单数据绑定到方法参数中的?下面我们就来讨论这个问题。
    2.2.1. 处理方法签名
    首先,我们可以在方法签名中放入@CookieValue注解参数,Spring自动将Cookie值绑定到参数中;
    同理@RequestHeader可 以绑定报文头的属性值;
    同时我们还可以将Servlet API如HttpServletRequest、HttpServletResponse、HttpSession、WebRequest直接作为方法参 数,Spring负责绑定;
    Spring MVC还允许控制器的处理方法使用java.io.InputStream/java.io.Reader及java.io.OutputStream /java.io.Writer作为方法的入参,SpringMVC将获取ServletRequest的InputStream/Reader或 ServletResponse的OutputStream/Writer,然后按类型匹配的方式,传递给控制器的处理方法入参;
    控制器处理方法的入参除 支持以上类型的参数以外,还支持java.util.Locale、java.security.Principal,可以通过Servlet的 HttpServletRequest的getLocale()及getUserPrincipal()得到相应的值。
    如果处理方法的入参类型为 Locale或Principal,Spring MVC自动从请求对象中获取相应的对象并传递给处理方法的入参。
    2.2.1. 表单数据绑定到方法参数
    再有,表单的数据只要名称相同就可以往方法参数中放,或者是级联的可以封装成对象置于参数中,Spring会自动绑定,如下图所示,极其地方便简单:

    2.2.3. HttpMessageConverter<T>
    最后,还有一类处理方法入参的形式,即使用HttpMessageConverter<T>,这个非常强大。它提供了两种途径:
    1)使用@RequestBody/@ResponseBody对处理方法进行标注;
    2)使用HttpEntity<T>/ResponseEntity<T>作为处理方法的入参或返回值。
    HttpMessageConverter顾名思义,它负责将请求信息转换为一个对象,或者将对象输出为响应信息。前面说过,当请求映射到具体的处理方法后,DispatcherServlet调用HandlerAdapter来封装并执行处理方法。
    DispatcherServlet默认已经安装了AnnotationMethodHandlerAdapter作为HandlerAdapter的组件实现类,
    HttpMessageConverter即由AnnotationMethodHandlerAdapter使用,将请求信息转换为对象,或者将对象转换为响应信息。

    先看几个示例:
    将报文体转换为字符串绑定到方法入参中

    @RequestMapping(value= "/handle41")
    publicString handle41(@RequestBody  StringrequestBody ) {
          System.out.println(requestBody);
          return "success";
    }

    读取一张图片,并将图片数据输出到响应流中,客户端将显示这张图片

    @ResponseBody
    @RequestMapping(value= "/handle42/{imageId}")
    public byte[]handle42(@PathVariable("imageId") String imageId) throwsIOException {
           System.out.println("load image of"+imageId);
           Resource res = newClassPathResource("/image.jpg");
           byte[] fileData=FileCopyUtils.copyToByteArray(res.getInputStream());
           return fileData;
    }
    @RequestMapping(value= "/handle43")
    publicString handle43(HttpEntity<String> httpEntity){
         long contentLen = httpEntity.getHeaders().getContentLength();
         System.out.println(httpEntity.getBody());
          return "success";
    }
    @RequestMapping(params= "method=login")
    public ResponseEntity<String>doFirst(){
        HttpHeaders headers = new HttpHeaders();
        MediaType mt=newMediaType("text","html",Charset.forName(“UTF-8"));
        headers.setContentType(mt);
        ResponseEntity<String> re=null;
        String return = newString("test");
        re=newResponseEntity<String>(return,headers, HttpStatus.OK);
        return re;
    }



    这里讲一下HttpMessageConverter中的重点@ResponseBody,我们用它来处理XML和JSON非常之方便。只要在 SpringWeb容器中为AnnotationMethodHandlerAdapter装配好相应的处理XML、JSON的 HttpMessageConverter(AnnotationMethodHandlerAdapter默认只装配部分转换器),并在交互中通过请求 的Accept指定MIME类型,Spring MVC就可以使服务端的处理方法和客户端透明地通过XML或JSON格式的消息进行通信了。

     http://blog.csdn.net/z69183787/article/details/41654039

    http://blog.csdn.net/renhui999/article/details/9837897

  • 相关阅读:
    Array的应用
    事物的操作
    定义集合
    wxWidgets 在 Linux 下开发环境配置
    Emacs 中 GDB 的使用
    wxWidgets 在 Windows 下开发环境配置
    Ubuntu14.04终端主机名+用户名修改配色方案
    S5PV210之内外存学习
    Ubuntu14.04进行配置符号链接arm2009q3.tar.bz2
    Ubuntu14.041+VMware12.0NET方式网卡连接虚拟机联网问题解决方法
  • 原文地址:https://www.cnblogs.com/softidea/p/7100437.html
Copyright © 2011-2022 走看看