Spring MVC详解

2023-11-01

第一节 Spring MVC 简介

1. Spring MVC

SpringMVC是一个Java 开源框架, 是Spring Framework生态中的一个独立模块,它基于 Spring 实现了Web MVC(数据、业务与展现)设计模式的请求驱动类型的轻量级Web框架,为简化日常开发,提供了很大便利。

2. Spring MVC 核心组件

  • DispatcherServlet 前置控制器

    负责接收请求、分发请求

  • Handler 处理器

    处理器包括了拦截器、控制器中的方法等,主要负责处理请求

  • HandlerMapping 处理器映射器

    解析配置文件、扫描注解,将请求与处理器进行匹配

  • HandlerAdpter 处理器适配器

    根据请求来找到匹配的处理器,这个过程称为适配

  • ViewResolver 视图解析器

    处理器执行后得到的结果可能是一个视图,但这个视图属于逻辑视图(页面中存在逻辑代码,比如循环、判断),需要使用视图解器行处理,这个过程称为渲染视图

第二节 Spring MVC 发展演变

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--低版本--></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-context<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.3.9.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-webmvc<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.3.9.RELEASE<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>javax.servlet<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>javax.servlet-api<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.0.1<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>provided<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

1. Bean的名字或ID匹配URL请求

1.1 web.xml 配置

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>dispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>org.springframework.web.servlet.DispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!--配置Servlet初始化参数--></span>
        <span style="color:#117700"><</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>contextConfigLocation<span style="color:#117700"></</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>classpath:spring-mvc.xml<span style="color:#117700"></</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--前置控制器要接收所有的请求,因此在容器启动的时候就应该完成初始化--></span>
    <span style="color:#117700"><</span><span style="color:#117700">load-on-startup</span><span style="color:#117700">></span>1<span style="color:#117700"></</span><span style="color:#117700">load-on-startup</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>dispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>/<span style="color:#117700"></</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span></span></span>

1.2 spring-mvc.xml 配置

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--视图解析器:在控制器返回视图的时候生效--></span>
<span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--视图资源的前缀--></span>
    <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"prefix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"/"</span> <span style="color:#117700">/></span>
    <span style="color:#aa5500"><!--视图资源的后缀--></span>
    <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"suffix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">".jsp"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配--></span>
<span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"</span><span style="color:#117700">/></span></span></span>

1.3 编写控制器

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span> <span style="color:#770088">extends</span> <span style="color:#000000">AbstractController</span> {
​
    <span style="color:#555555">@Override</span>
    <span style="color:#770088">protected</span> <span style="color:#000000">ModelAndView</span> <span style="color:#000000">handleRequestInternal</span>(<span style="color:#000000">HttpServletRequest</span> <span style="color:#000000">req</span>, <span style="color:#000000">HttpServletResponse</span> <span style="color:#000000">resp</span>) <span style="color:#770088">throws</span> <span style="color:#000000">Exception</span> {
        <span style="color:#aa5500">//这里使用配置的视图解析器进行解析  user => / + user + .jsp => /user.jsp</span>
        <span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">ModelAndView</span>(<span style="color:#aa1111">"user"</span>);
    }
}</span></span>

1.4 配置控制器

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!--通过id值匹配请求的URL--></span>
<span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"/view"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller.UserController"</span> <span style="color:#117700">/></span></span></span>

思考:按照这种匹配请求的方式,每一个请求需要一个控制器与之对应,这与使用Servlet开发一样,会编写大量的控制器,导致开发效率极为低下,如何解决?

<span style="background-color:#f8f8f8"><span style="color:#333333">Spring 提供了方法名来匹配请求来解决这个问题</span></span>

2. Bean的方法名匹配请求

2.1 方法名解析器

Spring 提供了控制器内的方法名的解析器 InternalPathMethodNameResolver,该解析器作用就是将方法名作为匹配URL请求的依据,与控制器关联起来

2.2 多操作控制器

Spring 提供了 MultiActionController 控制器类,供其他控制器类继承,在其子类中,开发者可以编写多个处理请求的方法,然后使用方法名解析器去匹配请求

2.3 编写控制器

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserMultiController</span> <span style="color:#770088">extends</span> <span style="color:#000000">MultiActionController</span> {
    <span style="color:#aa5500">//这个方法就匹配 /login 请求</span>
    <span style="color:#aa5500">//请求格式必须是 </span>
    <span style="color:#aa5500">//ModelAndView 方法名(HttpServletRequest req, HttpServletResponse resp){}</span>
    <span style="color:#770088">public</span> <span style="color:#000000">ModelAndView</span> <span style="color:#000000">login</span>(<span style="color:#000000">HttpServletRequest</span> <span style="color:#000000">req</span>, <span style="color:#000000">HttpServletResponse</span> <span style="color:#000000">resp</span>){
        <span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">ModelAndView</span>(<span style="color:#aa1111">"login"</span>);
    }
​
    <span style="color:#aa5500">//这个方法就匹配 /register 请求</span>
    <span style="color:#770088">public</span> <span style="color:#000000">ModelAndView</span> <span style="color:#000000">register</span>(<span style="color:#000000">HttpServletRequest</span> <span style="color:#000000">req</span>, <span style="color:#000000">HttpServletResponse</span> <span style="color:#000000">resp</span>){
        <span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">ModelAndView</span>(<span style="color:#aa1111">"register"</span>);
    }
}</span></span>

2.4 spring-mvc.xml 配置

