ITEEDU

Struts Gossip: Plugin 界面

您可以继承ActionServlet,重新定义它的init()方法,这样可以在ActionServlet被加载时增加一些您想要加载的资源,然而这并不是个好方法,您必须将程序代码写死在当中,如果您要加载的资源多时是一个麻烦,想要拆除某个资源时又是一个麻烦。

Struts 1.1提供一个新的PlugIn接口,它可以让您动态增减ActionServlet的功能,PlugIn中规定了两个必须实作的方法:
public interface PlugIn { 
    public void init(ActionServlet servlet, 
                    
ModuleConfig config) 
              throws javax.servlet.ServletException; 
    public void destroy(); 
}
您可以将资源加载的动作撰写在init()方法中,ActionServlet会加载后,会执行实作PlugIn接口的类别之 init()方法,例如您可以在这边进行数据库资源的连结,而ActionServlet被终结前,会执行实作PlugIn接口的类别之destroy ()方法,您可以在这边撰写一些释放资源的方法。

实作PlugIn接口时,必须提供一个没有参数的建构函式给ActionServlet使用,如果初始化需要一些参数设定,您可以如同JavaBean一样的设定setter,一个实例的例子如下:
MyPlugin.java
package onlyfun.caterpillar; 

.......

import org.apache.struts.action.*;

public class MyPlugIn implements PlugIn {
......
public MyPlugIn() {
}

public void init(ActionServlet servlet,
ModuleConfig config)
throws javax.servlet.ServletException {
// 初始化資源
SomeService service = new SomeService();
......
servlet.getServletContext().setAttribute("service", service);
}

public void destroy() {
// 釋放資源
}

public void setXXX(String xxx) {
...
}
}
为了让ActionServlet知道要「挂上」这个PlugIn,您要在struts-config.xml中设定:
<plug-in className="onlyfun.caterpillar.MyPlugIn"> 
    <set-property 
        property="XXX" 
        value="abcde"/> 
</plugin>
 
如果您在某个 Action 中必须使用到「挂上」的资源,您可以由Action的Field成员servlet(ActionServlet对象)来取得 ServletContext,并取出所必须的资源,例如:
public ActionForward execute(ActionMapping mapping, 
                             Actionform form, 
                             HttpServletRequest request, 
                             HttpServletResponse response) 
                              throws Exception { 
    ....... 
    ServletContext context = servlet.getServletContext(); 
    SomeService service = 
         (SomeService) context.getAttribute("service"); 
     ...... 
}

像Tiles、Validator等都是利用这种方式来扩充Struts的功能。