【SpringMVC】| 域对象共享数据

news2024/11/25 12:50:56

目录

前期准备

域对象共享数据

一:向request域共享数据(五种方法)

1. 使用ServletAPI向request域对象共享数据(了解)

2. 使用ModelAndView向request域对象共享数据

3. 使用Model向request域对象共享数据

4. 使用map向request域对象共享数据

5. 使用ModelMap向request域对象共享数据

6. Model、ModelMap、Map的关系

二:向session域共享数据

三:向application域共享数据


前期准备

pomx.ml:引入依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springmvc-thymeleaf003</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springmvc-thymeleaf003 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf-spring5</artifactId>
      <version>3.0.10.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
  </dependencies>

  <build>
    <!--指定资源文件的位置-->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>

  </build>
</project>

web.xml:配置请求乱码的CharacterEncodingFilter和注册前端控制器DispatcherServlet

<?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">
    <!--注册过滤器:解决post请求乱码问题-->
    <filter>
        <filter-name>encode</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--指定字符集-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <!--强制request使用字符集encoding-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--强制response使用字符集encoding-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <!--所有请求-->
    <filter-mapping>
        <filter-name>encode</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <!--注册SpringMVC框架-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--配置springMVC位置文件的位置和名称-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--将前端控制器DispatcherServlet的初始化时间提前到服务器启动时-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--指定拦截什么样的请求
            例如:http://localhost:8080/demo.action
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

springmvc核心配置文件:引入包扫描组件、配置Thymeleaf视图解析器

<?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"
       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="com.zl.controller"/>
    <!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

域对象共享数据

一:向request域共享数据(五种方法)

1. 使用ServletAPI向request域对象共享数据(了解)

index.html发出请求

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>测试</h1>
<a th:href="@{/testRequestServletAPI}">使用ServletAPI向request域对象共享数据</a>
</body>
</html>

ActionTest接收请求并存取数据

package com.zl.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class ActionTest {
    // 是为了开启就跳转到index.html目录下
    @RequestMapping("/")
    public String test(){
        return "index";
    }
    @RequestMapping("/testRequestServletAPI")
    public String testRequestServletAPI(HttpServletRequest request){
        // 使用原生的ServletAPI存取数据
        request.setAttribute("requestScope","hello");
        return "success";
    }
}

success.html取出数据

注:这是使用的不是jsp,不能直接用${变量名}取出数据;需要借助于thymeleaf!

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<font color="#dc143c" th:text="${requestScope}"></font>
</body>
</html>

2. 使用ModelAndView向request域对象共享数据

ModelAndView主要有两个功能:一个模型,一个视图。

模型:指的是向域中共享数据的功能;

视图:指的是根据我们设置的视图名称,经过视图解析器解析,跳转到指定页面的过程。

index.html发出请求

<a th:href="@{/testRequestModelAndView}">使用ModelAndView向request域对象共享数据</a><br>

ActionTest接收请求并存取数据

①方法的返回值必须是ModelAndView,这样才能被前端控制器DispatcherServlet解析。

创建ModelAndView对象调用addObject()方法设置共享的数据。

调用setViewName()方法,设置要跳转的视图名称,最终返回这个ModelAndView对象。

    @RequestMapping("/testRequestModelAndView")
    public ModelAndView testRequestModelAndView(){
        // 创建ModelAndView对象
        ModelAndView mav = new ModelAndView();
        // 处理模型数据,即向请求域request中共享数据
        mav.addObject("requestScope","hello,ModelAndView");
        //设置视图名称
        mav.setViewName("success");
        // 返回ModelAndView对象
        return mav;
    }

3. 使用Model向request域对象共享数据

Model就是ModelAndView中的Model,用法和原生的Servlet用法很类似!

 index.html发出请求

<a th:href="@{/testRequestModel}">使用Model向request域对象共享数据</a><br>

ActionTest接收请求并存取数据

Model向reuqest一样以方法的属性方式存在,然后调用Model对象的addAttreibute()方法存取共享的数据!

    @RequestMapping("/testRequestModelw")
    public String testRequestModel(Model model){
        // 使用model存取共享的数据
        model.addAttribute("requestScope","hello,Model");
        return "success";
    }

