SpringMVC Day 05 : Spring 中的 Model

前言

欢迎来到 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 集合中,再设置列到 ModelAndViewMap<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.mzph.cn/news/121484.shtml

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

相关文章

仿真软件Proteus8.10 SP3 pro一键安装、汉化教程(附proteus8.10下载链接安装视频)

本破解教程仅供个人及 proteus 8.10粉丝们交流学习之用&#xff0c;请勿用于商业用途&#xff0c; 谢谢支持。此版本为Proteus8.10 SP3 pro 这里写目录标题 安装包下载链接:视频教程 一、安装软件解压二、软件安装三、汉化 安装包下载链接: http://www.eemcu.cn/2022/05/14/pr…

FindDiff_Qt找不同项目

文章目录 项目简介源代码widget.hwidget.cppwidget.ui配置文件找不同.json 项目简介 开发平台 win10Qt6.6msvc2022 简介 微信上有一些好玩的游戏, 找不同一种比较轻松有趣的游戏,也曾经在街机上被坑过N币, 玩了几次后,发现还是太难了,于是开始截屏放大,慢慢找,再然后就发展到截…

群晖上搭建teamspeak3语音服务器

什么是 TeamSpeak &#xff1f; TeamSpeak &#xff08;简称 TS&#xff09;是一款团队语音通讯工具&#xff0c;但比一般的通讯工具具有更多的功能而且使用方便。它由服务器端程序和客户端程序两部分组成&#xff0c;如果不是想自己架设 TS 服务器&#xff0c;只需下载客户端程…

Linux系统编程_网络编程:字节序、socket、serverclient、ftp 云盘

1. 网络编程概述&#xff08;444.1&#xff09; TCP/UDP对比 TCP 面向连接&#xff08;如打电话要先拨号建立连接&#xff09;&#xff1b;UDP 是无连接的&#xff0c;即发送数据之前不需要建立连接TCP 提供可靠的服务。也就是说&#xff0c;通过 TCP 连接传送的数据&#xf…

设计模式——单例模式详解

目录 设计模式类型单例模式单例模式方式饿汉式静态常量方式静态代码块形式 懒汉式线程不安全&#xff08;不推荐&#xff09;懒汉式优化&#xff08;不推荐&#xff09; 双重检查&#xff08;推荐方式&#xff09;静态内部类&#xff08;推荐方式&#xff09;枚举方式&#xff…

STM32 ADC数模转换器

STM32 ADC数模转换器 ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 STM32主要是数字电路&#xff0c;数字电路只有高低电平&#xf…

【torch高级】一种新型的概率学语言pyro(01/2)

一、说明 贝叶斯推理&#xff0c;也就是变分概率模型估计&#xff0c;属于高级概率学模型&#xff0c;极有学习价值&#xff1b;一般来说&#xff0c;配合实际活动学习可能更直观&#xff0c;而pyro是pytorch的概率工具&#xff0c;不同于以往的概率工具&#xff0c;只是集中于…

PY32F002A系列单片机:高性价比、低功耗,满足多样化应用需求

PY32F002A系列微控制器是一款高性能、低功耗的MCU&#xff0c;它采用32位ARM Cortex-M0内核&#xff0c;最高工作频率达到24MHz&#xff0c;提供了强大的计算能力。此外&#xff0c;PY32F002A拥有最大20Kbytes的flash存储器和3Kbytes的SRAM&#xff0c;为简单的数据处理提供了充…

Python Selenium 之数据驱动测试的实现!

数据驱动模式的测试好处相比普通模式的测试就显而易见了吧&#xff01;使用数据驱动的模式&#xff0c;可以根据业务分解测试数据&#xff0c;只需定义变量&#xff0c;使用外部或者自定义的数据使其参数化&#xff0c;从而避免了使用之前测试脚本中固定的数据。可以将测试脚本…

Unity3D 如何用unity引擎然后用c#语言搭建自己的服务器

Unity3D是一款强大的游戏开发引擎&#xff0c;可以用于创建各种类型的游戏。在游戏开发过程中&#xff0c;经常需要与服务器进行通信来实现一些功能&#xff0c;比如保存和加载游戏数据、实现多人游戏等。本文将介绍如何使用Unity引擎和C#语言搭建自己的服务器&#xff0c;并给…

Redis(05)| 数据结构-哈希表

哈希表是一种保存键值对&#xff08;key-value&#xff09;的数据结构。 哈希表中的每一个 key 都是独一无二的&#xff0c;程序可以根据 key 查找到与之关联的 value&#xff0c;或者通过 key 来更新 value&#xff0c;又或者根据 key 来删除整个 key-value等等。 在讲压缩列表…

报错:Could not resolve host: mirrorlist.centos.org;Unknown error

报错&#xff1a;Could not resolve host: mirrorlist.centos.org;Unknown error 一般是因为网络配置错误导致无法连接外网&#xff0c;我们先尝试ping一下www.baidu.com发现无法ping通。 果然&#xff0c;接下来我们就开始排查吧&#xff01;&#xff01; 1.网络配置查看 打开…

HarmonyOS原生分析能力,即开即用助力精细化运营

数据分析产品对开发者的价值呈现在两个层面&#xff0c;第一个是产品的层面&#xff0c;可以通过数据去洞察用户的行为&#xff0c;从而找到产品的优化点。另外一个就是运营层面&#xff0c;可以基于数据去驱动&#xff0c;来实现私域和公域的精细化运营。 在鸿蒙生态上&#…

conda 实践

1. 环境部署 1.1. 下载 anaconda 安装包 下面这个网址查找自己需要的版本 https://repo.anaconda.com/archive/ 或者手动下载。 wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh 1.2. 执行安装程序 #安装依赖&#xff1a; sudo yum install bzip2…

APP自动化测试 ---- Appium介绍及运行原理

在面试APP自动化时&#xff0c;有的面试官可能会问Appium的运行原理&#xff0c;以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS&#xf…

node 第十三天 express初见

express概念 Fast, unopinionated, minimalist web framework for Node.js 快速、独立、极简的 Node.js Web 框架。 express相当于前端的jquery, 在不更改不侵入原生node的基础上封装了大量易用且实用的服务端api, express框架的封装原理就是前面第十天我们自己封装的简易服务器…

安卓核心板_天玑700、天玑720、天玑900_5G模块规格参数

5G安卓核心板是采用新一代蜂窝移动通信技术的重要设备。它支持万物互联、生活云端化和智能交互的特性。5G技术使得各类智能硬件始终处于联网状态&#xff0c;而物联网则成为5G发展的主要动力。物联网通过传感器、无线网络和射频识别等技术&#xff0c;实现了物体之间的互联。而…

微信小程序如何利用接口返回经纬计算实际位置并且进行导航功能【下】

如果要在微信小程序内部导航的话可以使用wx.navigateToMiniProgram方法来打开腾讯地图小程序&#xff0c;并传递目的地的经纬度信息。 目录 1.如何获取高精地址 2.如何调起地图 3.实现效果 navigateToDestination: function() {let that this;var latitude parseFloa…

springboot+vue基于协同过滤算法的私人诊所管理系统的设计与实现【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

Kafka - 异步/同步发送API

文章目录 异步发送普通异步发送异步发送流程Code 带回调函数的异步发送带回调函数的异步发送流程Code 同步发送API 异步发送 普通异步发送 需求&#xff1a;创建Kafka生产者&#xff0c;采用异步的方式发送到Kafka broker 异步发送流程 Code <!-- https://mvnrepository…