过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符. 。
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
过滤器:
过滤器是Struts2的第一层控制器,请求对象首先被过滤器过滤。Struts2的过滤器有三个层次
说明:
具体流程:
1、服务器端提交请求,容器初始化HttpServletRequest请求对象;
2、请求的对象被一系列的Servlet过滤器过滤,其中FilterDispatcher过滤器是Struts2 API中提供的,这个必须使用;
3、 调用FilterDispatcher,FilterDispatcher调用ActionMapper,决定请求是否需要调用某个Action,如果需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy(Action代理);
4、ActionProxy通过Configuration Manager解析框架的配置文件,找到需要调用的Action,ActionProxy创建一个ActionInvocation的实例;
5、ActionInvocation实例使用命令模式回调Action中的execute方法,Action调用业务逻辑类完成业务逻辑。
6、Action执行完毕,ActionInvocation根据struts.xml中的配置找到对应的返回结果(被称为Result)。返回结果通常是Jsp
7、 在调用Action前后,将调用该Action涉及到的相关拦截器(Interceptor)
拦截器:
拦截器(Interceptor)是Struts2中第二个层次的控制器,在Action执行的前后运行一些Action类需要的通用功能。
使用:
1、使用拦截器前,必须先在struts.xml中定义拦截器,拦截器在
例如:
名词扩展:
拦截器栈(Interceptor Stack)类似于过滤器链。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器栈的拦截器就会按其之前定义的顺序被调用。这就像设计模式中的职责链,直到遇到一个满足条件的进行处理。
2、定义了拦截器或拦截器栈后,可以在Action中使用,通过
3、API中的拦截器都在struts-default.xml的struts-default包中定义
struts.xml中的Action都继承了struts-default.xml中的struts-default包,因此都默认使用struts-default包的默认拦截器栈,大多数情况下,需要保证任何Action都被struts-default包的默认拦截器引用拦截。
如果要自定义拦截器,首先必须定义拦截器,然后再Action中引用定义好的拦截器。
自定义拦截器注意:
1、自定义拦截器类需要实现Interceptor接口
2、主要覆盖接口中的intercept(ActionInvocation arg0)方法
3、intercept方法的参数ActionInvocation非常重要,其中的invoke可以调用下一个拦截器或者Action
Action:
1、Action是Struts2的第三个层次的控制器,需要程序员自行开发
2、Action是Struts2应用中使用数量最多的控制器
3、Action实现的功能与Servlet非常类似,然而,Action不是Servlet,仅仅是一个普通的Java类。
小结:
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序:过滤 - 拦截 - Action处理