<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#aa5500"><!--方法名解析器--></span>
<span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"methodNameResolver"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"</span> <span style="color:#117700">/></span>
<span style="color:#aa5500"><!-- /login 请求使用该bean对象处理--></span>
<span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"/login"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller.UserMultiController"</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"methodNameResolver"</span> <span style="color:#0000cc">ref</span>=<span style="color:#aa1111">"methodNameResolver"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
<span style="color:#aa5500"><!-- /register 请求使用该bean对象处理--></span>
<span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"/register"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller.UserMultiController"</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"methodNameResolver"</span> <span style="color:#0000cc">ref</span>=<span style="color:#aa1111">"methodNameResolver"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span></span></span>

思考:按照这种匹配请求的方式,如果一个控制器要处理多个请求,那么就会导致配置信息繁多的问题,后期难以维护,如何解决?

<span style="background-color:#f8f8f8"><span style="color:#333333">Spring 提供了 SimpleUrlHandlerMapping 映射器, 该映射器支持一个控制器与多个请求匹配的同时也解决了配置信息繁多的问题。</span></span>

3. 简单URL处理器映射

使用SimpleUrlHandlerMapping只需要修改 spring-mvc.xml 配置即可。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">beans</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans"</span>
       <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span>
       <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--视图解析器:在控制器返回视图的时候生效--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!--视图资源的前缀--></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"prefix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"/"</span> <span style="color:#117700">/></span>
        <span style="color:#aa5500"><!--视图资源的后缀--></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"suffix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">".jsp"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配--></span>
<span style="color:#aa5500"><!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>--></span>
    <span style="color:#aa5500"><!--通过id值匹配请求的URL--></span>
<span style="color:#aa5500"><!--    <bean id="/view" class="com.qf.spring.mvc.controller.UserController" />--></span>
    <span style="color:#aa5500"><!--方法名解析器--></span>
<span style="color:#aa5500"><!--    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />--></span>
    <span style="color:#aa5500"><!-- /login 请求使用该bean对象处理--></span>
<span style="color:#aa5500"><!--    <bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">--></span>
<span style="color:#aa5500"><!--        <property name="methodNameResolver" ref="methodNameResolver" />--></span>
<span style="color:#aa5500"><!--    </bean>--></span>
    <span style="color:#aa5500"><!-- /register 请求使用该bean对象处理--></span>
<span style="color:#aa5500"><!--    <bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">--></span>
<span style="color:#aa5500"><!--        <property name="methodNameResolver" ref="methodNameResolver" />--></span>
<span style="color:#aa5500"><!--    </bean>--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"mappings"</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">props</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">prop</span> <span style="color:#0000cc">key</span>=<span style="color:#aa1111">"/view"</span><span style="color:#117700">></span>userController<span style="color:#117700"></</span><span style="color:#117700">prop</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">prop</span> <span style="color:#0000cc">key</span>=<span style="color:#aa1111">"/user/*"</span><span style="color:#117700">></span>userMultiController<span style="color:#117700"></</span><span style="color:#117700">prop</span><span style="color:#117700">></span>
            <span style="color:#117700"></</span><span style="color:#117700">props</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">property</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"userController"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller.UserController"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"userMultiController"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller.UserMultiController"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">beans</span><span style="color:#117700">></span></span></span>

思考:随着项目开发的推进,开发的业务功能越来越多,控制器的数量也会伴随着增加,请求的匹配同时也会增加,同样会造成后期难以维护的问题,如何解决呢?

<span style="background-color:#f8f8f8"><span style="color:#333333">Spring 提供了 DefaultAnnotationHandlerMapping 映射器,支持使用注解来匹配请求,这样就解决了请求匹配导致配置信息繁多的问题,同时还提升了开发效率。</span></span>

4. 注解匹配请求

4.1 编写控制器

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserAnnotationController</span> {
​
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"/login"</span>, <span style="color:#000000">method</span> <span style="color:#981a1a">=</span> <span style="color:#000000">RequestMethod</span>.<span style="color:#000000">GET</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">login</span>(){
        <span style="color:#770088">return</span> <span style="color:#aa1111">"login"</span>;
    }
​
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"/register"</span>, <span style="color:#000000">method</span> <span style="color:#981a1a">=</span> <span style="color:#000000">RequestMethod</span>.<span style="color:#000000">GET</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">register</span>(){
        <span style="color:#770088">return</span> <span style="color:#aa1111">"register"</span>;
    }
}</span></span>

4.2 spring-mvc.xml 配置

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">beans</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans"</span>
       <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span>
       <span style="color:#0000cc">xmlns:context</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/context"</span>
       <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"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"</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--视图解析器:在控制器返回视图的时候生效--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!--视图资源的前缀--></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"prefix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"/"</span> <span style="color:#117700">/></span>
        <span style="color:#aa5500"><!--视图资源的后缀--></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"suffix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">".jsp"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
​
    <span style="color:#aa5500"><!--处理器映射的方式:使用bean的名字或者id的值来与请求匹配--></span>
<span style="color:#aa5500"><!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>--></span>
    <span style="color:#aa5500"><!--通过id值匹配请求的URL--></span>
<span style="color:#aa5500"><!--    <bean id="/view" class="com.qf.spring.mvc.controller.UserController" />--></span>
    <span style="color:#aa5500"><!--方法名解析器--></span>
<span style="color:#aa5500"><!--    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />--></span>
    <span style="color:#aa5500"><!-- /login 请求使用该bean对象处理--></span>
