Spring MVC下的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<String> 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<String> 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.  总结

    这些标注简化了读取或者写入session信息的方法,简化了其代码结构,非常好用易用。

参考资料:

  1 http://www.importnew.com/16782.html

    原文作者:Spring MVC
    原文地址: https://blog.csdn.net/blueheart20/article/details/52996945
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