引言: 在Web应用中Session是我们非常常用的存放信息的方式,在Spring MVC中,提供了若干标注来直接使用,本文将介绍如何来使用它们。
1. 标注介绍
@SessionAttributes({A, B, C....}
Usage: 声明将设置A, B, C等多个session的属性信息,其将在设置的方法之后方可使用。
@SessionAttribute('A')
Usage: 声明引用Session中的某个属性, 在某个方法参数中,绑定参数,从而在方法中直接使用其值
@ModelAttribute('A')
Usage: 声明引用Session某个属性至Model
2. 代码演示使用方法
ControllerA的代码如下:
@Controller
@SessionAttributes({"userId", "cityId"})
public class ControllerA {
@RequestMapping(value="/testA", method=RequestMethod.GET)
public String testA(Model model, HttpSession session, @RequestParam("id") String id){
model.addAttribute("userId", id);
session.setAttribute("cityid", "beijing");
System.out.println("test A page.....");
System.out.println("--- Model data ---");
Map modelMap = model.asMap();
for (Object modelKey : modelMap.keySet()) {
Object modelValue = modelMap.get(modelKey);
System.out.println(modelKey + " -- " + modelValue);
}
System.out.println("*** Session data ***");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String s = e.nextElement();
System.out.println(s + " == " + session.getAttribute(s));
}
return "checkA";
}
}
ControllerB的代码如下:
@Controller
public class ControllerB {
@RequestMapping(value="/checkA", method=RequestMethod.GET)
public String checkA(Model model, HttpSession session, @SessionAttribute("userId") String userId,
@ModelAttribute("cityid") String cityid) {
System.out.println("Test session Attribute userId/cityid==>" + userId + "/" + cityid );
System.out.println("Check A Page........");
System.out.println("--- Model data ---");
Map modelMap = model.asMap();
for (Object modelKey : modelMap.keySet()) {
Object modelValue = modelMap.get(modelKey);
System.out.println(modelKey + " -- " + modelValue);
}
System.out.println("*** Session data ***");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String s = e.nextElement();
System.out.println(s + " == " + session.getAttribute(s));
}
return "testB";
}
}
在这里定义了2个GET方法,testA用来设置session中的属性, checkA用来读取其中的session信息。
在testA方法中,我们在Model中设置了userId, 在session中设置了cityId. 然后分别打印出model和session中所有的内容信息。
在checkA方法中,同理打印model和session的所有内容信息。
3. 测试方法
a. 启动应用, 访问: http://localhost:8080/testA?id=200, 后台输出测试信息如下:
test A page.....
--- Model data ---
userId -- 600
*** Session data ***
cityid == beijing
b. 访问: http://localhost:8080/checkA, 后台输出信息如下:
Test session Attribute userId/cityid==>600/
Check A Page........
--- Model data ---
cityid --
org.springframework.validation.BindingResult.cityid -- org.springframework.validation.BeanPropertyBindingResult: 0 errors
*** Session data ***
cityid == beijing
userId == 600
基于上述的测试结果,我们可以得知,在testA中,我们向model中写入数据,并不会立刻影响到session中的内容。
在checkA方法中,我们可以看到之前testA中写入的userId信息,同时基于sessionAttribute提取session中的cityid信息。这里可以看到在使用了@ModelAttribute的cityid中,我们正确提取到了cityid的值,因为这里是从session中提取的;但是Model中虽然有cityid的key,但是却没有其值,当下cityid的值为空。
4. 汇总标注的使用方法
@SessionAttributes: 设置session中的属性信息
在类上或者方法上,声明需要引入的属性信息,这里的使用方法如下:
@Controller
@SessionAttributes({"userId", "cityId"})
public class WelcomeController {
........
然后在某个方法之内,设置他们的值,这几个属性的值需要设置到model或者直接设置到session中即可。
@SessionAttribute/@ModelAttribute: 读取session中属性的信息
这里是在方法的入口参数上绑定特定的参数, 从而读取其值:
@RequestMapping(value="/checkA", method=RequestMethod.GET)
public String checkA(Model model, HttpSession session, @SessionAttribute("userId") String userId,
@ModelAttribute("cityid") String cityid) {
.......
}
5. 总结
参考资料:
1 http://www.importnew.com/16782.html