SpringMVC
一、SpringMVC框架概述
首先SpringMVC是一个MVC构架模式的web框架,是基于Servlet的。传统web框架,指的是SpringMVC依然使用多线程同步并发的方式来处理请求。
二、SpringMVC在系统中的位置
可以看出:SpringMVC并没有代替Servlet,他只是在Servlet上提供了一套封装好的组件,提高开发效率;还是得开发出的项目更加规范。
三、SpringMVC核心组件
如果没有SpringMVC框架,我们想要实现一个web项目,会出现大量Servlet,因为一个请求地址就需要一个Servlet,使得项目体积变大,且Servlet的生命周期,使得Servlet长期存在;
第一步,我们希望用一个Servlet来处理多个请求甚至是所有请求,就需要事先能根据请求路径查找出来请求方法的逻辑,这也是SpringMVC要做的第一件事:
-
DispatcherServlet:前端控制器
用户请求首先到达前端控制器,他就相当于mvc模式中的controller,DispatcherServlet是整个流程控制的调度中心,由它调用其他组件处理用户的请求。 -
Handler:处理器
Handler是继DispatcherServlet前端控制器的后端控制器,DispatcherServlet会将请求发送至对应的Handler来处理。Handler是处理业务逻辑的地方,需要我们自己来编写具体代码。 -
HandlerMapping:处理器映射器
HandlerMapping负责根据用户的请求路径找到Handler,SpringMVC提供了不同的映射器实现不同的映射方式。例如:BeanName映射,配置文件映射,注解映射等。 -
HandlerAdapter:处理器适配器
通过HandlerAdapter来执行Handler,因为Handler有不同形式,意味着调用方式是不同的,这是适配器模式的应用,我们也可以扩展适配器来实现新的Handler。
如果前后不分离,还要返回jsp页面等 -
ViewResolver:视图解析器
ViewResolver负责从Handler中获取数据和视图,根据逻辑视名称查找物理视图文件,并查找View对象,再生成View对象 -
View:视图
View的职责就是装配数据,SpringMVC框架提供了很多的View视图类型的支持,包括jstlView、freemarkerView、pdfView等。常用的视图就是jsp。我们需要根据业务需求,通过页面标签或页面模板技术将模型数据展示给用户。 -
其他组件:
类型 | 说明 |
---|---|
HandlerExceptionResolver | Handler异常处理器 |
LocaleResolver | 提供国际化的视图。根据不同地区显示不同内容 |
ThemeResolver | 根据不同地区提供个性化的布局 |
MultipartResolver | 解析multipart请求数据,如浏览器表单文件上传 |
FlashMapManager | 常用于通过重定向将属性从一个请求传递到另一个请求 |
请求处理流程简述
总的来说就是:
前端发送请求给Servlet,Servlet要通过HandlerMapping找能处理的Handler,但是HandlerMapping又不知道通过什么方式调用Handler,就去找HandlerAdapter找处理方式,最后处理Handler。经过Handler处理后返回数据或页面给DispatcherServlet,DispatcherServlet去找视图解析器,来解析视图产生结果,再返回给客户端。
四、简单demo
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
SpringMVC最小依赖包。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>hljsWeb</display-name>
<servlet>
<!-- 给Servlet起别名 -->
<servlet-name>dispatcherServlet</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>
</servlet>
<servlet-mapping>
<!-- 给TestServlet类添加URL映射 -->
<servlet-name>dispatcherServlet</servlet-name>
<!--
/ 除了.jsp结尾以外的所有请求
/* 所有请求 不常用(如果有.jsp结尾的请求也会进入DispatcherServlet)
*.action 所有以.action结尾的请求
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
springmvc.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.ttc.controller" />
</beans>
Controller.java
@Controller
public class UserController {
@RequestMapping("/a.action")
public ModelAndView getMsg() {
ModelAndView mav = new ModelAndView();
mav.addObject("msg", "Hello World");
mav.setViewName("index.jsp");
return mav;
}
}
jsp
<html>
<body>
${msg}
</body>
</html>
五、配置
SpringMVC默认配置
DispatcherServlet.properties
// 本地化相关
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
// 本地化相关
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
// 默认匹配方式
org.springframework.web.servlet.HandlerMapping=
// 继承Controller后,注册Bean,根据BeanName匹配URL
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
// 使用注解时的映射器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
org.springframework.web.servlet.function.support.RouterFunctionMapping
// 默认调用Handler的处理方式
org.springframework.web.servlet.HandlerAdapter=
// 实现HttpRequestHandler时候使用的处理方法
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
// 实现Controller时候使用的处理方法
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
// 方法注解的时候使用的处理方法
org.springframework