32.SpringMVC配置

news2024/11/23 17:09:13

SpringMVC配置

pom.xml里面将之前的"jar"打包方式更改为"war"

因为之前在JavaWeb创建Maven时就是按web工程来创建的(详细可参考5.IDEA里面使用Maven.md博客),所以不需要再创建webapp目录了,完整目录如下:

引入依赖

pom.xml

	<!-- 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>
        <scope>provided</scope>
    </dependency>

    <!-- Spring5和Thymeleaf整合包 -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>

配置web.xml

默认配置方式

注册SpringMVC的前端控制器DispatcherServlet

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">
	<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
	<servlet>
		<servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	</servlet>

	<servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <!--
            设置springMVC的核心控制器所能处理的请求的请求路径
            /:所匹配的请求可以是/login或.html或.js或.css方式的请求路径,但是不能匹配.jsp请求路径的请求
            /*:匹配任意请求,包括.jsp
        -->
        <url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

扩展配置方式

与默认方式相比多了一个<init-param>标签,可通过此标签设置SpringMVC配置文件的位置和名称,通过<load-on-startup>标签设置SpringMVC前端控制器DispatcherServlet的初始化时间

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">
      <!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
    <servlet>
		<servlet-name>SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

		<!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
		<init-param>
			<!-- contextConfigLocation为固定值 -->
            <param-name>contextConfigLocation</param-name>
            <!-- 使用classpath:表示从类路径查找配置文件,否则普通路径为webapp目录下(与默认路径WEB-INF目录下存在区别)
            这里代表java目录下或者resources目录下的SpringMVC.xml文件为配置文件 -->
            <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>
        <!--
            设置springMVC的核心控制器所能处理的请求的请求路径
            /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
            但是/不能匹配.jsp请求路径的请求
        -->
        <url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

创建请求控制器

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

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

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

HelloController.java

package com.atguigu.SpringMVC.controller;

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

@Controller
public class HelloController {
    //@RequestMapping注解:处理请求和控制器方法之间的映射关系
    //localhost:8080/springMVC/
    @RequestMapping("/")
    public String index(){
        //将逻辑视图返回
        return "index";
    }
}

WEB-INF/templates目录下创建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>欢迎来到主页</h1>
</body>
</html>

创建SpringMVC配置文件

  • 在默认配置方式下:SpringMVC的配置文件默认读取<WEB-INF>目录下的配置文件,默认名称为web.xml中的"<servlet-name>"+"-servlet.xml"
  • 在扩展配置方式下:为<init-param>标签下的<param-value>标签的属性值

例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为SpringMVCservlet.xml

SpringMVC-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"
       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.SpringMVC.controller"/>

    <!-- 配置Thymeleaf视图解析器——通过SpringMVC提供的方式进行视图渲染,并实现页面跳转 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <!--优先级为1-->
        <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">
                        <!-- 假设需要跳转:/WEB-INF/templates/index.html -->
                        <!-- 逻辑视图只需要为index,Thymeleaf会自动填充前缀和后缀来组合成完整的物理视图 -->
                        <!-- 视图前缀 -->
                        <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>

配置Tomcat

配置artifacts:

修改虚拟映射地址:

测试

启动Tomcat,地址栏输入http://localhost:8080/SpringMVC/hello

Tomcat成功接收请求并访问到受保护目录下WEB-INF的资源templates/index.html

值得注意的是,Tomcat启动时会默认去访问webapp/index.jsp,只有当访问不到时才会以"请求"的方式访问页面,也就是对应@RequestMapping("/")请求

路径问题

<html>中添加thymeleaf命名空间xmlns:th="http://www.thymeleaf.org"(可以在IDEA模板设置中添加这个语句,方便日后的使用)

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="@{/hello}">相对路径(通过Thymeleaf渲染)</a>
    <a href="/hello">绝对路径(缺少上下文路径)</a>
</body>
</html>

success.html

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

HelloController.java

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

测试结果:只有相对路径的方式才能访问得到success.html页面

总结

浏览器发送请求

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

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

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

相关文章

20天学会rust(二)rust的基础语法篇

在第一节&#xff08;20天学rust&#xff08;一&#xff09;和rust say hi&#xff09;我们配置好了rust的环境&#xff0c;并且运行了一个简单的demo——practice-01&#xff0c;接下来我们将从示例入手&#xff0c;学习rust的基础语法。 首先来看下项目结构&#xff1a; 项目…

云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

目录 一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.CKA版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过 一、理论 1.容器服务Kubernetes版 &#xff08;1&#xff09;概念 阿里云容器服务Kubernetes版&#xff08;Alibaba Cloud…

ChatGPT实战:创业咨询,少走弯路,少踩坑

用九死一生形容创业再适合不过&#xff0c;不过一旦成功回报也很诱人&#xff0c;这也是为什么那么多人下场创业。纸上得来终觉浅&#xff0c;绝知此事要躬行&#xff0c;创过业的人都知道其中的心酸&#xff0c;而他们也建议你去创业&#xff0c;因为那真不是一般人能干的事。…

采油平台状态监测:确保海上能源供应的可靠性与安全性

在全球范围内&#xff0c;保障可靠的能源供应对于每个工业化国家至关重要。某采油平台通过设备数字化平台的相关技术&#xff0c;实现了对海上平台的结构完整性的可靠监测和预测。本文将探讨海上平台在极端环境中的挑战&#xff0c;以及通过设备数字化平台数据分析如何确保采油…

Apache Arrow Acero执行引擎

Apache Arrow流执行引擎 对于许多复杂的计算&#xff0c;在内存或计算时间内&#xff0c;连续的计算函数的直接调用都是不可行的。为了更加有效的提高资源使用率、促进多批数据的消费&#xff0c;Arrow提供了一套流式执行引擎&#xff0c;称为Acero。 目前支持算子有&#xff1…

jvm-程序计数器

1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器&#xff0c;cpu中读取速度…

CI/CD—Docker中深入学习

1 容器数据卷 什么是容器数据卷&#xff1a; 将应用和环境打包成一个镜像&#xff01;数据&#xff1f;如果数据都在容器中&#xff0c;那么我们容器删除&#xff0c;数据就会丢失&#xff01;需求&#xff1a;数据可以持久 化。MySQL容器删除了&#xff0c;删容器跑路&#…

网络框架重构之路plain2.0(c++23 without module) 环境

开发环境 主开发环境 1、系统 plain因为支持跨平台&#xff0c;所以主要的两个操作系统是linux和windows&#xff0c;而linux中我选择了中小企业中常用的centos 7&#xff08;centos 8 已经停止支持了&#xff0c;但是7还有一段时间才会停&#xff0c;估计之后大家可能会被迫使…

C++QT教程2——创建QT项目

文章目录 2 创建Qt项目2.1 使用向导创建2.2 手动创建2.3 .pro文件2.4 一个最简单的Qt应用程序main入口函数中&#xff08;main.cpp&#xff09;arnold_widget.h函数arnold_widget.cpp 参考文章 2 创建Qt项目 2.1 使用向导创建 打开Qt Creator 界面选择 New Project或者选择菜…

CTF Crypto --- 七八月份比赛杂题记录

文章目录 前言第一届交通运输行业网络安全大赛决赛---CryptoeasyRSAMypow baby_RSAEasyRSA你懂RSA吗 前言 哥们终于想起账号密码了(尊嘟忘了)。 鸽了快两个星期辣&#xff0c;下次一定不鸽(x)。 第一届交通运输行业网络安全大赛决赛—Crypto easyRSA 题目&#xff1a; f…

APP外包开发的开发语言对比

在开发iOS APP时有两种语言可以选择&#xff0c;Swift&#xff08;Swift Programming Language&#xff09;和 Objective-C&#xff08;Objective-C Programming Language&#xff09;&#xff0c;它们是两种不同的编程语言&#xff0c;都被用于iOS和macOS等苹果平台的软件开发…

Kafka入门,保姆级教学

文章目录 Kafka概念消息中间件对比消息中间件对比-选择建议Kafka常用名词介绍Kafka入门1. Kafka安装配置2.Kafka生产者与消费者关系3.Kafka依赖4.生产者发消息5.消费者接受消息6.Kafka高可用性设计6.1集群Kafka备份机制(Reolication) 7.kafka生产者详解7.1 发送类型7.2参数详解…

五分钟帮您理解Linux网络核心知识点——socket和epoll

关于linux网络相关的基础知识点&#xff0c;最热的两个就是socket和epoll&#xff0c;接下来我就用最简单的方式把他俩说清楚便于大家理解&#xff01; Socket Socket 是一种进程间通信的方法&#xff0c;它允许位于同一主机&#xff08;计算机&#xff09;或使用网络连接起来…

【链表OJ 3】链表的中间结点

前言: 本文收录于http://t.csdn.cn/n6UEP数据结构刷题的博客中,首先欢迎大家的来访&#xff0c;其次如有错误&#xff0c;非常欢迎大家的指正&#xff01;我会及时更正错误&#xff01; 目录 一.链表的中间结点 1.1原理:快慢指针的使用 链表元素个数为奇数时 链表元素个数…

只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)

目录 前言 介绍 基本使用 关键帧 KeyframeEffect的三种类的声明 keyframes options 动画对象 全局Animation类 标签中的animate函数 总结 相关代码&#xff1a; 前言 接着上文往下介绍&#xff0c;上篇文章我们对JS原生动画和贝塞尔曲线有了一个详细的认识&#x…

了解IL汇编异常处理语法

从网上拷过来一个IL汇编程序&#xff0c;编译时先报如下错&#xff0c; 看它是把空格识别为了下注红线的字符&#xff0c;这是字符编码的问题&#xff0c;用记事本替换功能替换了&#xff1b; 然后又报如下的错&#xff0c; 看不出来问题&#xff0c;拷一句正确的来&#xff0…

Netty面试题3

讲一讲你在网络通讯中遇到的坑或者比较棘手的问题 1、网络延迟问题 2、网络拥塞问题 某公司的Java项目需要向远程服务器发送大量的HTTP请求并获取响应&#xff0c;由于请求量较大&#xff0c;导致网络拥塞&#xff0c;请求响应延迟较高。针对这个问题&#xff0c;我们可以采取…

「2024」预备研究生mem-等差等比数列片段和 一般数列

一、等差数列 片段和 二、等比数列 片段和 三、一般数列

数据结构 | 树的定义及实现

目录 一、树的术语及定义 二、树的实现 2.1 列表之列表 2.2 节点与引用 一、树的术语及定义 节点&#xff1a; 节点是树的基础部分。它可以有自己的名字&#xff0c;我们称作“键”。节点也可以带有附加信息&#xff0c;我们称作“有效载荷”。有效载荷信息对于很多树算法…

AcWing 379. 捉迷藏(最小路径点覆盖匈牙利算法)

输入样例&#xff1a; 7 5 1 2 3 2 2 4 4 5 4 6输出样例&#xff1a; 3 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N220; int n,m,t; int d[N][N],vis[N]; int match[N]; bool find(int x){for(int i1;i<n;i){if(d[x][i]&&…