Spring MVC之controller注解

23 篇文章 0 订阅
5 篇文章 0 订阅

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


目录


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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值