目录
1、搭建环境
1、Maven项目,添加web模块
2、设置子模块的打包方式为,打war包并引入依赖
2、注册Spring前端控制器
2.1、默认配置方式(弃用)
2.2、扩展配置方式(推荐)
3、创建请求控制器
4、配置SpringMVC配置文件
5、测试
5.1、实现对首页的访问
5.2、通过超链接跳转到指定页面
6、总结
使用thymeleaf作为模板引擎
手动在src.main.java下,创建webapp目录,然后通过Project Structure,在webapp目录下创建WEB-INF/web.xml文件
子模块
的打包方式为,打war包并引入依赖
war
org.springframework
spring-webmvc
5.3.1
ch.qos.logback
logback-classic
1.2.3
javax.servlet
javax.servlet-api
3.1.0
provided
org.thymeleaf
thymeleaf-spring5
3.0.12.RELEASE
这里的其余底层依赖由Maven自动导入
注意servlet的作用范围,否则部署时容易出问题。
注册SpringMVC的前端控制器DispatcherServlet
此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为-servlet.xml。
例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml
springMVC
org.springframework.web.servlet.DispatcherServlet
springMVC
/
这种配置方式存在的问题
这样配置,会导致SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml。
而Maven中,配置文件应该都存放在resources目录下,需要使用SpringMVC的扩展配置方式来实现。
springDispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 springDispatcherServlet /
推荐使用这种方式
springDispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
springDispatcherServlet
/
相比默认设置,这种方式扩展了哪些设置?
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页面丢失
,不能显示
什么是请求控制器
SpringMVC的控制器由一个POJO担任,负责处理具体请求。
请求控制器中每一个处理请求的方法称为 控制器方法
为什么需要请求控制器
由于前端控制器需要对浏览器发送的请求进行统一处理,但不同的具体请求有具体的处理方式,因此需要编写处理具体请求的逻辑。
如何注册请求控制器
不对这个POJO进行注册,Spring不会知晓它是个请求控制器。
有两种方法:
- 注解+扫描
- 配置bean标签
如果使用注解,需要通过
@Controller
注解,将其标识为一个控制层组件
,交给Spring的IoC容器管理,Spring才能知晓此控制器的存在。
示例
@Controller
public class HelloController {
}
SpringMVC的配置文件,其实就是一个Spring的配置文件
需要配置:
在请求控制器中创建处理请求的方法
@Controller
public class HelloController {
//访问/WEB-INF/templates/index.html
@RequestMapping("/")
public String index(){
System.out.println("请求收到");
//返回视图名称
return "index";
}
}
Title
Hello,SpringMVC
点击访问target.html
由于此处不能填写绝对路径,而是应该填写/项目路径/绝对路径,而
项目路径应该动态获取,所以使用thymeleaf来解析
。th:href="@{/target}", 如果@{}中是绝对路径,会自动解析成相对路径。
此处的路径,浏览器解析的时候,其实是 /springmvc/target
编写target.html
Title
Welcome to target.html
在控制器中添加方法
@RequestMapping("/target")
public String toTarget(){
System.out.println("请求收到");
//返回视图名称
return "target";
}
测试访问
浏览器请求解析的全过程
浏览器发送请求,若请求地址符合前端控制器的url-parttern("/"),该请求就会被前端控制器DispatherServlet拦截到。
前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性进行匹配,若匹配成功,该注解对应的控制器方法就是处理这个请求的方法。
处理请求的方法返回一个字符串类型的视图名称,该
视图名称会被视图解析器解析,加上前缀和后缀,组成视图的完整路径
,通过Thymeleaf对视图进行渲染,最终转发到视图对应的前端页面。可以简单总结成四个步骤:
- 前端控制器拦截请求
- 匹配控制器方法
- 返回视图名称
- 视图解析器解析视图名称,组成完整路径,转发到对应页面