一、拦截器概述
1.Struts2是一个框架,Struts2里面封装的功能都放在拦截器里面
2.Struts2里面封装了很多的功能——很多拦截器,但这些拦截器不是每次都执行的,每次执行的是默认的拦截器。
3.Struts2里面默认拦截器的位置
4.拦截器在什么时候执行?
-
拦截器在action对象创建之后,action的方法执行之前进行执行
二、拦截器底层原理(2个)
(1)aop思想:面向切面(方面)编程。有基本功能,想扩展功能,但不通过修改源代码方式扩展功能;
后面再spring里把安排做更深层次的分析。
(2)责任链模式
(1)在Java中有很多的设计模式,责任链模式是其中的一种;
(2)责任链模式和过滤链很相似的
过滤链:一个请求可以有多个过滤器进行过滤,每个过滤器只有进行放行操作才能到后面的过滤器;
责任链模式:要执行多个操作,有添加、修改、删除三个操作。
首先执行添加操作,添加操作执行之后做类似于放行的操作——>执行修改操作,修改操作执行之后做类似放行的操作——>执行删除操作。
- aop思想和责任链模式如何应用到拦截器里面?
(1)文字描述:拦截器在action对象创建之后,action的方法执行之前执行
——在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作。
——在执行拦截器的时候,执行很多的拦截器,这个过程使用责任链模式;
——加入执行三个拦截器,执行拦截器1,执行完之后放行——>执行拦截器2,执行完后放行——>执行拦截器3,完成之后放行—>执行action方法。
(2)画图分析:
3.查看源代码
(1)执行action
(2)创建action对象,使用动态代理方式
(3)执行action的方法
(4)执行很多的拦截器,遍历执行
类似于放行的操作方法:
三、重要的概念
1.过滤器和拦截器区别
(1)过滤器:理论上可以过滤任意内容,比如HTML、jsp、servlet、图片路径等;
(2)拦截器:拦截器只拦截action
2.Servlet和action的区别
(1)servlet默认第一次访问时创建,创建一次——单实例对象
(2)action每次访问时都创建,创建多次——多实例对象
四、自定义拦截器
1.在Struts2里面有很多的拦截器,这些拦截器是Struts2封装的功能,但是在实际开发中,Struts2里面的拦截器中可能没有我们要使用的功能,这个时候需要自己写拦截器实现功能。
2.拦截器结构
(1)查看源代码看拦截器结构:
继承类:
在接口里面有三个方法:初始化、销毁、拦截
(2)在开发中,建议使用:
——写类,并继承MethodFilterInterceptor类来实现自定义构造拦截器
——让action里面某个的方法不进行拦截
(3)让拦截器和action有关系
——不在action里面调用拦截器的方法,而是通过配置文件的方式来建立关系
案例:自定义登录拦截器
(1)需求:在项目中,有很多的action的超链接,实现只有是登录的状态,才可以点击action的超链接实现功能,如果不是登录状态,点击action超链接返回到登录页面
(2)登录的状态:使用session域对象实现
——登录成功之后,把数据放到session里面
——判断session是否有值,可以知道是否是登录状态
(3)实现登录的基本功能
——查询数据库判断用户名和密码
(4)添加登录拦截器功能
——判断是否登录:判断session里面是否有名称是username的值
——拦截器的实现过程:
第一步:创建类,集成MethodFilterInterceptor类
第二步:重写MethodFilterInterceptor类里面的方法,写拦截器逻辑
第三步:配置action和拦截器关系(注册拦截器)
——在要拦截器的action标签所在的package标签里面声明拦截器
——在具体的action标签里面使用声明的拦截器
——Struts2里面执行很多的默认拦截器,但是如果action里面配置自定义拦截器
问题:默认的拦截器不会执行了?——解决:把默认拦截器手动使用一次
上述三个:
(5)配置拦截器,对action里面所有的方法都进行拦截
——在action里面有login的登录方法,这个方法不需要拦截,如果这个方法都拦截,问题是,永远登录不进去了。
——解决:让login方法不进行拦截;直接通过配置的方式让action里面某些方法不被拦截
(6)<form target="_parent"> :设置打开的位置
待续。