.Net转Java自学之路—Struts2框架篇四(拦截器)
拦截器概述:
1、在struts2框架中封装的很多功能都是在拦截器中。
2、在struts2中有很多拦截器,不是每次这些拦截器都回执行,每次执行的都是默认拦截器。
3、默认拦截器的位置在struts2-core.jar包中的struts-default.xml文件中可以找到。
4、拦截器执行:在action对象创建之后与action的方法执行之前执行。
原理:
拦截器底层主要使用俩个原理:AOP思想,责任链模式。
AOP思想:
AOP就是面向切面编程;如在基本功能的基础上扩展功能,不通过修改源代码的方式进行扩展。就是AOP思想。
责任链模式:
设计模式的一种,责任链模式和过滤链很相似。要一次性执行多个操作,而每个操作执行后都要执行类似于放行操作后,才能执行下一个操作。
过滤链:一个请求可以有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器。
类似于放行操作的方法:invocation.invoke();
拦截器在action对象创建以后,在action的方法执行之前执行。
在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action没有直接调用拦截器的方法,使用配置文件方式进行操作。在执行拦截器时,执行很多的拦截器,这个过程使用责任链模式。
过滤器和拦截器的区别:
过滤器:服务器启动时创建。过滤器理论上可以过滤任意内容。
拦截器:拦截器只可以拦截action。
自定义拦截器:
在Struts2中有很多的拦截器,这些拦截器是Struts2封装的功能,但在实际开发中,Struts2中的拦截器中可以没有要使用的功能,这时需要自定义拦截器来实现功能。
结构:
继承AbstractInterceptor类,该类实现了Interceptor接口。该接口中的三个方法:
init();初始化
destroy();销毁
String intercept(ActionInvocation invocation);拦截逻辑的方法
实现自定义拦截器的方式:
第一种方式:自定义拦截器时需要继承AbstractInterceptor或实现Interceptor即可。
第二种方式:自定义拦截器继承MethodFilterInterceptor来实现,让action中某个方法不进行拦截。重写拦截器逻辑方法doIntercept。并配置action和拦截器的关系(注册拦截器)。
如何让拦截器与action有关系:
不是在action中调用拦截器的方法,而是通过配置文件方式让它们建立关系。
配置步骤:
1、在要拦截的action标签所在的package标签中声明拦截器。
<interceptors> <interceptor name="selfname" class="自定义拦截器类的全路径"> </interceptor> </interceptors>
2、在具体的action标签中使用声明的拦截器。
<interceptor-ref name="声明拦截器的name"> </interceptor-ref>
3、Struts2中执行很多的默认拦截器,但如果在action中配置自定义拦截器,那么默认的拦截器就不会执行。需要把默认拦截器手动配置。在struts2配置文件的action标签下手动配置。手动配置默认拦截器:俩种方式
》将interceptor-stack中的默认拦截器重新写一遍。
》直接使用interceptor-stack的name属性defaultStack值。
<interceptor-ref name="defaultStack"> </interceptor-ref>
配置的拦截器会对action中所有的方法都进行拦截。因为在action中有部分方法不需要拦截,那么需要配置不拦截的方法。在使用拦截器配置interceptor-ref标签中配置不拦截的方法。
<interceptor-ref name="声明拦截器的name"> <param name="excludeMethods(忽略某些方法。该name值时固定的)">方法1,方法2(action不拦截的方法名称)</param> </interceptor-ref>
Struts2标签:
struts2的标签只能使用在JSP页面中。导入标签库:
<%@ taglib uri="/struts-tags" prefix="s"%>
s:property:与ognl表达式在jsp页面中获取值栈数据。
s:iterator:获取值栈list集合数据,表示list集合。
s:debug:查看值栈结构和数据。
表单标签:
在html中表单标签:
1、form(action、method、enctype)
2、输入项:大部分在input中封装 type="值"
text:普通输入项
password:密码输入项
radio:单选输入项
checkbox:复选输入项
select:下拉输入项
textarea:文本域
file:文件上传项
hidden:隐藏项
button:普通按钮
submit:提交按钮
image:图片提交
reset:重置
在Struts2中对应html表单标签大部分都有,标签中多有label属性。
form >> s:form(action、method、enctype)
输入项:
text >> s:textfield:普通输入项
password >> s:password:密码输入项
radio >> s:radio:单选输入项
<s:radio list="{'男','女'}" name="sex" label="性别"></s:radio><!-- 该情况显示值和value值相同 --> <s:radio list="#{'0':'男','1':'女'}" name="sex" label="性别"></s:radio><!-- 该情况显示值和value值不同 -->
checkbox s:checkboxlist>> :复选输入项
select >> s:select:下拉输入项
textarea >> s:textarea:文本域
file >> s:file:文件上传项
hidden >> s:hidden:隐藏项
submit >> s:submit:提交按钮
reset >> s:reset:重置
<s:submit value="提交"></s:submit> <s:reset value="重置"></s:reset>