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的功能。