4. 使用map向request域对象共享数据

这里的Map集合就是前面我们学过的普通Map,用法和Model、原生的Servlet用法很类似!

 index.html发出请求

<a th:href="@{/testRequestMap}">使用Map向request域对象共享数据</a><br>

ActionTest接收请求并存取数据

调用map集合的put()方法存取共享的数据!

    @RequestMapping("/testRequestMap")
    public String testRequestMap(Map<String,Object> map){
        // 使用map存取共享的数据
        map.put("requestScope","hello,Map");
        return "success";
    }

5. 使用ModelMap向request域对象共享数据

ModelMap和Model的用法是一模一样的!

 index.html发出请求

<a th:href="@{/testRequestModelMap}">使用ModelMap向request域对象共享数据</a><br>

ActionTest接收请求并存取数据

和Model一样也是调用addAttribute()方法存取共享数据;但是因为ModelMap本身是继承LinkedHashMap集合,所以使用put()方法也可以存取共享数据。

    @RequestMapping("/testRequestModelMap")
    public String testRequestModelMap(ModelMap modelMap){
        // 使用modelMap存取共享的数据
        modelMap.addAttribute("requestScope","hello,ModelMap");
        // 调用put方法也可以
        modelMap.put("requestScope","hello,ModelMap");
        return "success";
    }

6. Model、ModelMap、Map的关系

现象:Model、ModelMap、Map输出的引用格式是相同的!

解释:说明调用的是同一个类的toString方法;实际上Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的!

怎么验证?通过反射机制!调用getClass()方法获取当前类,在调用getName()方法就可以获取到参数的类型。例如:modelMap.getClass().getName()

通过源码解析

对于Model:说明是一个顶级接口

public interface Model {}

对于Map:就是前面我们学习的Map集合

public interface Map<K,V> {

对于ModelMap继承了 LinkedHashMap,本质上就是一个Map

public class ModelMap extends LinkedHashMap<String, Object> {}

此时Map和ModelMap已经建立了关系,目前就看Model和ModelMap(Map)有什么关系?

选定Model,ctrl+h查看它的继承结构,发现有一个子类BindingAwareModelMap类

通过点开原码发现BindingAwareModelMap又是继承ExtendedModelMap的

public class BindingAwareModelMap extends ExtendedModelMap {}

 而ExtendedModelMap又是继承ModelMap实现Model的,此时就使Model和ModelMap建立了联系

public class ExtendedModelMap extends ModelMap implements Model {}

结果:BindingAwareModelMap间接或直接继承或实现了Model、ModelMap、Map,是它们的子类,可以通过它去实例化对象!

小总结:以上的五种方式:无论是原生的Servlet、ModelAndView、Model、Map、ModelMap最终都是把数据封装到ModelAndView当中去!

二:向session域共享数据

向session域中共享数据,建议使用原生的ServletAPI,比较简单!

 index.html发出请求

<a th:href="@{/testSessionServletAPI}">使用ServletAPI向session域对象共享数据</a><br>

ActionTest接收请求并存取数据

注意:此时的方法参数是HttpSession对象

    @RequestMapping("/testSessionServletAPI")
    public String testSessionServletAPI(HttpSession session){
        session.setAttribute("sessionScope","hello session");
        return "success";
    }

success.html取出数据

注意:对于session域中的数据,访问时不像request域中的数据那样,直接使用${变量名}就可以访问到;必须使用${session.变量名}的方式进行访问!

<font color="#dc143c" th:text="${session.sessionScope}"></font>

三:向application域共享数据

application域本质上就是ServletContext(上下文对象)!所以我们只需要获取到ServletContext对象即可!

获取ServletContext对象的方式有多种,例如:

(1)通过request对象获取

ServletContext application=request.getServletContext();

(2)通过session对象获取

ServletContext application=request.getServletConfig().getServletContext();

 index.html发出请求

<a th:href="@{/testApplicationServletAPI}">使用ServletAPI向application域对象共享数据</a><br>

ActionTest接收请求并存取数据

获取ServletContext对象的方式很多,例如:request、session、ServletConfig对象!

