如何使用拦截器?
让我们来看看如何使用一个已经存在的拦截我们的“Hello World”程序。我们将使用定时器拦截器,其目的是测量过了多长时间,执行相应的操作方法。同时我PARAMS拦截器,其目的是发送的请求参数的行动。您可以尝试不使用这个拦截器和你的榜样,你会发现,name属性没有被设置的参数是不能够达到给动作。
我们将继续HelloWorldAction.java,web.xml中,HelloWorld.jsp和index.jsp文件,因为他们已经创建的实例章,但让我们如下修改struts.xml文件中添加一个拦截器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello"
class="com.yiibai.struts2.HelloWorldAction"
method="execute">
<interceptor-ref name="params"/>
<interceptor-ref name="timer" />
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
右键点击项目名称,并单击“导出”> WAR文件创建一个WAR文件。然后,这WAR部署在Tomcat的webapps目录下。最后,启动Tomcat服务器,并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给你以下画面:

现在,在给定的文本框中输入任何单词,然后单击“Say Hello按钮执行已定义的动作。现在如果你将检查生成的日志,你会发现下面的文字:
INFO: Server startup in 3539 ms 27/08/2011 8:40:53 PM com.opensymphony.xwork2.util.logging.commons.CommonsLogger info INFO: Executed action [//hello!execute] took 109 ms.
这里的底线是产生,因为定时器拦截行动,告诉了要执行的总109ms
创建自定义拦截器
在应用程序中使用自定义拦截器是一个优雅的方式来提供跨领域的应用功能。创建一个自定义拦截器是容易的,需要扩展的接口,下面Interceptor接口内容:
public interface Interceptor extends Serializable{
void destroy();
void init();
String intercept(ActionInvocation invocation)
throws Exception;
}
正如其名称所表明的,在init()方法提供了一种方法来初始化拦截器destroy()方法提供了一个拦截器净化设施。不同的行动,拦截器的请求重用和需要是线程安全的,特别是在intercept()方法。
ActionInvocation对象提供的运行时环境。它允许访问的行动本身和方法调用的行动和决定的行动是否已经调用。
如果您有没有必要的初始化或清理代码,AbstractInterceptor类可以扩展。这提供了一个默认的无操作实现 init() 和destroy()方法。
创建拦截器类:
让我们创建MyInterceptor.java在Java资源> src文件夹:
package com.yiibai.struts2;
import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception{
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
return result;
}
}
就像你看到的,实际的动作将使用拦截器执行的invocation.invoke()调用。所以,你可以做一些前处理和后处理根据您的需要。
框架本身开始的过程,在第一次调用ActionInvocation对象的invoke()。每次invoke()被调用,ActionInvocation咨询状态并执行拦截。当所有配置的拦截器被调用,invoke()方法将导致要执行的动作本身。通过请求流以下数据图显示了相同的概念:
浙公网安备 33010602011771号