SpringMVC-传值方式
  TEZNKK3IfmPf 2023年11月13日 30 0

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) 示例如下所示:

SpringMVC-传值方式

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
<a href="https://www.ctyun.cn/portal/link.html?target=%24%7BpageContext.request.contextPath%7D%2FtestModel.action">提交请求</a>
</body>
</html>

SpringMVC-传值方式

/**
* @author: BNTang
*/
@Controller
public class MyFirstController {
@RequestMapping("testModel")
public String show(Model model) {
model.addAttribute("name", "BNTang");
return "/first";
}
}

SpringMVC-传值方式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
${requestScope.name}
</body>
</html>

Map<String, Object> asMap() 示例如下所示:

SpringMVC-传值方式

/**
* @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;
}

SpringMVC-传值方式

/**
* @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 修改内容如下所示:

SpringMVC-传值方式

Model addAllAttributes(Map<String, ?> attributes) 示例如下所示:

SpringMVC-传值方式

/**
* @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 修改的内容如下所示:

SpringMVC-传值方式

Model addAllAttributes(Collection<?> attributeValues) 示例如下所示:

SpringMVC-传值方式

/**
* @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) 示例如下所示:

SpringMVC-传值方式

/**
* @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) 示例如下所示:

SpringMVC-传值方式

/**
* @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 示例如下所示:

SpringMVC-传值方式

/**
* @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 示例如下所示:

SpringMVC-传值方式

@SessionAttribute 注解

使用@SessionAttribute来访问预先存在的全局会话属性

改造 ​​index.jsp​​ 新增一个请求

SpringMVC-传值方式

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>传值方式</title>
</head>
<body>
<a href="https://www.ctyun.cn/portal/link.html?target=%24%7BpageContext.request.contextPath%7D%2FtestModel.action">提交请求</a>
<br/>
<a href="https://www.ctyun.cn/portal/link.html?target=%24%7BpageContext.request.contextPath%7D%2Fresult.action">提交请求</a>
</body>
</html>

SpringMVC-传值方式

/**
* @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​​ 内容如下所示:

SpringMVC-传值方式

<%@ 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>

SpringMVC-传值方式

/**
* @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 的方法。

SpringMVC-传值方式

/**
* @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";
}
}

数据的访问过程

SpringMVC-传值方式

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月13日   24   0   0 springMVC上传
  TEZNKK3IfmPf   2023年11月13日   36   0   0 springMVC
  TEZNKK3IfmPf   2023年11月13日   30   0   0 springMVC
  TEZNKK3IfmPf   2023年11月13日   49   0   0 springMVC
  TEZNKK3IfmPf   2023年11月14日   24   0   0 springMVC
  TEZNKK3IfmPf   2023年11月14日   28   0   0 springMVCspring
  TEZNKK3IfmPf   2023年11月14日   29   0   0 springMVC
TEZNKK3IfmPf