SpringMVC概念与实现过程
注:spring-boot和spring-MVC的区别,spring-boot基于spring-MVC的基础上简化了配置过程(个人理解)
注:映射解释,可以参考java的map数据结构,或者比如python的dict(字典)类型,根据key找到对应的value
DispatcherServlet:springMVC的核心调度器,主要作用是用来分发的
Handler-Mapping:映射处理器,根据url映射到具体的controller类
Handler-Adapter:适配处理器
Handler:处理器(需要由工程师开发)
ViewResolver:视图解析器
ModelandView:分为两个部分,一个是视图,一个是model,model是一个mapping类型的集合,该mapping集合封装了controller返回的处理结果
1、用户使用浏览器向服务端发送一个请求,最先进入到web.xml的servlet-mapping中配置的url-pattern,拦截到请求之后会将请求传到web.xml的servlet中的servlet-class中的org.springframework.web.servlet.DispatcherServlet。
总结:这个步骤是将请求发送到springMVC的DispatcherServlet核心调度器。
2、DispatcherServlet将用户的请求转发给Handler-Mapping的映射处理器中,由该处理器决定由哪个controller类来处理该请求,确定好controller类之后将该类返回给DispatcherServlet核心调度器中。
总结:这个步骤是将用户请求找到对应映射的controller类,然后将该类返回给DispatcherServlet,由Handler-Mapping执行该映射过程。
3、DispatcherServlet将controller类转发给Handler-Adapter适配处理器中,由该处理器决定映射到这个controller类中的哪个方法。
总结:这个步骤是使用controller类找到对应映射的处理方法。
4、Handler-Adapter将映射得到的方法交给对应的controller的类方法去执行该请求,最后封装返回一个ModelandView类给Handler-Adapter,Handler-Adapter适配处理器再将ModelandView类返回给DispatcherServlet核心调度器里。
总结:这个步骤是执行对应的方法,并且将处理结果返回给DispatcherServlet,由Handler-Adapter处理该映射并处理的过程。
5、DispatcherServlet将ModelandView中的viewName传给spring-mvc.xml的bean中配置的org.springframework.web.servlet.view.InternalResourceViewResolver,ViewResolver视图解析器将配置的前缀和后缀拼接成绝对路径,最后返还给DispatcherServlet。
总结:这个步骤是将ModelandView中的viewName传给ViewResolver视图解析器,视图解析器将viewName拼接前缀和后缀成一个完整的字符串,找到绝对路径,最后返回给DispatcherServlet。
6、DispatcherServlet拿到根据视图解析器返回的绝对路径,通过这个绝对路径找到这个视图的资源文件,最后再将Model中的数据注入到视图当中,形成一个物理页面,最后返回给用户。
总结:这个步骤是找到视图,然后将model的数据注入到视图中并返回给用户。
SpringMVC配置
1、添加依赖(pom.xml)
javaEE
<properties>
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
<jsp-api.version>2.2</jsp-api.version>
</properties>
<!-- javaEE -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
Spring IOC 容器来负责对象的生命周期和对象之间的关系
<!-- 变量 -->
<properties>
<spring-core.version>4.3.16.RELEASE</spring-core.version>
</properties>
<!-- spring-ioc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring-core.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring-core.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-core.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring-core.version}</version>
</dependency>
spring-aop
面向切面编程:spring-aop就是一个拦截器,springaop通过代理模式实现方法的拦截
<!-- 变量 -->
<properties>
<spring-core.version>4.3.16.RELEASE</spring-core.version>
</properties>
<!-- spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-core.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-core.version}</version>
</dependency>
spring-webmvc
<!-- 变量 -->
<properties>
<spring-core.version>4.3.16.RELEASE</spring-core.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-core.version}</version>
</dependency>
<!-- 添加webmvc就可以不用添加web,webmvc依赖于web,所以上面可以不用添加导入 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-core.version}</version>
</dependency>
注:spring-webmvc 是 Spring-web 的一个实现。spriing-webmvc 依赖于 spring-web,根据maven的依赖管理机制,只需要导入spring-webmvc就会间接地添加 spring-web。
2、配置核心控制器DispatcherServlet,并制定核心配置文件路径(xxx-servlet.xml)
<?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_3_1.xsd"
version="3.1">
<!-- 1、配置DispatcherServlet核心控制器 -->
<servlet>
<!-- 指定核心控制器 -->
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- (1)、核心配置文件默认WEB-INF下并命名必须为'XXX'-servlet.xml -->
<!-- (2)、自定义指定配置文件init-param -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring*.xml</param-value>
</init-param>
<!-- 设置DispatcherServlet在web应用启动的时候执行 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截请求配置 -->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 过滤器,怕有乱码 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3、配置xxx-servlet.xml文件(推荐第一种配置方式)
1、配置Handler-Mapping(映射处理器)
根据controller的实现方式不同,配置方式也有所不同
1、实现接口方式
2、基于注解实现方式
注:本文基于注解的方式实现,实现接口方式比较麻烦,推荐使用注解方式
2、配置Handler-Adapter(适配处理器)
3、Handler(处理器)
4、配置ViewResolver(视图解析器)and 配置View
配置方式1(推荐)
<!--
mvc注解驱动,用来简化配置,自动创建Handler-Mapping,Handler-Adapter,等同于下面两个
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
-->
<mvc:annotation-driven/>
<!-- 4.配置Handler,扫包路径(需要根据项目情况进行配置) -->
<context:component-scan base-package="com.itany.backend.controller"/>
<!-- 5.配置ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 指定前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
<!-- 指定后缀 -->
<property name="suffix" value=".jsp"/>
<!-- 6.配置View,如果使用的是jsp的视图技术,可以省略不写 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
配置方式2
<!-- 2.配置HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 3.配置HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- 4.配置Handler,扫包路径(需要根据项目情况进行配置) -->
<context:component-scan base-package="com.itany.backend.controller"/>
<!-- 5.配置ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 指定前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
<!-- 指定后缀 -->
<property name="suffix" value=".jsp"/>
<!-- 6.配置View,如果使用的是jsp的视图技术,可以省略不写 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
5、静态资源处理
两种处理方式:
1、使用tomcat提供的默认的servlet来处理静态资源
2、自定义访问静态资源路径(推荐)
<!-- tomcat默认的servlet来处理静态资源 -->
<mvc:default-servlet-handler/>
<!-- 自定义静态资源配置 -->
<mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>
<mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
<mvc:resources mapping="/images/**" location="/WEB-INF/images/"/>
<mvc:resources mapping="/fonts/**" location="/WEB-INF/fonts/"/>
<mvc:resources mapping="/iconfont/**" location="/WEB-INF/iconfont/"/>
6、直接访问的url页面配置
<!-- 直接访问jsp页面,path为访问的url,view-name为访问的视图名 -->
<mvc:view-controller path="/showLogin" view-name="login"/>
controller详解
SpringMVC常用注解
注解 | 解释 |
---|---|
@Controller | 将此类映射为Controller,添加到IOC容器里面 |
@RestController | 将此类映射为Controller层,默认所有方法添加@ResponseBody注解 |
@RequestMapping | 配置请求映射路径,即URL |
@GetMapping | @RequestMapping上指定Get请求方式,4.3之前版本不存在该注解 |
@PostMapping | @RequestMapping上指定Post请求方式,4.3之前版本不存在该注解 |
@RequestParam | 表示参数来源于请求参数 |
@PathVariable | 表示参数来源于URL |
@RequestHeader | 表示参数来源于请求头 |
@CookieValue | 表示参数来源于cookie |
@RequestBody | 表示参数的值来源于请求体 |
@ResponseBody | 一般结合返回object方法使用,返回Json数据 |
@ModelAttribute | 将请求数据转化为对象 |
@Valid | 后台校验 |
@InitBinder | 类型转换,注册属性编辑器 |
@ControllerAdvice | 统一异常处理,处理全局异常 |
@ExceptionHandler | 异常处理器,处理特定异常的方法 |
@ModelAttribute注解有两种用法:
1、在方法参数前加该注解
作用:将请求参数转换为对象
2、在方法上加该注解
作用:在调用所有目标方法前都会调用加了@ModelAttribute注解的方法,并向模型中添加数据,实际上添加了该注解,就会将这个方法return的对象数据添加到其他@RequestMapping作用域里面
限定请求参数
参数 | 解释 |
---|---|
params | 限定请求参数,必须符合条件 |
handers | 限定请求的头部信息,必须符合指定条件 |
返回值
偷懒,拿的百度的图
还有一种常用的返回Object:表示返回的是数据模型(一般返回的是Json)