SpringMVC提供了以下种途径输出数据模型
ModelAndView:处理方法返回值为ModelAndView,方法体可以通过该对象添加模型数据
Map与Model:处理方法的传入参数是org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map,处理方法返回时,Map中的数据会自动添加到模型中
@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
@ModelAttribute:处理方法的传入参数标该注解后,入参的对象会放到数据模型中。
处理方法的返回值是ModelAndView,则其既包含视图信息,也包含模型数据信息
添加模型数据
public ModelAndView addObject(String attributeName, Object attributeValue)
public ModelAndView addObject(Object attributeValue)
设置视图
void setView(View view)
void setViewName(String viewName)
处理方法
@RequestMapping("/testModelAndView")public ModelAndView testModelAndView(){ModelAndView modelAndView = new ModelAndView();//添加模型数据到ModelAndView中 modelAndView.addObject("time",new Date());//设置视图 modelAndView.setViewName("success");return modelAndView;}
请求页面
<a href="exportData/testModelAndView">测试ModelAndView</a>
接受返回值页面:SpringMVC把Model中数据放到reques域对象
time:${requestScope.time }
SpringMVC在内部使用一个org.springframework.ui.Model接口存储模型数据
处理方法的传入参数为Map或Model类型,开发者可以通过这个参数对象,来访问模型中的所有数据,也可以向模型中添加新的属性数据
控制器中的处理方法
@RequestMapping("/testMap")public String testMap(Map<String, Object> map){ map.put("name", Arrays.asList("sunwukong","zhubajie","shasheng"));return "success";}
请求
<a href="exportData/testMap">测试Map</a>
接受返回值页面
name:${requestScope.name }
若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,SpringMVC将在模型中对应的属性暂存到HttpSession中。
@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
@SessionAttributes(types=User.class),会将隐含模型中所有类型为User.class的属性添加到会话中
@SesssionAttributes(value={"name1","name2"})。value表示的键名
@SesssionAttributes(types={User.class,Dept.class})
@SesssionAttributes(value={"name1","name2"},types={Dept.class})
注:@SessionAttributes只能放在类上面,则不能修饰方法
控制器
@SessionAttributes(value={"user"})@RequestMapping("/exportData")@Controllerpublic class ExportData {.../** * map中的key值(user)跟@SessionAttributes(value={"user"})中的value值一样 那么SpringMVC会将这个key对应的属性值分别放入request域和session域中 * @param map * @return */@RequestMapping("/testSessionAttributes")public String testSessionAttributes(Map<String, Object> map){User user = new User(); user.setUsername("wangsh"); user.setPassword("123456"); user.setEmail("[email protected]"); user.setAge(12); map.put("user", user);return "success";}}
请求
<a href="exportData/testSessionAttributes">测试SessionAttributes</a>
接受返回值页面
request user:${requestScope.user }<br/>session user:${sessionScope.user }
控制器类
/** * * @author wangsh * @SessionAttributes(types={Address.class}):会将此类中所有方法,输出数据模型中包括Address类型的数据存储到sessionk, * 如果冲突,后调用的方法,会替换前面调用的方法 */@SessionAttributes(types={Address.class})@RequestMapping("/exportData")@Controllerpublic class ExportData {...@RequestMapping("/testSessionAttributes2")public String testSessionAttributes2(Map<String, Object> map){Address address = new Address(); address.setProvince("zhejiang"); address.setCity("nb"); map.put("address", address);return "success";}}
请求
<a href="exportData/testSessionAttributes2">测试SessionAttributes2</a>
接受返回值页面
request address:${requestScope.address }<br/> session address:${sessionScope.address }
被@ModelAttribute注释的方法会在此controller每个方法前执行,因此对于一个controller映射多个URL,要谨慎使用
1.1 @ModelAttribute注释void返回值的方法
控制器
@ModelAttributepublic void populateModel(Model model){ model.addAttribute("attributeName", "abc");}@RequestMapping(value = "/helloWorld") public String helloWorld() { return "success"; }
请求
<a href="testModelAttribute/helloWorld">测试返回值为void的方法</a>
回显
${attributeName }
这个例子,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeName的model属性中,在它执行后helloWorld被调用。
处理器中的方法
@ModelAttributepublic User addUser(){User user = new User(); user.setUsername("imentors"); user.setAge(2); user.setEmail("[email protected]"); user.setPassword("123456");return user;}
这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是user。
这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。
回显页面
user:${user }
处理器中的方法
@ModelAttribute(value="imentors")public User addUser(){User user = new User(); user.setUsername("imentors"); user.setAge(2); user.setEmail("[email protected]"); user.setPassword("123456");return user;}
这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性对象就是方法的返回值。
回显页面
@ModelAttribute(value=""):${imentors }
@RequestMapping("/addUser")@ModelAttribute(value="imentors")public User addUser(){User user = new User(); user.setUsername("imentors"); user.setAge(2); user.setEmail("[email protected]"); user.setPassword("123456");return user;}
这时这个方法的返回值并不是表示一个视图名称,而是model属性的值
视图名称由RequestToViewNameTranslator根据请求"/addUser"转换为逻辑视图addUser。
Model属性名称有@ModelAttribute(value=””)指定,相当于在request中封装了key=imentors,value=user。
相信一般开发者都不会这样用.
控制器
@ModelAttributepublic User addUser(){User user = new User(); user.setUsername("imentors"); user.setAge(2); user.setEmail("[email protected]"); user.setPassword("123456");return user;} @RequestMapping(value = "/helloWorld") public String helloWorld(@ModelAttribute("user") User user) { user.setUsername("wangsh"); return "success"; }
在这个例子里,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addUser()方法中的model属性。
此时如果方法体没有标注@SessionAttributes("user"),那么scope为request,如果标注了,那么scope为session
@RequestMapping(value = "/helloWorld") public String helloWorld(@ModelAttribute User user) { user.setUsername("wangsh"); return "success"; }
注意这时候这个User类一定要有没有参数的构造函数。
一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
如果返回的字符串带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理
redirect:success.jsp 会完成一个到success.jsp的重定向的操作
forward:success.jsp 会完成一个到success.jsp的转发操作
@RequestMapping("/testRedirect")public String testRedirect(){System.out.println("testRedirect");return "redirect:/index.jsp";}
关注我们
师享空间的宗旨是分享知识,传播价值。关注我们,及时获得更多信息。