您现在的位置是:首页 > 编程 > 

SpringMVC之和异常处理

2025-07-29 10:09:54
SpringMVC之和异常处理 第四章 和异常处理 本章内容异常处理 第一节:javaWeb: 三大组件为servlet、filter 、listenerfilter: 1.filter接口 2.实现这个接口的过滤器应用:字符编码过滤,登录过滤,敏感字符过滤,日志记录listener: 1. SpringMVC的简介 Spring MVC中的(Inter

SpringMVC之和异常处理

第四章 和异常处理

本章内容

异常处理

第一节:

javaWeb: 三大组件为servlet、filter 、listener

filter: 1.filter接口 2.实现这个接口的过滤器

应用:字符编码过滤,登录过滤,敏感字符过滤,日志记录

listener:

1. SpringMVC的简介

Spring MVC中的(Interceptor),它主要用于拦截用户请求并作相应的处理。例如通过可以进行​权限验证​、记录​请求信息的日志​、​判断用户是否登录​等。要使用Spring MVC中的,就需要对类进行定义和配置。

Filter过滤器:

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集、控制权限、控制转向、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Respe)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行​预处理​,也可以对HttpServletRespe进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

Filter有如下几个用处

  • 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
  • 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
  • 在HttpServletRespe到达客户端之前,拦截HttpServletRespe。
  • 根据需要检查HttpServletRespe,也可以修改HttpServletRespe头和数据。 Filter有如下几个种类。
  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
  • 日志Filter:详细记录某些特殊的用户请求。
  • 负责解码的Filter:包括对非标准编码的请求解码。
  • 能改变XML内容的XSLT Filter等。
  • Filter可以负责拦截多个请求或响应;一个请求或响应也可以被多个Filter拦截。
Interceptor:

只会拦截jsp之外的请求。.html

三层架构:表现成(jsp+Controller),持久层(pojo + dao),业务层(service==>在项目中的体现 在加一个包 service);

是在​面向切面编程中应用的​(AOP),就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的​反射机制​。,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,

第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;

第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

2. 实现方式

springMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。

实现了Spring 的​HandlerInterceptor​ 接口或者继承实现了HandlerInterceptor 接口的(比如抽象类HandlerInterceptorAdapter )。

HandlerInterceptor 接口简介

HandlerMapping

HandlerAdapter

HanderItercepter

HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。

(1)preHandle (HttpServletRequest request, HttpServletRespe respe, Object handle) :该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式的调用的,每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法。该方法的返回值是布尔值Boolean类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个。

(2)postHandle (HttpServletRequest request, HttpServletRespe respe, Object handle, ModelAndView modelAndView) 方法:是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行

()afterCompletion(HttpServletRequest request, HttpServletRespe respe, Object handle, Exception ex) 方法:将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的

实现步骤:
  • 配置文件配置 <!--配置--> <mvc:interceptors> <!--1--> <mvc:interceptor> <mvc:mapping path="/要拦截的请求路径"/> <mvc:exclude-mapping path="/放行路径"></mvc:exclude-mapping> <bean class="自定义的全限定名"></bean> </mvc:interceptor> <!--2--> <mvc:interceptor> <mvc:mapping path="/要拦截的请求路径"/> <mvc:exclude-mapping path="/放行路径"></mvc:exclude-mapping> <bean class="自定义的全限定名"></bean> </mvc:interceptor> </mvc:interceptors>
  • 自定义类实现​HandlerInterceptor​ 接口
  • 根据自己的需求详细的实现​preHandle​方法
.执行链

请求----》1 prehandle方法----》2的prehandle方法—》的prehandle方法----》执行当前请求的controller中的方法----》的posthandle方法----》2的posthandle方法----》1 posthandle方法—>

执行afterCompletion方法–>执行2的afterCompletion方法–>执行1的afterCompletion方法–》结束!

4.登录拦截案例

------>见课堂代码 interceptor_exception项目。

第二节:统一异常处理

目的:就是让客户在使用程序期间,如果出现错误了,会有一个友好的页面显示,不会再出现大堆的 异常错误信息。

异常:程序运行期间,或者程序编码期间可能出现的错误。

异常的继承体系

throwable : 异常的顶级父类

Error:错误

Exception: 异常

RuntimeException:

空指针,类转换,数组下标越界,算术。。。

非运行时:编译期异常

IO异常,格式化异常。。。sql异常

异常的处理:

抛出异常:

throws 方法的尾部追加异常种类,s复数,肯定是方法后.

代码中: throw new 异常种类(msg);

捕获异常:

try{ 可能出现异常的代码} catch (异常的种类){打印异常信息} finally{一定会执行的代码}。

自定以异常:

要求:所有的异常都要处于异常的继承体系之下。

说明我们自己的异常要继承已经存在的jdk内部的异常。一般继承 Exception。

