SpringMVC Day 05 : Spring 中的 Model

news2024/12/16 23:55:38

前言

欢迎来到 SpringMVC 系列教程的第五天!在之前的教程中,我们已经学习了如何使用控制器处理请求和返回视图。今天,我们将深入探讨 Spring 中的 Model。

在 Web 应用程序开发中,数据的传递和展示是非常重要的。SpringMVC 提供了一个名为 Model 的机制,用于在控制器和视图之间传递数据。Model 在 SpringMVC 中充当着数据容器的角色,它可以存储和传递各种类型的数据,例如对象、集合、基本类型等。

在本教程中,我们将详细介绍 Spring 中的 Model,并学习如何在控制器中使用它来传递数据给视图。我们还将探讨如何在视图中获取和展示 Model 中的数据。

现在,让我们开始学习 Spring 中的 Model,了解它的作用和用法,以及如何在应用程序中充分利用它来传递和展示数据。

一、前期准备

1、新建项目,结构如下

2、导入依赖
    <dependencies>
    
        <!-- springmvc 依赖,会将spring的核心包一并添加进来 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.23</version>
        </dependency>
     
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>
 
 
 
    </dependencies>
 3、配置 web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

用于配置 Servlet 的映射和加载。在 Spring MVC 中,它用于配置 DispatcherServlet 的初始化和请求映射。

具体来说,这段配置的作用如下:

  1. 定义了一个名为 "dispatcher" 的 Servlet,并指定了 org.springframework.web.servlet.DispatcherServlet 作为其处理类。
  2. 设置了 load-on-startup 属性为 1,表示在应用启动时就加载该 Servlet。
  3. 使用 <servlet-mapping> 元素将 "dispatcher" Servlet 映射到所有的请求路径上(即 <url-pattern>/</url-pattern>),意味着所有的请求都会经过该 Servlet 进行处理。

 这段配置的作用是将所有的请求交给 DispatcherServlet 处理,并让它成为应用的核心控制器。DispatcherServlet 将根据请求的 URL 和其他配置信息,将请求分发给相应的处理器方法进行处理,然后返回响应结果。

4、配置 dispatcher-servlet.xml 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:mcv="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 启用扫描 -->
    <context:component-scan base-package="edu.nf.ch05"/>
    <!-- mvc 注解驱动 -->
    <mvc:annotation-driven/>
    <!-- 默认 servlet 处理静态资源 -->
    <mcv:default-servlet-handler/>
    <!-- 内部资源视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

 主要作用是配置Spring MVC框架相关的组件和参数,以便在Web应用中使用Spring MVC框架进行开发。

具体来说,该配置文件包含以下几个部分:

  1. 命名空间声明:声明了XML文件所使用的命名空间,包括beans、context和mvc三个命名空间。

  2. 组件扫描:通过context:component-scan标签启用组件扫描机制,指定需要扫描的包路径,以便Spring MVC框架能够自动扫描和注册相关的组件。

  3. 注解驱动:通过mvc:annotation-driven标签启用注解驱动机制,使得Spring MVC框架能够自动识别和处理控制器中的注解,例如@RequestMapping、@ResponseBody等。

  4. 静态资源处理:通过mcv:default-servlet-handler标签配置默认的servlet处理静态资源,以便在Web应用中访问静态资源,例如图片、CSS、JavaScript等。

  5. 视图解析器:通过<bean>标签配置视图解析器,将JSP页面映射到对应的控制器方法上,以便返回相应的视图。

二、将 map 设置到 ModelAndView 中

@Controller
public class ModelController {
 @GetMapping("/test1")
    public ModelAndView test1() {
        ModelAndView mav = new ModelAndView("index");
        // 设置请求作用域
        mav.addObject("name", "qiu");
        // 也可以将数据保存到 map 集合中,再设置列到 ModelAndView
        Map<String, Object> map = new HashMap<>();
        map.put("age", 21);
        // 再将 map 设置到 ModelAndView 中
        mav.addAllObjects(map);
        return mav;
    }
}

这段代码的意思是:

  1. 使用了 @GetMapping("/test1") 注解来处理 GET 请求,并将请求映射到路径 "/test1"。

  2. 该方法返回一个 ModelAndView 对象,并设置视图名称为 "index"。

  3. 使用 mav.addObject() 方法将参数保存到请求作用域中,参数名作为键,参数值作为值。在这个例子中,将 "name" 设置为 "qiu"。

  4. 还可以将数据保存到一个 Map 集合中,并使用 mav.addAllObjects() 方法将整个 Map 设置到 ModelAndView 中。在这个例子中,将 "age" 设置为 21。

  5. 最后,将数据保存到请求作用域中,并将视图名称设置为 "index",然后返回 ModelAndView 对象。

 1、在 index.jsp 中获取控制器保存的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>首页</h1>
