SpringMVC 学习笔记(四) 处理模型数据

时间:2023-03-08 23:49:44
SpringMVC 学习笔记(四) 处理模型数据

Spring MVC 提供了下面几种途径输出模型数据:

– ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据

– Map及Model:入參为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自己主动加入到模型中。

– @SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间能够共享这个属性

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

1.1. ModelAndView

控制器处理方法的返回值假设为 ModelAndView, 则其既包括视图信息,也包括模型数据信息。

• 加入模型数据:

– ModelAndView addObject(String attributeName, Object attributeValue)

– ModelAndView addAllObject(Map<String, ?

> modelMap)

• 设置视图:

– void setView(View view)

– void setViewName(String viewName)

JAVA:

/**
* SpringMVC 使用 ModelAndView 来解析视图和数据
* 假设返回的是字符串 运行方法后 还是会包装成一个 ModelAndView
* 最后会遍历 ModelMap将键值对存入request中
* @return
*/
@RequestMapping("/modelAndView")
public ModelAndView modelAndView(){
ModelAndView mv = new ModelAndView();
mv.addObject("name", "bigsea");
mv.addObject("age", 23);
mv.setViewName("helloworld");
return mv;
}

JSP:

<a href="modelAndView">modelAndView</a>
<br>
name : ${name} <br>
age : ${age} <br>
<br>

结果:

SpringMVC 学习笔记(四) 处理模型数据

ModelAndView 主要有 view 和 model 属性

SpringMVC 学习笔记(四) 处理模型数据

ModelMap 关系图

SpringMVC 学习笔记(四) 处理模型数据

最后解析的时候会遍历 map 然后将键值对 存入 request 中

SpringMVC 学习笔记(四) 处理模型数据

1.2. Map 和Model

Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据

• 详细步骤

– Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。

– 假设方法的入參为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传

递给这些入參。在方法体内,开发人员能够通过这个入參对象訪问到模型中的全部数

据。也能够向模型中加入新的属性数据

JAVA:

/**
* 当參数为Map时
* SpirngMVC 会传入 一个BindingAwareModelMap
* 往BindingAwareModelMap里面存入的值 会在后面存入request域中
* @param map
* @return
*/
@RequestMapping("/map")
public String map (Map<String, Object> map){
System.out.println(map.getClass().getName());
map.put("name", "bigsea");
map.put("age", 23);
return "helloworld";
}

JSP:

<a href="map">map</a>
name : ${name} <br>
age : ${age} <br>
<br>

SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

SpringMVC 学习笔记(四) 处理模型数据SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">SpringMVC 学习笔记(四) 处理模型数据SpringMVC 学习笔记(四) 处理模型数据SpringMVC 学习笔记(四) 处理模型数据

将获取的结果存入開始new出来的ModelAndView 中,最后解析视图的时候,遍历插入request中,我们能够查看输出的map类型

org.springframework.validation.support.<span style="color:#ff0000;">BindingAwareModelMap</span>

1.3. @SessionAttributes

若希望在多个请求之间共用某个模型属性数据,则能够在控制器类上标注一个 @SessionAttributes,SpringMVC将在模型中相应的属性暂存到 HttpSession 中。

• @SessionAttributes 除了能够通过属性名指定须要放到会话中的属性外。还能够通过模型属性的对象类型指定哪些模型属性须要放到会话中

– @SessionAttributes(types=User.class) 会将隐含模型中全部类型为 User.class 的属性加入到会话中。

– @SessionAttributes(value={“user”,”admin”})

– @SessionAttributes(types={User.class, Department.class})

– @SessionAttributes(value={“user”,”admin”}, types={User.class})

SpringMVC 学习笔记(四) 处理模型数据

/**
* 通过 @SessionAttributes 注解 在@SessionAttributes 中 设置 type 和 value
* type: 通过类型 来推断是否 将 属性存入 会话中
* value : 通过 ModelAndView 中 ModelMap 的 key 来推断 key 是否和 value 相等 假设相等 存入
* @return
*/
@RequestMapping("/sessionAttributes")
public ModelAndView sessionAttributes(){
User user = new User();
user.setName("bigsea");
user.setAge(23);
ModelAndView mv = new ModelAndView();
mv.setViewName("success");
mv.addObject("user", user);
return mv;
}

SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">SpringMVC 学习笔记(四) 处理模型数据SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">SpringMVC 学习笔记(四) 处理模型数据

1.4. @ModelAttribute

在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前。会先逐个调用在方法级上标注了@ModelAttribute 的方法。

• 在方法的入參前使用 @ModelAttribute 注解:

– 能够从隐含对象中获取隐含的模型数据中获取对象,再将请求參数绑定到对象中,再传入入參

– 将方法入參对象加入到模型中

SpringMVC 学习笔记(四) 处理模型数据

/**
* 当标注了@ModelAttribute
* SpirngMVC就会在调用目标方法前去运行该方法
* 将结果传入implicitMode中
* SpringMVC 中 大量的使用implicitMode
* @return
*/
@ModelAttribute("user")
public User modelAttribute(){
User user = new User();
user.setName("bigsea");
user.setAge(23);
return user;
}

SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1.1. HttpSessionRequiredException 异常

假设在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入參。然后再用请求消息填充该入參对象。

假设在会话中找不到相应的属性。则抛出 HttpSessionRequiredException 异常

@RequestMapping("/testSessionAttributesError")
public String testSessionAttributesError(User user){
System.out.println(user);
return "helloworld";
}
/**
* 当标注了@ModelAttribute
* SpirngMVC就会在调用目标方法前去运行该方法
* 将结果传入implicitMode中
* SpringMVC 中 大量的使用implicitMode
* @return
*/
@ModelAttribute("abc")
public User modelAttribute(){
User user = new User();
user.setName("bigsea");
user.setAge(23);
return user;
}

SpringMVC 学习笔记(四) 处理模型数据

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

改为以下这样的方式:

	@RequestMapping("/testSessionAttributesError")
public String testSessionAttributesError(@ModelAttribute("abc")User user){
System.out.println(user);
return "helloworld";
}