<span style="color:#aa5500"><!--    <bean id="/login" class="com.qf.spring.mvc.controller.UserMultiController">--></span>
<span style="color:#aa5500"><!--        <property name="methodNameResolver" ref="methodNameResolver" />--></span>
<span style="color:#aa5500"><!--    </bean>--></span>
    <span style="color:#aa5500"><!-- /register 请求使用该bean对象处理--></span>
<span style="color:#aa5500"><!--    <bean id="/register" class="com.qf.spring.mvc.controller.UserMultiController">--></span>
<span style="color:#aa5500"><!--        <property name="methodNameResolver" ref="methodNameResolver" />--></span>
<span style="color:#aa5500"><!--    </bean>--></span>
    <span style="color:#aa5500"><!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"></span>
        <span style="color:#aa5500"><property name="mappings"></span>
            <span style="color:#aa5500"><props></span>
                <span style="color:#aa5500"><prop key="/view">userController</prop></span>
                <span style="color:#aa5500"><prop key="/login">userMultiController</prop></span>
                <span style="color:#aa5500"><prop key="/register">userMultiController</prop></span>
            <span style="color:#aa5500"></props></span>
        <span style="color:#aa5500"></property></span>
    <span style="color:#aa5500"></bean></span>
    <span style="color:#aa5500"><bean id="userController" class="com.qf.spring.mvc.controller.UserController" /></span>
    <span style="color:#aa5500"><bean id="userMultiController" class="com.qf.spring.mvc.controller.UserMultiController" />--></span>
    <span style="color:#aa5500"><!--类上的注解处理器--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"</span> <span style="color:#117700">/></span>
    <span style="color:#aa5500"><!--方法上的注解处理器--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"</span> <span style="color:#117700">/></span>
    <span style="color:#aa5500"><!--扫描包,使得该包下类以及类中定义的方法上所使用的注解生效--></span>
    <span style="color:#117700"><</span><span style="color:#117700">context:component-scan</span> <span style="color:#0000cc">base-package</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">beans</span><span style="color:#117700">></span></span></span>

5. 较新的版本配置

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">beans</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans"</span>
       <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span>
       <span style="color:#0000cc">xmlns:context</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/context"</span>
       <span style="color:#0000cc">xmlns:mvc</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/mvc"</span>
       <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"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"</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--视图解析器:在控制器返回视图的时候生效--></span>
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span><span style="color:#117700">></span>
        <span style="color:#aa5500"><!--视图资源的前缀--></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"prefix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">"/"</span> <span style="color:#117700">/></span>
        <span style="color:#aa5500"><!--视图资源的后缀--></span>
        <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"suffix"</span> <span style="color:#0000cc">value</span>=<span style="color:#aa1111">".jsp"</span> <span style="color:#117700">/></span>
    <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--较新的版本使用该标签开启注解支持--></span>
    <span style="color:#117700"><</span><span style="color:#117700">mvc:annotation-driven</span> <span style="color:#117700">/></span>
    <span style="color:#aa5500"><!--扫描包,使得该包下类以及类中定义的方法上所使用的注解生效--></span>
    <span style="color:#117700"><</span><span style="color:#117700">context:component-scan</span> <span style="color:#0000cc">base-package</span>=<span style="color:#aa1111">"com.qf.spring.mvc.controller"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">beans</span><span style="color:#117700">></span></span></span>

第三节 Spring MVC 常用注解

1. @Controller

该注解是一个控制器的标识

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span>{
    
}</span></span>

2. @RequestMapping

该注解用于匹配请求

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/user"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span>{
    
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"/login"</span>, <span style="color:#000000">method</span><span style="color:#981a1a">=</span><span style="color:#000000">RequestMethod</span>.<span style="color:#000000">POST</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#000000">login</span>(){
        <span style="color:#770088">return</span> <span style="color:#116644">1</span>;
    }
}</span></span>

3. @RequestBody

该注解只能应用在方法的参数上,用于从请求体中获取数据并注入至参数中

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/user"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span>{
    
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"/login"</span>, <span style="color:#000000">method</span><span style="color:#981a1a">=</span><span style="color:#000000">RequestMethod</span>.<span style="color:#000000">POST</span>)
    <span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#000000">login</span>(<span style="color:#555555">@RequestBody</span> <span style="color:#000000">User</span> <span style="color:#000000">user</span>){
        <span style="color:#770088">return</span> <span style="color:#116644">1</span>;
    }
}</span></span>

4. @ResponseBody

该注解用于向页面传递数据

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/user"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span>{
    
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"/login"</span>, <span style="color:#000000">method</span><span style="color:#981a1a">=</span><span style="color:#000000">RequestMethod</span>.<span style="color:#000000">POST</span>)
    <span style="color:#555555">@ResponseBody</span>
    <span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#000000">login</span>(<span style="color:#555555">@RequestBody</span> <span style="color:#000000">User</span> <span style="color:#000000">user</span>){
        <span style="color:#770088">return</span> <span style="color:#116644">1</span>;
    }
}</span></span>

5. @RequestParam

该注解只能应用在方法的参数上,用于从请求头中获取数据并注入至参数中

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/user"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span>{
    
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"/search"</span>, <span style="color:#000000">method</span><span style="color:#981a1a">=</span><span style="color:#000000">RequestMethod</span>.<span style="color:#000000">GET</span>)
    <span style="color:#555555">@ResponseBody</span>
    <span style="color:#770088">public</span> <span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">User</span><span style="color:#981a1a">></span> <span style="color:#000000">searchUsers</span>(<span style="color:#555555">@RequestParam</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"name"</span>) <span style="color:#008855">String</span> <span style="color:#000000">name</span>){
        <span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">ArrayList</span><span style="color:#981a1a"><></span>();
    }
}</span></span>

