【SpringMVC入门系列】篇4:SpringMVC传值方式
传值方式
前面几篇文章中我们提到的都是获取浏览器发送到服务器请求的方式,现在我们来介绍一下如何使用springmvc进行传值到jsp页面。
1.Model & ModelMap
ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可。
Model 和 ModelMap 的实例都是spirng mvc框架来自动创建并作为控制器方法参数传入,用户无需自己创建,可以简单地将model的实现类理解成一个Map,Request级别的模型数据。
Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。
下面是传值样例:
@RequestMapping("testModel")
public String testModel(Model model) {
//1.使用键值对传入
model.addAttribute("modelName", "ThinMoon");
//2.直接传入对象,默认key为类名
User user = new User();
user.setUsername("Thinmoon");
user.setAge(15);
model.addAttribute(user);
//3.传入一个Map<String, ?>
Map<String, String> map = new HashMap<>();
map.put("first", "first");
map.put("second", "second");
model.addAllAttributes(map);
//4.传入一个Collection,相同类型会被覆盖,不想被覆盖可以使用mergeAttributes
List list = new ArrayList<>();
list.add(100);
list.add("ttt");
list.add(user);
model.addAllAttributes(list);
System.out.println(model.containsAttribute("integer"));
System.out.println(model.asMap());
return "first.jsp";
}
2.ModelAndView
ModelAndView用法与上面几乎完全一致,只不过我们需要自己创建对象,并且需要设置view
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(ModelAndView modelAndView) {
modelAndView.addObject("modelAndViewName", "TTT");
modelAndView.setViewName("first.jsp");
return modelAndView;
}
3.@SessionAttributes & @SessionAttribute
@SessionAttributes
上面传值都是request域的,那么我们怎么将值设置成session域的呢?
很简单,在类上面添加@SessionAttributes便签即可。
@SessionAttributes(value = {"name", "age", "user"})
上面标签表示该类中model当中key为name
、age
、user
的值都将变为session域中的值。
也可以这样写:
@SessionAttributes(types = String.class)
表示将model中为String类型的都变成session中的值。
@SessionAttribute
@SessionAttributes是将值存入session那么我们在程序中如何将session中值取出来呢?利用@SessionAttribute就可以来访问预先存在的全局会话属性。具体使用方法如下:
@RequestMapping("test")
public String testSession(@SessionAttribute(value = "name") String name) {
System.out.println(name);
return "test.jsp";
}
在方法参数中预先定义,就能获取session中的name了。
4.@ModelAttribute
@ModelAttribute有两个作用,可以修饰方法与方法参数。
-
修饰处理方法参数时,可以自动将参数放入Model中。下面代码,表示传入一个user对象到model中,指定key为myuser。注意:
若model中已经存在key为myuser的对象,@ModelAttribute并不是直接替换对象,而是替换对象中的属性值!若没有标记@ModelAttribute则是真正的覆盖对象。
@RequestMapping("testModeAttribute") public String testSession(@ModelAttribute(value = "myuser") User user, Model model) { System.out.println(model.asMap()); return "test.jsp"; }
如果不指定key可以写成下面形式,key默认为类名首字母小写形式。
@RequestMapping("testModeAttribute") public String testSession(User user, Model model) { System.out.println(model.asMap()); return "test.jsp"; }
-
修饰方法时,在方法定义上使用 @ModelAttribute 注解,Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。我们可以在每个目标处理方法调用前预先存入一些值到model中,因为springmvc会将model先传入@ModelAttribute标注的方法中。
@ModelAttribute public void test(Model model) { System.out.println(model.asMap()); }