le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
SpringMVC è un framework open source Java e un modulo indipendente nell'ecosistema Spring Framework. Implementa il framework Web leggero basato sulle richieste del modello di progettazione Web MVC (dati, business e presentazione) basato su Spring. Fornisce uno sviluppo quotidiano semplificato convenienza.
Controller frontale DispatcherServlet
Responsabile della ricezione delle richieste e della distribuzione delle richieste
Processore del gestore
Il responsabile del trattamento comprende intercettatori, metodi del responsabile del trattamento, ecc. ed è principalmente responsabile dell'elaborazione delle richieste.
Mappatore del processore HandlerMapping
Analizza i file di configurazione, scansiona le annotazioni e abbina le richieste ai processori
Adattatore del gestore HandlerAdpter
Trova un processore corrispondente in base alla richiesta Questo processo è chiamato adattamento
ViewResolver risolutore di viste
Il risultato ottenuto dopo l'esecuzione del processore può essere una vista, ma questa vista è una vista logica (c'è codice logico nella pagina, come cicli e giudizi) e deve essere elaborata utilizzando un risolutore di viste. Questo processo è chiamato rendering della vista.
<!--低版本-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--配置Servlet初始化参数-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--前置控制器要接收所有的请求,因此在容器启动的时候就应该完成初始化-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--视图解析器:在控制器返回视图的时候生效-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图资源的前缀-->
<property name="prefix" value="/" />
<!--视图资源的后缀-->
<property name="suffix" value=".jsp" />
</bean>
<!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
public class UserController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//这里使用配置的视图解析器进行解析 user => / + user + .jsp => /user.jsp
return new ModelAndView("user");
}
}
<!--通过id值匹配请求的URL-->
<bean id="/view" class="com.qf.spring.mvc.controller.UserController" />
Pensiero: secondo questo metodo di corrispondenza delle richieste, ogni richiesta richiede che vi corrisponda un controller. Ciò equivale a utilizzare lo sviluppo di servlet. Verrà scritto un numero elevato di controller, con conseguente efficienza di sviluppo estremamente bassa.
Spring 提供了方法名来匹配请求来解决这个问题
Spring fornisce InternalPathMethodNameResolver, un risolutore per i nomi dei metodi nel controller. La funzione di questo risolutore è utilizzare il nome del metodo come base per la corrispondenza delle richieste URL e associarlo al controller.
Spring fornisce la classe controller MultiActionController che altre classi controller possono ereditare. Nelle sue sottoclassi, gli sviluppatori possono scrivere più metodi per elaborare le richieste e quindi utilizzare il parser del nome del metodo per corrispondere alla richiesta.
public class UserMultiController extends MultiActionController {
//这个方法就匹配 /login 请求
//请求格式必须是
//ModelAndView 方法名(HttpServletRequest req, HttpServletResponse resp){}
public ModelAndView login(HttpServletRequest req, HttpServletResponse resp){
return new ModelAndView("login");
}
//这个方法就匹配 /register 请求
public ModelAndView register(HttpServletRequest req, HttpServletResponse resp){
return new ModelAndView("register");
}
}
<!--方法名解析器-->
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />
<!-- /login 请求使用该bean对象处理-->
<bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">
<property name="methodNameResolver" ref="methodNameResolver" />
</bean>
<!-- /register 请求使用该bean对象处理-->
<bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">
<property name="methodNameResolver" ref="methodNameResolver" />
</bean>
Riflessione: secondo questo metodo di corrispondenza delle richieste, se un controller deve gestire più richieste, ciò porterà al problema di una grande quantità di informazioni di configurazione, che sarà difficile da mantenere in seguito. Come risolverlo?
Spring 提供了 SimpleUrlHandlerMapping 映射器, 该映射器支持一个控制器与多个请求匹配的同时也解决了配置信息繁多的问题。
Per utilizzare SimpleUrlHandlerMapping è sufficiente modificare la configurazione spring-mvc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--视图解析器:在控制器返回视图的时候生效-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图资源的前缀-->
<property name="prefix" value="/" />
<!--视图资源的后缀-->
<property name="suffix" value=".jsp" />
</bean>
<!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配-->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
<!--通过id值匹配请求的URL-->
<!-- <bean id="/view" class="com.qf.spring.mvc.controller.UserController" />-->
<!--方法名解析器-->
<!-- <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />-->
<!-- /login 请求使用该bean对象处理-->
<!-- <bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!-- <property name="methodNameResolver" ref="methodNameResolver" />-->
<!-- </bean>-->
<!-- /register 请求使用该bean对象处理-->
<!-- <bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!-- <property name="methodNameResolver" ref="methodNameResolver" />-->
<!-- </bean>-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/view">userController</prop>
<prop key="/user/*">userMultiController</prop>
</props>
</property>
</bean>
<bean id="userController" class="com.qf.spring.mvc.controller.UserController" />
<bean id="userMultiController" class="com.qf.spring.mvc.controller.UserMultiController" />
</beans>
Pensiero: man mano che lo sviluppo del progetto avanza, vengono sviluppate sempre più funzioni aziendali, aumenterà anche il numero di controllori e anche il numero di richieste corrispondenti. Ciò causerà anche problemi difficili da mantenere nel periodo successivo. Come per risolverlo?
Spring 提供了 DefaultAnnotationHandlerMapping 映射器,支持使用注解来匹配请求,这样就解决了请求匹配导致配置信息繁多的问题,同时还提升了开发效率。
@Controller
public class UserAnnotationController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(){
return "login";
}
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String register(){
return "register";
}
}
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--视图解析器:在控制器返回视图的时候生效-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图资源的前缀-->
<property name="prefix" value="/" />
<!--视图资源的后缀-->
<property name="suffix" value=".jsp" />
</bean>
<!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配-->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
<!--通过id值匹配请求的URL-->
<!-- <bean id="/view" class="com.qf.spring.mvc.controller.UserController" />-->
<!--方法名解析器-->
<!-- <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />-->
<!-- /login 请求使用该bean对象处理-->
<!-- <bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!-- <property name="methodNameResolver" ref="methodNameResolver" />-->
<!-- </bean>-->
<!-- /register 请求使用该bean对象处理-->
<!-- <bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">-->
<!-- <property name="methodNameResolver" ref="methodNameResolver" />-->
<!-- </bean>-->
<!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/view">userController</prop>
<prop key="/login">userMultiController</prop>
<prop key="/register">userMultiController</prop>
</props>
</property>
</bean>
<bean id="userController" class="com.qf.spring.mvc.controller.UserController" />
<bean id="userMultiController" class="com.qf.spring.mvc.controller.UserMultiController" />-->
<!--类上的注解处理器-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!--方法上的注解处理器-->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!--扫描包,使得该包下类以及类中定义的方法上所使用的注解生效-->
<context:component-scan base-package="com.qf.spring.mvc.controller" />
</beans>
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--视图解析器:在控制器返回视图的时候生效-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图资源的前缀-->
<property name="prefix" value="/" />
<!--视图资源的后缀-->
<property name="suffix" value=".jsp" />
</bean>
<!--较新的版本使用该标签开启注解支持-->
<mvc:annotation-driven />
<!--扫描包,使得该包下类以及类中定义的方法上所使用的注解生效-->
<context:component-scan base-package="com.qf.spring.mvc.controller" />
</beans>
Questa annotazione è l'identificatore di un controller
@Controller
public class UserController{
}
Questa annotazione viene utilizzata per abbinare le richieste
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value="/login", method=RequestMethod.POST)
public int login(){
return 1;
}
}
Questa annotazione può essere applicata solo ai parametri del metodo e viene utilizzata per ottenere dati dal corpo della richiesta e inserirli nei parametri.
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value="/login", method=RequestMethod.POST)
public int login(@RequestBody User user){
return 1;
}
}
Questa annotazione viene utilizzata per passare i dati alla pagina
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value="/login", method=RequestMethod.POST)
@ResponseBody
public int login(@RequestBody User user){
return 1;
}
}
Questa annotazione può essere applicata solo ai parametri del metodo e viene utilizzata per ottenere dati dall'intestazione della richiesta e inserirli nei parametri.
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping(value="/search", method=RequestMethod.GET)
@ResponseBody
public List<User> searchUsers(@RequestParam(value="name") String name){
return new ArrayList<>();
}
}
Questa annotazione può essere applicata solo ai parametri del metodo e viene utilizzata per ottenere dati dal percorso della richiesta e inserirli nei parametri.
@Controller
@RequestMapping("/user")
public class UserController{
// /user/admin
@RequestMapping(value="/{username}", method=RequestMethod.GET)
@ResponseBody
public User queryUser(@PathVariable("username") String username){
return new User();
}
}
Questa annotazione può essere utilizzata solo sulle definizioni di classe e viene utilizzata per inserire input nella sessione.
@SessionAttributes(types=User.class) //会将model中所有类型为 User的属性添加到会话中。
@SessionAttributes(value={“user1”, “user2”}) //会将model中属性名为user1和user2的属性添加到会话中。
@SessionAttributes(types={User.class, Dept.class}) //会将model中所有类型为 User和Dept的属性添加到会话中。
@SessionAttributes(value={“user1”,“user2”},types={Dept.class}) //会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。
Questa annotazione può essere applicata solo ai parametri del metodo e viene utilizzata per ottenere dati dalle intestazioni della richiesta.
@RequestMapping("/find")
public void findUsers(@RequestHeader("Content-Type") String contentType) {//从请求头中获取Content-Type的值
}
Questa annotazione può essere applicata solo ai parametri del metodo e viene utilizzata per ottenere il valore del cookie dalla richiesta.
@RequestMapping("/find")
public void findUsers(@CookieValue("JSESSIONID") String jsessionId) {//从请cookie中获取jsessionId的值
}
Questa annotazione può essere applicata solo alle classi, indicando che questa classe è il controller che gestisce le eccezioni.
/**
* 异常处理的控制器
*/
@ControllerAdvice //这个注解就是spring mvc提供出来做全局异常统一处理的
public class ExceptionController {
}
Questa annotazione può essere applicata solo ai metodi delle classi identificate da @ControllerAdvice o @RestControllerAdvice per gestire le eccezioni.
/**
* 异常处理的控制器
*/
@ControllerAdvice //这个注解就是spring mvc提供出来做全局异常统一处理的
public class ExceptionController {
@ExceptionHandler //异常处理器
@ResponseBody //响应至页面
public String handleException(Exception e){
return e.getMessage();
}
}
JSR sta per Java Specifica Requests, che rappresenta le proposte di specifiche Java. JSR-303 è un framework standard fornito da Java per la verifica della validità dei dati Java Bean. Definisce una serie di annotazioni di verifica che possono essere annotate sulle variabili membro e sui metodi degli attributi. Hibernate Validator fornisce un'implementazione di questo standard.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.1.Final</version>
<!-- 最新7.0.1.Final -->
</dependency>
annotazione | spiegare | annotazione | spiegare |
---|---|---|---|
@Nullo | deve essere nullo | @Non nullo | non può essere nullo |
@AssertTrue | deve essere vero | @AssertFalse | deve essere falso |
@Minimo | Deve essere un numero il cui valore è maggiore o uguale al valore minimo specificato | @Massimo | Deve essere un numero il cui valore è inferiore o uguale al valore massimo specificato |
@DecimaleMin | Deve essere un numero il cui valore è maggiore o uguale al valore minimo specificato | @DecimalMax | Deve essere un numero il cui valore è inferiore o uguale al valore massimo specificato |
@Misurare | lunghezza del set | @Cifre | Deve essere un numero e il relativo valore deve essere compreso in un intervallo accettabile |
@Passato | Deve essere una data nel passato | @Futuro | Deve essere una data futura |
@Modello | Deve corrispondere all'espressione regolare | Deve essere in formato email | |
@Lunghezza(min=,max=) | La dimensione della stringa deve essere compresa nell'intervallo specificato | @Non vuoto | Non può essere nullo, la lunghezza è maggiore di 0 |
@Range(min=,max=,messaggio=) | Gli elementi devono rientrare nell'ambito appropriato | @Non Vuoto | Non può essere nullo, la lunghezza della stringa è maggiore di 0 (limitata alle stringhe) |
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- web.xml -->
<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:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<?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:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />
<mvc:annotation-driven>
<mvc:message-converters>
<!--处理字符串的消息转换器-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<!--处理JSON格式的消息转换器-->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<context:component-scan base-package="com.qf.spring.controller" />
</beans>
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotNull;
public class User {
@NotNull(message = "账号不能为空")
@Length(min = 8, max = 15, message = "账号长度必须为8~15位")
private String username;
@NotNull(message = "密码不能为空")
@Length(min = 8, max = 20, message = "密码长度必须为8~20位")
private String password;
@Range(min = 0, max = 120, message = "年龄只能在0~120岁之间")
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.Valid;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/add")
@ResponseBody
public Object saveUser(@Valid User user, BindingResult result){
if(result.hasErrors()) return result.getAllErrors();
return 1;
}
}
Il nome completo di REST è Trasferimento rappresentativo dello Stato,esprimere Trasferimento dello stato rappresentativo。
RESTFUL ha le seguenti caratteristiche:
/user GET => 获取用户资源
/user POST => 增加用户资源
/user PUT => 修改用户资源
/user DELETE => 删除用户资源
/user/{username} GET => 获取指定用户资源 这是RESTFUL风格中子资源的表述方式
Questa annotazione può essere applicata solo alle classi ed equivale alla combinazione delle annotazioni @Controller e @ResponseBody.Indica che i risultati restituiti dopo l'esecuzione di tutti i metodi in questa classe vengono visualizzati direttamente nella pagina.
Le risorse statiche includono html, js, css, immagini, file di caratteri, ecc. I file statici non hanno un modello URL, quindi non sono accessibili per impostazione predefinita. Il motivo per cui è possibile accedervi è perché esiste un servlet globale in Tomcat: org.apache.catalina.servlets.DefaultServlet Il suo modello URL è "/", quindi le richieste di risorse statiche che non possono essere soddisfatte nel progetto sono tutte gestito da questo servlet trattare. Ma in SpringMVC, DispatcherServlet utilizza anche "/" come modello URL, quindi il Serlvet globale non verrà più utilizzato nel progetto, il che si traduce nell'impossibilità di accedere alle risorse statiche.
Basta cambiare il modello URL corrispondente a DispathcerServlet in un modello corrispondente diverso da "/". Ad esempio *.do, *.action. Dopo questa modifica, quando si invia una richiesta, l'URL della richiesta deve corrispondere a .do o .action.
<!-- web.xml -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
<!-- spring-mvc.xml -->
<!--
这个handler就是处理静态资源的,它的处理方式就是将请求转会到tomcat中名为default的Servlet
-->
<mvc:default-servlet-handler/>
<!-- mapping是访问路径,location是静态资源存放的路径 -->
<mvc:resources mapping="/static/**" location="/static/" />
<?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">
<display-name>Archetype Created Web Application</display-name>
<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:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</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>
<init-param>
<!--强制编码-->
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
checkMultipart(request); //检测是否是多部分请求,这个只可能在文件上传的时候为真
getHandler(processedRequest); //获取处理器 => 遍历HandlerMapping,找到匹配当前请求的执行器链
//没有找到执行器链 就直接向页面报一个404
noHandlerFound(processedRequest, response);
//找到处理当前请求的适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//控制器之前执行的拦截器将先执行,如果拦截器不通过,则方法直接结束
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
//控制器处理请求,可能会得到一个ModelAndView
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//控制器之后的拦截器执行
mappedHandler.applyPostHandle(processedRequest, response, mv);
//处理分发的结果:这个结果就是控制器处理后的结果
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
//拦截器在控制器给出的结果DispatcherServlet处理后执行
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);