概述
struts2里面封装了很多的功能,有很多的拦截器,但不是每次这些拦截器都执行,每次只是执行默认的拦截器。
拦截器的位置:
拦截器什么时候执行?
在action对象创建之后,在action里面的方法执行之前
拦截器底层原理
第一个aop思想
aop是面向切面(方面)变成,有了基本功能,如果要扩展的话,不通过修改源代码方式扩展功能。
责任链模式
在java中有很多的设计模式,责任链模式就是其中的一种。责任链模式和过滤链很相似。
责任链模式:比如要执行多个操作,有添加、修改、删除三个操作,首先执行添加操作,添加执行之后,做类似放行操作;才执行修改操作,修改操作执行完成之后做类似放行操作后才执行删除操作。
过滤器:一个请求可以有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器。
aop思想和责任链模式如何应用到拦截器里面的?
拦截器在action对象创建之后,action中的方法执行之前执行;在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件进行操作,在执行拦截器的时候,执行很多的拦截器,这个过程使用责任链模式。
加入执行是哪个拦截器,执行拦截器1,执行之后做放行操作,执行拦截器2,执行之后放行,执行拦截器3,执行之后放行,才执行action中的方法。
重要概念
过滤器和拦截器的区别
过滤器:过滤理论上的任意内容,如HTML,jsp,servlet,图片路径等。
拦截器:拦截器只会拦截action。
servlet和action的区别
servlet默认第一次访问时创建,创建一次,单实例对象。
action每次访问都会创建,创建多次,多实例对象。
自定义拦截器
在开发中,建议使用另一种方式写类:继承MethodFilterInterceptor类实现,让action里面的某个方法不进行拦截。
让拦截器和action有关系,不是在action中调用拦截器的方法,而是通过配置文件方式让他们建立关系。
自定义登录拦截器(前期准备工作)
需求:在项目中,有很多action的超链接,实现只有事登录的状态,才可以点击action的超链接实现功能,如果不是登录状态,点击超链接返回到登录页面。
登录状态:使用session域对象实现
(1)登录成功之后,把数据放到session里面
(2)判断session是否有值,可以知道是否是登录状态斜体样式
A:定义登录页面,跳转到指定的action
B:定义登录方法
C:获取request对象中的用户名,并跳转到指定页面,然后将数据封装到session中
D:添加登录拦截器
(1)判断是否登录,判断session中是否有username的值
实现过程:
创建类,让他集成MethodFilterInterceptor类
重写MethodFilterInterceptor里面的方法写拦截器逻辑
配置action和拦截器的关系(注册拦截器)
(1)在要拦截的action标签所在的package标签里面声明拦截器
(2)在具体的action标签里面声明拦截器
(3)struts2中会执行很多默认的拦截器,如果在action里面配置了自定义的拦截器,则默认拦截器就不执行了,但是我们会用到默认拦截器中的内容。
解决方案:把默认拦截器手动使用一次。
配置的拦截器会对action中的所有方法都进行拦截,所以当我们执行不是我们配置的拦截器中要拦截方法时,则会被拦截器拦截
解决方案:让拦截器对这些方法不拦截。
直接通过配置的方式让action中的某些方法不进行拦截。
**如果是登录状态,就直接到登录成功的页面,如果不是登录状态,会跳转到登录页面,但是登录成功之后会出现问题:页面嵌套的情况 **
解决办法:页面设置打开位置,在提交数据的form表单中添加属性target(_parent:和父类对其)