Name:${requestScope.name}<br>
Age:${requestScope.age}
</body>
</html>
2、运行

这个方法的作用是将数据传递给视图,以便在视图中进行展示。具体来说,它通过 ModelAndView 对象将数据保存到请求作用域中,并将视图名称设置为 "index",然后返回该对象。

在 SpringMVC 中,控制器负责处理请求并返回视图。当控制器需要将数据传递给视图时,可以使用 ModelAndView 对象。ModelAndView 对象允许控制器设置视图名称、模型数据和其他参数,并将它们传递给视图进行展示。

在这个例子中,控制器通过 mav.addObject() 方法和 mav.addAllObjects() 方法将数据保存到请求作用域中。这些数据可以是任何类型的对象,例如字符串、数字、集合、自定义对象等。在视图中,可以通过 ${name}${age} 等表达式获取对应的参数值进行展示。

三、传入一个 Map,保存到 ModelAndView 中

1、Map 
 /**
     * Spring 可以传入一个 Map 、Model 或者 ModelMap
     * 来保存用户需要转发的数据,这些数据一样会保存到请求
     * 作用域中
     * @param map
     * @return
     */
    @GetMapping("/test2")
    public ModelAndView test2(Map<String, Object> map) {
        map.put("name", "qiu");
        map.put("age", 21);

        return new ModelAndView("index");
    }

控制器的方法接受一个 Map<String, Object> 参数,该参数会自动被 SpringMVC 注入。

在方法体内,你可以通过 map.put() 方法将需要传递给视图的数据保存到这个 Map 对象中。在这个例子中,将 "name" 设置为 "qiu",将 "age" 设置为 21。

最后,通过创建一个新的 ModelAndView 对象并设置视图名称为 "index",将数据传递给视图。由于 Map 参数已经保存了需要传递的数据,因此不需要再调用 mav.addObject()mav.addAllObjects() 方法。

这种方式与之前的方式相比,省去了创建 ModelAndView 对象的步骤,直接通过方法参数进行数据传递。这样可以简化代码,并且在方法体内可以更直接地操作数据。

 2、Model
@GetMapping("/test3")
public String test3(Model model) {
    model.addAttribute("name", "qiu");
    model.addAttribute("age", 21);

    return "index";
}

控制器的方法接受一个 Model 参数,该参数会自动被 SpringMVC 注入。与之前的 Map 参数类似,你可以通过 model.addAttribute() 方法将需要传递给视图的数据保存到 Model 对象中。

最后,直接返回视图名称即可。由于 Model 参数已经保存了需要传递的数据,因此不需要再创建 ModelAndView 对象。

3、ModelMap
@GetMapping("/test4")
public String test4(ModelMap modelMap) {
    modelMap.put("name", "qiu");
    modelMap.put("age", 21);

    return "index";
}

方法参数是 ModelMap 对象,代码与 Map 参数的情况类似,只需要将方法参数类型改为 ModelMap 即可。

4、运行效果
 

最后它们运行的结果都是一样的,都是能把数据显示到页面中。 

四、原生 servlet 的传递参数和使用 Spring 中的 Model 传递参数有什么区别

原生 Servlet 的传递参数通常通过 HttpServletRequest 对象来实现,可以使用请求参数、请求头、请求体等方式传递数据。而在 Spring 中,Model 是一种更高级的数据传递方式,用于将数据从控制器传递到视图。

以下是原生 Servlet 和使用 Spring 中的 Model 传递参数的区别:

  1. 数据封装方式:原生 Servlet 需要手动从 HttpServletRequest 中获取参数,并进行解析和封装;而使用 Spring 的 Model 则是通过调用 addAttribute() 方法将数据添加到 Model 中,Spring 框架会自动将数据传递给视图。

  2. 数据范围:原生 Servlet 的参数传递范围局限于单个请求,参数只能在当前请求中传递;而使用 Spring 的 Model,数据可以在整个请求处理过程中共享,包括请求转发、重定向等情况下都可以传递数据。

  3. 视图解析:原生 Servlet 需要手动编写代码来进行视图解析,如使用 RequestDispatcher 进行请求转发或设置响应结果;而使用 Spring 的 Model,则由 Spring MVC 框架负责解析视图,根据配置的视图解析器将模型数据渲染到相应的视图上。

  4. 框架集成:原生 Servlet 是 Java EE 标准的一部分,可以与其他 Java EE 技术无缝集成;而使用 Spring 的 Model,需要结合 Spring MVC 框架进行使用,可以充分利用 Spring 提供的各种便利功能,如拦截器、AOP 等。

