Spring MVC之controller注解

来源:互联网 发布:贵金属网络销售好做吗 编辑:程序博客网 时间:2024/04/29 02:11

参考链接:http://zachary-guo.iteye.com/blog/1318597


目录

  • Controller
  • RequestMapping
    • 2-1 类注解
    • 2-2 方法注解
      • 2-2-1 value
      • 2-2-2 method
      • 2-2-3 params
      • 2-2-4 header
  • RequestParam
    • 3-1 命名一致性绑定
    • 3-2 自定义绑定
  • PathVariable
  • RequestBody
  • ResponseBody
  • ModelAttribute
  • SessionAttributes


1 @Controller

类注解

@Controller  public class MainController {    // ......  } 

2 @RequestMapping

请求的匹配模式(映射方式) 类或方法注解

2-1 类注解

访问方式:http://localhost:8080/project/one/

@Controller  @RequestMapping("/one")public class MainController {    // ......  } 

2-2 方法注解

属性:value(匹配模式)、method(请求方法)、params(参数)、headers(请求头)

2-2-1 value

访问方式:http://localhost:8080/project/one/two

@Controller  @RequestMapping("/one")public class MainController {     @RequestMapping(value="/two", method=RequestMethod.GET);    public String hello() {...}    } 

2-2-2 method

请求方式GET/POST:
method=RequestMethod.GET 或者 .POST
两种方式均可:
method={RequestMethod.GET, RequestMethod.POST}

2-2-3 params

访问方式:http://localhost:8080/project?key=value

@Controller  public class MainController {     @RequestMapping(params="key=value", method={RequestMethod.GET, RequestMethod.POST})      public String hello() {...}    } 

访问方式:http://localhost:8080/project?key=anything

@Controller  public class MainController {     @RequestMapping(params="key", method={RequestMethod.GET})      public String hello() {...}    } 

2-2-4 header

/*telnet localhost 8080  * POST /contextPath/my HTTP/1.1  * Host: localhost  * key: value # 这个就是自定义请求头,和标准的请求头的写法别无二致  * 【回车】  * 【回车】*/@RequestMapping(headers="key=value", method={RequestMethod.POST}) public String hello() {...}     

3 @RequestParam

将请求参数绑定到方法参数 方法参数注解

3-1 命名一致性绑定

方法参数名为 userId,则请求参数中一定有名为 userId 的参数,且值为整数。这是默认的绑定行为,根据名称匹配原则进行的数据绑定。

@RequestMapping("/test")  public String test(int userId) { ... }  

3-2 自定义绑定

名为 userId 的请求参数绑定到新的名称为 id 的方法参数上;
名为age的请求参数设置为不必须(required=false),则没有这个请求参数也没事,required值默认为true。

 @RequestMapping("/test2")    public String test2(@RequestParam("userId") int id, @RequestParam(required=false) int age, Date date, User user) { ... }  

4 @PathVariable

将 url template 里的参数绑定到方法参数 方法参数注解

在这个例子中,请求的 url 必须满足类似 /my/user/zhangsan/18 这样的格式才能匹配方法。url 模板里的参数名和方法参数名的绑定规则和 @RequestParam 类似,这里就不再赘述了。
@PathVariable 和 @RequestParam 的区别在于:
* @PathVariable 的 url:/my//user/zhangsan/18
* @RequestParam 的 url:/my//user?nickname=zhangsan&age=18

 @RequestMapping("/user/{nickname}/{age}");    public String getUserInfo(@PathVariable("nickname") String name, @PathVariable int age) {...}  

5 @RequestBody

将请求正文绑定到方法参数 方法参数注解

/**  * 来看一个 http 请求:  * (请求行) POST /my HTTP/1.1  * (请求头) Host: localhost  * (请求头) Content-Type: text/plain  * (请求头) Content-Length: 5  *  * (请求体) hello  *  * 这里的 hello,就是请求体,也称 request message。若有请求体,则必须提供请求体的类型和长度,这些信  * 息是写在请求头里的,即 Content-Type 和 Content-Length  */  @RequestMapping("/user/body");    public String getBody(@RequestBody String body) {      // 这里的 body 的内容就是 hello      System.out.println(body);      return null;    }  

6 @ResponseBody

将处理完请求后返回的对象绑定到响应正文 方法参数注解

 @RequestMapping("/user")    public @ResponseBody User getUser() {      return new User(18, "Jack", "计算机");    }  

7 @ModelAttribute

为视图渲染提供更多的模型数据,而不需要在处理请求的方法里添加 ModelMap 或Model 类型的参数。
标注在方法(存数据)上,也可以标注在方法参数(取数据)上。

 /**    * 在处理该请求时,方法的返回类型是 User,貌似不符合返回类型的规范。由于这里使用了 @ModelAttribute    * 注解,表示将返回的对象以 "user" 为 key 放入模型数据里。这里的 key 值默认值是返回的数据类型首字母    * 小写的结果。如果想自定义 key,可以写成 @ModelAttribute("myAttribute"),那么模型数据将会将     * User 对象绑定到 key 为 "myAttribute" 上。    *     * jsp 里可以这样访问模型里的数据:    *   age: ${user.age}    *   name: ${user.name}    *   job: ${user.job}    *    * 当然,这里只是提到了 @ModelAttribute 存数据的操作。    */    @RequestMapping("/user")    @ModelAttribute    public User getUser() {      return new User(18, "Jack", "计算机");    }    /**    * 这里将 @ModelAttribute 标注在方法参数上,表示要从模型数据里取 key 为 "user" 的对象,绑定在方法    * 参数上。如果这样做的话,其实你是得不到上面的那个请求放入的 User 对象,得到的是另外一个对象。其实    * 也好理解,这是两个互相独立的请求,作用域不一样。要想达到我们的目的,即能够从模型数据里取数据,需要    * 求助于 @SessionAttributes    */    @RequestMapping("/user2")    public String showUser(@ModelAttribute User user) {      System.out.println(user);      return null;    }  

8 @SessionAttributes

将数据存放于session中或从 session 中取;
只能应用在类型声明;
允许以属性名名称或者类型(@SessionAttributes(types=User.class) )两种方法,来表明将哪些数据通过 session 进行管理。

@Controller  @RequestMapping("/my")  @SessionAttributes("the-attribute")  public class MyController {    @RequestMapping("/getUser")    public String getUser(int userId, Model model) {      /**      * 注意,这里将 User 对象添加到属性名为 "the-attribute" 上,所以 User 对象将纳入到 session 的      * 管理。如果这里添加的对象的属性名不是 "the-attribute",那么它只会作用于当前请求,而不会纳入到       * session 的管理中。      */      User user = userService.getUserById(userId);      model.addAtrribute("the-attribute", user);      return "userinfo";    }    /**    * 将模型里的 "the-attribute" 为 key 的对象绑定到 User 类上。由于在类级别上声明了只有 "the-    * attribute" 的属性名才会纳入到 session 的管理,所以就解决了在 @ModelAttribute 注解中讲解中最    * 后提到的问题。    *    * 另外,这个方法还有两个参数,BindingResult 和 SessionStatus。由于这里有绑定数据的动作,我们可以    * 根据 BindingResult 对象获得数据绑定结果以决定后继流程该如何处理。SessionStatus 在这里用于处理    * 完请求后,清空 session 里的数据。    */    @RequestMapping("/updateUser")    public String updateUser(@ModelAttribute("the-attribute") User user,               BindingResult result, SessionStatus status) {      if (result.hasErrors) {        return "error";      }      userService.updateUser(user);      // 我们通过调用 status.setComplete() 方法,该 Controller 所有放在 session 级别的模型属性数据      // 将从 session 中清空      status.setComplete();      return "redirect:getUser?userId=" + user.getId();    }  }  
0 0
原创粉丝点击