Struts秘籍之第1段:第2.1式:用插件来进行应用初始化
来源:互联网 发布:手机商城html源码下载 编辑:程序博客网 时间:2024/04/27 23:41
第2.1式. 用插件来进行应用初始化
问题
在应用启动时需要装入应用初始化数据到context 中。
动作要领
创建一个类,实现org.apache.struts.action.PlugIn接口,并且在struts-config.xml文件中指定plug-in元素。下面的XML 片断展示了一个plug-in 声明以及一个嵌套的set-property元素来设置定制属性:
<set-property property="customData"
value="Hello from the plugin"/>
</plug-in>
动作变化
Struts提供了一个PlugIn接口,你可以用它来创建在应用启动时初始化的定制服务。PlugIn接口的Java源代码示于Example 2-1. (为了清晰起见,去除了JavaDoc 文档)
Example 2-1. Struts PlugIn 接口
import javax.servlet.ServletException;
import org.apache.struts.config.ModuleConfig;
public interface PlugIn {
public void destroy( );
public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException;
}
为了实现一个plug-in,只需要实现这个接口并且在struts-config.xml文件中声明这个plug-in 实现。有两个方法必须被实现:即init()和destroy( ), 它们在插件的生命周期中被调用。Struts 在启动ActionServlet时实例化plug-in 之后调用init( )。Struts则在ActionServlet被销毁时调用destroy()方法,通常是在一个用服务器停止时。首先,这个 plug-in 特征似乎是很单纯和有限的。然而,通过使用Struts的另外一个特征,即set-property元素,你可以将特殊的信息传递到plug-in中。这种能力增强了这些类的灵活性。
set-property元素被几乎所有定义Struts实体的元素所支持,比如form-bean, action-mapping, action, 以及plug-in。set-property元素有两个属性:name和value。Struts调用name属性的值指定的property的setter方法,将property设置为value属性的字符串值。
对给定plug-in的所有set-property元素都将在调用plug-in的init( )方法之前进行处理。这允许plug-in 在init( )方法中使用属性的值。
如果对一个plug-in使用多个set-property元素, Struts不能保证它们被调用的顺序。每个setter方法都应该独立于其他任何方法。
Struts 将对ActionServlet和plug-in的ModuleConfig的引用作为引数传递给init( )方法。ActionServlet允许访问ServletContext来进行应用范围的对象存储。ActionServlet还可以允许你访问更多高级的容器管理的J2EE 组件,比如数据源和消息队列。ModuleConfig允许你访问定义plug-in 的模块的Struts配置。
每个Struts 应用至少有一个模块:默认模块。如果你不熟悉模块,我们将在第2.5式中讲解之。
为了更具体一些,请考虑一个简单的,但仍然相关的例子。你需要定义一个plug-in,它可以使你决定应用何时启动,以及它启动和运行了多长时间。你可以使用下面所示的类跟踪和报告你的应用的运行时间。
Example 2-2. Application uptime tracker 对象
import java.util.Date;
public class TimeTracker {
private long startUpTimeMillis;
private Date startedOn;
public TimeTracker( ) {
startUpTimeMillis = System.currentTimeMillis( );
startedOn = new Date( );
}
public long getUptime( ) {
return System.currentTimeMillis( ) - startUpTimeMillis;
}
public Date getStartedOn( ) {
return startedOn;
}
}
创建一个PlugIn接口的实现,比如Example 2-3所示,它实例化了TimeTracker。plug-in 通过plug-in 属性的值将TimeTracker实例保存在ServletContext中。你可以使用这个值来从Servlet上下文中获取TimeTracker实例。虽然这个值是硬编码的,使用属性也提供了更大的灵活性。
Example 2-3. Time tracker plugin
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class TimeTrackerPlugin implements PlugIn {
private String contextKey;
public void setContextKey(String key) {
this.contextKey = key;
}
public void init(ActionServlet servlet, ModuleConfig conf)
throws ServletException {
servlet.getServletContext( ).setAttribute(contextKey, new TimeTracker( ));
}
public void destroy( ) {
}
}
现在你已经有了为plug-in 创建的类,你可以通过在struts-config.xml中加入plug-in元素来将其集成到Struts 应用中。
<set-property property="contextKey" value="timeTracker"/>
</plug-in>
plug-in 在servlet 上下文中存储了time tracker对象。可以访问TimeTracker来显示关于应用启动运行时间的信息,下面是相关的JSP 片断:
<bean:write name="timeTracker"
property="startedOn"
format="MM/dd/yyyy HH:mm"/> for
<bean:write name="timeTracker"
property="uptime"/> milliseconds!
</h4>
你可以使用一个servlet 来载入像Struts plug-in之类的初始化数据。具有load-on-startup初始化参数的servlet,应将其设置为较低的数值,比如1, 一保证它们在应用启动时载入。容器在实例化Servlet之后将调用servlet的init( )方法。但是Struts plug-in 方式由多个优点。首先,大多数Struts 应用在其初始化设置后不需要修改web.xml文件。必须在web.xml中声明额外的Servlet意味着要维护额外的文件。其次,如果需要PlugIn接口提供对特定Struts信息的访问。最后,因为plug-in 的生命周期紧随ActionServlet的生命周期,所以可以保证在你的Struts应用所需时数据有效。
相关招式
第2.8式展示了set-property元素的另一种用法。Struts 文档中关于plug-in 的信息可以访问http://jakarta.apache.org/struts/userGuide/building_controller.html#plugin_classes.
你也可以使用一个Servlet 上下文listener 来载入初始化数据。
- Struts秘籍之第1段:第2.1式:用插件来进行应用初始化
- Struts秘籍之第1.2式. 部署Struts 示例应用
- Struts秘籍之第2段:第3.7式: 动态产生JavaScript
- Struts秘籍之第2段:第3.4式:在表单中使用索引属性
- iPhone秘籍 第1章 理论知识
- iPhone秘籍 第1章 操作部分
- Struts秘籍之起式第1.1式:下载Struts
- ssh之struts第一篇:struts国际化
- 用apkplug来进行插件式开发
- 程序猿之泡妞秘籍(1) --- 第一眼如何吸引女生的注意力
- 段错误的第8种情况——用双引号来括字符
- 第16周-武林秘籍
- Unity3d插件之Shader Forge第1,2,3讲
- Android插件化系列第(二)篇---动态加载技术之应用换肤
- struts之采用xml来进行数据校验(二)
- 使用 Twisted Matrix 框架来进行网络编程,第 1 部分
- iPhone秘籍 第2章 视图
- iPhone秘籍 第3章 摘要
- 今天用Visual C#为客户做一个数据下载分析系统,碰到一个问题 未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值。
- 在.net中轻松掌握Windows窗体间的数据交互
- PCB图画了一半了
- 提高IIS网站服务器的效率的八种方法
- asp.net2.0的几种自动生成脚本的原理以及应用
- Struts秘籍之第1段:第2.1式:用插件来进行应用初始化
- 从今天开始写技术博客
- Jsp中的session使用
- 通信技术名词趣谈
- 哲学意思上的计算机知识体系结构
- 创建DataTable
- Spring+Struts+Hibernate 架构中对Oracle9i中clob字段的处理之--新增数据篇
- 关于DetailsView使用DropDownList1!
- 今天第一次在CSDN上安家