当前位置:K88软件开发文章中心网站服务器框架Struts2 → 文章内容

Struts2 拦截器

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:39:25

由 lxjazni_7 创建,youj 最后一次修改 2016-12-12 拦截器在概念上与servlet过滤器或JDK代理类相同。拦截器允许横切功能,把action以及框架分开实现。你可以使用拦截器实现以下操作: 在调用action之前提供预处理逻辑。在调用action后提供后处理逻辑。捕获异常,以便可以执行备用处理。Struts2框架中提供的许多功能都是使用拦截器实现的,包括异常处理,文件上传,生命周期回调和验证等。事实上,由于Struts2将其大部分功能基于拦截器,因此不太可能为每个action分配7个或8个拦截器。 Struts2框架拦截器 Struts 2框架提供了一个良好的开箱即用的拦截器列表,这些拦截器预先配置好并可以使用。 下面列出了几个重要的拦截器:序号拦截器和说明1alias 允许参数在请求之间使用不同的别名。 2checkbox 通过为未检查的复选框添加参数值false,以辅助管理复选框。 3conversionError 将字符串转换为参数类型的错误信息放置到action的错误字段中。 4createSession 自动创建HTTP会话(如果尚不存在)。 5debugging 为开发人员提供一些不同的调试屏幕。 6execAndWait 当action在后台执行时,将用户发送到中间的等待页面。 7exception 映射从action到结果抛出的异常,允许通过重定向自动处理异常。 8fileUpload便于文件上传。 9i18n在用户会话期间跟踪选定的区域。 10logger 通过输出正在执行的action的名称提供简单的日志记录。 11params 设置action上的请求参数。 12prepare 这通常用于执行预处理工作,例如设置数据库连接。 13profile 允许记录action的简单分析信息。 14scope 在会话或应用程序范围内存储和检索action的状态。 15ServletConfig 提供可访问各种基于servlet信息的action。 16timer 以action执行时间的形式提供简单的分析信息。 17token 检查action的有效性,以防止重复提交表单。 18validation 提供action的验证支持。你可以阅读Struts 2文档,了解上述拦截器的完整信息。接下来我们会告诉你如何在Struts应用程序中使用拦截器。 如何使用拦截器? 让我们看看如何在我们的“Hello World”程序中使用一个已经存在的拦截器。我们将首先使用timer拦截器,目的是测量执行action方法所需的时间。同时我们使用params拦截器,目的是将请求参数发送给action。你可以尝试不在你的例子中使用这个拦截器,然后你会发现name属性没有被设置,因为参数无法发送给action。我们可以保留HelloWorldAction.java,web.xml,HelloWorld.jsp和index.jsp文件,因为它们已在Hellow World示例一章中创建过了,然后让我们参照下面修改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="cn.k88.struts2.HelloWorldAction" method="execute"> <interceptor-ref name="params"/> <interceptor-ref name="timer" /> <result name="success">/HelloWorld.jsp</result> </action> </package></struts>右键单击项目名称,然后单击“Export”>“WAR File”创建WAR文件。然后在Tomcat的webapps目录中部署这个WAR文件。最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。结果如下图所示: 现在,在给定文本框中输入任意单词,然后单击Say Hello按钮执行定义的action。如果你去查看生成的日志,会看到以下文本: INFO: Server startup in 3539 ms27/08/2011 8:40:53 PM com.opensymphony.xwork2.util.logging.commons.CommonsLogger infoINFO: Executed action [//hello!execute] took 109 ms.这里的最后一行是由timer拦截器生成的,是表示ation总共需要109ms来执行。 创建自定义拦截器在你的应用程序中使用自定义拦截器是提供跨切割应用程序功能的简洁方式。创建自定义拦截器很容易,需要扩展的是以下Interceptor接口: public interface Interceptor extends Serializable{ void destroy(); void init(); String intercept(ActionInvocation invocation) throws Exception;}正如name所指出的,init()方法提供了一种初始化拦截器的方法,而destroy()方法为拦截器清理提供了一个工具。与action不同,拦截器在请求之间重复使用,需要线程安全,特别是intercept()方法。ActionInvocation对象可访问运行时的环境。它允许访问action本身以及方法来调用action,并确定action是否已被调用。如果你不需要初始化或清理代码,可以扩展AbstractInterceptor类,以实现init()和destroy()的默认的无操作指令。 创建拦截器类我们接下来在Java Resources>src文件夹中创建以下MyInterceptor.java文件: package cn.k88.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; }}你可以发现,实际中action将通过拦截器使用invocation.invoke()调用执行,所以你可以根据你的需求做一些预处理和一些后处理。框架本身通过第一次调用ActionInvocation对象的invoke()来启动进程。每次调用invoke()时,ActionInvocation都会查询其状态,并执行下一个拦截器。当所有配置的拦截器都被调用时,invoke()将使得action本身被执行。以下图表通过请求流显示了所说的概念: 创建Action类我们在Java Resources>src文件夹下创建一个java文件HelloWorldAction.java

[1] [2]  下一页


Struts2 拦截器