总的来说,使用 Spring 的 Model 传递参数相对于原生 Servlet 更加简洁、方便,并且能够与 Spring MVC 框架的其他功能无缝集成。它提供了一种高级的数据传递方式,使得开发人员能够更加专注于业务逻辑的实现,而不需要过多关注底层的参数解析和视图解析等细节。

 

五、使用 Spring 中的 Model 有什么好处

在 Spring 中,Model 是一个接口,它允许控制器方法向视图传递数据。具体来说,Model 接口提供了一个 addAttribute() 方法,用于将数据添加到模型中,以便在视图中使用。

使用 Spring 中的 Model 有以下好处:

  1. 简化代码:使用 Model 可以避免在控制器方法中编写大量的重复代码,如将数据存储到 HttpServletRequest 或 HttpSession 中。相反,只需调用 addAttribute() 方法一次即可将数据添加到 Model 中。

  2. 提高可读性:使用 Model 可以使代码更加清晰易懂,因为它明确指定了要传递的数据和数据的名称。

  3. 支持多种数据类型:Model 不仅支持基本数据类型,还支持集合、数组、JavaBean 等多种数据类型,可以满足不同场景下的数据传递需求。

  4. 支持多种视图技术:Model 不依赖于任何特定的视图技术,可以与多种视图技术(如 JSP、Thymeleaf 等)配合使用,从而提高应用程序的灵活性和可扩展性。

六、gitee 案例

gitee地址:ch05 · qiuqiu/SpringMVC - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter版本选择

使用命令dart --version查看dart版本 使用命令flutter doctor查看flutter版本 Flutter 有 3 个发布渠道&#xff0c;分别是 stable、beta 和 master。我们推荐使用 stable 渠道除非你需要体验最新更新的 Flutter 特性。 要查看你当前使用的哪个渠道&#xff0c;使用下面的命令&…

山西电力市场日前价格预测【2023-10-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-28&#xff09;山西电力市场全天平均日前电价为324.42元/MWh。其中&#xff0c;最高日前电价为601.09元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

微信native支付对接

简介 Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。 应用场景 Native支付适用于PC网站、实体店单品或订单、媒体广告支付等场景,用户扫描商户展示在各种场景的二维码进行支付。聚体步骤如下: 1.商户根据微信支付的规则,…

【EI会议投稿】第三届电气、控制与信息技术国际学术会议(ECITech 2024)

第三届电气、控制与信息技术国际学术会议&#xff08;ECITech 2024&#xff09; 2024 3rd International Conference on Electrical, Control and Information Technology 继往届ECITech年度系列会议的成功举办&#xff0c;第三届电气、控制与信息技术国际学术会议&#xff08…

JTAG 详解

10.1 JTAG简介 JTAG接口的基本工作原理是&#xff1a;在芯片内部定义一个TAP&#xff08;Test Access Port&#xff0c;测试访问端口&#xff09;&#xff0c;开发人员使用连接到芯片的JTAG外部接口上的JTAG调试器&#xff0c;通过访问芯片内部的TAP端口来扫描芯片内部各个扫…

数据驱动决策:大数据分析如何塑造业务成功

文章目录 大数据分析的定义大数据分析如何影响业务1. 洞察业务趋势2. 提高决策质量3. 优化运营效率4. 个性化客户体验5. 发现新商机 如何利用大数据分析实现业务成功1. 收集和整合数据2. 选择适当的工具和技术3. 制定数据策略4. 建立数据分析团队5. 进行实验和反馈 大数据分析的…

激活函数作用以及 sigmoid和softmax

激活函数 激活函数在神经网络中起着非常重要的作用&#xff0c;它的主要功能是引入非线性性质&#xff0c;使得神经网络可以学习和表示更加复杂的模式和关系。下面是激活函数的几个主要作用&#xff1a; 引入非线性&#xff1a;激活函数通过引入非线性变换&#xff0c;打破了…

java.sql.SQLException: ORA-28000: the account is locked

