Spring 异常与拦截器

  搭建环境          异常             拦截器         两个拦截器

搭建环境

在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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值