搭建环境
在web.xml文件中 配置 前端控制器 初始化 SpringConfig.xml 配置文件 配置过滤器 使请求为utf-8
前端控制器
<servlet>
<servlet-name>dispatcherServlet</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>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在SpringConfig.xml 中 开启注解扫描 开启视图解析器 让方法返回字符串时能解析地址 配置前端控制器 不拦截 js资源
开启注解扫描
<context:component-scan base-package="com.wyc"/>
视图解析器
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
前端控制器,哪些资源不拦截
<mvc:resources mapping="/js/" location="/js/**"></mvc:resources>
开启注解 springmvc注解支持
<mvc:annotation-driven></mvc:annotation-driven>
异常
当服务器出现异常时 异常最终都被从 Dao 到service 到web 到前端控制器 再抛到 前端控制器 再抛到浏览器
我们可以在 前端控制器 编写一个 异常处理器 处理异常后再返回给 浏览器
1.编写自定义异常类
public class SysException extends Exception {
存储异常信息
private String msg;
public SysException(String msg) {
this.msg = msg;
} get set 方法...}
2.编写异常处理器
public class SysExceptionResolver implements HandlerExceptionResolver {
@Override 处理异常逻辑
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
SysException exception= null;
if (e instanceof SysException){ 如果是 自己写的异常 强转为自己的异常
exception = (SysException)e;
}else { 如果不是 new 一个自己的异常
exception = new SysException("系统正在维护@");
}
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg",exception.getMsg());
mv.setViewName("error"); 跳转到 error页面
return mv;
}}
3.配置异常处理器 在SpringConfig.xml中配置 注册异常处理器
配置异常处理器
<bean id="sysExceptionResolver" class="com.wyc.exception.SysExceptionResolver"></bean>
拦截器
1.编写拦截器
public class Interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器--先--11111");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器-返回响应前---11111");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器-返回响应后---1111");
}
}
必须实现HandlerInterceptor 接口
1. preHandle 预处理在前端控制器执行 return true 表示放行 2.postHandle在前端控制器返回响应前执行 可设置response
3.afterCompletion在给完响应后执行 一般用于释放资源
2.配置/注册 拦截器
/user/** 表示user/下的所有请求拦截 /user/* user/下的一级目录拦截
配置多个拦截器
<mvc:interceptors>
<mvc:interceptor> 第一个拦截器
<mvc:mapping path="/user/*"/> 要拦截的方法
<!--<mvc:exclude-mapping path=""/>--> <!--不拦截的方法-->
配置拦截器对象
<bean class="com.wyc.interceptors.Interceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
执行结果
<a href="/user/test1">hahah</a> index页面
<%System.out.println("响应的页面");%> sucess页面
拦截器--先--11111
test1执行了... 前端控制器
拦截器-返回响应前---11111
响应的页面
拦截器-返回响应后---1111
不放行 只会执行preHandle 后面的所有都不会执行 可以使用
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器--先--11111");
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return false; }
在postHandle中跳转时
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
System.out.println("拦截器-返回响应前---11111");
}
响应会先跳转到 前端控制器 的响应页面 但是又因为响应前跳转 所以最后 跳转到 error页面
拦截器--先--11111
test1执行了... 前端控制器
拦截器-返回响应前---11111
响应的页面
拦截器-返回响应后---1111
两个拦截器执行循序
配置拦截器
<mvc:interceptors>
<mvc:interceptor> 第一个拦截器
<mvc:mapping path="/user/*"/> 要拦截的方法
<!--配置拦截器对象-->
<bean class="com.wyc.interceptors.Interceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor> 第二个拦截器
<mvc:mapping path="/user/*"/> 要拦截的方法
配置拦截器对象
<bean class="com.wyc.interceptors.Interceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器--先--11111
拦截器--先--2222
test1执行了...
拦截器--返回响应前---2222
拦截器--返回响应后---2222
拦截器-返回响应后---1111