ColdFusionでSeasar!

Adobe ColdFusionは、6.1からJavaで動いています。なので、Seasarを使ってみました。
理由は(ry
ちなみに環境は、WindowsXP Professinal & ColdFusionMX7でやってみた結果です。


以下を作りました。(最後のDITestMain.javaだけ、明らかによく考えて作っていない事がバレバレなのですが、これはこれ。)

test1/test1.dicon
test1/DICalc.java(インターフェイス)
test1/DICalcMinus.java(実装クラス)
test1/DICalcPlus.java(実装クラス)
test1/DITestMain.java(デザインパターンで言うところの・・・なんだっけ?)


で、これらをまとめてJarにします。(名前は取り合えず[cf2s2.jar]としました。便利なEclipseを使っているので、右クリック→Exportでさくっと)

続いてCFAdmin(Localhostにインストールしたなら、http://localhost:8500/CFIDE/Administrator/でアクセス可能)にログインして、「サーバーの設定」→「JavaJVM」→「ColdFusionクラスパス」に、このJarを含めてS2Containerを利用するのに必要なJar一式の物理パスをべたっと貼り付けます。このように。

(Jar置き場)\aopalliance-1.0.jar
,(Jar置き場)\geronimo-ejb_2.1_spec-1.0.jar
,(Jar置き場)\geronimo-j2ee_1.4_spec-1.0.jar
,(Jar置き場)\geronimo-jta_1.1_spec-1.0-tsr.jar
,(Jar置き場)\geronimo-jta_1.1_spec-1.0.jar
,(Jar置き場)\javassist-3.4.ga.jar
,(Jar置き場)\junit-3.8.2.jar
,(Jar置き場)\junit-addons-1.4.jar
,(Jar置き場)\log4j-1.2.13.jar
,(Jar置き場)\ognl-2.6.9-patch-20070908.jar
,(Jar置き場)\poi-3.0-FINAL.jar
,(Jar置き場)\portlet-api-1.0.jar
,(Jar置き場)\s2-extension-2.4.26.jar
,(Jar置き場)\s2-framework-2.4.26.jar
,(Jar置き場)\uow_api-6.jar
,(Jar置き場)\cf2s2.jar ←★さっき作った奴はコレ

その後、再起動するよう求めてくるダイアログが表示されるので、「コントロール・パネル」→「管理ツール」→「サービス」で「ColdFusion MX 7 Application Server」を再起動します。こうする事で、前述のJarがColdFusionに認識されます。ちなみに、ColdFusion自身が既にcommons-logging-x.x.jarを持っていたりするので、ここでわざわざ書かなくても良いJarもあると思います。(すいません、ちゃんと調べてません)

なお、このときクラスパスの一覧の中に空行が混ざっていたり、区切り文字を書き忘れたりすると、サービス再起動時に「JarLauncherがだめでーす」みたいなエラーが出て起動に失敗するので要注意です。(やってしまった場合は、CFMX7の場合[\runtime\bin\jvm.config]を直接いじってやる事で復旧可能)


で、今度Seasarを利用したクラスをCFのコードから利用します。

<html>
	<body>
		<cftry>
			<cfset obj=CreateObject("java", "test1.DITestMain") />
			addition:[#obj.getCalc(true).calc(1, 2)#]
			<br />
			subtraction:[#obj.getCalc(false).calc(1, 2)#]
			<cfcatch>
				<cfdump var="#cfcatch#" expand="false" />
			</cfcatch>
		</cftry>
	</body>
</html>

こんな感じでDIを利用したJavaオブジェクトをColdFusionから利用する事が出来ます。


CFMX7の場合、JREのバージョンが1.4だそうなので、コンパイラのバージョンには気をつけたいところです。後は、CFでそこまでしてJavaリソースを使うべきかどうか、という所なのですが、これはどうなんでしょうね。よく分かりません。


上記で使ったJavaのコードを以下に書いておきます。

test1/DICalc.java

package test1;

public interface DICalc {

	public int calc(int a, int b);
}

test1/DICalcMinus.java

package test1;

public class DICalcMinus implements DICalc {

	public int calc(int a, int b) {
		// TODO Auto-generated method stub
		return a - b;
	}

}

test1/DICalcPlus.java

package test1;

public class DICalcPlus implements DICalc {

	public int calc(int a, int b) {
		// TODO Auto-generated method stub
		return a + b;
	}

}

test1/DITestMain.java

package test1;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class DITestMain {

	private static final String PATH = "test1/test1.dicon";

	public DICalc getCalc(boolean plusMinus) {
		SingletonS2ContainerFactory.setConfigPath(PATH);
		SingletonS2ContainerFactory.init();
		S2Container c = SingletonS2ContainerFactory.getContainer();
		DICalc diCalc;
		if (plusMinus) {
			diCalc = (DICalc) c.getComponent("plus");
		} else {
			diCalc = (DICalc) c.getComponent("minus");
		}
		return diCalc;
	}

}

test1/test1.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 "http://www.seasar.org/dtd/components24.dtd">
<components>
	<component name="plus"	class="test1.DICalcPlus" />
	<component name="minus"	class="test1.DICalcMinus" />
</components>


でも、cfneoでは使ってません。ごめんなさいごめんなさい。