kevin

奋斗的码农

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>
View Code

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     }
View Code

其中,viewname是返回的视图名称,就是这些数据在哪个页面显示的那个页面地址。

model对象可以看成一个存放数据的容器,可以往里面加入键值对的对象,在显示的页面再把其取出来显示

1 time:
2 ${requestScope.time }
View Code

可以把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>
View Code

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     }
View Code

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>
View Code

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     }
View Code

结果

请求与与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>
View Code

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     }
View Code

结果

年龄等数据项可以修改,密码等数据项不变。

下面是源码分析过程:要导入这个包,才能看到源码调试过程。最终将implicitModel对象传到请求域中。页面就可以看到修改后的对象的属性值了。

 

 

posted on 2016-08-31 12:31  存在00000  阅读(498)  评论(0编辑  收藏  举报

导航