Java基础知识——SpringMVC(异常处理,拦截器)

 两者都不会重启程序
 热加载:依赖java的类加载机制,在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。主要作用于服务器
  热部署:使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader。这样在有代码更改时,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader。

异常处理:
在这里插入图片描述
如果没有定义异常处理器:出现异常,直接打印到用户页面上
有:
1:编写自定义异常类
public class SysException extends Exception ()

2:编写异常处理器
public String testException() throws Exception(){
try{
//模拟异常
int a=10/0;
}
catch(Exception e){
throw new SysException(“error”);
}
}

3:配置异常处理器
因为在handler中直接抛出错误,所以需要在异常处理器中设置ModelAndView
extends Exception
4:web.xml配置

拦截器:
参考资料
和过滤器的区别:
1:拦截器只能springmvc用,过滤器java都能用
2:拦截器对静态资源不拦截,过滤器会拦截所有静态资源

应用场景
1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。
2、权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。
3、性能监控:典型的是慢日志。

实现HandlerInterceptor接口(JDK8后是默认静态方法,不用全部重写)
1:拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。
2:preHandle按顺序执行,postHandle和afterCompletion倒序执行
preHandle:handler处理前调用
return true:可以使用后续拦截器
return false:直接跳转到afterCompletion(可以理解preHandle,postHandle:handler返回false)

postHandle:handler处理后,视图解析前调用
1:只有所有preHandle都返回true才调用
2: handler没有抛出异常。否则直接调用afterCompletion

afterCompletion:视图解析后调用
只有对应的preHandle返回true才调用

源码分析:

HandlerExecutionChain由HandlerMethod和Interceptors构成
Interceptors是拦截器,表现为数组,根据xml文件中的定义顺序排行
preHander,postHandler,afterCompletion分别在HandlerExecutionChain的applyPreHandler,applyPostHandler,triggerAfterCompletion中

在这里插入图片描述

在这里插入图片描述
上述两张图为前端控制器的doDispatcher方法,可以抽象
try{
applyPreHandler()
handler()
applyPostHandler()
view()
}
catch(){

}
triggerAfterCompletion()

在这里插入图片描述
可以看到,一旦有一个preHandler返回false,直接调用triggerAfterCompletion。并且在doDispatcher中
IF(!MappedHandler.applyPreHandler())return;
即一旦返回false,直接结束方法
在这里插入图片描述
可以看到是完全遍历Interceptors数组,并且倒序遍历
在这里插入图片描述
可以看到是从this.interceptorIndex即第一个返回false或者length-1处开始倒序遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值