- @Controller
负责注册一个bean 到 spring 上下文中,用于标识是处理器类
- @RequestMapping
注解为控制器制定可以处理哪些URL请求,可用于类或者方法上。
用于类上:表示类中的所有方法请求都是以该参数value值中的内容作为父路径请求
用于方法:表示映射到具体的URI参数
我就把RequestMapping的主要六个注解来分别看看:
value: 指定请求的实际地址,也就是想http uri 中的请求参数是什么内容,才能跳入调用这个方法
method:指定http请求的method类型(get、post、put、delete等)
consumes:指定处理http请求的提交内容类型(也就是http中的Content-Type参数)
produces:指定该方法处理后返回的内容类型,仅当request请求头中的Accept类型中包含该指定类型才返回。这句话意思就是,若是客户端可以接收text/html;application/json等类型的数据类型,那么我服务器端才在该函数处理完数据后,以这些格式将数据封装返回浏览器。
params:指定request请求中必须包含的某些参数,才让该方法处理
headers:指定request中必须包含的某些指定的header指定
- @PathVariable
当使用@RequestMapping URI的template样式映射参数时候,如http:{uri}/user/{uid},这时候可以通过@PathVariable注解将uri中的uid参数绑定到方法的参数上。(方法上的uri中的{sid}参数将会映射传递到方法的sid参数上。若是方法参数名称和uri中传递的{param}名称不一致,需要在方法参数旁显式指定名称。)
@RequestMapping(value = "/sid/{sid}",method=RequestMethod.DELETE)
public ModelAndView DeleteUserById(@PathVariable String sid){ //sid参数对应方法上的路径参数{sid}
ModelAndView mv = new ModelAndView("stulist"); //跳转到stulist.jsp
int ret = userService.DeleteUserById(sid);
mv.addObject("ret",ret);
return mv;
}
//uri/{param}中param名称与方法变量名字不同,需要@PathVariable()显示指定
@RequestMapping(value="/sid/{userId}",method=RequesetMethod.DELETE)
public ModelAndView DeleteUserById(@PathVariable("userId") String sid){...}
2.@RequestHeader,@CookieValue:
@RequestHeader注解,可以把Request请求header部分的值绑定到方法的参数上。
例如假设我们的一个request请求头为以下内容:
Host: www.cnblogs.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.baidu.com/link?url=vMwqr_1CInBYSsvCXnoPrwOFxPvxdChHmN9XWPp7C1Do5MjbnJN8e8WP6VCPjsW5w-edqnKJaCNJPN2sR20eNOb6d73O0ZaFM9Kwe-GRVtK&wd=&eqid=8a738c1d00002ce20000000658c8c3ca
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: CNZZDATA1260386081=1660805767-1486222861-https%253A%252F%252Fwww.baidu.com%252F%7C1486222861; __utma=226521935.140421385.1488358381.1488899945.1488899945.1; __utmz=226521935.1488899945.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; CNZZDATA1259029673=860036098-1489063915-%7C1489063915;
那如果服务器端代码要使用request请求头中某些内容,那么我们就可以使用@RequestHeader参数来映射参数:
下面的方法参数,分别获取请求头中,客户端接收的编码(Accept-Encoding)绑定到encoding参数上,和接收的内容格式(Accept)绑定到accept参数上。
@RequesetMapping(value="..")
public void getRequestHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Accept") String accept){
//...
}
@CookieValue注解,顾名思义,就是将客户端发送的request请求中cookie拿到,绑定到方法参数上。
我们还是根据上面那个request请求头,我们可以看到最后一行请求头中有:Cookie:..的内容,若是想直接拿到该字段内容,那么可以使用@CookieValue注解来实现数据绑定。
@RequesetMapping(value="..")
public void getRequestCookieInfo(@CookieValue("Cookie") String cookie){ //绑定cookie内容到cookie参数
//...
}
3.@RequestParam,@RequestBody:
上面我们在获取request请求资源uri路径,请求头内容后,还有一个重要的request格式中区域就是请求体body了。那么这两个参数就是用于处理这部分内容的。
@RequestParam注解,通过以下几点来说明:
(1) 常常用来处理简单类型的数据绑定。什么是简单类型,简单的说,就是在服务器端可以通过request.getParameter(“key”)方法获取的参数的类型。通常这类的参数在Get请求中是以uri?key=value样式体现的,也就是queryString的值。也能获取POST请求中请求体body data中的值。也就是将一些key=value参数放置在request请求体中。
(2) 用来处理Content-Type: 为application/x-www-form-urlencoded表单提交的编码内容。
(3) 该注解有两个属性:value,required。value用来指定传入值的名称,required用于指示参数是否必须存在并绑定。
//url: http://.../getUser?uid=1
@RequestMapping(method = RequestMethod.GET)
public String doSomething(@RequestParam("uid") int uid, ModelMap model) {//url中queryString参数uid绑定到方法参数uid中。
//...
}
@RequestBody
注解:通常用来处理非表单提交(Content-Type={application/json;application/xml})中的post data body内容
4.@SessionAttributes,@ModelAttribute:
@SessionAttributes注解是用来绑定httpSession的attribute对象的值,方便在方法中参数映射并使用。该注解有value,types两个属性,可以通过名字和类型来指定要使用的attribute对象。
那么为什么要使用这个注解呢?能解决什么问题?这个与spring中的ModelMap有关。因为modelMap中的属性作用域是request级别,也就是说,当本次request结束后,modelMap中的所有属性都会被销毁,那么就造成一个问题?若想在多个request中共享该对象,如何实现?那就可以把对象放置到session域级别中。就是通过@SessionAttributes来完成这个需求的。
eg:通过@SessionAttributes注解将该request请求域中的ModelMap中的user对象属性放置到session中。在后面jsp视图中我们可以使用常规session操作得到user属性(session.getAttriute(“user”)):
@Controller
@RequestMapping("/editUser.do")
@SessionAttributes(value="user",types={user.class})
public class EditUserForm {
// ...
}
关于该属性的使用形式还有以下几种:
(1)字符串数组指定多个属性。@SessionAttributes({“attr1”,”attr2”})
(2)也能通过types指定每个value的属性:
@SessionAttributes(types={User.class})
@SessionAttributes(types={User.class,Deptment.class},value={“atrr1”,”attr2”})
@ModelAttribute注解有两个用法,一个是用于方法上,一个是用于参数上:
方法上: 通常是用来处理@RequestMapping之前,为请求绑定需要从后台查询的model。
参数上: 用来通过名称对应,把相应的名称的值绑定到注解的参数bean上,该bean的来源有:
A. @SessionAttributes配置中的attribute对象。
B. @ModelAttribute用于方法上时候指定的model对象。
C. 若是上述情况都没有,new一个需要绑定的bean对象,然后把request中按照同名方式把值绑定到bean。
在参数上使用该注解的例子:可以看到@ModelAttribute(“user”)中有user参数与@SessionAttribute(“user”)中的对象名称一致,那么就会自动将user属性对象注入到ModelMap对象,就可以直接使用该user对象了
@RequestMapping(value="/users/{uid}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("user") User user) {
//...
}
关于@ModelAttribute属性中对象如何查找,按照如下顺序:先查询@SessionAttribute上有无绑定的同名对象,若是没有则在查询定义在方法上的@ModelAttribute是否绑定有同名对象,最后则是在uri按照属性名称映射查找。