SpringMVC 处理数据模型
ModelAndView
处理方法返回值类型为 ModelAndView 时,方法体即可通过该对象添加模型数据
example
java代码
/**
*SpringMVC 会把 ModelAndView 的model中数据放入request域对象中,所以jsp 能从请求域中拿出来
*/
@RequestMapping("/modelAndViewTest")
public ModelAndView modelAndViewTest(){
//创建一个 ModelAndView 对象,并且为这个对象命名; "modelAndViewTest" 表示请求转发的资源名称
ModelAndView modelAndView = new ModelAndView("modelAndViewTest");
//在 ModelAndView 中添加 键值对
modelAndView.addObject("time", new Date());
//返回给 SpringMVC的视图处理器
return modelAndView;
}
jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<h3>Success</h3>
time:${time}
</body>
</html>
网页结果
Map
SpringMvc 在内部使用了一个Model接口存储模型数据
具体步骤
- SpringMVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器
- 如果方法的入参为 Map 或 Model 类型,SpringMVC 会将隐含模型的引用传递给这些入参,在方法体内,开发者通过这个入参对象访问到模型中的所有数据,也可向模型中添加新的属性数据
example
java代码
@RequestMapping("/mapTest")
public String mapTest(Map<String, Object> map){
map.put("names", Arrays.asList("tom","jerry", "mike"));
return "success";
}
jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<h3>Success</h3>
names:${requestScope.names}
</body>
</html>
网页结果
@SessionAttributes
使用范围: 类
作用: 将 map 中符合要求的数据 放入会话域中
example
java代码
@Controller
@SessionAttributes(value = {"str1"}, types = Date.class)
/**
* value 表示 map中对应的key 存放到 会话域中
* types 表示 map中的所有的 value 如果是指定类型的数据,多会存放到 会话域中
*/
public class Demo3 {
@RequestMapping("/SessionAttributesTest")
public String SessionAttributesTest(Map<String, Object> map){
map.put("str1", "字符串1");
map.put("str2", new Date());
return "success2";
}
}
jsp 代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
<h3>Success</h3>
请求域<br/>
str1:${requestScope.str1}<br/>
str2:${requestScope.str2}<br/>
会话域<br/>
str1:${sessionScope.str1}<br/>
str2:${sessionScope.str2}<br/>
</body>
</html>
网页显示效果
@ModelAttribute
使用范围:方法,参数列表
作用: 类似Servlet 的 Filter ,每次访问对应 url映射的对应的方式时 都会,调用控制器 中 被@ModelAttribute修饰的方法,有点 类似 Junit 中的 @Before
注意:@ModelAttribute 修饰的方法中,放入到Map时 的键需要与目标方法 的入参类型的 首字母小写的字符串一致
example
java代码
@ModelAttribute
public void modelAttribute(User user, Map<String, Object> map){
System.out.println(user.hashcode());
if (user != null){
user.setPassword("密码");
map.put("user", user);
}
}
@RequestMapping("/modelAttributeTest")
public String modelAttributeTest(User user){
System.out.println(user.hashcode());
System.out.println(user);
return "success";
}
输出结果
1892208422
1892208422
密码小结
- 有@ModelAttrbute 标记的方法,会在每个目标方法执行前没SpringMVC 调用
- @ModelAttrbute 注解也可以来修饰目标方法POJO 类型入参, 其 value属性值有如下作用:
- SpringMVC 会使用value 属性值在implicitModel 中查找对应的对象,若存在则会直接传入到目标方法的入参中。
- SpringMVC 会以 value 为key, POJO类型的对象为value 存入到 request 中
- 目标方法入参没有使用@ModelAttrbute ,目标方法的入参会按类型去 implicitModel 中查找对应的对象, 并且 入参 会存放到 请求域中, key 就是 入参类型 首字母小写
- 被 @ModelAttrbute 修饰的方法,map 中的数据会被存放到 request中 key, 就是 map 的key
配置直接转发,不经过 Handler
springMVC.xml 中配置
<mvc:view-controller path="/success" view-name="success"/>
SpringMVC 重定向或转发
控制器映射的方法返回值 加上 redrect 或者 foword 即可
example
@RequestMapping("/redirectTest")
public String redirectTest(){
return "redirect:/jsp/success.jsp";
}
注意:redirect后面的资源名必须是全路径,这样写,redirect 不会经过视图解析器,拼接前后缀
本文详细介绍了SpringMVC处理数据模型的多种方式,包括ModelAndView、Map的使用,以及@SessionAttributes、@ModelAttribute注解的作用和用法。还提及了配置直接转发不经过Handler,以及SpringMVC重定向或转发的实现方法,并给出了相应的代码示例和结果展示。

693

被折叠的 条评论
为什么被折叠?



