【零基础入门SpringMVC】第三期——请求域添加数据与视图

news2025/7/14 8:12:41

一、域对象共享数据

  • SpringMVC 中有哪些域对象?

    • Request请求域,代表一次请求,从浏览器开启到关闭
    • Session请求域,代表一次会话,从服务器开启到关闭【一次getSession获得了cookie,这个会话没关闭,之后获取的都是这个session
    • Application请求域,代表整个应用的范围,一个项目对应一个
    • pageContext请求域,代表当前的jsp文件
  • 如何选择域对象?

    • 可以实现功能且范围最小的域对象
  • 准备工作:构建我们的SpringMVC的框架

    • 创建新的模块,确定打包方式和配置依赖
    • 添加webapp模块,然后在项目结构中添加web.xml文件
    • web.xml文件中注册过滤器和前端控制器
    • 编写我们SpringMVC的核心配置文件
      • 扫描组件
      • 添加 thymeleaf 的视图解析器
    • 创建我们的控制器【一个类文件】
    • 创建我们的前端页面
  • 我们将数据添加到请求域中了,那么我们如何获取数据呢?

    • 首先我们要知道域中的数据是以键值对的形式存在的
    • 在使用了thymeleafhtml页面中获取共享到request中的数据,我们可以直接通过键值对的key来获取数据
    • 如果是获取session中的数据,采用session.共享数据的键
    • 如果是获取application中的数据,采用application.共享数据的键
  • 在我们原生的 Servlet 中为我们提供了三种操作域中数据的方法:

    • setAttribute 方法,向域中添加数据
    • getAttribute 方法,获取域中数据
    • removeAttribute ,删除域中数据
  • 接下来我们介绍几种向域中添加数据的方式:【如何演示具体操作】

    • 第一步,编写我们在首页中写的超链接,作为请求
    • 第二步,在控制器中编写我们的控制器方法,用作处理请求【向请求域对象中添加数据】
    • 第三步,我们在最后跳转的页面中去获取一下我们添加的数据,验证是否添加成功
  • 因为我们获取域对象的数据根据域的不同在此处分为三种,我在这里直接给出跳转页面的代码

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>用作请求匹配成功后的跳转页面</title>
    </head>
    <body>
    <h1>跳转页面成功</h1>
    <!--我们在前面将数据添加到了共享域中之后,我们可以在显示页面获取这些共享数据-->
    <!--因为我们要获取的是在request中的数据,所以我们直接通过key获取即可,尽管IDEA中会显示报错,但是实际没有问题-->
    <p th:text="${testRequestScope}"></p>
    <p th:text="${session.testSessionScope}"></p>
    <p th:text="${application.testApplicationScope}"></p>
    
    </body>
    </html>
    

$ 向Request域对象共享数据

$$ ServletAPI

编写我们的请求

<a th:href="@{/testRequestByServletAPI}">通过原生ServletAPIRequest请求域添加数据</a><br>

编写我们的控制器方法

// 通过原生的Servlet的API向域中共享数据
@RequestMapping("/testRequestByServletAPI")
public String testRequestByServletAPI(HttpServletRequest request){
	request.setAttribute("testRequestScope", "Hello, Request");
	return "success";
}

请添加图片描述
请添加图片描述

$$ ModelAndView

  • 模型就是我们要往域中共享数据的对象,视图是我们要往视图解析器里面传递的内容
  • 对于其他几种方式,通过前端控制器处理之后,最后都是包装成了ModelAndView对象

编写我们的请求

<a th:href="@{/testModelAndView}">通过ModelAndViewRequest请求域添加数据</a><br>

编写我们的控制器方法

// 通过ModelAndView向域中共享数据
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
	/*
		我们的ModelAndView包含两个方面:
			(1)M 代表模型,用来向请求域共享数据
			(2)V 代表视图,用于页面跳转
	*/
	// 创建我们ModelAndView的对象
	ModelAndView mav = new ModelAndView();
	// 然后为其添加数据,就是向我们的 request请求域添加数据
	mav.addObject("testRequestScope", "Hello, ModelAndView");
	// 然后通过这个对象指定视图名称
	mav.setViewName("success");
	return mav;
}

请添加图片描述

请添加图片描述

$$ Model

编写我们的请求

<a th:href="@{/testModel}">通过ModelRequest请求域添加数据</a><br>

