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/でアクセス可能)にログインして、「サーバーの設定」→「JavaとJVM」→「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の場合[
で、今度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では使ってません。ごめんなさいごめんなさい。