Spring MVC详解

第一节 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>

Spring MVC 是一种基于 Java 的开发框架,用于构建 Web 应用程序。它是 Spring 框架的一部分,提供了一种模型-视图-控制器(MVC)的架构模式,帮助开发人员将应用程序的不同方面进行解耦。 在 Spring MVC 中,应用程序的请求由 DispatcherServlet 接收并将其路由到适当的处理程序(也称为控制器)。控制器处理请求并生成模型数据,然后选择适当的视图来呈现这些模型数据给用户。 以下是 Spring MVC 的一些重要组件和概念: 1. DispatcherServlet:是整个 Spring MVC 的中央调度器,负责接收请求并将其分派给相应的处理程序。 2. 控制器(Controller):处理请求的组件,根据请求的类型和内容执行逻辑处理,并生成模型数据。 3. 模型(Model):表示应用程序的数据和状态。控制器可以通过模型对象来设置和获取数据,并将其传递给视图进行呈现。 4. 视图(View):负责将模型数据呈现给用户。可以是 JSP、Thymeleaf 或其他模板引擎。 5. 处理器映射器(Handler Mapping):将请求映射到相应的处理程序(控制器)。它根据配置文件或注解来确定请求与处理程序之间的映射关系。 6. 视图解析器(View Resolver):根据视图名称解析出实际的视图对象,它将逻辑视图名转换为物理视图。 7. 拦截器(Interceptor):在请求处理的过程中,可以对请求进行预处理和后处理。可以用于身份验证、日志记录等功能。 8. 数据绑定(Data Binding):自动将请求参数绑定到控制器方法的参数或模型对象的属性上。 9. 校验器(Validator):用于验证模型对象的数据的有效性。 Spring MVC 提供了灵活且强大的功能,使开发人员能够轻松构建可扩展和可维护的 Web 应用程序。它还支持 RESTful Web 服务和国际化等功能。通过良好的设计和组织,Spring MVC 可以实现松耦合、可测试和可扩展的应用程序架构。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值