我见过很多开发者自己实现MVC框架的项目,并不是因为他们想从根本上和struts不同的方式来做些东西.而是他们不太清楚如何来扩展struts.你可以完全控制你自己的MVC框架,但是这意味着你必须为它提交许多的资源,但是如果时间安排的不充裕,这是不可能完成的.
Struts不仅是一个强大的框架,而且还非常容易扩展.你可以用三种方法扩展Struts框架:
1. Plugin
如果你想在应用程序启动或者关闭时执行一些业务逻辑的话,就创建你自己的插件.
2. RequestProcessor
如果你想在处理请求的过程中特定的时间点执行一些业务逻辑,可以创建一个自己的请求处理器.例如:你可以扩展一个请求处理器在执行每次请求之前,来检查用户登陆和他是否有执行特定动作的角色.
3. ActionServlet
如果不在应用程序启动或者关闭时执行一些业务逻辑的话,你可以扩展一下ActionServlet这个类.但是你应该只有在Plugin 和RequestProcessor都不可以满足你的要求的情况,才使用这个方法.
我们接下来就会以一个简单的Struts 项目分别用这几种方法来说明应该怎么扩展struts.在文章的结尾处资源区有可供下载的例子.
最成功的两个扩展Struts例子是Struts Validation框架和Titles框架.
这里我假设你已经对Struts框架很熟悉而且可以自己创建一个简单的STRUTS应用程序,在下面的资源区你可以找到一些更多关于STRUTS的资料.
PLUGIN
根据STRUTS的文档上说的”一个插件是一个为了模块具体资源或者服务在应用程序发生启动或关闭事件时被通知的包装配置.
这就意味着你可以创建一个类去实现PLUGIN接口在应用程序启动或关闭的时候做一些事情.
首先我创建一个WEB应用程序,然后HIBERNATE来做持久层结构,并且为了能让我的应用程序在接受到第一个请求之前,HIBERNATE已经配置好并且可以使用,我要在应用程序启动的时候就把HIBERBATE初始化完毕.我们也希望可以关闭HIBERNATE在应用程序关闭的时候. 我们可以按下面两步来实现一个HIBERNATE_PLUGIN,从而完成这个需求.
1. 创建一个类来实现Plugin接口,像这样:
- public class HibernatePlugIn implements PlugIn{
- private String configFile;
- // This method will be called at application shutdown time
- public void destroy() {
- System.out.println("Entering HibernatePlugIn.destroy()");
- //Put hibernate cleanup code here
- System.out.println("Exiting HibernatePlugIn.destroy()");
- }
- //This method will be called at application startup time
- public void init(ActionServlet actionServlet, ModuleConfig config)
- throws ServletException {
- System.out.println("Entering HibernatePlugIn.init()");
- System.out.println("Value of init parameter " +
- getConfigFile());
- System.out.println("Exiting HibernatePlugIn.init()");
- }
- public String getConfigFile() {
- return name;
- }
- public void setConfigFile(String string) {
- configFile = string;
- }
- }
实现Plugin接口需要实现它的两个方法:init()和destory(),init方法将会在应用程序启动的时候调用,而destory方法会在应用程序关闭的时候调用.
1. 在Strust-config.xml中加入新的插件的声明:
- <struts-config>
- ...
- <!-- Message Resources -->
- <message-resources parameter=
- "sample1.resources.ApplicationResources"/>
- <!-- Declare your plugins -->
- <plug-in className="com.sample.util.HibernatePlugIn">
- <set-property property="configFile"
- value="/hibernate.cfg.xml"/>
- </plug-in>
- </struts-config>
className属性必须要写上实现Plugin接口的类的全称.为每一个你想要传递给你的Plugin插件的初始化参数,添加一个<set-property>元素. 在我们的例子里,我想要传递的是配置文件的名字,所以我添加了一个带有配置文件值的<set-property>元素.
如果你的应用程序需要一些配置文件的话,你可以在这时候来检查他们在你的Plugin里是否可用,还可以抛出一个ServletException,如果这些配置文件不可用.而这将导致ActionServlet变的不可用.
Plugin接口中的init()方法是最后一次机会来修改模块配置的一些东西,包括所有的关于STRUTS最基础的模块的静态配置信息.STRUTS将会在所有的插件处理完毕后把所有的模块配置冻结起来.