Spring MVC拦截器组件
拦截器组件
拦截器组件实现HandlerInterceptor接口。接口中有3个方法,分别在处理器执行前、执行后、请求处理完毕响应输出前执行。
案例:登录检查
-
编写一个拦截器组件,实现HandlerInterceptor接口,按需求在方法中添加逻辑
public class CheckInterceptor implements HandlerInterceptor{ //postHandle和afterCompletion省略 public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { //检查是否登录,session是否有指定信息 HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if(user != null){//有登录信息 return true; }else{ response.sendRedirect("/spring_05/login.do"); return false; } } }
-
在spring中配置拦截器
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/book/delete.do"/> <mvc:mapping path="/book/modify.do"/> <bean class="cn.xdl.interceptor.CheckInterceptor"/> </mvc:interceptor> </mvc:interceptors>
案例:请求处理时间监控
参考案例代码
Spring MVC异常处理
全局异常处理
当流程调用Controller、Service、Dao组件抛出异常后,SpringMVC会调用ExceptionResolver异常处理器处理,异常处理器可以使用内置的,也可以自定义。
-
内置异常处理器SimpleMappingExceptionResolver
该组件只需要在spring配置下即可
<bean id="handleException" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error</prop> </props> </property>
所有Controller方法抛出异常都会触发该异常处理器,跳转到error.jsp
-
自定义ExceptionResolver组件
编写实现类,实现HandlerExceptionResolver接口
public class MyExceptionResolver implements HandlerExceptionResolver{ //注入异常类型和视图名 private Properties exceptionMappings; //set注入方法 public void setExceptionMappings(Properties exceptionMappings) { this.exceptionMappings = exceptionMappings; } @Override public ModelAndView resolveException( HttpServletRequest request, HttpServletResponse response, Object arg2, Exception ex) { ModelAndView mav = new ModelAndView(); //根据ex类型封装成对应ModelAndView String className = ex.getClass().getName(); String viewName = exceptionMappings.getProperty(className); if(viewName == null){ viewName = "error"; } System.out.println("className:"+className); System.out.println("viewName:"+viewName); mav.setViewName(viewName); return mav; } }
配置异常处理器
<bean id="handleException" class="cn.xdl.exception.MyExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.NumberFormatException">error</prop> </props> </property> </bean>
局部异常处理
ExceptionResolver都是全局范围处理,如果某个Controller异常需要特殊处理,可以使用@ExceptionHandler局部处理
@ExceptionHandler
public ModelAndView handlerException(Exception e){...}
@ExceptionHandler
public String handlerException(Exception e){...}
SpringMVC文件上传
Spring框架提供了一个CommonsMultipartResolver组件,可以调用commons-fileupload.jar工具包将请求中的上文件流信息解析出来保存到服务器某个目录下。
使用方法如下:
-
在spring配置CommonsMultipartResolver组件
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> </bean>
-
导入commons-fileupload.jar或commons-io.jar
利用上传处理器执行上传功能,步骤如下:
-
JSP页面表单,method必须为post;enctype必须为multipart/form-data.
-
Controller方法参数为MultipartFile类型接收。
由于multipartResolver解析处理,所以Controller方法才能直接用MultipartFile接收文件对象。
-
图片存储(存储路径、存储文件名)