SpringMVC处理模型数据(1)

来源:互联网 发布:软件测试职业规划 编辑:程序博客网 时间:2024/05/20 09:43
Spring MVC 提供了以下几种途径输出模型数据:
ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
Map 及 Model: 入参为  org.springframework.ui.Model、org.springframework.ui.  ModelMap 或 java.uti.Map 时,处理方法返回时,Map  中的数据会自动添加到模型中。
@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性

@ModelAttribute:方法入参标注该注解后, 入参的对象  就会放到数据模型中

在本文中中重点讨论前三种方式,因为最后一种需要花大量的篇幅来讲解。详见SpringMVC处理模型数据(2)

演示代码的顺序按照index.jsp(初始界面),Controller控制器,success.jsp(显示结果)

1、ModelAndView

控制器处理方法的返回值如果为 ModelAndView, 则其既  包含视图信息,也包含模型数据信息。
添加模型数据的方法:
1)、添加单个键值对(有点类似request域对象的setAttribute方法)
MoelAndView addObject(String attributeName, Object  attributeValue)
2
)、添加多个键值对,即直接添加一个map集合
ModelAndView addAllObject(Map<String, ?> modelMap)
设置视图的方法:
1
)、设置视图对象
void setView(View view)
2
)、设置视图名
void setViewName(String viewName)

SpringMVC会把 ModelAndView 中的 model 数据放入 Request 域对象中

<a href="springmvc/testModelAndView">testModelAndView</a>
@RequestMapping("/testModelAndView")public ModelAndView testModelAndView(){// 创建一个ModelAndView类型的对象,指定视图名称ModelAndView modelAndView = new ModelAndView(SUCCESS);// 为modelAndView添加modle数据modelAndView.addObject("time", new Date());return modelAndView;}
<h3>${requestScope.time}</h3>

2、Map 及 Model

目标方法的入参可以是Map类型(实际上也可以是Model类型或者ModelMap类型)
* SpringMVC会将此Map数据作为ModelAndView的model
* 将目标方法的返回值作为ModelAndView的view

<a href="springmvc/testMap">testMap</a>
@RequestMapping("/testMap")public String testMap(Map<String, Object> map){map.put("names", Arrays.asList("Tom","Jerry","mike"));return SUCCESS;}
<h3>${requestScope.names}</h3>

3、SessionAttributes

目标方法默认会将参数放在Request域对象中,加上此注解可以将参数同时放在Session域对象中
* 注意,此注解只能使用在类的上面
* 使用此注解时有两种方式可以指定哪些数据会被放在HttpSession中
* 第一种方式是直接指定参数名称:也就是使用value属性
* 第二种则是指定参数的类型:也就是使用types属性,比如types = String.class
* 当然,两种属性都支持多值操作

<a href="springmvc/testSessionAttributes">testSessionAttributes</a>
@SessionAttributes(value = "user",types = String.class)@RequestMapping("/springmvc")@Controllerpublic class RequestMappingTest {public final static String SUCCESS = "success";@RequestMapping("/testSessionAttributes")public String testSessionAttributes(Map<String, Object> map) {User user = new User("rgx", "123456", "rgx@love.com", 21, new Address("Hubei", "Yichang"));map.put("user", user);map.put("school", "CTGU");return SUCCESS;}}
request:<h3>${requestScope.user}</h3><br><br>session:<h3>${sessionScope.user}</h3><br><br>request:<h3>${requestScope.school}</h3><br><br>session:<h3>${sessionScope.school}</h3>
注意上面的控制器代码中存在SessionAttributes注解,两个属性value和types分别决定将什么对应参数名或者对应类型的model属性数据被放入HttpSession作用域内。

0 0