下面是整个运行流程:
- 发送请求
- springDispatcherServlet的url-pattern
- SpringMVC中是否存在对应映射(@RequestMapping注解映射)
(3.1)如果没有映射,就看是否配置<mvc:default-servlet-handler/>
(3.1.1)如果没有配置控制台返回错误没有映射,并返回404页面
(3.1.2) 如果有配置,就查找目标资源,控制台不会返回没有映射的错误
(3.2) 如果有映射,由HandlerMapping获取HandlerExecutionChain对象 获取HandlerAdapter对象 - 调用拦截器的preHandler方法
- 调用目标Handler的目标方法,获取ModlerAndView对象
- 调用拦截器的postHandler方法 看是否出现异常,如果有异常就由HandlerExceptionResolver处理异常
- 用视图解析器解析ModlerAndView
- 渲染视图
下面是一些细节的处理和使用:
配置都是在springmvc.xml中配置的
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>springmvc123</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 修改配置文件路径和名称 -->
<!-- 配置DispatcherServlet的一个初始化参数:配置springMVC配置文件的位置和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 自启动 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc123</servlet-name>
<url-pattern>/</url-pattern> <!-- 配置那些请求可以给到servlet -->
</servlet-mapping>
<!--配置视图解析器--!>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--可以用来处理静态资源--!>
<mvc:default-servlet-handler/>
<!--配置自定义拦截器--!>
<mvc:interceptors>
<bean>
Interceptor
</bean>
</mvc:interceptors>
自定义拦截器
自定义的拦截器必须实现HandlerInterceptor接口
- preHandler:在目标方法之前调用,若返回值是true,则继续调用后序的拦截器和目标方法;若返回值是false,则不在调用后序的拦截器和目标方法。
可以考虑做权限,日志,事务等 - postHandler:调用目标方法之后,渲染视图之前。
可以对请求域中的属性或视图进行修改 - afterCompletion:渲染视图之后。
释放资源。
异常处理
- @ExceptionHandler标记的方法的入参中可以加入Exception类型的参数,该参数及对应发生的异常对象
- @ExceptionHandler标记的方法的入参中不能传入Map,若希望把异常信息传导页面中,需要使用ModleAndView作为返回值
- @ExceptionHandler标记的方法标记的异常有优先级问题,先是最匹配的,在退其次
- 如果当前handler中找不到@ExceptionHandler标记的方法来处理方法出现的异常,则将去@ControllerAdvice标记的类中查找@ExceptionHandler标记的方法来处理异常。
- @ResponseStatus标记方法,正确还是会显示value和reason的值。
Value:页面显示的状态码,reason:页面显示的错误消息。 - @ResponseStatus标记类,错误,抛出异常显示,
Value:页面显示的状态码,reason:页面显示的错误消息。