目录
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的配置文件
需要配置:
- 注解扫描
- 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对视图进行渲染,最终转发到视图对应的前端页面。可以简单总结成四个步骤:
- 前端控制器拦截请求
- 匹配控制器方法
- 返回视图名称
- 视图解析器解析视图名称,组成完整路径,转发到对应页面