- 浏览: 1035793 次
文章分类
最新评论
-
cjh_android:
我想你是对的,至少对于现实是对的,不过对于技术岗位竞争越来越激 ...
程序员的思考--终于确定了自己的技术发展方向 -
dongbiying:
现在情况如何 。。
创业,不能兼职 -
jackyrong:
ie 9 下时,老显示关闭窗口提示,有办法去掉么,就是关闭掉那 ...
jquery右下角弹窗效果 -
lmaxjj:
加点班如果都称得上是累,只能说明还没体会到真正的生活。。
IT男的进化论 -
馨雨轩:
IT男要进化需要先穿越
IT男的进化论
Struts2 中拦截器配置一般都是在 struts.xml 配置文件中。笔者自己编写三个拦截器类,通过在 struts.xml 配置文件中定义,查看运行效果,介绍自定义拦截器的执行顺序和配置文件中遵行的配置原理。
4.3.1 扩展拦截器接 口的自定义拦截器配置
技术要点
本节代码介绍拦截器基础配置以及设置参数功能。
= 配置文件 struts.xml 中如何定义拦截器。
= Action 配置中拦截器参数定义和注意点。
= 拦截器参数的设置和配置修改过程。
演示代码
<!------------------------------------------- 文件名: ExampleInterceptor.java-------------------------------->
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class ExampleInterceptor implements Interceptor {
// 设置新参数
private String newParam;
public String getNewParam() {
return newParam;
}
public void setNewParam(String newParam) {
this.newParam = newParam;
}
public void destroy() {
System.out .println("end doing...");
}
// 拦截器初始方法
public void init() {
System.out .println("start doing...");
System.out .println("newParam is:"+newParam);
}
// 拦截器拦截方法
public String intercept(ActionInvocation arg0) throws Exception {
System.out .println("start invoking...");
String result = arg0.invoke();
System.out .println("end invoking...");
return result;
}
}
拦截器映射配置。
<!------------------------------------------- 文件名: struts.xml-------------------------------->
<!-- 拦截器配置定义 -->
<interceptors>
<interceptor name="example"
class="com.example.struts.interceptor.ExampleInterceptor">
<!-- 参数设置 -->
<param name="newParam">test</param>
</interceptor>
</interceptors>
<!-- Action 名字,类以及导航页面定义 -->
<!-- 通过 Action 类处理才导航的的 Action 定义 -->
<action name="Login"
class="com.example.struts.action.LoginAction" >
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/success.jsp</result>
<!-- Action 中拦截器定义 -->
<interceptor-ref name="example">
<!-- 改变拦截器参数值 -->
<param name="newParam">example</param>
</interceptor-ref>
</action>
执行效果如图 4.2 所示。
图 4.2 执行拦截器后效果
参数值显示如图 4.3 所示。
图 4.3 newParam 参数值显示图
代码解释
( 1 )先看 struts.xml 文件,在文件开始以 <interceptors> 开头, </interceptors> 结尾形式定义了拦截器,该拦截器命名为 example ,映射的类文件路径写在 class 属性中。在 <Action> 中 <result> 标签后,可以定义只在该 Action 执行时候会拦截的拦截器定义,其实就是调用在 <Action> 前定义的 example 拦截器。并且还可以以 <param> 标签定义拦截器属性。
( 2 ) <param> 标签定义拦截器属性,或者称为参数。 param 其实就是英语中参数缩写形式。 name 是参数名,而在 <param></param> 间的内容就是该定义的参数值。
注意:如果在 <Action> 中和 <Action> 外都定义 <param> 的值,比如在本实例中 <Action> 中 newParam 值为“ example ”, <Action> 外 newParam 值为“ test ”。而在运行时候显示的还是 <Action> 中的参数值,即“ example ”。显示如图 4.3 。可以理解为屏蔽了 <Action> 外参数值,因此如果定义多个 Action ,每个 Action 都调用了 example 拦截器,则都可以自定义自己的 newParam 的值了。如果不定义的话,那显示的就是“ test ”,否则就是各自定义的 newParam 值。
( 3 )再来看看 ExampleInterceptor 类代码, newParam 是它的一个私有变量属性,有自己的 setter 、 getter 方法。而且它扩展了 Interceptor 接口,该接口是 Struts2 的类库中自带的接口类。重写 interceptor 方法,用 invoke 方法执行 Action ,在 Action 前后执行两个打印方法。
启动服务器后,在网页上显示登录页面,单击“登录”,然后在 MyEclipse 的控制台下就可以看见如图 4.2 显示的效果图。如果读者能看见这两行字被打印出来,就说明 example 拦截器拦截 Login Action 成功。
4.3.2 继承抽象拦截器的自定义拦截器配置
技术要点
本节代码介绍抽象拦截器配置并对缺省拦截器栈做简单介绍。
= 继承抽象拦截器类的自定义拦截器类编写方式。
= 配置文件 struts.xml 中如何定义缺省拦截器。
演示代码
<!------------------------------------------- 文件名: ExampleInterceptor.java-------------------------------->
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class ExampleInterceptor extends AbstractInterceptor {
// 重写抽象拦截器的拦截方法
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out .println("start invoking2...");
String result =arg0.invoke();
System.out .println("end invoking2...");
return result;
}
}
拦截器映射配置。
<!------------------------------------------- 文件名: struts.xml-------------------------------->
<struts>
<!-- Action 所在包定义 -->
<package name="C04.3.2" extends="struts-default">
<!-- 拦截器配置定义 -->
<interceptors>
<interceptor name="example"
class="com.example.struts.interceptor.ExampleInterceptor">
</interceptor>
<!--
拦截器栈配置定义
<interceptor-stack name="exampleStack">
<interceptor-ref name="example"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
-->
</interceptors>
<action name="Login"
class="com.example.struts.action.LoginAction">
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/success.jsp</result>
<!-- Action 拦截器配置定义 -->
<interceptor-ref name="example"></interceptor-ref>
<!-- Action 拦截器栈配置定义 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
拦截器执行效果如图 4.4 所示。
图 4.4 执行拦截器后效果
拦截器栈执行效果如图 4.5 所示。
图 4.5 缺省拦截器栈中包含的校验拦截器执行
代码解释
( 1 ) ExampleInterceptor 类中,继承 AbstractInterceptor 抽象类。读者可以查看 struts2 的源代码,在 AbstractInterceptor 中只有 intercept 这一个抽象方法。因此自定义的 ExampleInterceptor 中只需要对这个方法进行重写。重写内容和 4.3.1 小节类似。
( 2 ) struts.xml 配置文件中,在 <Action> 前还是如 4.3.1 定义名为“ example ”的拦截器。在 <Action> 中,配置“ example ”拦截器。
注意:在 <Action> 中还配置了“ defaultStack ”拦截器栈,这是因为如果在 <Action> 中不配置该拦截器栈,则 Login.action 运行时候只会执行配置的“ example ”拦截器,不会执行“ defaultStack ”拦截器栈。而且“ defaultStack ”是 Struts2 配置的缺省拦截器栈,在 4.1 小节中的 struts-default.xml 中定义的拦截器都是由它来调用执行。 Struts2 规定如果在 <Action> 中 , 开发人员配置了自己定义的拦截器或拦截器栈,不显式在 struts.xml 配置文件中配置“ defaultStack ”拦截器栈,则所有 struts-default.xml 中定义的拦截器都不会执行即不执行“ defaultStack ”拦截器栈。当然如果在 <Action> 中开发人员没有配置自己定义的拦截器或拦截器栈,就算不显示配置“ defaultStack ”拦截器栈,则“ defaultStack ”拦截器栈是会执行的。
( 3 )为了让 Action 被执行时候,“ defaultStack ”拦截器栈和“ example ”的拦截器都执行,一种办法是如上代码所示。另一种办法也可以如 struts.xml 配置文件中被注释的那段自定义的拦截器栈配置。在 4.1 小节中也说过拦截器栈中可以配置拦截器栈,因此在注释中“ defaultStack ”拦截器栈可以作为配置的“ exampleStack ”拦截器栈的子元素。在 <Action> 中配置代码可以写成如下代码中黑体所示:
<!------------------------------------------- 文件名: struts.xml-------------------------------->
<action name="Login"
class="com.example.struts.action.LoginAction">
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/success.jsp</result>
<!-- Action 拦截器栈配置定义 -->
<interceptor-ref name="exampleStack"></interceptor-ref>
</action>
这样的代码形式也能保证“ defaultStack ”拦截器栈和“ example ”的拦截器都执行。例如在登录页面不输入任何登录信息,单击“登录”按钮。在 MyEclipse 的控制台下,执行结果如图 4.4 所示。而在页面中显示如图 4.5 ,“ defaultStack ”拦截器栈中包含的输入校验拦截器执行,显示拦截后的信息。这两张图就充分证明了“ defaultStack ”拦截器栈和“ example ”的拦截器都已经执行。
4.3.3 继承方法拦截器的自定义拦截器配置
技术要点
本节代码介绍方法拦截器配置并对缺省拦截器栈对整个 Web 项目的 Action 影响进行介绍。
= 继承方法拦截器类的自定义拦截器类编写方式。
= 配置文件 struts.xml 中如何定义方法拦截器和其属性。
= 对所有 Action 配置拦截器和拦截器栈。
演示代码
<!------------------------------------------- 文件名: ExampleInterceptor.java-------------------------------->
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class ExampleInterceptor extends MethodFilterInterceptor {
// 重写方法拦截器拦截方法
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out .println("start invoking3...");
String result = arg0.invoke();
System.out .println("end invoking3...");
return result;
}
LoginAction 中增加了 method 方法
<!------------------------------------------- 文件名: LoginAction .java-------------------------------->
public String method()throws Exception {
FORWARD = "success";
return FORWARD ;
}
拦截器映射配置。
<!------------------------------------------- 文件名: struts.xml-------------------------------->
<struts>
<!-- Action 所在包定义 -->
<package name="C04.3" extends="struts-default">
<!-- 拦截器配置定义 -->
<interceptors>
<interceptor name="example"
class="com.example.struts.interceptor.ExampleInterceptor">
</interceptor>
</interceptors>
<!--
缺省拦截器栈配置定义
<default-interceptor-ref name="example"></default-interceptor-ref>
-->
<!-- Action 名字,类以及导航页面定义 -->
<!-- 通过 Action 类处理才导航的的 Action 定义 -->
<action name="Login"
class="com.example.struts.action.LoginAction" method="method" >
<result name="input">/jsp/login.jsp</result>
<result name="success">/jsp/success.jsp</result>
<!-- Action 方法拦截器配置定义 -->
<interceptor-ref name="example">
<!-- 被拦截方法配置定义 -->
<param name="includeMethods">method</param>
<!-- 不被拦截方法配置定义 -->
<param name="excludeMethods">method,execute</param>
</interceptor-ref>
</action>
</package>
</struts>
“ includeMethods ”配置后的拦截器执行效果如图 4.6 所示。
图 4.6 执行方法拦截器后效果
“ includeMethods ”和“ excludeMethods ”同时配置后的拦截器执行效果如图 .7 所示。
图 4.7 method 方法还是被拦截器拦截
代码解释
( 1 ) ExampleInterceptor 类中,继承 MethodFilterInterceptor 抽象类。读者也可以查看 struts2 的源代码,在 MethodFilterInterceptor 中也只有一个抽象方法,但该抽象方法名为“ doIntercept ”。也对这个方法进行重写。重写内容和 4.3.1 小节类似。
( 2 ) LoginAction.java 中又定义了一个名为“ method ”方法,在 struts.xml 配置文件中,因为 LoginAction 中有 execute 方法,又有 method 方法,因此在 <Action> 中,请读者注意 struts.xml 中黑体部分,该部分代码表示现在 LoginAction 只执行 method 方法,而 execute 方法不被执行。笔者在 <Action> 中增加了一个“ method ”属性,该属性中“ = ”后面的内容是 Action 中具体方法名,如果不写“ method ”属性, Action 是缺省执行 execute 方法。如果写了“ method ”属性, Action 就执行“ = ”后写的具体方法。而不会执行 execute 方法。“ example ”拦截器还是如之前在 <Action> 前定义。在 <Action> 中配置“ example ”拦截器,笔者增加了“ includeMethods ”和“ excludeMethods ”两个 param 属性定义。“ includeMethods ”表示的是被拦截器拦截的方法。方法名写在 <param> 和 </param> 之间,如果有多个方法开发人员需要拦截器拦截,则方法名之间以“,”相隔。“ excludeMethods ”表示的是不被拦截器拦截的方法。如果有多个方法,也是以“,”相隔。
注意:如 struts.xml 配置文件中代码所示。假设
<param name="excludeMethods">method,execute</param>
这行代码被注释,则运行后在 MyEclipse 的控制台中看见是如图 4.6 的运行后效果。这说明 method 方法被拦截。如果
<param name="includeMethods">method</param>
这行代码被注释,则 MyEclipse 的控制台中是没有任何拦截器拦截信息显示。说明 method 没有被拦截器拦截即拦截器没有执行。
但是如 struts.xml 配置文件中代码显示,上述两行代码都没有被注释,读者有时候会不知道 method 方法到底是被拦截器拦截还是不被拦截。其实运行后的效果如图 4.7 所示。这说明 method 方法在两个属性中都被定义, Struts2 认为 method 方法还是被拦截的。
( 3 )请读者注意 struts.xml 配置文件中, <Action> 前被注释的 <default-interceptor-ref > 定义。该标签表示的是所有 Action 都会执行的拦截器或拦截器栈的定义。之前的代码中对于拦截器的定义是在 <Action> 前,拦截器的配置都是在 <Action> 中,比如“ example ”拦截器只有在 LoginAction 执行时候才会去拦截。如果是配置 <default-interceptor-ref > 中,则不管是 LoginAction 还是其他 struts.xml 配置文件中定义的 Action 都会被“ example ”拦截。在 <default-interceptor-ref > 中,也可以配置拦截器栈。如 4.3.2 小节中的“ exampleStack ”拦截器栈如果在 <default-interceptor-ref > 中配置,则所有 Action 执行时候,“ exampleStack ”拦截器栈都会执行该栈中包含的拦截器。
注意: struts.xml 配置文件中要么没有 <default-interceptor-ref > 定义,如果定义了也只能定义一次。该标签在 struts.xml 配置文件中只能写在 <Action> 前,而且只能写一次。不能重复定义它。
更多信息请查看 java进阶网 http://www.javady.com/index.php/category/thread
发表评论
-
Struts之拦截器
2012-05-16 17:16 1525今天看了看拦截器,不由得想对拦截器做个描述,在我们进 ... -
struts第一篇:struts诞生记
2012-04-23 22:29 1120Struts是一个开源框架,学Struts有一段时间 ... -
Struts2教程 - 5.4.4 debug标签使用介绍
2012-04-16 21:23 1046技术要点 本节代码具体介绍 debug 数据 标签的使 ... -
Struts2教程 - 5.4.3 date标签使用介绍
2012-04-16 21:23 1160技术要点 本节代码具体介绍 date 数据 标签的使用 ... -
Struts2教程 - 5.2 OGNL表达式语言介绍
2012-04-14 21:15 2133在进行 Struts2 的标签库介绍之前,有必要着重对 ... -
Struts2教程 - 4.1 拦截器在Struts2中的缺省应用
2012-04-09 10:11 1125通过前几章介绍,读者应该明白在 Web 项目中,客户先在视图界 ... -
Struts2教程 - 使用Action类控制导航业务数据
2012-04-09 10:10 1258Struts2 中 Action 充当着一个关键的角色。它解决 ... -
Struts2教程 - 3.4 使用ActionSupport进行校验
2012-04-08 09:04 1566如果 From 数据操作有误,比如输入不是我们需要的数据, ... -
Struts2教程 - 3.3使用Action类控制导航业务数据
2012-04-08 09:04 1156Struts2 中 Action 充当着一个关键的角色。 ... -
Struts2教程 - 5.4.8--10 url标签使用介绍
2012-04-16 21:24 10435.4.8 url 标签使用介绍 ... -
Struts2教程 - 5.4.6-7push、set标签使用介绍
2012-04-16 21:23 1195技术要点 本节代码具体介绍 push ... -
Struts2教程 - 5.4.5 include标签使用介绍
2012-04-16 21:23 1228技术要点 本节代码具体介绍 inclu ... -
Struts2教程 - 5.4.4 debug标签使用介绍
2012-04-17 23:46 1035技术要点 本节代码具体介绍 debug ... -
Struts2教程 - 5.4.3 date标签使用介绍
2012-04-17 23:46 1125技术要点 本节代码具体介绍 date ... -
Struts2教程 - 5.4.2 bean标签使用介绍
2012-04-15 22:57 862技术要点 本节代码具体介绍 bean ... -
Struts2教程 - 5.4.1 action标签使用介绍
2012-04-15 22:57 1151技术要点 本节代码具体介绍 actio ... -
Struts2教程 - 5.3.7 subset标签使用介绍
2012-04-15 22:57 11855.3.7 subset 标签使用介绍 ... -
Struts2教程 - 5.3.5-6 merge、sort标签使用介绍
2012-04-15 22:57 10695.3.5 merge 标签使用介绍 ... -
Struts2教程 - 5.3.4 iterator标签使用介绍
2012-04-14 21:14 1102技术要点 本节代码具体介绍 itera ... -
Struts2教程 - 5.3.3 if、else、elseif标签使用介绍
2012-04-14 21:14 1322技术要点 本节代码具体介绍 if 、 ...
相关推荐
- **拦截器(Interceptor)**:类似于AOP的切面,Struts2通过拦截器链来处理请求,可以添加自定义的拦截逻辑,如权限验证、日志记录等。 - **结果映射(Result Mapping)**:定义了Action执行后跳转到的页面或资源...
- **自定义拦截器**:开发者可以自定义拦截器,实现特定的功能。 - **自定义方法过滤拦截器**:根据Action的方法名来决定是否执行拦截器。 - **自定义结果监听器**:在Action执行后,监听其返回的结果,并进行相应的...
在 struts.xml 中配置自定义拦截器栈。 **4.3 文件上传与下载** - **文件上传**:利用 Struts2 的 FileUploadInterceptor 实现文件上传功能。 - **文件下载**:可以通过 Action 的响应流来实现文件下载。 #### 五...
Struts 2.3版本引入了许多改进,例如更强大的拦截器(Interceptor)机制,增强了自定义结果类型,以及对OGNL表达式语言的优化,使得视图和控制器之间的数据传递更为灵活。 Hibernate是一个流行的Java ORM(对象关系...
- 需要在`struts.xml`文件中配置自定义拦截器的使用。 - **4.4 Struts2文件上传拦截器应用** - **知识点**: 讨论了文件上传功能的实现方法。 - **核心内容**: - 文件上传通常涉及到文件的临时存储、大小限制等...
这包括自定义拦截器、结果类型等方面。 #### 五、Struts2标签库详解 ##### 5.1 标签库概述 Struts2提供了丰富的标签库,这些标签可以帮助开发者更方便地生成HTML代码,同时还能利用Struts2的强大功能。 ##### ...
4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的自定义拦截器配置 56 4.3.3 继承方法拦截器的自定义拦截器配置 58 4.4 Struts2文件上传拦截器应用 61 ...
4.5 构建自定义拦截器 78 4.5.1 实现Interceptor接口 78 4.5.2 构建AuthenticationInterceptor拦截器 79 4.6 小结 82 第5章 数据转移:OGNL和类型转换 84 5.1 数据转移和类型转换:Web应用程序领域的常见任务 85 ...
4.2 拦截器的使用:拦截器可以按需堆叠,创建自定义拦截器或者使用预定义的拦截器,如ValidationInterceptor进行表单验证,ExceptionHandlerInterceptor处理异常。 4.3 结果映射:通过配置结果映射,定义不同Action...
- **配置Filter**:在`web.xml`文件中配置`FilterDispatcher`过滤器,用于拦截所有的请求并将其交给Struts2框架处理。 ```xml <filter-name>struts2</filter-name> <filter-class>org.apache.struts2....
- **实现方式**:指导如何自定义拦截器。 **7.5 深入拦截器编程** - **7.5.1 拦截方法的拦截器** - **实现方式**:介绍如何编写用于拦截特定方法的拦截器。 - **7.5.2 拦截器的执行顺序** - **实现方式**:描述...
这一节可能会讲解如何定义和配置自定义拦截器,以及内置拦截器如Validation、Exception、Params等的作用和使用方法。通过拦截器,开发者可以实现如日志记录、权限验证、数据转换等功能。 4.5节可能深入讲解了Struts...
在实际项目中,开发者通常会创建一个Spring配置文件来装配所有组件,定义Struts2的Action、Hibernate的数据源和SessionFactory。Struts2的Action可以通过Spring注入Service层对象,而Service层通过Spring注入DAO层,...
- **配置文件(struts.xml)**:定义了应用程序的行为,包括Action映射、拦截器配置等。 - **结果(Result)**:定义了Action执行完毕后的结果,如重定向、转发等。 - **值栈(ValueStack)**:用来存储Action、...
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...