zoukankan      html  css  js  c++  java
  • springMVC新理解

    springmvc 中@Controller和@RestController的区别

    1. Controller, RestController的共同点

         都是用来表示spring某个类的是否可以接收HTTP请求

    2.  Controller, RestController的不同点

         @Controller标识一个Spring类是Spring MVC controller处理器

         @RestController: @RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。返回的数据不用进行转换,springMVC自动进行转换成所需要的数据格式。

    示例如下:


     
     在CODE上查看代码片派生到我的代码片
    1. @Controller  
    2. @ResponseBody  
    3. public class MyController { }  
    4.   
    5. @RestController  
    6. public class MyRestController { }  

    SpringMVC层跟JSon结合,几乎不需要做什么配置,代码实现也相当简洁。再也不用为了组装协议而劳烦辛苦了! 

    从Spring4开始,Spring以Servlet3为进行开发,如果用Spring MVC 测试框架的话需要指定Servlet3兼容的jar包(因为其Mock的对象都是基于Servlet3的)。另外为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加 @ResponseBody了。而且添加了一个AsyncRestTemplate ,支持REST客户端的异步无阻塞支持。



    一、Spring注解@ResponseBody,@RequestBody和HttpMessageConverter 

    Spring 3.X系列增加了新注解@ResponseBody@RequestBody 

    • @RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。
    • @ResponseBody 将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。


    HttpMessageConverter接口,需要开启<mvc:annotation-driven  />。 
    AnnotationMethodHandlerAdapter将会初始化7个转换器,可以通过调用AnnotationMethodHandlerAdaptergetMessageConverts()方法来获取转换器的一个集合 List<HttpMessageConverter> 

    引用
    ByteArrayHttpMessageConverter 
    StringHttpMessageConverter 
    ResourceHttpMessageConverter 
    SourceHttpMessageConverter 
    XmlAwareFormHttpMessageConverter 
    Jaxb2RootElementHttpMessageConverter 
    MappingJacksonHttpMessageConverter



    可以理解为,只要有对应协议的解析器,你就可以通过几行配置,几个注解完成协议——对象的转换工作! 

    PS:Spring默认的json协议解析由Jackson完成。 所以在jar包那里添加jackson的jar,配上注解,spring即可自动转换。

    二、servlet.xml配置 

    Spring的配置文件,简洁到了极致,对于当前这个需求只需要三行核心配置: 

    Xml代码  收藏代码
    1. <context:component-scan base-package="org.zlex.json.controller" />  
    2. <context:annotation-config />  
    3. <mvc:annotation-driven />  



    三、pom.xml配置 

    闲言少叙,先说依赖配置,这里以Json+Spring为参考: 
    pom.xml 

    Xml代码  收藏代码
    1. <dependency>  
    2.         <groupId>org.springframework</groupId>  
    3.         <artifactId>spring-webmvc</artifactId>  
    4.         <version>3.1.2.RELEASE</version>  
    5.         <type>jar</type>  
    6.         <scope>compile</scope>  
    7.     </dependency>  
    8.     <dependency>  
    9.         <groupId>org.codehaus.jackson</groupId>  
    10.         <artifactId>jackson-mapper-asl</artifactId>  
    11.         <version>1.9.8</version>  
    12.         <type>jar</type>  
    13.         <scope>compile</scope>  
    14.     </dependency>  
    15.     <dependency>  
    16.         <groupId>log4j</groupId>  
    17.         <artifactId>log4j</artifactId>  
    18.         <version>1.2.17</version>  
    19.         <scope>compile</scope>  
    20.     </dependency>  


    主要需要spring-webmvcjackson-mapper-asl两个包,其余依赖包Maven会帮你完成。至于log4j,我还是需要看日志嘛。 
    包依赖图: 

    至于版本,看项目需要吧! 

    四、代码实现 

    域对象: 

    Java代码  收藏代码
    1. public class Person implements Serializable {  
    2.   
    3.     private int id;  
    4.     private String name;  
    5.     private boolean status;  
    6.   
    7.     public Person() {  
    8.         // do nothing  
    9.     }  
    10. }  



    这里需要一个空构造,由Spring转换对象时,进行初始化。 

    @ResponseBody,@RequestBody,@PathVariable 
    控制器: 

    Java代码  收藏代码
    1. @Controller  
    2. public class PersonController {  
    3.   
    4.     /** 
    5.      * 查询个人信息 
    6.      *  
    7.      * @param id 
    8.      * @return 
    9.      */  
    10.     @RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)  
    11.     public @ResponseBody  
    12.     Person porfile(@PathVariable int id, @PathVariable String name,  
    13.             @PathVariable boolean status) {  
    14.         return new Person(id, name, status);  
    15.     }  
    16.   
    17.     /** 
    18.      * 登录 
    19.      *  
    20.      * @param person 
    21.      * @return 
    22.      */  
    23.     @RequestMapping(value = "/person/login", method = RequestMethod.POST)  
    24.     public @ResponseBody  
    25.     Person login(@RequestBody Person person) {  
    26.         return person;  
    27.     }  
    28. }  



    备注:@RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)中的{id}/{name}/{status}@PathVariable int id, @PathVariable String name,@PathVariable boolean status一一对应,按名匹配。 这是restful式风格。 
    如果映射名称有所不一,可以参考如下方式: 

    Java代码  收藏代码
    1. @RequestMapping(value = "/person/profile/{id}", method = RequestMethod.GET)  
    2. public @ResponseBody  
    3. Person porfile(@PathVariable("id") int uid) {  
    4.     return new Person(uid, name, status);  
    5. }  



      • GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。
      • POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。
      • @ResponseBody可以标注任何对象,由Srping完成对象——协议的转换。
  • 相关阅读:
    for,foreach,$.each()跳出循环的比较
    十大经典排序算法
    沙箱模式以及其使用到的IIFE
    绝对路径和相对路径的区别
    必备的JS调试技巧汇总
    通过.frm表结构和.ibd文件恢复数据
    Jenkins使用QQ邮箱构建邮件提醒服务
    windows常用命令积累
    7.手机屏幕分辨率
    6.移动端App安装包的测试用例
  • 原文地址:https://www.cnblogs.com/fengli9998/p/6729317.html
Copyright © 2011-2022 走看看