SpringMVC简介
MVC的三层结构
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
- M(Model模型层): 工程中处理数据的JavaBean,分为专门存储业务数据的
实体类
和专门用于处理业务逻辑的Service
以及数据持久化的Dao
- V(View视图层): 工程中与用户进行交互或展示数据的html或jsp等页面
- C(Controller控制层): 工程中接收并处理浏览器发起的请求同时响应结果给浏览器的Servlet
MVC的工作流程
- 第一步: 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收
- 第二步: Controller根据请求路径调用Model层中匹配的业务方法处理请求,处理完毕后将结果返回到Controller
- 第三步: Controller将请求处理的结果渲染到对应的View视图,数据渲染完毕后将结果响应给浏览器
SpringMVC的特点
传统的三层架构分为表示/表述层(前台HTML页面和后台Servlet)、业务逻辑层、数据访问层
- 表述层框架历经Strust,WebWork,Strust2等诸多产品的历代更迭之后,目前SpringMVC作为JavaEE项目表述层开发的首选方案
SpringMVC是Spring为表述层开发提供的一整套完备的解决方案, 代码简洁且性能卓著, 适合现代大型、超大型互联网项目要求
- SpringMVC的IoC容器核心配置文件与Spring的IoC容器配置文件相同二者可以无缝衔接
- 通过功能强大的前端控制器
DispatcherServlet
对请求和响应进行统一处理(底层还是基于原生的Servlet) - 内部组件化程度高,可插拔式组件即根据功能需求配置相应组件即可
入门程序
环境搭建
第一步: 使用maven创建一个web工程(设置工程的结构在src/mian/webapp/WEB-INF
目录下生成web.xml文件)
第二步: 指定Maven工程的打包方式为war包
第三步: 引入最顶端的依赖spring-webmvc
, 由于Maven的传递性也会自动导入spring环境所需要的依赖
<dependencies>
<!-- SpringMVC(自动传递Spring环境所需要的依赖) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!--slf4j的日志实现,Thymeleaf依赖slf4j-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--Spring5需要的ServletAPI,前端控制器继承HttpServlet-->
<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>
</dependencies>
第四步: 配置Tomcat部署web应用时的相关参数,并指定web应用的上下文路径
注册前端控制器
第四步: 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet
, 配置其所能处理的请求的请求路径同时指定SpringMVC的配置文件的名称和位置
- 如果不指定SpringMVC配置文件的名称和位置,默认需要放在WEB-INF下且文件名称为
springMVC-servlet.xml
(springMVC由servlet-name决定)
<?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配置文件的名称和位置,不指定按照默认配置-->
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--/表示可以匹配所有请求但不包括*.jsp的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第五步: 创建SpringMVC的配置文件springMVC-servlet.xml
,添加context
命名空间及其对应的约束文件
- 将来控制层的组件一定会使用到Spring提供的大量注解,所以我们需要
扫描所有控制层的组件
交给SpringMVC的IoC容器管理 配置Thymeleaf视图解析器
帮我们拼接前后缀得到HTML页面的物理地址,解析页面中的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.atguigu.mvc.controller"></context:component-scan>
<!--配置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>
编写控制器以及控制器方法
WEB-INF目录下的资源是受保护的
,在浏览器中通过路径直接访问/WEB-INF/templates/index.html会出现404错误,需要使用视图解析器转发到视图对应的页面
由于前端控制器对浏览器发送的请求进行了统一的处理,所以它最终还需要将这些请求分发到对应的控制器当中
使用@Controller
标识控制层组件交给SpringMVC的IoC容器管理,这样前端控制器才能识别到控制器的存在知道其可以处理请求并分发请求到对应的控制层组件
通过@RequestMapping注解
标识控制器方法,告诉前端控制器其可以处理什么样的请求路径(不带项目名,服务器解析时会自动添加)
- 一般请求的映射路径名称和处理请求的方法名称最好一致(实质上方法名称任意)
/
表示当前web工程的上下文路径(默认可以省略),即tomcat服务器会将/
解析为localhost:8080/SpringMvc/
- 控制器方法的返回值是个字符串表示页面的逻辑地址, 视图解析器会自动拼串得到页面的物理地址并解析页面中的语法,解析完后在服务器中转发到该页面
<!DOCTYPE html>
<!--引入thymeleaf的命名空间,使用thymeleaf标签-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>Hello SpringMvc</h1>
</body>
</html>
@Controller
public class HelloController {
// 处理http://localhost:8080/SpringMvc/请求
@RequestMapping("/")
public String index() {
// 返回逻辑视图名称,对应页面的物理地址为/WEB-INF/templates/index.html
return "index";
}
}
MVC的执行流程
客户端点击超链接发送请求服务器处理请求的具体过程
- 若请求地址符合前端控制器的url-pattern(除*.jsp外的所有请求),该请求就会被前端控制器DispatcherServlet处理
- 前端控制器解析SpringMvc的核心配置文件,扫描控制层组件找到所有的控制器,将请求地址和这些控制器中@RequestMapping注解的value属性值进行匹配
- 若匹配成功说明该注解所标识的控制器方法就是处理该请求的方法, 然后利用反射机制执行目标方法得到一个字符串类型的逻辑视图名称
- 视图解析器Thymeleaf拿到逻辑视图名称加上前缀和后缀组成完整的物理视图, 得到html页面地址后解析页面中的语法并在服务器当中转发到视图对应的页面
.