6. @PathVariable

该注解只能应用在方法的参数上,用于从请求路径中获取数据并注入至参数中

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@Controller</span>
<span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/user"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span>{
    <span style="color:#aa5500">// /user/admin</span>
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"/{username}"</span>, <span style="color:#000000">method</span><span style="color:#981a1a">=</span><span style="color:#000000">RequestMethod</span>.<span style="color:#000000">GET</span>)
    <span style="color:#555555">@ResponseBody</span>
    <span style="color:#770088">public</span> <span style="color:#000000">User</span> <span style="color:#000000">queryUser</span>(<span style="color:#555555">@PathVariable</span>(<span style="color:#aa1111">"username"</span>) <span style="color:#008855">String</span> <span style="color:#000000">username</span>){
        <span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">User</span>();
    }
}</span></span>

7. @SessionAttributes[不重要]

该注解只能使用在类定义上,用于从将输入放入 session 中

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@SessionAttributes</span>(<span style="color:#000000">types</span><span style="color:#981a1a">=</span><span style="color:#000000">User</span>.<span style="color:#770088">class</span>) <span style="color:#aa5500">//会将model中所有类型为 User的属性添加到会话中。</span>
<span style="color:#555555">@SessionAttributes</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span>{<span style="color:#000000">“user1”</span>, <span style="color:#000000">“user2”</span>}) <span style="color:#aa5500">//会将model中属性名为user1和user2的属性添加到会话中。</span>
<span style="color:#555555">@SessionAttributes</span>(<span style="color:#000000">types</span><span style="color:#981a1a">=</span>{<span style="color:#000000">User</span>.<span style="color:#770088">class</span>, <span style="color:#000000">Dept</span>.<span style="color:#770088">class</span>}) <span style="color:#aa5500">//会将model中所有类型为 User和Dept的属性添加到会话中。</span>
<span style="color:#555555">@SessionAttributes</span>(<span style="color:#000000">value</span><span style="color:#981a1a">=</span>{<span style="color:#000000">“user1”</span>,<span style="color:#000000">“user2”</span>},<span style="color:#000000">types</span><span style="color:#981a1a">=</span>{<span style="color:#000000">Dept</span>.<span style="color:#770088">class</span>}) <span style="color:#aa5500">//会将model中属性名为user1和user2以及类型为Dept的属性添加到会话中。</span></span></span>

8. @RequestHeader

该注解只能应用在方法的参数上,用于从请求头中获取数据

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/find"</span>)  
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">findUsers</span>(<span style="color:#555555">@RequestHeader</span>(<span style="color:#aa1111">"Content-Type"</span>) <span style="color:#008855">String</span> <span style="color:#000000">contentType</span>) {<span style="color:#aa5500">//从请求头中获取Content-Type的值</span>
}  </span></span>

9. @CookieValue

该注解只能应用在方法的参数上,用于从请求中获取cookie的值

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/find"</span>)  
<span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#0000ff">findUsers</span>(<span style="color:#555555">@CookieValue</span>(<span style="color:#aa1111">"JSESSIONID"</span>) <span style="color:#008855">String</span> <span style="color:#000000">jsessionId</span>) {<span style="color:#aa5500">//从请cookie中获取jsessionId的值</span>
}  </span></span>

10. @ControllerAdvice

该注解只能应用在类上,表示这个类就是处理异常的控制器

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 异常处理的控制器</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@ControllerAdvice</span> <span style="color:#aa5500">//这个注解就是spring mvc提供出来做全局异常统一处理的</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionController</span> {
}</span></span>

11. @ExceptionHandler

该注解只能应用在@ControllerAdvice或者说@RestControllerAdvice标识的类的方法上,用来处理异常

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 异常处理的控制器</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@ControllerAdvice</span> <span style="color:#aa5500">//这个注解就是spring mvc提供出来做全局异常统一处理的</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ExceptionController</span> {
​
    <span style="color:#555555">@ExceptionHandler</span> <span style="color:#aa5500">//异常处理器</span>
    <span style="color:#555555">@ResponseBody</span> <span style="color:#aa5500">//响应至页面</span>
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">handleException</span>(<span style="color:#000000">Exception</span> <span style="color:#000000">e</span>){
        <span style="color:#770088">return</span> <span style="color:#000000">e</span>.<span style="color:#000000">getMessage</span>();
    }
}</span></span>

第四节 JSR-303

1. JSR-303 简介

JSR全称为 Java Specification Requests,表示 Java 规范提案。JSR-303是 Java 为 Java Bean 数据合法性校验提供的标准框架,它定义了一套可标注在成员变量,属性方法上的校验注解。Hibernate Validation提供了这套标准的实现。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.hibernate<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>hibernate-validator<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>6.0.1.Final<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
  <span style="color:#aa5500"><!-- 最新7.0.1.Final --></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>

2. 校验注解

注解 解释 注解 解释
@Null 必须为null @NotNull 不能为null
@AssertTrue 必须为true @AssertFalse 必须为false
@Min 必须为数字,其值大于或等于指定的最小值 @Max 必须为数字,其值小于或等于指定的最大值
@DecimalMin 必须为数字,其值大于或等于指定的最小值 @DecimalMax 必须为数字,其值小于或等于指定的最大值
@Size 集合的长度 @Digits 必须为数字,其值必须再可接受的范围内
@Past 必须是过去的日期 @Future 必须是将来的日期
@Pattern 必须符合正则表达式 @Email 必须是邮箱格式
@Length(min=,max=) 字符串的大小必须在指定的范围内 @NotEmpty 不能为null,长度大于0
@Range(min=,max=,message=) 元素必须在合适的范围内 @NotBlank 不能为null,字符串长度大于0(限字符串)

