SpringMVC
一 springmvc的统一异常处理器
定义统一异常处理步骤
1 创建错误页面
2 创建类实现接口HandlerExceptionResolver
3 配置异常处理器(交给spring容器管理)
MyException
package cn.itcast.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyException implements HandlerExceptionResolver {
@Override //为所有异常方法做统一处理
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","不好意思,程序出现了错误,请骚后再来...");
modelAndView.setViewName("error");
return modelAndView;
}
}
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="cn.itcast.web"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--注册统一异常处理器-->
<bean class="cn.itcast.exception.MyException"></bean>
</beans>
二 拦截器
拦截器的作用和过滤器的作用是一样的,都是对访问资源时的一种请求拦截
虽然他们作用是一样的,但是也有区别:
1 过滤器是servlet规范中的一部分,任何java web工程都可以使用
2 拦截器是springmvc框架自己的,只有使用了springmvc框架的工程才能使用
3 拦截器和过滤器能够同时使用 优先级:过滤器>拦截器
自定义拦截器
1.自定义拦截器:实现HandlerInterceptor
2.配置拦截器(springmvc.xml)
MyInterceptor1
public class MyInterceptor1 implements HandlerInterceptor {
@Override //在控制器方法之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("之前...");
return true;
}
@Override //在控制器方法之后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("之后...");
}
@Override //整个响应结束最终执行 条件:preHandle的返回值true
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("响应结束..");
}
}
MyInterceptor2
package cn.itcast.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
@Override //在控制器方法之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("之前2...");
return true;
}
@Override //在控制器方法之后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("之后2...");
}
@Override //整个响应结束最终执行 条件:preHandle的返回值true
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("响应结束2..");
}
}
spring-mvc.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.interceptor.MyInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器小demo案例:用户登录能访问查询资源 未登录无法访问
//拦截器实现的需求:该方法只有登录用户才能访问执行 如果不是登录用户跳转到登录页面进行登录
@RequestMapping(value = "/findAll")
public String findAll(){
System.out.println("去数据库查到所有用户的信息");
return "index";
}
public class LoginInterceptor implements HandlerInterceptor {
@Override //在执行控制器controller核心方法之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user =(User)request.getSession().getAttribute("user");
if(user==null){
// 用户如果是不登录的 就到登录页面
response.sendRedirect("/login.jsp");
return false;
}
// 用户如果是登录的 就放行
return true;
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!--排出不需要拦截的资源-->
<mvc:exclude-mapping path="/login.do"></mvc:exclude-mapping>
<bean class="cn.itcast.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<body>
<h2>登录</h2>
<form action="${pageContext.request.contextPath}/login.do" method="post">
用户名:<input type="text" name="username" />
密码:<input type="password" name="password" />
<input type="submit" value="登录">
</form>
</body>
@RequestMapping(value = "/login")
public String login(User user, HttpSession session){
System.out.println(user);
session.setAttribute("user",user);
return "index";
}