SpringMVC实现对页面的访问和跳转~

news2024/12/28 6:05:47

初识MVC:

MVC是一种软件架构的思想,将软件按照模型,视图,控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

一类称为实体类Bean:专门存储业务数据的,如student,user等
一类称为业务处理Bean:指Service或Dao对象,专门用于处理业务逻辑和数据访问

V:view,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:controller,控制层,指工程中的Servlet,作用是接收请求和响应浏览器
MVC的工作流程:

用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕后将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

初识SpringMVC:

SpringMVC是Spring的一个后续产品,是Spring的一个子项目
SpringMVC是spring为表述层开发提供的一整套完备的解决方案,在表述层框架经历Strust,WebWork,Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为javaEE项目表述层开发的首选方案

注:三层架构分为表述层(或表示层),业务逻辑层,数据访问层,表述层表示前台页面和后台Servlet

SpringMVC的特点:

spring家族原生产品,与IOC容器等基础设施无缝对接

基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理

表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案

代码清新简洁,大幅度提升至开发效率

内部组件化程度高,可拔插式组件即插即用,想要什么功能配置相应的组件即可

性能卓著,尤其适合现代大型,超大型互联网项目要求

SpringMVC入门案例:

项目前期准备工作:

第一步:新创建一个名为SpringMVC的maven项目

第二步:在pom.xml文件中,将其打包方式设置为war

<packaging>war</packaging>

第三步:打开项目结构,如下所示:

在这里插入图片描述

修改路径:在 WEB-INF前添加src\main\webapp

举例:

E:\Ide-test\SpringMVC\src\main\webapp\WEB-INF\web.xml

创建新的模块,如下所示:

在这里插入图片描述

导入依赖:

 <dependencies>
        <!-- SpringMVC-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- 日志-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- ServletAPI-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- Spring和Thymeleaf整合包-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.12.RELEASE</version>
        </dependency>
</dependencies>

由于maven的传递性,我们并不需要将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性注入

例如:
当我们引入了spring-webmvc,那么如下所示,和spring有关的所有依赖都被注入:

在这里插入图片描述

配置web.xml:

在这里插入图片描述

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
   <!-- Servlet的名称任意,只要保证和servletmapping中的Servlet-name一致即可-->
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!-- url-pattern的名称任意-->
    <url-pattern>/abc</url-pattern>
  </servlet-mapping>
</web-app>

创建请求控制器:

由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器

请求控制器中每一个处理请求的方法成为控制器方法