    @RequestMapping("/testApplicationServletAPI")
    public String testApplicationServletAPI(HttpServletRequest request){
        // 通过request
        ServletContext application = request.getServletContext();
        // 通过session
        // ServletContext application = request.getSession().getServletContext();
        
        application.setAttribute("applicationScope","hello application");
        return "success";
    }

 success.html取出数据

必须使用${application.变量名}的方式进行访问!

<font color="#dc143c" th:text="${application.applicationScope}"></font>

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

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

相关文章

chatgpt赋能python:Python代码怎么找?这里介绍几种方法

Python代码怎么找&#xff1f;这里介绍几种方法 在编写Python程序的时候&#xff0c;经常会遇到需要查找已有代码的情况。那么&#xff0c;在这里&#xff0c;我们将介绍几种查找Python代码的方法&#xff0c;希望能对大家有所帮助。 使用文本编辑器的查找功能 在大多数文本…

3.场(field)

目录 1.复习 2.引言 3.数量场 1.概念 2.例题 4.矢量场 1.概念 2.例题 5.坐标变换和坐标单位矢 1.坐标变换 2.单位矢 1.复习 2.引言 如果说矢量分析研究的是矢量的时间变化&#xff0c;那么场就是它的空间变化. 场是客观存在的&#xff0c;杨振宁先生在总结20世…

Spring Boot 3.1中如何整合Spring Security和Keycloak

在今年2月14日的时候&#xff0c;Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器。其中包括Spring Security和Spring Boot的适配器&#xff0c;这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成方案。但是&#xff0c;如此强大的Keycloak&…

数据库|TiDB 数据库大版本升级-基于TiCDC异机升级

作者&#xff1a;高文峰 | 神州数码云基地TiDB团队成员 目录 一、前言 二、升级架构图 三、升级流程 1.下游TiDB集群部署过程 2. 上游TiCDC节点的扩容 3. 上游数据全备恢复到下游 4. TiCDC启用正向同步任务 5. 应用停服务&#xff0c;tidb 无业务会话连接 6. 确认数据…

2023年6月跟产品开发专家学NPDP产品经理认证课到这里

NPDP产品经理国际资格认证是国际公认的唯一的新产品开发专业认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 我们针对互联网时代的个人、互联网企业、与传统企业推出一系列学习。 课程从…

小车跑迷宫,如何完成?

先看视频1&#xff1a; 先看视频2&#xff1a; 要制作一个能顺利走到迷宫终点&#xff0c;并能按最短路径回来的小车&#xff0c;重中之重就是寻找其最短路径的算法&#xff0c;迷宫情况复杂多变&#xff0c;多个路口交错纵横&#xff0c;想要完美的找出最短路径并不容易&#…

事件相关功能磁共振波谱技术(fMRS)

导读 质子磁共振波谱(MRS)是一种非侵入性脑成像技术&#xff0c;用于测量不同神经化学物质的浓度。“单体素”MRS数据通常在几分钟内采集&#xff0c;然后对单个瞬态进行平均&#xff0c;从而测量神经化学物质浓度。然而&#xff0c;这种方法对更快速的神经化学物质的时间动态…

chatgpt赋能python:Python人脸身份识别:提高安全性和效率的先进技术

Python人脸身份识别&#xff1a;提高安全性和效率的先进技术 随着科技的发展&#xff0c;人类对于安全性和效率的需求逐渐增加。而人脸身份识别技术正是一个能够满足这一需求的先进技术。在过去的几年中&#xff0c;这种技术已经逐渐发展成为一种普及的安全措施&#xff0c;这…

串口组件:ZylSerialPort.NET 1.83 Crack

ZylSerialPort.NET 1.83 .NET 组件 库 ZylSerialPort.NET 是一个基于线程、事件驱动、异步/同步串口的.NET 组件库。 使用 ZylSerialPort.NET 组件可以轻松地通过串行端口连接与外部设备进行通信&#xff0c;例如调制解调器、条形码阅读器、GSM 模块等。 您也可以将它与 USB、…

Volatile、Synchronized、ReentrantLock锁机制使用说明

一、Volatile底层原理 volatile是轻量级的同步机制&#xff0c;volatile保证变量对所有线程的可见性&#xff0c;不保证原子性。 当对volatile变量进行写操作的时候&#xff0c;JVM会向处理器发送一条LOCK前缀的指令&#xff0c;将该变量所在缓存行的数据写回系统内存。由于缓…

DJ4-7 请求分页存储管理方式

目录 4.7.1 请求分页中的硬件支持 1、页表机制 2、缺页中断机构 4.7.2 内存分配策略和分配算法 1、最小物理块数的确定 2、物理块的分配策略 3、物理块的分配算法 4.7.3 调页策略 1、系统应当在何时把一个页面装入内存&#xff1f; 2、从何处调入页面&#xff1f;…

机器学习常识 12: SVM

摘要: 支持向量机 (support vector machine, SVM) 有很多闪光点, 理论方面有 VC 维的支撑, 技术上有核函数将线性不可分变成线性可分, 实践上是小样本学习效果最好的算法. 1. 线性分类器 如图 1 所示, 基础的 SVM 仍然是一个线性二分类器, 这一点与 logistic 回归一致. 图 1.…

MATLAB 之 隐函数绘图、图形修饰处理、图像处理与动画制作和交互式绘图工具

这里写目录标题 一、隐函数绘图1. 隐函数二维绘图3. 隐函数三维绘图 二、图形修饰处理1. 视点处理2. 色彩处理2.1 颜色的向量表示2.2 色图2.3 三维曲面图形的着色 3. 图形的裁剪处理 三、图像处理与动画制作1. 图像处理1.1 图像的读/写1.2 图像的显示 2. 动画制作2.1 制作逐帧动…

chatgpt赋能python:Python交流App:提高Python社区交流效率

Python 交流 App: 提高 Python 社区交流效率 Python 是当今流行程度最高的编程语言之一&#xff0c;有着广泛的应用场景和庞大的社区。 作为 Python 工程师&#xff0c;经常有各种问题需要得到解决&#xff0c;同时也希望能与同行进行交流、分享和学习。这时&#xff0c;一款高…

Linux——Centos7进入单用户模式修改密码

本篇文章适用于经常忘记自己root用户密码的初学者&#xff01;&#xff01;&#xff01;&#xff0c;会进入单用户模式修改root密码即可。 系统启动进入到如下界面后输入字母“e”; 2.可以看到进入到如下界面&#xff1b; 3.一直下翻到图中圈起来的这部分&#xff1b; 4.在Lin…

excel 获取指定字符前后的字符串

目录 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 2.截取指定字符后的字符串 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 1.1LEFT FIND find:返回一个字符串在另一个字符串中出现的起始位置。 (区分大小写&#xff0c;且不允许使用通配符) …

综合指挥调度系统行业分类汇总

综合指挥调度系统是将语音、视频、GIS进行高度融合&#xff0c;构建“平战结合”的指挥调度模式&#xff0c;既满足平时的应急培训、日常通信、会议会商等要求&#xff0c;也能够应对战时的应急指挥、应急救援、应急决策等需求&#xff0c;达到统一指挥、联合行动的目的&#x…

ArcGIS中实现土地利用转移矩阵

土地利用转移矩阵&#xff0c;就是根据同一地区不同时相的土地覆盖现状的变化关系&#xff0c;求得一个二维矩阵。通过对得到的转移矩阵进行分析&#xff0c;能够得到&#xff12;个时相&#xff0c;不同的地类之间相互转化的情况&#xff0c;它描述了不同的土地利用的类型在不…

新华三的网络脉动:为AI泵血,向产业奔流

AI大模型作为最新的通用技术&#xff0c;今年以来&#xff0c;发展如火如荼。也有很多从业者和专家注意到&#xff0c;AI模型训练和应用过程中&#xff0c;需要优先考虑网络的升级与适配。 如果说数据中心、算力集群是AI的“心脏”&#xff0c;那么网络就犹如AI的“动脉”&…

《嵌入式存储器架构、电路与应用》----学习记录(一)

前言 本书系统介绍嵌入式存储器在架构、电路和应用方面的技术进展&#xff0c;包括SRAM、eDRAM、eFlash和近几年兴起的阻变型存储器&#xff0c;并着重介绍我国研究人员在嵌入式存储器方面的研究工作。 第1章 绪论 1.1 什么是嵌入式存储器 存储器(Memory)是现代信息技术中用…