1.遇到的问题 Oracle执行报下面的错误 java.sql.SQLException: ORA-28000: the account is locked 2.解决办法 登录sysdba管理账号&#xff0c;执行下面命令。 alter user demo account unlock&#xff1b;

NPDP产品经理证书值得考吗?

NPDP&#xff08;New Product Development Professional&#xff09;证书是由新产品开发专业协会&#xff08;PDMA&#xff09;提供的一项专业认证。对于那些在产品开发领域寻求进一步发展的人来说&#xff0c;考取这个证书可能是一个值得考虑的选择。 首先&#xff0c;NPDP证…

以“降本增效”为目标,智能视频监控能为企业带来哪些经济价值?

随着经济的发展和科技的进步&#xff0c;企业需要不断提升自身的品质和效率&#xff0c;以保持竞争优势。而智能视频监控技术正是一项值得考虑的工具&#xff0c;其对企业带来的降本增效效益可以通过以下几个方面来体现。 1、降低运行成本 EasyCVR智能视频监控平台可以实现远程…

Mysql数据库 5.SQL语言聚合函数 语言日期-字符串函数

一、聚合函数 SQL中提供了一些可以对查询的记录的列进行计算的函数——聚合函数 1.count&#xff08;&#xff09; 统计函数&#xff0c;统计满足条件的指定字符的值的个数 统计表中rebirth_mood个数 select count(列名) from 表名; #统计表中rebirth_namelcl的个数 select …

亚马逊发布Q3财报,营收利润强劲,云业务增长缓慢

KlipC报道&#xff1a;10月26日&#xff0c;亚马逊发布财报显示&#xff0c;该公司2023年第三季度每股收益0.94美元&#xff0c;营收同比增13%至1431亿美元&#xff0c;营业利润率7.8%远超预期的5.46%&#xff0c;均高于预期。 KlipC的合伙人Andi D表示&#xff1a;“三季度盈利…

S-3A5001 DPDK性能优化

一、已知问题 1. 7A1000桥片总带宽约20G&#xff0c; 7A2000桥片总带宽约40G 2. 7A1000桥片单槽无法跑满2个10G口&#xff0c;需要用双槽来跑&#xff0c;每个槽用1个port 二、 板卡当前状态 用双槽单port模式测试丢包 调试方案1&#xff1a;配置HT拆包寄存器 busybox devm…

如何开通 Medium会员

1 开通 WildCard 卡 首先你需要一张可以支付的外国卡 选择开通 WildCard 卡&#xff0c;优点&#xff1a; 1 无需上传身份证件&#xff0c;支付宝认证即可 2 可以使用国内手机号注册 3 可以使用支付宝、微信充值 开通地址&#xff1a; https://bewildcard.com/card 一步一步…

【AI视野·今日Sound 声学论文速览 第三十期】Fri, 20 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 20 Oct 2023 Totally 7 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;Loop Copilot,基于对话模型的作曲助理 (from 伦敦大学玛丽女王学院) website:https://sites.google.com/view/loop-copilot Daily…

c语言中啥时候用double啥时候用float?

c语言中啥时候用double啥时候用float&#xff1f; 一般来说&#xff0c;可以使用double来表示具有更高精度要求的浮点数&#xff0c;因为它可以存储更大范围的数值并且具有更高的精度。 最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据自己从业十年…

netcore项目中使用miniexcel

1.miniexcel背景简介 常工作中经常与数据打交道的同学肯定会难以避免对Excel的一些数据操作如导入、导出等&#xff0c;但是当对一些大数据量操作Excel时经常会遇到一个常见的问题内存溢出。今天给大家推荐一个简单、高效、低内存避免OOM&#xff08;内存溢出&#xff09;的.N…

SILKYPIX Developer Studio Pro 11E for Mac: 掌握数码照片处理的黄金标准

在当今的数字时代&#xff0c;照片处理已经成为我们日常生活的一部分。无论是社交媒体分享&#xff0c;还是个人相册制作&#xff0c;我们总是希望我们的照片能够展现出最佳的效果。然而&#xff0c;这并非易事。幸运的是&#xff0c;SILKYPIX Developer Studio Pro 11E for Ma…

Angular-04:指令

① 内置指令1.1 *ngIf 结构指令1.2 [hidden] 属性指令1.3. *ngFor 结构指令1.4 *ngSwitch 结构指令 ② 自定义指令用法 指令是angular操作dom的途径&#xff0c;分为属性指令和结构指令。属性指令&#xff1a;修改元素的外观或行为。使用 [ ] 包裹。结构指令&#xff1a;增加、…