1.统一异常处理思路分析:
SpringMVC之和异常处理_maven
SpringMVC之和异常处理_maven_02
2.自定义异常类
代码语言:javascript代码运行次数:0运行复制
package com.;
/**
 * 自定义异常类要处于异常的继承体系之下
 */
public class ErrorException extends Exception{
    public ErrorException(){
        super();
    }
    public ErrorException(String message){
        super(message);
    }
}

改造Controller:

代码语言:javascript代码运行次数:0运行复制
@RequestMapping("getUser")
    public String getUser() throws Exception{
        try {
            int a = 1/0;
        } catch (Exception e) {
            e.printStackTrace();
            throw  new Exception("出错了,请联系管理员!1111");
        }
        return "success";
    }

在第一步和第二步完毕之后,大家可以做个​测试​,这个测试是测试我们500的错误,500错误已经变成自己的Execption信息。

.自定义异常处理器

在SpringMVC里面,叫HandlerExceptionResolver

代码语言:javascript代码运行次数:0运行复制
package com.;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRespe;
/**
 * 自定义异常处理器
 * 必须要实现这个接口
 * HandlerExceptionResolver
 */
public class ErrorExceptionResolver implements HandlerExceptionResolver {
    /**     
     * @param httpServletRequest
     * @param httpServletRespe
     * @param o
     * @param  e 此参数 表示的就是异常处理器捕获到的异常。
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletRespe httpServletRespe, Object o, Exception e) {
        /*因为,此方法接收到的异常直接就是Exception父类异常,
            直接使用父类异常无法取出我们自己抛出的子类异常信息
            所以需要做一个强转,将这个Exception 类型的e 转换成我们自己抛出的ErrorException异常
        */
        ErrorException exception;
        //判断e是否是ErrorException子类异常,或者同类异常
        if(e instanceof ErrorException){
            exception = (ErrorException) e;
        }else{
            exception = new ErrorException("出错了,请联系管理员!2222");
        }
        //通过此ModelAndView对象,让客户端显示一个友好的错误页面
        ModelAndView mv = new ModelAndView();
        mv.setViewame("error");
        mv.addObject("msg",exception.getMessage());
        return mv;
    }
}
4.配置异常处理器
代码语言:javascript代码运行次数:0运行复制
<!--配置异常处理器-->
<bean id="唯一标识" class="自定义异常处理器的全限定名"></bean>

不这样是否可以???之前看到一些自定义的bean,都可以使用Spring注解托管,我们这里用的是

在第三步类前面加了个@Component。

5.观察结果显示
SpringMVC之和异常处理_jar_0

调试二

注意:原来出现异常之后,在页面上用户会看到一堆堆的500、404的错误信息,用户体验不好。我们可以自定义错误页面信息,UI体验效果会更好。

在登录页面,加异常处理.

异常处理器的全限定名">

代码语言:javascript代码运行次数:0运行复制
不这样是否可以???之前看到一些自定义的bean,都可以使用Spring注解托管,我们这里用的是

在第三步类前面加了个@Component。

#### 5.观察结果显示



**调试二**

注意:原来出现异常之后,在页面上用户会看到一堆堆的500、404的错误信息,用户体验不好。我们可以自定义错误页面信息,UI体验效果会更好。

在登录页面,加异常处理.
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2022-04-06,如有侵权请联系 cloudcommunity@tencent 删除继承接口配置异常异常处理

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1271572.html

相关标签:无
上传时间: 2025-07-29 02:28:37
留言与评论(共有 15 条评论)
本站网友 寿险的意义
9分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看继承接口配置异常异常处理
本站网友 手术缝合线
1分钟前 发表
比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ; 第二种方式是实现Spring的WebRequestInterceptor接口
本站网友 利是是什么意思
19分钟前 发表
Object handle
本站网友 福州中瑞国际影城
19分钟前 发表
要使用Spring MVC中的
本站网友 四川绵阳美食
3分钟前 发表
UI体验效果会更好
本站网友 智能安保机器人
18分钟前 发表
请联系管理员!2222"); } //通过此ModelAndView对象
本站网友 剧本怎么写
5分钟前 发表
或者是这个类继承实现了HandlerInterceptor 接口的类
本站网友 酵母片的作用
1分钟前 发表
我们就是通过这三个方法来对用户的请求进行拦截处理的
本站网友 保险费用
7分钟前 发表
Filter有如下几个用处在HttpServletRequest到达Servlet之前
本站网友 锦绣阳光花园
2分钟前 发表
mapping path="/要拦截的请求路径"/> <mvc
本站网友 上海婚纱店
16分钟前 发表
使用Filter完整的流程是:Filter对用户请求进行预处理
本站网友 九制陈皮
6分钟前 发表
数组下标越界
本站网友 281公里
29分钟前 发表
日志记录listener
本站网友 儿童预防接种证
10分钟前 发表
HttpServletRespe respe