编写我们的控制器方法

// 通过Model向域中共享数据
    @RequestMapping("/testModel")
    public String testModel(Model model){
        // 添加数据
        model.addAttribute("testRequestScope", "Hello, Model");
        return "success";
    }

请添加图片描述
请添加图片描述

$$ Map集合

编写我们的请求

<a th:href="@{/testMap}">通过MapRequest请求域添加数据</a><br>

编写我们的控制器方法

// 通过Map向域中共享数据
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
	// 通过map的put方法添加键值对
	map.put("testRequestScope", "Hello, Map");
	return "success";
}

请添加图片描述
请添加图片描述

$$ ModelMap

编写我们的请求

<a th:href="@{/testSession}">通过ServletAPISession请求域对象中添加数据</a><br>

编写我们的控制器方法

// 通过ModelMap向域中共享数据
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
	// 通过map的put方法添加键值对
	modelMap.addAttribute("testRequestScope", "Hello, ModelMap");
	return "success";
}

请添加图片描述

请添加图片描述

  • 我们的Model、Map、ModelMap之前是存在联系的,两个接口一个类
    • 他们最终都是由同一个类实现的 ,BindingAwareModelMap

$ 通过ServletAPI向Session域对象共享数据

编写我们的请求

<a th:href="@{/testSession}">通过ServletAPISession请求域对象中添加数据</a><br>

编写我们的控制器方法

// 通过ServletAPI向我们的Session请求域中添加共享数据
    @RequestMapping("/testSession")
    public String testSession(HttpSession session){
        session.setAttribute("testSessionScope", "Hello, Session");
        return "success";
    }

请添加图片描述
请添加图片描述

$ 通过ServletAPI向Application域对象共享数据

<a th:href="@{/testApplication}">通过ServletAPIApplication请求域对象中添加数据</a>
// 向我们Application请求域中添加数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
	// 通过session的getServletContext方法获取我们的application对象
	ServletContext application = session.getServletContext();
	// 然后调用我们的add~方法向域中添加数据
	application.setAttribute("testApplicationScope", "Hello, Application");
	// 返回页面
	return "success";
}

请添加图片描述
请添加图片描述


二、视图

  • 什么是视图?

    • SpringMVC中,视图是 View 接口
    • 将模型中的数据经过渲染后展示给用户
  • 视图分为哪些种类?【列举几种常见的】

    • 转发视图
    • 重定向视图
    • 引入 jst 的依赖后,转发视图会自动转化为 jstView
    • 如是通过Thymeleaf解析之后得到的就是 ThymeleafView
  • 接下来我们将展开介绍几种常见的视图

$ ThymeleafView

  • 我们导入了Thymeleaf的框架的依赖,并且在SpringMVC的核心配置文件中使用了这个视图解析器为前提
  • 如果我们控制器方法返回的视图名没有前缀,那么最后得到的就是ThymeleafView
  • 主要流程:
    • 视图名被SpringMVC配置的视图解析器解析
    • 视图名通过拼接视图前缀和后缀后得到最终路径
    • 最后通过转发的方式实现跳转

我们之前练习的一直都是 Thymeleaf 的视图

@RequestMapping("/testThymeleafView")
public String testThymeleafView(){
	return "success";
}

可以看到控制器方法返回时没有任何前缀,我们获得的就是ThymeleafView

如果想进行测试可以在我们的首页写一条超链接,请求地址为 /testThymeleaf,运行后点击超链接就可以查看效果

在这里插入图片描述

$ 转发视图

  • SpringMVC中默认的转发视图为 InternalResourceView 【网络资源视图】

  • 当我们为控制器方法返回的视图名添加 forward: 前缀,得到的就是 InternalResourceView

  • 这种视图不会通过核心配置文件中的视图解析器解析,而是将前缀后面的路径作为最终路径通过转发的方式实现跳转

  • 转发可以转发到一个页面,也可以转发到一个请求上

主页编写发起请求的超链接

<a th:href="@{/testForward}">测试InternalResourceView</a><br>

控制器实现具体的跳转方法,此处我们跳转到/testThymeleafView请求上,因为我们的html页面的位置浏览器访问不到

@RequestMapping("/testForward")
public String testForward(){
	return "forward:/testThymeleafView";
}

