当前位置: 首页 > news >正文

2.SpringMvc中Model、ModelMap和ModelAndView使用详解

1.前言
最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。 使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别。 这两者之间有着很大的区别,具体就表现在 Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView 却是可以进行业务寻址的,就是设置对应的要请求的静态文件,这里的静态文件指的是类似jsp的文件。 其次,两者还有一个最大的区别,那就是Model是每一次请求可以自动创建,但是ModelAndView 是需要我们自己去new的。
 

2.Model方法

注意:如果在控制层上的方法声明了注解@ResponseBody ,则会直接将返回值输出到页面。 Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。

public class ExtendedModelMap extends ModelMap implements Model

一般来说,可以用model来接收各种类型的数据,如果使用来接收一组数据List 》》那么这个时候的model实际上是ModelMap

3.ModelMap方法
ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,
他的作用类似于request对象的setAttribute方法的作用: 用来在一个请求过程中传递处理的数据。
ModelMap或者Model通过addAttribute方法向页面传递参数.
其中addAttribute方法参数有多种方式:

public ModelMap addAttribute(String attributeName, Object attributeValue){...}
public ModelMap addAttribute(Object attributeValue){...}
public ModelMap addAllAttributes(Collection<?> attributeValues) {...}
public ModelMap addAllAttributes(Map<String, ?> attributes){...}

然后在jsp页面上可以通过el表达式语言$attributeName或者是C标签库下的方法,来获取并展示modelmap中的数据。
modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址.
那么我们可以通过控制器方法的字符串返回值来设置跳转url地址别名或者物理跳转地址。
 

4.ModelAndView方法

添加模型数据用addObject; 设置视图setViewName; ModelAndView 对象有两个作用: (1). 设置转向地址,这也是ModelAndView和ModelMap的主要区别.设置方式如下所示:

ModelAndView view = new ModelAndView("path:student");

或者通过setViewName方式:

public void setViewName(String viewName){...}

(2). 将控制器方法中处理的结果数据传递到结果页面,也就是把在结果页面上需要的数据放到ModelAndView对象中即可,其作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数

public ModelAndView addObject(String attributeName, Object attributeValue){...}
public ModelAndView addObject(Object attributeValue){...}

在jsp中:也是可以通过el表达式语言attributeName 或 者 C 标 签 库 的 attributeName或者C标签库的attributeName或者C标签库的{name } 来获取并展示ModelAndView中的数据

5.使用示例

(1) Model 或者 ModelMap Model 和 ModelMap 的实例都是spirng mvc框架来自动创建并作为控制器方法参数传入,用户无需自己创建。 而且需要return 返回指定的页面路径.

在控制层的java代码中写入:

    //传值方法一
    @RequestMapping("listCategory2")
    public String listCategory2(Model model) {
        
        // 接收查询的信息
        List<Category> cs2= categoryService.list();
        // 封装了查询的数据
        model.addAttribute("test", cs2);
        //重要!!需要给出返回model跳转的路径
        return "listCategory2";
    }

然后在jsp页面中写入:

<!-- 获取值的时候,对应的是addAttribute的第一个参数!取了个别名为c-->
    <c:forEach items="${test }" var="c" varStatus="st">
        <tr>
            <td>${c.id}</td>
            <td>${c.name}</td>
        </tr>
    </c:forEach>

(2) ModelAndView
ModelAndView的实例是需要我们手动new的,这也是和ModelMap的一个区别。
而且,ModelAndView 可以自己寻址,只需要return 返回其对象即可。

在控制层的java代码中写入:

//传值方法二:使用ModelAndView
    //当url处于这个时,由listCategory方法来处理请求
    @RequestMapping("listCategory")
    public ModelAndView listCategory(){
        //创建一个模型视图对象
        ModelAndView mav = new ModelAndView();
        //获取到查询的数据
        List<Category> cs= categoryService.list();
        
        // //将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型
        mav.addObject("cs", cs);
        // 放入jsp路径
        mav.setViewName("listCategory");
         //返回ModelAndView对象mav
        return mav;
    }

在jsp页面中:

 <!-- 使用c标签库,循环遍历出数据 ,命名为c-->
    <c:forEach items="${cs}" var="c" varStatus="st">
        <tr>
            <td>${c.id}</td>
            <td>${c.name}</td>
        </tr>
    </c:forEach>

http://www.lryc.cn/news/127988.html

相关文章:

  • Spark repartition和coalesce的区别
  • 微服务最佳实践,零改造实现 Spring Cloud Apache Dubbo 互通
  • leetcode 力扣刷题 两数/三数/四数之和 哈希表和双指针解题
  • (搜索) 剑指 Offer 12. 矩阵中的路径 ——【Leetcode每日一题】
  • 构建高可用的去中心化微服务集群架构指南
  • Sui主网升级至V1.7.1版本
  • 自然语言处理从入门到应用——LangChain:索引(Indexes)-[基础知识]
  • k8s集群监控方案--node-exporter+prometheus+grafana
  • nginx反向代理流程
  • Java“牵手”根据店铺ID获取淘宝店铺所有商品数据方法,淘宝API实现批量店铺商品数据抓取示例
  • 从0开始yolov8模型目标检测训练
  • 设计模式-抽象工厂模式
  • 如何用Apipost实现sign签名?
  • Hive底层数据存储格式
  • 双向-->带头-->循环链表
  • Opencv4基于C++基础入门笔记:OpenCV环境配置搭建
  • JS基础之实现map方法
  • FPGA应用学习笔记-----复位电路(二)和小结
  • 信捷 XD PLC 16位整数转换为双精度浮点数
  • (二)结构型模式:1、适配器模式(Adapter Pattern)(C++实现示例)
  • 【编程二三事】ES究竟是个啥?
  • 爬虫逆向实战(三)--天某云登录
  • 不要过于迷恋软件架构,要重视如何设计根据简单和清晰的设计
  • Grafana监控 Redis Cluster
  • k8s 认证和权限控制
  • 性能优化的重要性
  • Leetcode No.53 Maximum Subarray
  • 手机出现 不读卡 / 无信号时应该怎么办?
  • Linux 内核模块运行机制(10/11)
  • MySQL数据库-字符串函数详解