SpringMVC_v14

1 SpringMVC异常处理之分析和搭建环境

2 SpringMVC异常处理之演示程序异常

3 SpringMVC异常处理之异常处理代码编写

image-20191008131340977

步骤

创建环境 pom.xml, web.xml, springmvc.xml … => 复制前端控制器, 过滤器 => sysException.java 文件 => 配置异常处理类 => 完成 UserController.java =>编写 SysException.java => 编写 SYSExceptionResolver.java

UserController.java
/**
 * @author YYDCYY
 * @create 2019-10-08
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testException")
    public String testException() throws SysException {
        System.out.println("testException 执行了... ");

        try {
            int a = 10 / 0;
        } catch (Exception e) {
            e.printStackTrace();
            throw new SysException("查询所有用户出现错误了...");
        }
        return "success";
    }
}

模拟一个错误, 调用自己的错误处理类 “SYSException”

SYSException
/**
 *
 * 自定义异常类
 * @author YYDCYY
 * @create 2019-10-08
 */
public class SysException extends Exception{
    private String message;

    public SysException(String message) {
        this.message = message;

    }
    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
SysException.java
/**
 *  处理异常业务逻辑
 * @param httpServletRequest
 * @param httpServletResponse
 * @param handler
 * @param ex
 * @return
 */
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {
    // 获取到异常对象
    SysException e = null;
    if (ex instanceof SysException){
        e = (SysException) ex;
    }else
        e = new SysException("系统维护中呢....");

    // 创建ModelAndView对象
    ModelAndView mv = new ModelAndView();
    mv.addObject("errorMsg", e.getMessage());
    mv.setViewName("error");
    return mv;
}

注: 结果提交至 request 域 ModelAndView

springmvc.xml
<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="com.yydcyy.exception.SysExceptionResolver"/>

类似前端控制器, 不配置异常类咋起作用?

结果 Dmoe

image-20191008145106399

image-20191008145122639

说明 : 用户页面很友好, 控制台输出原因

4 SpringMVC拦截器之介绍和搭建环境

image-20191008170305671

拦截器中有 3 个方法 ① preHandle ② postHandle ③ afterCompletion

流程示意图

image-20191008151122026

拦截器执行步骤 : pre1 -> pre2 -> controller =>post2 -> post2 - > after2 -> after1

见 pdf 文档

拦截器可做的事, 过滤器都可以做; 过滤器做的事, 拦截器不一定能做

1 编写拦截器类, 实现 HandlerInterceptor.java 接口

2 配置拦截器

5 SpringMVC拦截器之编写controller

 @RequestMapping("/testInterceptor")
    public String testInterceptor(){
        System.out.println("testInterceptor执行了...");
        return "success";
    }

6 SpringMVC拦截器之拦截器入门代码

interceptor1
/**
 * @author YYDCYY
 * @create 2019-10-08
 */
public class MyInterceptor1 implements HandlerInterceptor {


    /**
     * 预处理,controller方法执行前
     *      * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     *      * return false不放行
     *     用于 eg : 登录时候预检测, 当前状态没登录, 跳转至登录页面类似这样
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1执行了...前1111");

        return true;
    }

    /**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     * eg : 用于退出后 跳转至登录页面等
     * @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("MyInterceptor1执行了...后1111");

    }

    /**
     * eg : 结束后资源释放等
     * @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("MyIntercept⁄or1执行了...最后1111");
    }
}
interceptor2
/**
 * @author YYDCYY
 * @create 2019-10-08
 */
public class MyInterceptor2 implements HandlerInterceptor {


    /**
     * 预处理,controller方法执行前
     *      * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     *      * return false不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1执行了...前2222");

        return true;
    }

    /**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     * @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("MyInterceptor1执行了...后2222");

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1执行了...最后2222");
    }
}
Springmvc.xml 配置拦截对象
 <!--配置拦截器-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的方法
            <mvc:exclude-mapping path=""/>
            -->
            <!--配置拦截器对象-->
            <bean class="cn.yydcyy.controller.cn.itcast.interceptor.MyInterceptor1" />
        </mvc:interceptor>

        <!--配置第二个拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <mvc:mapping path="/**"/>
            <!--不要拦截的方法
            <mvc:exclude-mapping path=""/>
            -->
            <!--配置拦截器对象-->
            <bean class="cn.yydcyy.controller.cn.itcast.interceptor.MyInterceptor2" />
        </mvc:interceptor>
    </mvc:interceptors>

7 SpringMVC拦截器之拦截器接口方法演示

结果 Demo

image-20191008164256739

image-20191008164306878

多个拦截器时:(2 个 执行步骤见上面示意图) :

image-20191008165743406

image-20191008165832397

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值