springmvc学习(五)——处理模型数据
Spring MVC 提供了以下几种途径输出模型数据:
ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
Map 及 Model:
入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map
时,处理方法返回时,Map 中的数据会自动添加到模型中。
@SessionAttributes: 将模型中的某个属性暂存到HttpSession
中,以便多个请求之间可以共享这个属性
@ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
1.ModelAndView
控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
添加模型数据:
MoelAndView
addObject(String attributeName, Object attributeValue)
ModelAndView
addAllObject(Map<String, ?> modelMap)
设置视图 :
void setView(View view
)
void setViewName(String viewName)
例子:
jsp代码:
1 <a href="springmvc/testModelAndView">testModelAndView</a><br>
java
1 @RequestMapping(value="/testModelAndView") 2 public ModelAndView testModelAndView(){ 3 String viewName=SUCCESS; 4 ModelAndView model=new ModelAndView(viewName); 5 model.addObject("time", new Date()); 6 return model; 7 }
其中,viewname是返回的视图名称,就是这些数据在哪个页面显示的那个页面地址。
model对象可以看成一个存放数据的容器,可以往里面加入键值对的对象,在显示的页面再把其取出来显示
1 time: 2 ${requestScope.time }
可以把MAV理解成M给V数据,springmvc把模型数据放入到了请求域中。
2 .Map 及 Model
Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据
具体步骤:
Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据
jsp
1 <a href="springmvc/testMap">testMap</a><br>
java
1 /* 2 * 目标方法可以添加map类型的参数 3 * 实际也可以是Model或者ModelMap类型的参数 4 * org.springframework.validation.support.BindingAwareModelMap 5 */ 6 @RequestMapping(value="/testMap") 7 public String testMap( Map<String,Object> map){ 8 System.out.println(map.getClass().getName()); 9 map.put("names", Arrays.asList("王五","张三","李四")); 10 11 return SUCCESS; 12 }
success.jsp
3.@SessionAttributes
若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个 @SessionAttributes, Spring MVC 将在模型中对应的属性暂存到 HttpSession 中。
@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
@SessionAttributes(types=User.class) 会将隐含模型中所有类型为 User.class 的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”})
@SessionAttributes(types={User.class, Dept.class})
@SessionAttributes(value={“user1”, “user2”}, types={Dept.class})
例子
jsp
1 <a href="springmvc/testSession">testSession</a><br>
java
1 @RequestMapping(value="/testSession") 2 public String testSessionAttribute(Map<String,Object> map){ 3 User user=new User("baipeng", "123", "bai@qq.com", 23); 4 map.put("user", user); 5 map.put("school", "cumt"); 6 return SUCCESS; 7 }
结果
请求与与session域中都可以获得到。
4.@ModelAttribute
这两幅图的区别就是对象是要新建还是从数据库中取得一个,根据需求,是要从数据库中取得一个,修改其属性即可。
jsp:
1 <!-- 需求说明,原始数据为 2 一、1,tom,123456,bai@qq.com,23 3 二、密码不能被修改 4 三、表单回显,模拟操作直接在表单填写对应的属性值 5 6 --> 7 <form action="springmvc/testModelAttribute" method="post"> 8 <input type="hidden" name="id" value="1"> 9 username<input type="text" name="username" value="tom"> 10 email<input type="text" name="email" value="tom@qq.com"> 11 age<input type="text" name="age" value="23"> 12 <input type="submit" value="submit"> 13 </form>
java
1 //被@ModelAttribute修饰的方法,会在目标方法执行前被springmvc调用 2 @ModelAttribute 3 public void getUser(@RequestParam(value="id", required=false)Integer id,Map<String,Object> map){ 4 System.out.println("getuser调用了"); 5 if(id!=null){ 6 //模拟从数据库中获取对象 7 User user=new User("tom", "123456", "bai@qq.com", 23, 1); 8 System.out.println("从数据库获取对象"+user); 9 map.put("user", user); 10 11 } 12 } 13 /* 14 *运行流程 15 *1.执行@ModelAttribute修饰的方法,从数据库中获取数据,并且添加到map中 16 *2.springmvc从map中把user对象获取到,并把表单请求参数赋值给user对象相应的属性值 17 *3.springmvc把上面修改后的user对象再传给目标方法的形参 18 * 19 *注意:@ModelAttribute修饰的方法中,map的键的值,要和目标方法中类的值的小写一致,这样能保证是一个对象,而不是新创建的对象 20 */ 21 22 @RequestMapping(value="/testModelAttribute") 23 public String testModelAttribute(User user){ 24 //表单属性给对象属性赋值 25 //form表单中的input的name值要与user实体的属性值相同,否则不能传值的 26 System.out.println("testModelAttribute修改"+user); 27 return SUCCESS; 28 }
结果
年龄等数据项可以修改,密码等数据项不变。
下面是源码分析过程:要导入这个包,才能看到源码调试过程。最终将implicitModel对象传到请求域中。页面就可以看到修改后的对象的属性值了。