3. 应用

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-context-support<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.3.10<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.springframework<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>spring-webmvc<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>5.3.10<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>org.hibernate<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>hibernate-validator<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>6.0.1.Final<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>com.alibaba<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>fastjson<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>1.2.78<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">dependency</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">groupId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>junit<span style="color:#117700"></</span><span style="color:#117700">artifactId</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">version</span><span style="color:#117700">></span>4.11<span style="color:#117700"></</span><span style="color:#117700">version</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">scope</span><span style="color:#117700">></span>test<span style="color:#117700"></</span><span style="color:#117700">scope</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">dependency</span><span style="color:#117700">></span></span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!-- web.xml --></span>
<span style="color:#117700"><</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>dispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>org.springframework.web.servlet.DispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>contextConfigLocation<span style="color:#117700"></</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>classpath:spring-mvc.xml<span style="color:#117700"></</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">load-on-startup</span><span style="color:#117700">></span>1<span style="color:#117700"></</span><span style="color:#117700">load-on-startup</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>dispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>/<span style="color:#117700"></</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span></span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">beans</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans"</span>
       <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color:#0000cc">xmlns:p</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/p"</span>
       <span style="color:#0000cc">xmlns:mvc</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/mvc"</span>
       <span style="color:#0000cc">xmlns:context</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/context"</span>
       <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"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"</span><span style="color:#117700">></span>
​
    <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span> <span style="color:#0000cc">p:prefix</span>=<span style="color:#aa1111">"/"</span> <span style="color:#0000cc">p:suffix</span>=<span style="color:#aa1111">".jsp"</span> <span style="color:#117700">/></span>
​
    <span style="color:#117700"><</span><span style="color:#117700">mvc:annotation-driven</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">mvc:message-converters</span><span style="color:#117700">></span>
            <span style="color:#aa5500"><!--处理字符串的消息转换器--></span>
            <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"org.springframework.http.converter.StringHttpMessageConverter"</span> <span style="color:#117700">/></span>
            <span style="color:#aa5500"><!--处理JSON格式的消息转换器--></span>
            <span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">property</span> <span style="color:#0000cc">name</span>=<span style="color:#aa1111">"supportedMediaTypes"</span><span style="color:#117700">></span>
                    <span style="color:#117700"><</span><span style="color:#117700">list</span><span style="color:#117700">></span>
                        <span style="color:#117700"><</span><span style="color:#117700">value</span><span style="color:#117700">></span>text/html;charset=UTF-8<span style="color:#117700"></</span><span style="color:#117700">value</span><span style="color:#117700">></span>
                        <span style="color:#117700"><</span><span style="color:#117700">value</span><span style="color:#117700">></span>application/json;charset=UTF-8<span style="color:#117700"></</span><span style="color:#117700">value</span><span style="color:#117700">></span>
                    <span style="color:#117700"></</span><span style="color:#117700">list</span><span style="color:#117700">></span>
                <span style="color:#117700"></</span><span style="color:#117700">property</span><span style="color:#117700">></span>
            <span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">mvc:message-converters</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">mvc:annotation-driven</span><span style="color:#117700">></span>
​
    <span style="color:#117700"><</span><span style="color:#117700">context:component-scan</span> <span style="color:#0000cc">base-package</span>=<span style="color:#aa1111">"com.qf.spring.controller"</span> <span style="color:#117700">/></span>
