一、SpringMVC运行流程图:
二、SpringMVC的组件名称:
前端控制器(DispatcherServlet);
处理器映射器(HandlerMapping);
处理器适配器(HandlerAdapter);
处理器(Handler);
视图解析器(ViewResolver);
视图(View);
三、运行流程:
1-1、用户发起请求到前端控制器;
2、前端控制器请求处理器映射器查找处理器,处理器映射器查到后向前端控制器返回处理器;
3-1、前端控制器请求处理器适配器执行处理器;
4、处理器适配器请求处理器执行,处理器执行后向处理器适配器返回ModelAndView;
3-2、处理器适配器向前端控制器返回ModelAndView;
5、前端控制器请求视图解析器进行视图解析,视图解析器解析后向前端控制器返回视图;
6、前端控制器请求视图进行渲染,视图渲染后返回给前端控制器;
1-2、前端控制器向用户返回响应。
四、代码详解:
必需(1)前端控制器(配置在web.xml):
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/neuedu/mvc/interceptor/sprinmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
springmvc:名字可以随便起,原则上符合生产环境使用需求即可;
org.springframework.web.servlet.DispatcherServlet:前端控制器对应类的全路径,只要不是自己开发前端控制器,这就是固定写法,是可以根据路径找到项目下对应的类的;
/sprinmvc.xml:路径一定要正确,springmvc.xml中是处理器适配器、处理器映射器等一系列组件;
.do:当然也可以是/、/.html等,这影响着用户请求的url是否会交给前端控制器来处理,例如用户请求了dologin.do,服务器收到请求,就会交给SpringMVC的前端控制器处理,当然前端控制器收到dologin.do,要自己处理了,交给处理器映射器的就是dologin,所以.do什么的只是进门的门槛,可以随便配,符合生产环境即可;
必需(2)处理器映射器和处理器适配器(使用注解):
<mvc:annotation-driven/>
使用了注解,需要启用包扫描 :
<context:component-scan base-package="com.baidu.controller" />
com.baidu.controller:指加了注解的包,也可以指定到相应的类,有多个路径的情况下,以逗号分隔;
如果不使用注解,处理器代码需要继承相应的类,开发中一般不使用:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
(3)视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
prefix:前缀;
suffix:后缀;
当然,这都是org.springframework.web.servlet.view.InternalResourceViewResolver类中属性名,不是随便写的名字;
一般情况,配置文件中,除了id会自己命名(也要符合生产规范),其余属性皆有对应之处,如果不能对应起来,容器将不能成功加载,所以如果容器加载失败,就可以看看配置文件是否出了问题;
如果此处前端控制器请求视图解析器解析的是index逻辑视图名,视图解析器解析后,将给前端控制器返回/index.jsp物理视图名称,直接对应到前端页面;
常用(4)文件上传解析器:
需要另外导入jar包(版本自选,满足版本之间依赖关系即可):
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定上传文件最大尺寸为5MB -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
org.springframework.web.multipart.commons.CommonsMultipartResolver:类中还有很多属性可以扩展,例如文件编码格式、缓存大小等;
常用(5)拦截器:
<mvc:interceptors>
<mvc:interceptor>
<!-- /**所有url包括url路径 -->
<mvc:mapping path="/**"/>
<!-- 不拦截的路径 -->
<mvc:exclude-mapping path="*.haha"/>
<bean class="com.neuedu.mvc.interceptor.Interceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
常用(6)异常处理器:
<bean class="com.neuedu.mvc.exception.ex.CustomExceptionResolver"></bean>
常用(7)校验器:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 指定校验器 -->
<property name="providerClass" value='org.hibernate.validator.HibernateValidator'></property>
<!-- 指定资源文件,没有validationMessageSource属性,但是有set方法,依然可以注入 -->
<property name="validationMessageSource" ref="messageSource"></property>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basenames">
<list>
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="cacheSeconds" value="120"/>
</bean>