在这里插入图片描述

  • 注意:
    • 因为我们转发到一个 /testThymeleafView 请求上
      • 所以我们先生成的是 InternalResourceView
      • 后生成的是 ThymeleafView
    • 尽管我们是跳到 /testThymeleafView 请求上进一步获得页面的
      • 但是我们的转发地址栏显示testForward,页面是success

$ 重定向视图

  • SpringMVC中默认的重定向视图是 RedirectView
  • 与转发视图使用方式类似,只是将前缀替换为 redirect:
  • 通过重定向的方式实现跳转
  • 重定向视图在解析时,会判断剩余部分是否以正斜杠 / 开头,若是则会自动拼接上下文路径

我们直接重定向到 /testForward 请求上去

@RequestMapping("/testRedirect")
public String testRedirect(){
	return "redirect:/testForward";
}

发起请求页要写一个超链接

<a th:href="@{/testRedirect}">测试RedirectView</a>

在这里插入图片描述

  • 对于重定向来说,重定向后的地址拼接上上下文就是最后页面地址栏中的地址
  • 重定向和转发有什么区别呢?
    • 浏览器请求次数不同
      • 转发:当浏览器收到请求后,完成响应跳转到另一个地址
      • 重定向:浏览器向服务器发送一个请求收到响应后,再向一个新地址发送请求
    • 跳转地址不同
      • 转发:只能在本站点资源内进行跳转
      • 重定向:可以跳转到任意的地址 【其他站点】
    • 地址栏显示不同:
      • 转发:地址栏不会变化
      • 重定向:地址栏会发生变化
    • 数据共享规则不同:
      • 转发:在一次请求中共享数据
      • 重定向:在两次请求中不共享数据
    • 发生行为不同
      • 转发:服务器行为
      • 重定向:客户端行为

$ 视图控制器

  • 是一种可以代替控制器方法实现简单页面跳转的方式
  • 简单体现在请求直接返回一个视图名,没有啥其他业务功能

我们可以在springMVC的核心配置文件中进行声明

<!--尽管此处success报错,但是不影响使用:配置了这个后控制器中的方法就会失效-->
<!--我当前想到的作用就是将上下文路径定位到一个页面-->
<mvc:view-controller path="/success" view-name="success"></mvc:view-controller>
  • 这个标签有两个常用的属性:

    • path 代表我们的请求地址
    • view-name 代表我们要跳转的视图名
  • 当我们设置了这个标签后,控制器里的所有方法都会失效

    • 我们需要开启 mvc 的注解驱动才能解决这个问题
    <mvc:annotation-driven />
    
    • 根据使用情景不同这个注解驱动还有很多其他作用
  • 在此之前我们一直都是使用的都是html页面进行演示,如果是jsp文件,我们又将如何处理呢?

$ 使用JSP

  • JSP 本身就是一个Servlet,可以直接访问,所以我们不需要去设置首页了
  • JSP 中只存在转发视图和重定向视图
  • 需求:我们要通过一个 jsp 模块演示如何显示 jsp 文件的视图

我们新建一个模块,然后将打包方式设置为 war,然后导入依赖,添加web模块,添加xml文件

web.xml 中依旧注册解决乱码问题的过滤器和前端控制器 Dispatcher

对于springMVC的核心配置文件所有变化,我们不在使用之前的视图解析器,而是替换为 InternalResourceViewResolver

<?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"
       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">

    <!--扫描组件-->
    <context:component-scan base-package="com.atguigu.mvc.controller"/>

    <!--
        在jsp中,不设置任何前缀自身也是一个转发视图,所以直接采用InternalResolver解析器
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--也需要我们指定前缀和后缀-->
        <property name="prefix" value="/WEB-INF/templates/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

webapp 目录下,我们编写 index.jsp 文件

  • 上面我们了解到当前 jsp 页面就是一个最小的域对象 pageContext

  • jsp 页面中动态获取上下文路径 pageContext.request.contextPath【使用EL表达式】

  • 那么什么是 EL 表达式呢?

    • 全称 Expression Language,语法格式 ${表达式},我们将其使用在jsp页面中,表达式通过为域对象的key
    • 代替 JSP 进行数据的输出,只能用来获取数据,如果存在多个域对象,那么从低级向高级域搜索【先从pageContext查找key】