因为SpringMVC的控制器由一个POJO(普通java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IOC容器管理,此时SpringMVC才能够识别控制器的存在

例如:

@Controller
public class HelloController{
}

springMVC的配置文件:

创建springMVC的配置文件:

由于springMVC配置文件是在DispatcherServlet初始化加载时完成的,而不是我们手动编写的,因此无论是其放置位置还是名称都有严格的规定,springMVC的配置文件放于WEB-INF目录下,名称:<servlet-name>-servlet.xml,例如我的servlet-name为springMVC,那么我配置的springMVC配置文件名就为spring-servlet.xml

配置springMVC配置文件:

在springMVC中,控制层必须通过@Controller注解将其标识为一个控制层组件,但是早在之前的学习中,我们就知道基于注解管理bean时,光有注解是不够的,还需要扫描组件,因此在springMVC的配置文件中,我们需要做的第一步就是扫描控制层组件,如下所示:

<!-- 扫描控制层组件-->
    <context:component-scan base-package="Controller"></context:component-scan>

第二步:配置Thymeleaf视图解析器

Thymeleaf视图解析器它是由DispatcherServlet内部加载的,不需要程序员进行访问,只要程序员将其配置在XML文件中,那么它的功能相对应的就会被实现

<!-- 配置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>

功能测试:

实现对页面的访问:

第一步:配置tomcat

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里的/HelloSpringMVC_war_exploded为上下文路径,由于在一个web服务器中可能存在多个工程,那么我们如何准确的访问到某个工程呢?此时就需要通过上下文路径!

在这里插入图片描述

创建首页html文件,如下所示,首先我们先在WEB-INF目录下,创建templates目录,再在templates目录下创建关于首页的html文件

在这里插入图片描述

我们实现在首页显示一句话,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>你好,SpringMVC</h1>
</body>
</html>

完成之后运行服务器,浏览器显示如下:

在这里插入图片描述

之所以出现404错误的原因是:我们当前项完成的操作是访问首页,在web.xml文件中,我们设置了路径为/abc的请求会被DispatcherServlet进行请求处理,而路径为/abc的请求和首页并无任何关系,也就是说,我们并没有设置DispatcherServlet对首页的请求进行处理,因此直接产生404错误

在这里插入图片描述

既然是由于没有指定让DispatcherServlet对首页的请求进行处理,那么我们接下来就要完成该操作,而具体的操作应该在控制层完成,因为控制层的作用就是处理当前的某个请求,首先我们在controller中编写一个用来处理首页访问请求的方法,如下所示:

 public String showMessage(){
    }

虽然开发人员知道该方法是用来处理首页请求的,但SpringMVC并不知道啊,由此我们需要通过SpringMVC为我们提供的@RequestMapping注解,该注解的作用是将当前的浏览器发送的请求通过指定的路径映射到当前的方法上,该注解的值需要与web.xml文件中的url-pattern一致,这样才能保证当前的showMessage方法是处理请求的方法,那么如何处理请求呢?
将方法的逻辑视图返回,什么叫逻辑视图呢?也就是将当前视图的物理视图去掉前缀和后缀,此时我们需要跳转的页面的物理视图为index.html,它的完整路径为WEB-INF/templates/index.html,那前缀后缀是什么呢?我们打开SpringMVC-servlet.XML文件,如下所示:

在这里插入图片描述

那么我们的首页的逻辑视图即为"index"

return "index";

完整代码如下:

如下所示的showMessageController控制器方法,该方法处理的请求即为我们在 @RequestMapping指定路径的请求,我们在当前的请求方法中,直接将它的逻辑视图返回,该逻辑视图会被SpringMVC-servlet.XML文件中的视图解析器解析,通过给返回的逻辑视图加上前缀和后缀再进行匹配,就能匹配到完整的物理视图,再通过Thymeleaf的渲染,跳转到指定的页面

package Controller;

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

@Controller
public class showMessageController {
   @RequestMapping("/abc")
    public String showMessage(){
        return "index";
    }
}

此时我们访问首页,显示如下所示:

在这里插入图片描述

此时,首页的访问就成功啦!

实现对页面的跳转:

页面跳转实现的项目基础是在上述实现对页面访问的基础上进行修改的

html文档操作部分:

如下所示:

<html lang="en" xmlns:th="http://www.thymeleaf.org">

为了代码的复用,我们可以将Thymeleaf命名空间的声明添加至HTML模板中,这样我们以后创建的每个文件都有该声明,操作如下所示:

打开settings:

在这里插入图片描述

在这里插入图片描述

点击OK即可添加成功,添加成功之后就可以在文档中使用Thymeleaf的属性和标签,如下述代码所表示的th:href="@{/hello}",用于动态地将变量hello的值渲染到a标签中。

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>你好,SpringMVC</h1>
<a th:href="@{/hello}">测试SpringMVC</a>
</body>
</html>

创建要跳转的html页面:

success.html:

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

控制器操作部分:

在请求控制器中,添加新的请求控制方法,与上述实现首页访问的方式相同,这里我们也需要返回要跳转页面的物理视图,由于我们在indexhtml文件中,动态地将变量hello的值渲染到a标签中,此时首页跳转的连接的路径即为hello,因此这里的@RequestMapping的值需要与目标跳转页面的值相一致,也就是hello

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

最后我们还需要将web.xml文件进行修改:

如下所示,我们需要将url-pattern的值设置为/,表示所匹配的请求可以是login或.html或.js或.css方式的请求路径,但是/不能匹配.jsp请求路径的请求

在这里插入图片描述

此时启动服务器:

点击测试SpringMVC

在这里插入图片描述

页面成功跳转

在这里插入图片描述

SpringMVC处理请求的过程文字描述:

浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理,前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器{Controller},将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制方法就是处理请求的方法,处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应的页面

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

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

相关文章

Java 中线程相关的各种锁

一、Java对象与锁 1、对象结构 2、对象头的 Mark Word 二、锁介绍 1、概念和种类 1、乐观锁 不加锁&#xff0c;在使用数据时判断数据是不是最新。常用CAS算法实现 2、自旋锁 与 适应性自旋锁 两者并不是锁&#xff0c;而是锁提供的处理方式。 自旋锁&#xff08;JDK1.4&a…

Sentinel 熔断与限流

文章目录 1 是什么&#xff1f;2 特征3 特性4 与Hystrix的区别5 两个部分6 应用6.1 依赖6.2 配置文件 7 流量配置规则7.1 直接&#xff08;默认&#xff09;7.2 关联7.3 Warm Up 预热7.4 排队等待 8 熔断降级8.1 概述RT(平均响应时间&#xff0c;秒级)异常比列(秒级)异常数(分钟…

python-cv2模块安装

1.自动安装 如果网络环境好&#xff1a; pip install opencv-python2.卸载与安装指定版本 卸载opencv pip uninstall opencv-python安装指定版本的cv 指定版本为&#xff1a;4.5.4.60 pip install opencv-python 4.5.4.603.下载安装包安装 从官网下载正确安装包安装&#x…

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2(make/makefile和git的基本使用)

【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2&#xff08;make/makefile和git的基本使用&#xff09; 目录 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2&#xff08;make/makefile和git的基本使用&#xff09;背景make和makefile的用法…

Proxy-Reflect使用详解

1 监听对象的操作 2 Proxy类基本使用 3 Proxy常见捕获器 4 Reflect介绍和作用 5 Reflect的基本使用 6 Reflect的receiver Proxy-监听对象属性的操作(ES5) 通过es5的defineProperty来给对象中的某个参数添加修改和获取时的响应式。 单独设置defineProperty是只能一次设置一…

AppStorage, OnboardingView 的示例

1. AppStorage 数据简单存储的实现 /// 应用程序数据简单存储 struct AppStorageBootcamp: View {//State var currentUserName: String?AppStorage("name") var currentUserName: String?var body: some View {VStack(spacing: 20) {Text(currentUserName ?? &…

Ghostscript开源PDF库中发现关键漏洞

在Linux中广泛使用的PostScript语言和PDF文件开源解释器Ghostscript被发现存在严重远程代码执行漏洞。 该漏洞被标记为CVE-2023-3664&#xff0c;CVSS v3评级为9.8&#xff0c;影响10.01.2之前的所有Ghostscript版本&#xff0c;10.01.2是三周前发布的最新版本。 据Kroll公司…

深入理解netfilter和iptables

目录 Netfilter的设计与实现 内核数据包处理流 netfilter钩子 钩子触发点 NF_HOOK宏与Netfilter裁定 回调函数与优先级 iptables 内核空间模块 xt_table的初始化 ipt_do_table() 复杂度与更新延时 用户态的表&#xff0c;链与规则 conntrack Netfilter(结合iptable…

基于C语言设计的足球信息查询系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 需求分析与概要设计 2.1 项目说明 我们小组的选题主要是面向足球爱好者&#xff0c;在普通社交软件的基础之上&#xff0c;围绕足球的主题展开设计&#xff0c;以便于他们能够更好的交流相关的话题&#xff…

高效编程的捷径:HbuilderX的独特之处

目录 引言HbuilderX的功能HbuilderX的优点HbuilderX的缺点总结 HBuilderX 官网 引言 在当今科技发展日新月异的时代&#xff0c;软件开发已成为一个极富挑战性且高需求的领域。为了在竞争激烈的市场中脱颖而出&#xff0c;程序员们需要掌握一系列高效编程的技巧和工具。在这个过…

谈一谈LLM在推荐域的一些理解

作者&#xff1a;陈祖龙(葬青) 一、前言 最近大模型真的很火&#xff0c;从个人到公司&#xff0c;各行各业都在学习大模型、总结大模型和尝试应用大模型。大模型其实不是一个新的产物&#xff0c;已经在NLP发展了很多年。ChatGPT的诞生&#xff0c;经验的效果震惊了所有人&…

ES系列--es初探

一、前言 一般传统数据库&#xff0c;全文检索都实现的很鸡肋&#xff0c;因为一般也没人用数据库存文本字段。进 行全文检索需要扫描整个表&#xff0c;如果数据量大的话即使对 SQL 的语法优化&#xff0c;也收效甚微。建 立了索引&#xff0c;但是维护起来也很麻烦&#xff0…

人工智能-电脑如何像人一样思考?

发展历史 在电影如 终结者、机械公敌 中&#xff0c;机器人为什么能够像人一样思考&#xff1f;其实这就是人工智能。人工智能多方面&#xff1a;例如人脸识别系统、肺部影响CT&#xff0c;手机中的美颜、垃圾邮件拦截、自动驾驶 。 上世纪30-50年代&#xff0c;随着计算机科…

服务器如何查库磁盘情况?

查库磁盘情况 du -h --max-depth1 ./ | sort -hr

九九乘法表案例

for循环嵌套 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Linux5.15 Zookeeper集群 + Fafka集群

文章目录 计算机系统5G云计算第四章 LINUX Zookeeper集群 Fafka集群一、Zookeeper1.Zookeeper 概述1&#xff09;Zookeeper 定义2&#xff09;Zookeeper 工作机制3&#xff09;Zookeeper 特点4&#xff09;Zookeeper 数据结构5&#xff09;Zookeeper 应用场景6&#xff09;Zoo…

unittest与pytest自动化测试框架

引言 前面一篇文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区…

大华相机接入web页面实现人脸识别

先看下效果&#xff0c;中间主视频流就是大华相机&#xff08;视频编码H.264&#xff09;&#xff0c;海康相机&#xff08;视屏编码H.265&#xff09; 前端接入视屏流代码 <!--视频流--><div id"col2"><div class"cell" style"flex: …

2023夏季营销报告新鲜出炉!(小红书平台)

夏季温度持续走高&#xff0c;大众需求也在升级。品牌如何借势和部署相关内容&#xff1f; 本期&#xff0c;千瓜推出《千瓜2023夏季营销策略数据报告&#xff08;小红书平台》&#xff08;本文非完整版报告&#xff09;&#xff0c;围绕七大行业&#xff08;美妆|个护|食品|家…

能翻译维吾尔语的软件有哪些?这几个可以用用看

能翻译维吾尔语的软件有哪些&#xff1f;在如今全球化的背景下&#xff0c;不同语言之间的沟通交流变得尤为重要。维吾尔语作为中国特有的少数民族语言之一&#xff0c;它的翻译需求日益增长。本文将介绍几款精选的维吾尔语翻译软件&#xff0c;帮助大家顺利实现跨语言沟通。 智…