SessionAttribute和ModelAttribute使用

引言: 在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";
	}
}

 基于上述的测试结果,我们可以得知,在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.  总结
    这些标注简化了读取或者写入session信息的方法,简化了其代码结构,非常好用易用。
 

你可能感兴趣的:(SpringMVC模块)