SpringMVC笔记(3)
一、SpringMVC 拦截器
1.1 快速入门
步骤
-
创建拦截器类实现HandlerInterceptor接口
public class MyInterceptor01 implements HandlerInterceptor { /** * 在目标方法执行之前 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."); //true则放行 return true; } /** * 在目标方法执行之后,视图对象返回之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle.."); } /** * 在流程都执行完毕后执行 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCom..."); } }
-
配置拦截器
<!-- 拦截器--> <mvc:interceptors> <mvc:interceptor> <!-- 拦截路径--> <mvc:mapping path="/**"/> <!-- 拦截器的依赖注入--> <bean class="interceptor.MyInterceptor01"></bean> </mvc:interceptor> </mvc:interceptors>
-
测试拦截器的拦截效果
preHandle...
目标函数执行。。
postHandle..
afterCom...
1.2 用户登录权限控制
步骤
-
编写登录验证拦截器
/** * 登录拦截 * @author 郜宇博 */ public class PrivilegeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判断用户是否登录 // 判断session中是否存在user对象 HttpSession session = request.getSession(); //获取user对象 User user = (User) session.getAttribute("user"); //判断是否存在 if(user == null){ //无用户 //重定向到登录界面 response.sendRedirect(request.getContextPath()+"/login.jsp"); return false; } //放行 return true; } }
-
配置拦截器(spring-mvc.xml中)
<!-- 配置登录权限拦截器--> <mvc:interceptors> <mvc:interceptor> <!-- 拦截目标--> <mvc:mapping path="/**"/> <!-- 放行目标--> <mvc:exclude-mapping path="/user/login"/> <bean class="springTest.interceptor.PrivilegeInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>
二、SpringMVC异常处理
2.1 异常处理的思路
系统中异常包括两类:预期异常和运行时异常****RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
2.2 异常处理的两种方式
2.2.1简单异常处理器:
使用SpringMVC提供的SimpleMappingExceptionResolver
1. 配置异常处理器
2. 编写异常页面
<!-- 配置简单异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 默认错误视图-->
<property name="defaultErrorView" value="error.jsp"></property>
<!-- 单独异常配置-->
<property name="exceptionMappings">
<map>
<!-- 类转换异常-->
<entry key="java.lang.ClassCastException" value="error1.jsp"></entry>
</map>
</property>
</bean>
2.2.2异常处理接口:
实现Spring的HandelerExceptionResolver
- 实现异常处理接口
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
//e异常是否是ClassCastException的实例
if(e instanceof ClassCastException){
//设置模型和视图
modelAndView.addObject("error","类转换异常");
}
else if (e instanceof DataAccessException){
//设置模型和视图
modelAndView.addObject("error","数据访问异常");
}
modelAndView.setViewName("error.jsp");
return modelAndView;
}
}
- 配置
<!-- 配置自定义异常-->
<bean class="springTest.ExceptionTest.MyExceptionResolver"/>