Struts 1.1から提供されるようになったプラグイン機能を利用することで、Struts本体に手を加えずに独自の機能を簡単に追加できます。Strutsの機能で有名なValidatorやTilesなども、プラグインを利用しています。本稿では、このプラグインを自分の手で作成する方法を紹介します(本稿では、独自に作成するプラグインをカスタムプラグインと呼ぶことにします)。
カスタムプラグインを作成するにはorg.apache.struts.action.PlugInインターフェイスを実装したクラスを作成する必要があります。
SamplePlugIn.java
package to.msn.wings;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;
public class SamplePlugIn implements PlugIn {
private String message = null;
public void setMessage(String msg) {
//初期化パラメータ読込用アクセサメソッド
//(struts-config.xmlのmessageプロパティが自動セットされる)
this.message = msg;
System.out.println("-->message = " + msg);
}
public void init(ActionServlet servlet, ModuleConfig config)
throws ServletException {
//Webアプリケーションの開始処理
System.out.println("-->SamplePlugIn init...");
//メッセージをコンテクストに保存
ServletContext context = servlet.getServletContext();
context.setAttribute("PLUGIN_MESSAGE", message);
}
public void destroy() {
//Webアプリケーションの終了処理
System.out.println("-->SamplePlugIn destroy...");
}
} |
PlugInインターフェイスには、アプリケーションの起動時に実行されるinitメソッドと停止時に実行されるdestroyメソッドが定義されています。initメソッドではパラメータのActionServletやModuleConfigを活用することが可能です。このサンプルでは、起動時のinitメソッドにstruts-config.xmlに設定されているプロパティの値を読み込み、ServletContextに保存しています。
作成したPlugInクラスを組み込むには、struts-config.xmlに定義をする必要があります。
参考:PlugInは複数定義することができ、実行される順番もstruts-config.xmlに定義した順番になります。
struts-config.xml
<struts-config>
(中略)
<!-- TilesPlugIn -->
<plug-in className="org.apache.struts.tiles.TilesPlugin" >
<set-property property="definitions-config"
value="/WEB-INF/tiles-defs.xml" />
<set-property property="moduleAware" value="true" />
<set-property property="definitions-parser-validate" value="true"/>
</plug-in>
<!-- ValidatorPlugIn -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>
<!-- 独自のPlugInを定義する -->
<plug-in className="to.msn.wings.SamplePlugIn">
<set-property property="message" value="Hello StrutsPlugIn!!"/>
</plug-in>
</struts-config> |
PlugInインターフェイスを実装したクラスはplug-inタグのclassName属性にフルパスで設定します。アプリケーションから使用したい値があればset-property属性を使用します。このサンプルではコンテキストに保存する「Hello StrutsPlugIn!!」というメッセージを設定しています。
PlugInはアプリケーションサーバの起動時と停止時に実行されますので、Tomcatを起動してみます。
2004/08/23 1:04:59
org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1をポートhttp-8080で初期化します
(中略)
2004/08/23 1:05:08 org.apache.struts.tiles.TilesPlugin init
情報: Tiles definition factory loaded for module ''.
2004/08/23 1:05:08 org.apache.struts.validator.ValidatorPlugIn initResources
情報: Loading validation rules file from '/WEB-INF/validator-rules.xml'
2004/08/23 1:05:08 org.apache.struts.validator.ValidatorPlugIn initResources
情報: Loading validation rules file from '/WEB-INF/validation.xml'
-->message =
Hello StrutsPlugIn!!
-->SamplePlugIn Init...
(中略)
2004/08/23 1:05:09 org.apache.catalina.startup.Catalina start
情報: Server startup in 9625 ms |
上記のようにTomcatの起動メッセージに「-->message = Hello StrutsPlugIn!!」「-->SamplePlugIn Init...」が表示され、SamplePlugInのinitメソッドに記述した処理が動作していることが確認できます。実際に保存された値を取得したい場合は、index.jsp等に、
<bean:write name="PLUGIN_MESSAGE"
scope="application"/> |
という1行を追加すれば、「Hello StrutsPlugIn!!」というメッセージがWebブラウザに表示され、PlugInのinitメソッドで設定した値が正しく取得できていることが確認できます。
今回のサンプルでは単純にstruts-configのプロパティを取得するだけでしたが、アプリケーション実装時には、共通利用されるデータを読み込んだり、1回だけ実行したい処理を行ったりといったアプリケーションの初期化処理に活用することができます。