一.單攔截器
1.編寫自定義攔截器方法:
a.實現HandlerInterceptor接口,實現preHandle postHandle afterCompletion三個抽象方法.
b.在配置文件中配置攔截器.代碼如下:
2.攔截器中方法的執行順序
preHandle—>目標方法—>postHandle—>afterCompletion
3.多個攔截器的執行順序
多個攔截器的執行順序跟攔截器在配置文件中的配置順序對應。先配置的先執行.
4.多個攔截器的方法的執行順序
preHandle: 根據攔截器的配置順序,正序執行
postHandle:根據攔截器的配置順序,倒序執行
afterCompletion:根據攔截器的配置順序,倒序執行
5.單個攔截器方法執行順序:
render:渲染
業務方法執行之後,視圖渲染之前執行postHandle
二.雙攔截器
業務方法執行前自定義攔截器根據springmvc.xml配置正序進行preHandle,業務方法執行後倒序執行postHandle,並倒序關閉,即afterCompletion
三.異常
1.ExceptionHandlerExceptionResolver
a.支持使用@ExceptionHandler註解來進行異常的處理
b.@ExceptionHandler({各種異常.class}) 是有優先級問題的. 優先選擇匹配度最高的異常處理方法.
c.可以通過@ControllerAdvice來實現全局的異常處理.
當Handler中拋出異常後,如果在當前的Handler中找不到異常處理方法,就會到標註了@ControllerAdvice的類中找異常處理方法.
2.SimpleMappingExceptionResolver
a.將指定的異常映射到指定的頁面.
b.具體的配置:
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionAttribute" value="yichang"></property>
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop>
</props>
</property>
</bean>
解決運算異常:
@ExceptionHandler(value={ArithmeticException.class})
public ModelAndView dealHandlerExceptionResolver(Exception e){
System.out.println("-----------11111111--------dealHandlerExceptionResolver");
ModelAndView mv = new ModelAndView();
// mv.addObject("myException");
mv.setViewName("error");
return mv;
3.@ResponseStatus
代碼如下:
自定義異常:
@ResponseStatus(value = HttpStatus.LOCKED,reason = "用戶被鎖住,請撥打1022")
public class MyUserLockException extends RuntimeException {
private static final long serialVersionUID = -147674262913531007L;
}
控制層:
@RequestMapping(value="/testResponseStatus",method=RequestMethod.GET)
public String testResponseStatus(@RequestParam("userName") String userName){
if(userName.equalsIgnoreCase("li4")){
throw new MyUserLockException();
}
return "ok";
}//訪問時輸入li4則拋出自定義異常,顯示用戶被鎖住
主入口:
testResponseStatus:<a href="${pageContext.request.contextPath}/testResponseStatus?userName=li3">testResponseStatus</a>
四.SpringMVC運行流程
五.SpringMVC和Spring整合
1.web.xml中配置:
<!--spring config-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--springMVC config-->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<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>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.springmvc.xml配置:負責控制層(@Controller)
<!--use-default-filters="false"不是默認設置,由自己規定,保證只負責帶有註解@Controller的控制層-->
<context:component-scan base-package="com.atguigu.springmvc" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
3.spring配置文件applicationContext.xml配置:負責業務層(@Service)
<!--掃包-->
<context:component-scan base-package="com.atguigu.springmvc">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>