超详细从0到1快速搭建SpringMVC开发环境

news/2024/11/28 2:42:02/

目录

1、搭建环境

1、Maven项目,添加web模块

 2、设置子模块的打包方式为,打war包并引入依赖

2、注册Spring前端控制器

2.1、默认配置方式(弃用)

2.2、扩展配置方式(推荐)

3、创建请求控制器

4、配置SpringMVC配置文件

5、测试

5.1、实现对首页的访问

5.2、通过超链接跳转到指定页面

6、总结


使用thymeleaf作为模板引擎

1、搭建环境

1、Maven项目,添加web模块

手动在src.main.java下,创建webapp目录,然后通过Project Structure,在webapp目录下创建WEB-INF/web.xml文件

 增加框架支持

 2、设置子模块的打包方式为,打war包并引入依赖

<packaging>war</packaging>
<!--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><!--Spring和Thymeleaf整合包-->
<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version>
</dependency>

这里的其余底层依赖由Maven自动导入

注意servlet的作用范围,否则部署时容易出问题。

 

2、注册Spring前端控制器

注册SpringMVC的前端控制器DispatcherServlet

2.1、默认配置方式(弃用)

此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为-servlet.xml。

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

<!--配置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的核心控制器所能处理的请求的请求路径--><url-pattern>/</url-pattern>
</servlet-mapping>

这种配置方式存在的问题

这样配置,会导致SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml。

而Maven中,配置文件应该都存放在resources目录下,需要使用SpringMVC的扩展配置方式来实现。

<!--配置SpringMVC的前端控制器,对浏览器发送的请求进行统一处理-->
<servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--将前端控制器的初始化时机,提前到服务器启动时--><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springDispatcherServlet</servlet-name><!--设置SpringMVC的核心控制器所能处理的请求的请求路径--><url-pattern>/</url-pattern>
</servlet-mapping>

2.2、扩展配置方式(推荐)

推荐使用这种方式

<!--配置SpringMVC的前端控制器,对浏览器发送的请求进行统一处理-->
<servlet><servlet-name>springDispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--将前端控制器的初始化时机,提前到服务器启动时--><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springDispatcherServlet</servlet-name><!--设置SpringMVC的核心控制器所能处理的请求的请求路径--><url-pattern>/</url-pattern>
</servlet-mapping>

相比默认设置,这种方式扩展了哪些设置?

  • init-param:

    • 自定义配置文件的名称和路径,然后通过初始化参数,赋值给DispatcherServlet的contextConfigLocation属性。
    • classpath:springmvc.xml的含义:SpringMVC的配置文件,是resources下的springmvc.xml
  • load-on-startup:

    • 因为DispatcherServlet需要拦截其他请求,所以它需要设置成在服务器启动时,自动启动。
    • 如果不做设置,默认是在第一次访问时才初始化,显然不合理。
    • 这个值越小,优先级越高,越先创建对象

关于请求路径的匹配

/ 所能匹配的请求可以是 /login 或 .html 或 .js 或.css方式的请求路径,但是 / 不匹配 .jsp请求路径的请求

.jsp的请求不应该被前端控制器捕获,因为jsp文件需要专门的Servlet来处理,才能显示jsp页面。所以前端控制器并不需要处理jsp。