<%--
  Created by IntelliJ IDEA.
  User: npc
  Date: 2022/11/23
  Time: 17:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>第一个使用jdp的springMVC模块</title>
</head>
<body>

<h1>首页</h1>
<a href="${pageContext.request.contextPath}/success">点击跳转我们指定的jsp页面</a>
</body>
</html>

编写我们请求跳转后的页面 success.jsp

<%--
  Created by IntelliJ IDEA.
  User: npc
  Date: 2022/11/23
  Time: 17:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>成功</h1>
</body>
</html>

在这里插入图片描述

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

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

相关文章

Romantics三大浪漫(编译原理+操作系统+计算机图形学)

Romantics三大浪漫 一、编译原理1.1 研究翻译的科学1.2 编译器和解释器1.3 编译的流程(JIT为例)1.4 词法分析器1.5 多有限状态机提取Token- 实现词法分析器lexer1.6 实现流的peek和putBack操作一、编译原理 本章目标: 提升编程能力 区别于面向研究人员、学者的编译原理教学&a…

CSS学习笔记(三)

her~~llo&#xff0c;我是你们的好朋友Lyle&#xff0c;是名梦想成为计算机大佬的男人&#xff01; 博客是为了记录自我的学习历程&#xff0c;加强记忆方便复习&#xff0c;如有不足之处还望多多包涵&#xff01;非常欢迎大家的批评指正。 目录 一、CSS 的三大特性 1.1 层叠…

mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)

mybatis复习05,mybatis的缓存机制&#xff08;一级缓存和二级缓存&#xff09;MyBatis的缓存机制MyBatis的一级缓存MyBatis的二级缓存二级缓存的相关配置MyBatis缓存查询的顺序整合第三方缓存EHCacheEHCache配置文件说明&#xff1a;MyBatis的缓存机制 MyBatis作为持久化框架&…

社区故事|SmartX 用户社区技术发烧友独家专访

小伙伴们&#xff0c;SmartX 用户社区已经陪伴我们走过近两年的时光&#xff0c;这期间有一千多位小伙伴加入我们&#xff0c;共同讨论问题、分享经验。今天&#xff0c;SmartX 用户社区的一线记者小乐为我们带来了独家采访&#xff0c;揭秘社区中两位技术发烧友的幕后故事&…

葡萄糖-聚乙二醇-转铁蛋白|Transferrin-PEG-Glucose|转铁蛋白-PEG-葡萄糖

转铁蛋白又名运铁蛋白 transferrin&#xff0c;TRF&#xff0c;siderophilin&#xff09;还可以提供PEG接枝修饰葡萄糖&#xff0c;葡萄糖-聚乙二醇-转铁蛋白,Transferrin-PEG-Glucose,转铁蛋白-PEG-葡萄糖 中文名称&#xff1a;葡萄糖-转铁蛋白 英文名称&#xff1a;Glucose…

Java学习——Servlet服务器请求响应程序

Servlet服务器程序 1. Servlet的概念 Servlet&#xff08;Server Applet&#xff09;&#xff1a;运行在Web服务器端&#xff08;Tomcat&#xff09;的小程序。 Servlet的主要作用&#xff1a;接收客户端浏览器的请求&#xff0c;还可以为客户端浏览器做出响应。 学习Servl…

戴尔笔记本重装系统按f几进入

有不少使用戴尔笔记本电脑的用户对于u盘重装系统中的按f几进入u盘启动的操作不熟悉&#xff0c;导致自己无法独立完成戴尔笔记本重装系统的步骤怎么办&#xff1f;其实相关的方法不难&#xff0c;下面小编就教下大家戴尔笔记本重装系统按f几进入u盘启动项安装。 工具/原料&…

【培训】MMEdu离线版的使用:实现石头剪刀布图像分类的检测

一、MMEdu离线版的使用 1.双击XEdu v1.0.exe解压缩到某个盘&#xff0c;会是一个文件夹XEdu 2.进入XEdu&#xff0c;双击运行“点我初始化.bat”&#xff0c;等待至运行结束命令提示符窗口自动关闭 3.双击运行“jupyter编辑器.bat”&#xff0c;将会打开一个网页版jupyter&…

第五站:操作符(第二幕)

