SpringMVC-传值方式
ModelMap
ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,request对象的setAttribute方法的作用:用来在一个请求过程中传递处理的数据。使用方法与model一样
Model
Model 和 ModelMap 的实例都是 SpirngMVC 框架来自动创建并作为控制器方法参数传入,无需自己创建,可以简单地将model 的实现类理解成一个 Map,Request级别的模型数据,Model 是一个接口, 其实现类为 ExtendedModelMap,继承了ModelMap类
方法介绍
方法名 | 作用 |
---|---|
Model addAttribute(String attributeName, Object attributeValue); | 添加键值对属性 |
Map<String, Object> asMap(); | 将当前的model转换成Map |
Model addAttribute(Object attributeValue); | 以属性的类型为键添加属性 |
Model addAllAttributes(Map<String, ?> attributes); | 将attributes中的内容复制到当前的model中,如果当前model存在相同内容,会被覆盖 |
Model addAllAttributes(Collection<?> attributeValues); | 以集合中数据的类型做为key, 将所提供的Collection中的所有属性复制到这个Map中, 如果有同类型会存在覆盖现象 |
Model mergeAttributes(Map<String, ?> attributes); | 将attributes中的内容复制到当前的model中,如果当前model存在相同内容,不会被覆盖 |
boolean containsAttribute(String attributeName); | 判断是否包含指定的属性名 |
注意事项:关于如下的示例都是需要自己跑一个工程然后发送请求进行测试的。
Model addAttribute(String attributeName, Object attributeValue) 示例如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/testModel.action">提交请求</a>
</body>
</html>
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
return "/first";
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
${requestScope.name}
</body>
</html>
Map<String, Object> asMap() 示例如下所示:
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
System.out.println(model.asMap());
return "/first";
}
}
Model addAttribute(Object attributeValue) 示例如下所示:
Goods 实体类的代码如下,其实之前中的文章也有我这里图方便就直接放在下面了。
/**
* @author: BNTang
*/
@Data
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
public class Goods {
private String goods_name;
private String goods_price;
private Date goods_date;
}
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
Goods goods = Goods.builder().goods_name("JonathanLee").build();
model.addAttribute(goods);
return "/first";
}
}
first.jsp 修改内容如下所示:
Model addAllAttributes(Map<String, ?> attributes) 示例如下所示:
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
Map<String, Object> map = new HashMap<>();
map.put("name", "JonathanLee");
map.put("age", 23);
model.addAllAttributes(map);
return "/first";
}
}
first.jsp 修改的内容如下所示:
Model addAllAttributes(Collection<?> attributeValues) 示例如下所示:
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
model.addAttribute("age", 23);
List<Object> list = new ArrayList<>();
list.add("JonathanLee");
list.add("Tang");
list.add(1);
model.addAllAttributes(list);
System.out.println(model.asMap());
return "/first";
}
}
Model mergeAttributes(Map<String, ?> attributes) 示例如下所示:
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
Map<String, Object> map = new HashMap<>();
map.put("name", "JonathanLee");
model.mergeAttributes(map);
return "/first";
}
}
boolean containsAttribute(String attributeName) 示例如下所示:
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
Map<String, Object> map = new HashMap<>();
map.put("name", "JonathanLee");
model.mergeAttributes(map);
System.out.println(model.containsAttribute("names"));
return "/first";
}
}
ModelAndView
需要自己创建,既包含模型也包含视图
@SessionAttributes 注解
将模型中的某个属性暂存到 HttpSession 中,以便多个请求之间可以共享这个属性
- value:通过指定key将model数据放到session域当中
- type:把指定类型的模型数据放到session域当中
value 示例如下所示:
/**
* @author: BNTang
*/
@Controller
@SessionAttributes(value = {"goods", "name"})
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
Goods goods = Goods.builder().goods_name("BNTang").build();
model.addAttribute(goods);
model.addAttribute("name", "JonathanLee");
return "/first";
}
}
first.jsp 修改的内容如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
${sessionScope.goods}
${sessionScope.name}
</body>
</html>
type 示例如下所示:
@SessionAttribute 注解
使用@SessionAttribute来访问预先存在的全局会话属性
改造 index.jsp
新增一个请求
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/testModel.action">提交请求</a>
<br/>
<a href="${pageContext.request.contextPath}/result.action">提交请求</a>
</body>
</html>
/**
* @author: BNTang
*/
@Controller
@SessionAttributes(value = {"goods"}, types = String.class)
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
Goods goods = Goods.builder().goods_name("BNTang").build();
model.addAttribute(goods);
model.addAttribute("name", "JonathanLee");
return "/first";
}
@RequestMapping("result")
public String myTest(@SessionAttribute("goods") Goods goods) {
System.out.println("Goods → " + goods);
return "/result";
}
}
测试方式,先请求 testModel
先在 session 域当中存放数据,然后在请求 result
即可
@ModelAttribute
修改处理方法的参数时, 自动把该参数放到model当中,修改 index.jsp
内容如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/testModel.action" method="get">
商品名称:<input type="text" placeholder="请输入商品名称" name="goods_name"/>
<br/>
商品价格:<input type="text" placeholder="请输入商品价格" name="goods_price"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(@ModelAttribute Goods goods, Model model) {
System.out.println(model.asMap());
return "/first";
}
}
在方法定义上使用 @ModelAttribute 注解, SpringMVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@ModelAttribute
public void testMethod(){
System.out.println("在 show 之前执行");
}
@RequestMapping("testModel")
public String show(@ModelAttribute Goods goods, Model model) {
System.out.println(model.asMap());
return "/first";
}
}