【SpringMVC】
SpringMVC简介
SpringMVC是Spring的一个后续产品,是Spring的一个子项目
基于原生的Servlet,通过了功能强大的DispatcherServlet,对请求和响应进行统一处理
什么是MVC
MVC是一种架构思想,将软件按照模型、视图、控制器来划分
M:Modedl,模型层,指工程中的JavaBean,作用是处理数据
JavaBean分为两类:
· 一类是实体类Bean,专门存储业务数据
· 一类是业务处理Bean,指Service和Dao对象,专门处理业务逻辑和数据库访问
V:View,视图层,指工程中的html和jsp页面,作用是与用户交互,展示数据
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
MVC的工作流程
用户通过视图层发送数据请求到服务器,在服务器中请求被Controller接收,Controller调用Model层处理请求,处理完毕将结果返回给Controller,Controller再根据请求处理的结果找到相应的View视图层,对数据进行渲染相应给浏览器。
开发环境
IDE:idea 2019.2
构建工具:maven3.5.4
服务器:tomcat7
Spring版本:5.3.1
创建Maven工程
①添加web模块
②设置打包方式为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
导入依赖时会同时导入依赖所需要的依赖,如导入spring-webmvc时就导入了Spring所需的aop、beans、context等
scope provided /scope 标签表示服务器已经提供了该依赖,打包时不必再注入
配置web.xml
默认请求方式
SpringMVC
org.springframework.web.servlet.DispatcherServlet
SpringMVC
/
对名为SpringMVC的servlet进行注册,servlet和servlet-mapping的servlet-name的名称必须相同
匹配路径设置为SpringMVC的核心控制器能够处理的请求的请求路径
/表示除了.jsp之外的请求,可以匹配如/login、.html、css方式的请求路径,/*则表示包括.jsp的所有请求
为什么不能匹配jsp?
jsp被认为是一种特殊的servlet,需要服务器指定的servlet进行处理,因此.jsp结尾的请求路径不需要DispatcherServlet处理,否则SpringMVC将.jsp请求当做普通请求处理而不会找到相应的jsp页面
扩展配置方式
Maven要求配置文件都要在resource下,因此通过init-param(初始化前端控制器属性)设置SpringMVC配置文件(contextConfigLocation,上下文配置路径)的位置(value,对应resource的类路径)和名称(name),通过load-on-startup标签设置前端控制器DispatcherServlet的启动时间为服务器启动时(Servlet生命周期默认为第一次访问时才启动)
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:SpringMVC.xml
1
创建SpringMVC.xml配置文件
开启注解扫描
@Controller
public class HelloController {
}
这样控制器就能被IOC识别并注入
配置Thymeleaf视图解析器
Order设置视图解析器的优先级
templateEngine为当前模板,其内部Bean表示的是当前解析视图的一种策略。视图名称加上视图前缀和视图后缀就可以得到要跳转的页面。
每当页面发生跳转的时候,视图名称符合当前条件,就会被视图解析器解析,得到相应的页面
对控制器设置请求映射注解 @RequestMapping
将当前的请求和控制器方法创建映射关系,不仅可以通过请求路径,而且可以通过请求方式、请求参数、请求报文等进行匹配
@Controller
public class HelloController {
@RequestMapping("/")
public String getIndex() {
return "index";
}
}
这里省略了value="/"
WEB-INFO下的页面浏览器是不能够访问的,也不能够通过重定向只能通过转发的方式
不允许多个控制器对同一个上下文地址进行映射
由于引入的日志依赖,控制台输出的日志信息:
13:53:35.733 [http-nio-8080-exec-1] DEBUG org.thymeleaf.TemplateEngine - [THYMELEAF] TEMPLATE ENGINE INITIALIZED
13:53:35.858 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK
13:53:36.105 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/springMVC/", parameters={}
13:53:36.106 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.hikaru.mvc.controller.HelloController#getIndex()
13:53:36.111 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK
可以看到
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.hikaru.mvc.controller.HelloController#getIndex()
这里发生的映射关系:访问请求Mapped to控制器方法,且与注解表示的方法有关而与方法名无关
通过thymeleaf视图解析器访问指定的页面th:href="@{/target}"th:href="@{/target}"th:href="@{/target}"
Title
首页
target.html
thymeleaf会解析a标签的上下文路径(或者使用 /springMVC/target作为上下文路径 ,但是上下文可以修改耦合性不好,否则普通超链接地址只有浏览器或服务器解析的绝对路径),将请求发送给控制器,经请求映射的控制器方法得到返回值后再加上视图前缀和视图后缀,返回完整的页面地址
@Controller
public class HelloController {
@RequestMapping("/")
public String getIndex() {
return "index";
}
@RequestMapping("/target")
public String toTarget() {
return "target";
}
}
总结
浏览器发送请求,若请求符合前段控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理,前端控制器会读取SpringMVC核心配置文件(resource中的SpringMVC.xml)通过扫描组件找到控制器,将请求地址和控制器方法的@RequestMapping的value值进行匹配,如果匹配成功则说明该控制器方法是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上视图前缀、后缀组成视图的路径,通过ThymeLeaf对视图进行渲染,最终转发到视图对应的页面。