参考链接: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();
}
}