<span style="color:#117700"></</span><span style="color:#117700">beans</span><span style="color:#117700">></span></span></span>

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">hibernate</span>.<span style="color:#000000">validator</span>.<span style="color:#000000">constraints</span>.<span style="color:#000000">Length</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">hibernate</span>.<span style="color:#000000">validator</span>.<span style="color:#000000">constraints</span>.<span style="color:#000000">Range</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">javax</span>.<span style="color:#000000">validation</span>.<span style="color:#000000">constraints</span>.<span style="color:#000000">NotNull</span>;
​
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">User</span> {
​
    <span style="color:#555555">@NotNull</span>(<span style="color:#000000">message</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"账号不能为空"</span>)
    <span style="color:#555555">@Length</span>(<span style="color:#000000">min</span> <span style="color:#981a1a">=</span> <span style="color:#116644">8</span>, <span style="color:#000000">max</span> <span style="color:#981a1a">=</span> <span style="color:#116644">15</span>, <span style="color:#000000">message</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"账号长度必须为8~15位"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">username</span>;
​
    <span style="color:#555555">@NotNull</span>(<span style="color:#000000">message</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"密码不能为空"</span>)
    <span style="color:#555555">@Length</span>(<span style="color:#000000">min</span> <span style="color:#981a1a">=</span> <span style="color:#116644">8</span>, <span style="color:#000000">max</span> <span style="color:#981a1a">=</span> <span style="color:#116644">20</span>, <span style="color:#000000">message</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"密码长度必须为8~20位"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">String</span> <span style="color:#000000">password</span>;
​
    <span style="color:#555555">@Range</span>(<span style="color:#000000">min</span> <span style="color:#981a1a">=</span> <span style="color:#116644">0</span>, <span style="color:#000000">max</span> <span style="color:#981a1a">=</span> <span style="color:#116644">120</span>, <span style="color:#000000">message</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"年龄只能在0~120岁之间"</span>)
    <span style="color:#770088">private</span> <span style="color:#008855">int</span> <span style="color:#000000">age</span>;
​
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getUsername</span>() {
        <span style="color:#770088">return</span> <span style="color:#000000">username</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setUsername</span>(<span style="color:#008855">String</span> <span style="color:#000000">username</span>) {
        <span style="color:#770088">this</span>.<span style="color:#000000">username</span> <span style="color:#981a1a">=</span> <span style="color:#000000">username</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">String</span> <span style="color:#000000">getPassword</span>() {
        <span style="color:#770088">return</span> <span style="color:#000000">password</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setPassword</span>(<span style="color:#008855">String</span> <span style="color:#000000">password</span>) {
        <span style="color:#770088">this</span>.<span style="color:#000000">password</span> <span style="color:#981a1a">=</span> <span style="color:#000000">password</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#000000">getAge</span>() {
        <span style="color:#770088">return</span> <span style="color:#000000">age</span>;
    }
​
    <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">setAge</span>(<span style="color:#008855">int</span> <span style="color:#000000">age</span>) {
        <span style="color:#770088">this</span>.<span style="color:#000000">age</span> <span style="color:#981a1a">=</span> <span style="color:#000000">age</span>;
    }
}
​
​
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">stereotype</span>.<span style="color:#000000">Controller</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">validation</span>.<span style="color:#000000">BindingResult</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">RequestMapping</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">ResponseBody</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">javax</span>.<span style="color:#000000">validation</span>.<span style="color:#000000">Valid</span>;
​
<span style="color:#555555">@Controller</span>
<span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/user"</span>)
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">UserController</span> {
​
    <span style="color:#555555">@RequestMapping</span>(<span style="color:#aa1111">"/add"</span>)
    <span style="color:#555555">@ResponseBody</span>
    <span style="color:#770088">public</span> <span style="color:#008855">Object</span> <span style="color:#000000">saveUser</span>(<span style="color:#555555">@Valid</span> <span style="color:#000000">User</span> <span style="color:#000000">user</span>, <span style="color:#000000">BindingResult</span> <span style="color:#000000">result</span>){
        <span style="color:#770088">if</span>(<span style="color:#000000">result</span>.<span style="color:#000000">hasErrors</span>()) <span style="color:#770088">return</span> <span style="color:#000000">result</span>.<span style="color:#000000">getAllErrors</span>();
        <span style="color:#770088">return</span> <span style="color:#116644">1</span>;
    }
}</span></span>

第五节 RESTFUL

1. RESTFUL 简介

REST全称为 Representational State Transfer,表示 表述性状态转移

RESTFUL有如下特点:

  • 每一个 URI 代表一种资源

  • 客户端使用GET、POST、PUT、DELETE4 个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源

2. RESTFUL 请求

<span style="background-color:#f8f8f8"><span style="color:#333333">/user GET => 获取用户资源
/user POST => 增加用户资源
/user PUT => 修改用户资源
/user DELETE => 删除用户资源
​
/user/<span style="color:#999977">{</span>username<span style="color:#999977">}</span> GET => 获取指定用户资源  这是RESTFUL风格中子资源的表述方式</span></span>

3. Spring 对 RESTFUL 的支持

3.1 @RestController

该注解只能应用于类上,相当于@Controller 和 @ResponseBody 注解的组合。表示该类中的所有方法执行完成后所返回的结果直接向页面输出

3.2 @GetMapping

3.2 @PostMapping

3.2 @PutMapping

3.2 @DeleteMapping

第六节 静态资源处理

1. 静态资源无法访问的原因

静态资源包含html、js、css、图片、字体文件等。静态文件没有url-pattern,所以默认是访问不到的。之所以可以访问,是因为tomcat中有一个全局的servlet:org.apache.catalina.servlets.DefaultServlet,它的url-pattern是 "/", 所以项目中不能匹配的静态资源请求,都由这个Servlet来处理。但在SpringMVC中DispatcherServlet也采用了"/" 作为url-pattern, 那么项目中不会再使用全局的Serlvet,这样就造成了静态资源不能完成访问。

2. 处理方案

2.1 方案一

DispathcerServlet 对应的 url-pattern 修改为 "/" 以外的其他匹配样式即可。比如 *.do, *.action。这样修改后,发送请求时,请求URL必须匹配 .do 或者 .action。

2.2 方案二

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!-- web.xml --></span>
<span style="color:#117700"><</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>default<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>/static/*<span style="color:#117700"></</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span></span></span>

2.2 方案三

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500"><!-- spring-mvc.xml --></span>
<span style="color:#aa5500"><!-- </span>
<span style="color:#aa5500">这个handler就是处理静态资源的,它的处理方式就是将请求转会到tomcat中名为default的Servlet </span>
<span style="color:#aa5500">--></span>
<span style="color:#117700"><</span><span style="color:#117700">mvc:default-servlet-handler</span><span style="color:#117700">/></span>
<span style="color:#aa5500"><!-- mapping是访问路径,location是静态资源存放的路径 --></span>
<span style="color:#117700"><</span><span style="color:#117700">mvc:resources</span> <span style="color:#0000cc">mapping</span>=<span style="color:#aa1111">"/static/**"</span> <span style="color:#0000cc">location</span>=<span style="color:#aa1111">"/static/"</span> <span style="color:#117700">/></span></span></span>

第七节 中文乱码处理

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span>
<span style="color:#117700"><</span><span style="color:#117700">web-app</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://xmlns.jcp.org/xml/ns/javaee"</span>
         <span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span>
         <span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://xmlns.jcp.org/xml/ns/javaee</span>
                      <span style="color:#aa1111">http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"</span>
         <span style="color:#0000cc">version</span>=<span style="color:#aa1111">"4.0"</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">display-name</span><span style="color:#117700">></span>Archetype Created Web Application<span style="color:#117700"></</span><span style="color:#117700">display-name</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>dispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>org.springframework.web.servlet.DispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-class</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>contextConfigLocation<span style="color:#117700"></</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>classpath:spring-mvc.xml<span style="color:#117700"></</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">load-on-startup</span><span style="color:#117700">></span>1<span style="color:#117700"></</span><span style="color:#117700">load-on-startup</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">servlet</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>dispatcherServlet<span style="color:#117700"></</span><span style="color:#117700">servlet-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>/<span style="color:#117700"></</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">servlet-mapping</span><span style="color:#117700">></span>
​
  <span style="color:#117700"><</span><span style="color:#117700">filter</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">filter-name</span><span style="color:#117700">></span>encodingFilter<span style="color:#117700"></</span><span style="color:#117700">filter-name</span><span style="color:#117700">></span>
    <span style="color:#aa5500"><!--字符编码过滤器--></span>
    <span style="color:#117700"><</span><span style="color:#117700">filter-class</span><span style="color:#117700">></span>org.springframework.web.filter.CharacterEncodingFilter<span style="color:#117700"></</span><span style="color:#117700">filter-class</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
      <span style="color:#aa5500"><!--编码格式--></span>
      <span style="color:#117700"><</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>encoding<span style="color:#117700"></</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>UTF-8<span style="color:#117700"></</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
      <span style="color:#aa5500"><!--强制编码--></span>
      <span style="color:#117700"><</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>forceEncoding<span style="color:#117700"></</span><span style="color:#117700">param-name</span><span style="color:#117700">></span>
      <span style="color:#117700"><</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>true<span style="color:#117700"></</span><span style="color:#117700">param-value</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">init-param</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">filter</span><span style="color:#117700">></span>
  <span style="color:#117700"><</span><span style="color:#117700">filter-mapping</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">filter-name</span><span style="color:#117700">></span>encodingFilter<span style="color:#117700"></</span><span style="color:#117700">filter-name</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>/*<span style="color:#117700"></</span><span style="color:#117700">url-pattern</span><span style="color:#117700">></span>
  <span style="color:#117700"></</span><span style="color:#117700">filter-mapping</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">web-app</span><span style="color:#117700">></span></span></span>

第八节 Spring MVC工作原理

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">checkMultipart</span>(<span style="color:#000000">request</span>); <span style="color:#aa5500">//检测是否是多部分请求,这个只可能在文件上传的时候为真</span>
​
​
<span style="color:#000000">getHandler</span>(<span style="color:#000000">processedRequest</span>); <span style="color:#aa5500">//获取处理器 => 遍历HandlerMapping,找到匹配当前请求的执行器链</span>
<span style="color:#aa5500">//没有找到执行器链 就直接向页面报一个404</span>
<span style="color:#000000">noHandlerFound</span>(<span style="color:#000000">processedRequest</span>, <span style="color:#000000">response</span>);
<span style="color:#aa5500">//找到处理当前请求的适配器</span>
<span style="color:#000000">HandlerAdapter</span> <span style="color:#000000">ha</span> <span style="color:#981a1a">=</span> <span style="color:#000000">getHandlerAdapter</span>(<span style="color:#000000">mappedHandler</span>.<span style="color:#000000">getHandler</span>());
​
<span style="color:#aa5500">//控制器之前执行的拦截器将先执行,如果拦截器不通过,则方法直接结束</span>
<span style="color:#770088">if</span> (<span style="color:#981a1a">!</span><span style="color:#000000">mappedHandler</span>.<span style="color:#000000">applyPreHandle</span>(<span style="color:#000000">processedRequest</span>, <span style="color:#000000">response</span>)) {
    <span style="color:#770088">return</span>;
}
<span style="color:#aa5500">//控制器处理请求,可能会得到一个ModelAndView</span>
<span style="color:#000000">mv</span> <span style="color:#981a1a">=</span> <span style="color:#000000">ha</span>.<span style="color:#000000">handle</span>(<span style="color:#000000">processedRequest</span>, <span style="color:#000000">response</span>, <span style="color:#000000">mappedHandler</span>.<span style="color:#000000">getHandler</span>());
​
<span style="color:#aa5500">//控制器之后的拦截器执行</span>
<span style="color:#000000">mappedHandler</span>.<span style="color:#000000">applyPostHandle</span>(<span style="color:#000000">processedRequest</span>, <span style="color:#000000">response</span>, <span style="color:#000000">mv</span>);
<span style="color:#aa5500">//处理分发的结果:这个结果就是控制器处理后的结果</span>
<span style="color:#000000">processDispatchResult</span>(<span style="color:#000000">processedRequest</span>, <span style="color:#000000">response</span>, <span style="color:#000000">mappedHandler</span>, <span style="color:#000000">mv</span>, <span style="color:#000000">dispatchException</span>);
<span style="color:#aa5500">//拦截器在控制器给出的结果DispatcherServlet处理后执行</span>
<span style="color:#000000">triggerAfterCompletion</span>(<span style="color:#000000">processedRequest</span>, <span style="color:#000000">response</span>, <span style="color:#000000">mappedHandler</span>, <span style="color:#000000">ex</span>);</span></span>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring MVC详解 的相关文章

随机推荐

  • 2023-9-8 求组合数(一)

    题目链接 求组合数 I include
  • C语言 _ 指针(超详解析 3分钟完全掌握 总结性讲解 经典通俗)

    目 录 1 指针 指针变量及指针的大小 2 指针类型 3 指针的解引用 4 指针运算 4 1指针 整数 4 2指针 指针 5 野指针 5 1 为什么会有野指针 5 2 如何规避野指针 6 指针和数组 7 二级指针 7 1二级指针的定义 8
  • Java中的加号“+”

    在Java中 加号 与数学上的加号有些不同 它有两个意思 一个是算术运算中的 一个是连接符的重要 类似于C语言中的strcat函数 怎么区分这两种作用呢 1 当 两边是非数值类型 就被看作连接符 2 当 两边都是数值类型 就被看作算术运算中
  • ZYNQ平台在SDK下引导启动UBOOT

    ZYNQ芯片 Linux系统搭建完成后 希望通过QSPI Flash的方式来进行程序加载 QSPI Flash启动则需要烧录以下文件 BOOT bin fsbl elf uboot elf uImage linux内核 zynq board
  • 小吴学前端--Element-UI tree 组件 选中节点高亮(持续高亮)

    最近开发的时候遇到的一个需求 1 加深选中单据颜色框 2 在不切换tree组件时 选中的一直保持高亮 由于对该组件不是很熟悉 记下笔记 用来巩固学习 1 点击后高亮显示的背景颜色修改 仅仅需要修改css部分即可 deep el tree n
  • 从语言到品牌

    在竞争激烈的商业环境中 一个强大的品牌所带来的广泛品牌影响力是企业成功的关键要素之一 无论是刚刚起步的初创公司 还是已经存在多年的大型企业 都需要创建最符合自身 最贴合市场受众的品牌名称 并且持续努力来塑造和维护自己的品牌 以吸引更多客户
  • WSDL文档结构详解(五)

    1 实例截图 2 wsdl文件分析
  • C++静态链接库

    1 打开VS2010 新建win32项目 命名libm 下一步选中静态库完成 2 新建空文件mylib h和mylib cpp 其中mylib h文件中代码如下 ifndef LIB H define LIB H extern C int
  • 9个爬虫基础实战汇总+4个专业爬虫练手站推荐

    个人主页 互联网阿星 格言 选择有时候会大于努力 但你不努力就没得选 作者简介 大家好我是互联网阿星 和我一起合理使用Python 努力做时间的主人 如果觉得博主的文章还不错的话 请点赞 收藏 留言 支持一下博主哦 行业资料 PPT模板 简
  • 嵌入式系统图解

    嵌入式系统组成 嵌入式系统硬件结构图 嵌入式软件运行流程 体系结构和接口 ARM Cotex M3内核架构图
  • 查看jvm运行情况

    使用 jps 或top显示当前所有java进程pid 详细的使用方法可参考博客 https blog csdn net u013250071 article details 80496623 https blog csdn net weix
  • Yolov4部署到ZYNQ系列4-网络地址调整和部署

    文章目录 前言 一 笔记本上的步骤 二 开发板上的步骤 三 部署 四 总结 前言 本文参照上一节的工作 使用Vitis AI 1 4与Vitis AI 2 5的工具得到的量化和编译 在开发板上部署 但在此之前 不想使用路由的方式 直接通过网
  • HIVE介绍(五)

    文章目录 HIVE介绍 hql语法 hive优缺点 Hive运行原理 Hive为什么要分区 partitioned by Hive与mysql的对比 Hive内部表和外部表 hive数据类型 hive数据存格式 自定义函数UDF和UDTF
  • 数字IC笔试面试常考问题及答案

    来源 知乎 链接 https zhuanlan zhihu com p 261298869 基础知识 原理务必理解透彻 锁存器的结构 DFF的结构 建立保持时间 亚稳态 STA CDC 亚稳态的成因 危害 解决方法 建立保持时间的计算 违例
  • centos 软件卸载

    1 查找系统注册名称 rpm q a grep 软件名 2 卸载 rpm e package name 即可卸载软件 参数e的作用是使rpm进入卸载模式 对名为 package name 的软件包进行卸载 由于系统中各个软件包之间相互有依赖
  • Linux 非阻塞connect

    套接字执行I O操作有阻塞和非阻塞两种模式 在阻塞模式下 在I O操作完成前 执行操作的函数一直等候而不会立即返回 该函数所在的线程会阻塞在这里 相反 在非阻塞模式下 套接字函数会立即返回 1 而不管I O是否完成 该函数所在的线程会继续运
  • https流程详解(含ca证书校验)

    首先来说 一下 为什么需要https 加密 由于http 传输是明文传输 信息在传输的过程中容易被篡改 不安全 所以 就有了 加密传输 对称加密 aes等 对称加密很容易理解 就是 只有一个秘钥 可以使用这个秘钥加密和解密 但是这样只要被别
  • 关系型数据库RDBMS -MySQL基础入门(五)数据备份与恢复

    一 物理备份 innodbackupex 二 逻辑备份 mysqldump Binlog 二进制 日志文件 备份恢复 主从同步 除查询sql所有命令都记录 索引文件 bin index bin 000001 Purge master log
  • 蓝牙之九-AT命令

    AT命令用于HF协议 该命令使参考3GPP 27 007协议 以下是HFP规范 每个命令行只有一个命令 AG侧默认不回显命令 AG使用冗长的格式返回结果 以下字符将被用于AT命令和返回结果格式中
  • Spring MVC详解

    第一节 Spring MVC 简介 1 Spring MVC SpringMVC是一个Java 开源框架 是Spring Framework生态中的一个独立模块 它基于 Spring 实现了Web MVC 数据 业务与展现 设计模式的请求驱