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";
    }
}

数据的访问过程

posted @ 2020-11-08 17:20  BNTang  阅读(98)  评论(0编辑  收藏  举报