1. 前言
本文主要记录一下spring mvc中常用的注解的使用
2. 注解
1. @ModelAttribute
这个注解可以用在方法或者参数上,注解本身可用的三个成员:
- String value()
- String name()
name和value互为别名,作用是一样的
- boolean binding()
默认true
用在不同的地方代表的含义也有所不同:
- 用在方法上
使用@ModelAttribute
注解方法是,是将方法的返回值绑定到一个名字上,同时当访问某个URL并最终走到这个url映射的Controller
的具体的一个的方法methodA时,这个Controller里所有使用了@ModelAttribute
注解的方法都会先被执行一遍,然后执行的结果被绑定到一个name上,如下例:
@Controller
@RequestMapping("/api/echo")
public class EchoTime {
private static int i = 0;
@RequestMapping(value = "/timestamp", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public Long currentTimeStamp(@ModelAttribute("name") String name){
System.out.println(name);
return System.currentTimeMillis();
}
@ModelAttribute("name")
public String testModeAnAttribute(){
System.out.println("in testModeAnAttribute...");
return "eric" + i ++;
}
}
-------连续两次访问输出结果如下---------
in testModeAnAttribute...
eric0
in testModeAnAttribute...
eric1
- 用在参数上
上面例子也反应了用在参数上含义:
public Long currentTimeStamp(@ModelAttribute("name") String name)
将属性明为name的值绑定到参数上,这个name的值可以是上面例子中@ModelAttribute
注解的方法的返回值,也可以是url中的请求参数.
2. @SessionAttributes
注解在类上(controller类上),它可以指定一些names或者types,如下:
@SessionAttributes(names = {"lastAccessTime","lastUpdateTime"})
表示将model中名称为'lastAccessTime'和‘ lastUpdateTime’的属性值绑定到session上。配合使用在参数上的注解@ModelAttribute
一起使用,如:
methodA(@ModelAttribute("lastAccessTime") Date lastAccessTime
则完成将session中‘ lastAccessTime’的值绑定到参数上。
它的流程大概是:
首先这里有一个SessionAttributeStore的接口,session上的属性值的设置和获取是通过它来完成的,默认实现类是DefaultSessionAttributeStore。
DefaultSessionAttributeStore只是简单的将属性值设置到session中和从session中获取。
1. 执行controller的method之前,需要解析method的参数并完成参数绑定:
- 获得@ModelAttribute注解的参数名称(同时这些参数名称也在SessionAttributes的名称列表里),
从sessionAttributeStore中获取这个名称的值(也就是从session中获取值),将值绑定定到method的参数上
2. 执行controller方法
3. 执行controller方法之后获得新的Model,遍历model中的所有name,value,
对于那些出现在`@SessionAttributes`中name,用这些name,value去更新sessionAttributeStore, 也就是设置到session中去。
综上这个过程,可以看出你在代码中调用HttpSession # removeAttribute是不会生效的,因为为controller方法执行完后上面第3步还是设置session的属性值
网友评论