在前面的文章中我们详细讲解了操作符的一些内容&#xff0c; 今天我们来继续了解操作符剩余的内容 操作符第一幕的传送门在这&#xff1a;第五站&#xff1a;操作符&#xff08;第一幕&#xff09; 目录 七、关系操作符 八、逻辑操作符 1.基础知识 2.几道经典的题目 九、条…

视频压缩软件哪个好?万兴优转:好用的视频无损压缩软件

如今&#xff0c;无论是学生党&#xff0c;上班族还是专业的视频制作者&#xff0c;都会遇到视频文件体量太大&#xff0c;需要对视频文件进行压缩的时候&#xff0c;但是又会担心视频压缩以后&#xff0c;画质受损&#xff0c;清晰度不如从前&#xff0c;所以一个好用的视频压…

机器学习笔记之高斯网络(三)高斯马尔可夫随机场

机器学习笔记之高斯网络——高斯马尔可夫随机场引言回顾&#xff1a;马尔可夫随机场——团、势函数高斯马尔可夫随机场点势函数关联的项边势函数相关的项关于多元高斯分布学习任务的核心思想关于条件独立性的总结引言 上一节介绍了高斯贝叶斯网络(Gaussian Bayesian Network,G…

c语言tips-带参main函数

0.写在最前 最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 1. main函数的两种表现形式 main函数是c/cpp语言的…

python破解wifi教程

目录 一、安装pywifi 二、构建wifi密码字典 三、python实现wifi破解 四、结果展示 4.1 选择要破解的wifi名称 4.2 获取字典 4.3 成功破解 一、安装pywifi pywifi是在python中一个用于操作无线接口的模块&#xff0c;可以跨平台使用&#xff0c;Windows和Linux都支持 …

Linux下Jenkins服务搭建及配置

一、简介 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;为软件的持续集成提供了一种便捷的方式。 二、Jenkins自动化部署实现原理 Jenkins的自动化部署实…

现代密码学导论-14-基于伪随机发生器的EAV安全

目录 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生器进行加密的图示 CONSTRUCTION 3.17 一种基于伪随机发生器的私钥加密方案 THEOREM 3.16 基于伪随机发生器的私钥加密方案的EAV安全 THEOREM 3.16 的证明 最后来理一下 3.3.3 基于伪随机发生器的EAV安全 用伪随机发生…

pandas是什么以及pandas的三种数据结构Series、DataFrame、MultiIndex的创建方式函数代码

一、pandas概述 pandas是2008年WesMcKinney开发出的专门用于数据挖掘的开源python库&#xff0c;以Numpy为基础&#xff0c;借助numpy模块在计算方面性能高的优势&#xff0c;基于matplotlib&#xff0c;能够简便的画图&#xff0c;具有独特的数据结构 pandas特点 图表的可读…

深度强化学习中深度Q网络(Q-Learning+CNN)的讲解以及在Atari游戏中的实战(超详细 附源码)

需要源码请点赞收藏关注后评论区留下QQ~~~ 深度强化学习将深度学习的感知&#xff08;预测能力&#xff09;与强化学习的决策能力相结合&#xff0c;利用深度神经网络具有有效识别高维数据的能力&#xff0c;使得强化学习算法在处理高纬度状态空间任务中更加有效 一、DQN算法简…

牛客小白月赛62 幼稚园的树

2022.11.25 今晚闲来无事&#xff0c;在zhoj群中看到管理员发布的牛客小白月赛的通知&#xff0c;就和舍友一起参加了。 题目描述 来源&#xff1a;牛客网 牛牛在幼稚园做义工&#xff0c;幼稚园中共有 nnn 颗树&#xff0c;第 1 天中午时它们的高度分别为&#xff1a;h1,h2…

体系结构27_多处理机(1)

单处理机的发展正在走向尽头&#xff1f; 并行处理机在未来将会发挥更大的作用。 1.获得超过单处理器的性能&#xff0c;最直接的方法就是把多个处理器连在一起。 2.自1985年以来&#xff0c;体系结构的改进使性能迅速提高&#xff0c;这种改进的速度能否持续下去还不清楚&a…

Day11--首页-轮播图效果

1.创建 home 分支 我的操作&#xff1a; ************************************************** ************************************************** ******* 2.配置网络请求 博主文档&#xff1a; 我的操作&#xff1a; 1》.先初始化一个package.json文件。 2》根据博主的…