Strutsを読む ~3日目: ActionServlet#init()~
テーマ: initInternal() は何をするメソッド?
<深度:1>コードとしては、下記の通りで、ActionResources.propertiesの内容をインスタンス化する。
#########################################################
protected String internalName = "org.apache.struts.action.ActionResources";
protected MessageResources internal = null;
protected void initInternal(){
internal = MessageResources.getMessageResources(internalName);
}
#########################################################
<深度:2>MessageResourcesクラスを読み解く
MessageResources.getMessageResources("org.apache.struts.action.ActionResources");
実装 ↓ ※下記2行が何をしているかを読み解く。
MessageResourcesFactory defaultFactory = MessageResourcesFactory.createFactory();
return defaultFactory.createResources("org.apache.struts.action.ActionResources");
まずは、
<深度:3>MessageResourcesFactoryはどういうクラス?
所謂ファクトリパターンにおいてオブジェクトを生成するクラス。
ファクトリパターンの利用シチュエーションとしては、
たとえば、条件によってデータファイルの読み込みに使うオブジェクトが異なる場合、
CSV形式であればCSVDataReaderオブジェクトを、XML形式であれば
XMLDataReaderオブジェクトを生成するような場合に利用する。
ファクトリクラスでは、オブジェクトの生成のみを行います。
オブジェクト生成の専門家であるファクトリが、オブジェクトの使用者から生成するオブジェクトの種類や生成手順を隠してくれます。
オブジェクトの使用者はファクトリに生成を依頼するだけで、オブジェクトの生成手順や種類を意識する必要はなく、望むオブジェクトを使用できる状態で手に入れることができる。
結局下記メソッドが何をやっているかを読み解くのが鍵。
defaultFactory.createResources("org.apache.struts.action.ActionResources");
Strutsを読む ~2日目: フレームワークの入口~
StrutsがJava EEフレームワークである以上、まずは「web.xml」となる。
############### <web.xml> ###############
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
######################################
*.doをいうURIにより、ActionServlet が必ず呼び出される。
これがフレームワークの入口。
このようにリクエストを一手に担うようなサーブレット(ActionServlet)を利用する
デザインパターンのことをFront Controller パターンと呼ぶ。
サーブレットのライフサイクルに準じて、まずは、このサーブレットのinit()メソッドを読んでいく。
Strutsを読む ~1日目: ソースコードリーディングをする環境構築~
利用するツールとしては、「Pleiades All in One」を利用するが、これは通常通りインストールすればOK。
作成する環境は、StrutsのソースコードからEclipseのプロジェクトを作成し、
そのプロジェクトの中にサンプルコードも含ませるイメージ。
こうすることで、Strutsを弄りながらサンプルの挙動を確認できる。
ビルドするStrutsのプロジェクト(パッケージ)は下記2つ。
・struts-core
・struts-taglib
手順としては下記の通り。
1. Eclipseで動的プロジェクト作成
2. struts-core を上記プロジェクトにインポート
上記で作成されたsrcフォルダを右クリックし、
[展開フォルダ]\struts-1.3.10\src\core\src\main\java(orgフォルダの一個上の階層)をインポート
3. ビルドエラー(Mock~)が出るので、クイックフィックス ⇒ 実装無しメソッド追加で解消
4. struts-taglib を同様にインポート
5. 静的コンテンツのデプロイ(tldファイル)
[展開フォルダ]\struts-1.3.10\src\taglib\src\main\resources\META-INF\tld
フォルダをプロジェクトのWEB-INF以下に置く。
6. 静的コンテンツのデプロイ(chain-config.xml)
プロジェクト内に下記XMLを配置する。
[展開フォルダ]\struts-1.3.10\src\core\src\main\resources\org\apache\struts\chain
※これが無いと"org/apache/struts/chain/chain-config.xml に対するマッピング設定がありません"というエラーが出る。Javaソースはプロジェクトにインポートしたけど、静的コンテンツ等のリソースをインポートしていないため、XMLが有りませんよという意味のエラー。
7. サンプルコードをデプロイ
下記ページのものをそのままデプロイした。
http://www.zealseeds.com/SysDevTech/Struts/Struts/introduction/helloworld/index.html
※余談だが、今回作成したプロジェクトはStrutsもサンプルコードも全て同じプロジェクト内でビルドしたが、Eclipseの外部プロジェクト読み込み機能を利用して、サンプルとStrutsのプロジェクトを分離しようとしてみたところ、ActionServletが有りませんよエラーが発報した。どうやらActionServletはプロジェクトのWEB-INF/lib以下に無いと動かないようだ。クラスローダの動きが分からないため、原因は不明。。。