这里不能使用 /* ,因为 /* 会捕获所有请求,造成jsp文件被拦截,导致jsp页面丢失,不能显示

3、创建请求控制器

什么是请求控制器

SpringMVC的控制器由一个POJO担任,负责处理具体请求。

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

为什么需要请求控制器

由于前端控制器需要对浏览器发送的请求进行统一处理,但不同的具体请求有具体的处理方式,因此需要编写处理具体请求的逻辑。

如何注册请求控制器

不对这个POJO进行注册,Spring不会知晓它是个请求控制器。

有两种方法:

  • 注解+扫描
  • 配置bean标签

如果使用注解,需要通过 @Controller注解,将其标识为一个控制层组件,交给Spring的IoC容器管理,Spring才能知晓此控制器的存在。

示例

@Controller
public class HelloController {}

4、配置SpringMVC配置文件

SpringMVC的配置文件,其实就是一个Spring的配置文件

需要配置:

  1. 注解扫描
  2. 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"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.zcy"/><!--配置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>

5、测试

5.1、实现对首页的访问

在请求控制器中创建处理请求的方法

@Controller
public class HelloController {//访问/WEB-INF/templates/index.html@RequestMapping("/")public String index(){System.out.println("请求收到");//返回视图名称return "index";}
}

5.2、通过超链接跳转到指定页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>Hello,SpringMVC</h3>
<a th:href="@{/target}">点击访问target.html</a>
</body>
</html>

由于此处不能填写绝对路径,而是应该填写/项目路径/绝对路径,而项目路径应该动态获取,所以使用thymeleaf来解析

th:href="@{/target}", 如果@{}中是绝对路径,会自动解析成相对路径。

此处的路径,浏览器解析的时候,其实是 /springmvc/target

编写target.html

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

在控制器中添加方法

@RequestMapping("/target")
public String toTarget(){System.out.println("请求收到");//返回视图名称return "target";
}

测试访问

!!!如若有index.jsp记得删除 否则会出现

 

 

6、总结

浏览器请求解析的全过程

浏览器发送请求,若请求地址符合前端控制器的url-parttern("/"),该请求就会被前端控制器DispatherServlet拦截到。

前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性进行匹配,若匹配成功,该注解对应的控制器方法就是处理这个请求的方法。

处理请求的方法返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀,组成视图的完整路径,通过Thymeleaf对视图进行渲染,最终转发到视图对应的前端页面。

可以简单总结成四个步骤:

  1. 前端控制器拦截请求
  2. 匹配控制器方法
  3. 返回视图名称
  4. 视图解析器解析视图名称,组成完整路径,转发到对应页面

http://www.ppmy.cn/news/39295.html

相关文章

从零开始实现一个C++高性能服务器框架----序列化模块

此项目是根据sylar框架实现&#xff0c;是从零开始重写sylar&#xff0c;也是对sylar丰富与完善 项目地址&#xff1a;https://gitee.com/lzhiqiang1999/server-framework 简介 项目介绍&#xff1a;实现了一个基于协程的服务器框架&#xff0c;支持多线程、多协程协同调度&am…

2023 年前端十大 Web 趋势

在本文中&#xff0c;我想跟大家聊聊自己看到的最新 Web 开发趋势。 &#xff08;元&#xff09;框架 单页应用程序&#xff08;SPA&#xff09;及各类相关框架&#xff08;包括 React.js、Vue.js、Svelte.js 等&#xff09;或多或少都经历过一定的炒作周期&#xff0c;也用多…

深度优先搜索算法详解

深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;是一种经典的图形搜索算法&#xff0c;用于在图或树中遍历所有节点。它是一种递归算法&#xff0c;它通过深入到树或图的最深层来遍历节点&#xff0c;并且在回溯时继续搜索其他分支。 深度优先搜索的核…

从SE for AI 到AI for SE,谈无代码平台如何应用AIGC技术

ChatGPT爆⽕全⽹一段时间后&#xff0c;GPT4的发布再次打破普通人的认知。 相比于chatGPT聊天式交互和生成答案&#xff0c;其背后的底层技术AIGC应用场景更加广泛。不管是头部厂商还是个人&#xff0c;都在考虑如何借助这项新技能实现跨越式发展。 数睿数据也在思考无代码开…

半监督学习为什么能work?以及直推式学习是什么

今天在看半监督的时候&#xff0c;突然想起这个问题&#xff1a; 半监督用训好的模型去生成伪标签&#xff0c;再把伪标签当做真标签去训&#xff0c;但是模型能生成伪标签说明模型已经学到了这部分内容&#xff0c;把模型已经学会的内容加进去&#xff0c;让模型继续学&#…

大器晚成我服刘邦,48岁才开始创业

读史使人明智&#xff0c;周末放下手机&#xff0c;静下心来读点人文历史。大器晚成我最佩服刘邦&#xff0c;48岁才开始创业 。在此之前&#xff0c;他是一个出身平凡的农民&#xff0c;早年曾多次失败和受挫。刘邦最后能够战胜项羽&#xff0c;常常让人觉得匪夷所思&#xff…

网络编程三要素

网络编程三要素 IP、端口号、协议 三要素分别代表什么 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 端口号&#xff1a;应用程序在设备中的唯一标识 协议&#xff1a;数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp ip&#xff1a;IPv4和…

DataGrip连接数据库设置(MySQL、Oracle、SQL Server)

一、DataGrip连接MySQL 1.1 配置信息 1.2 测试查询employees库中departments表信息 employees为测试库&#xff0c;具体来源&#xff0c;参考这篇文章 下载并导入MySQL示例数据库employees 。 1.3 测试查询employees库中employees表信息 二、DataGrip连接Oracle 将SID改为o…