例 : CFML での Java の 使用

次の項では、CFML で Java オブジェクトを使用するいくつかの例を示します。これらの例では、カスタム Java クラス、ユーザー定義関数の標準 Java API クラス、JavaBean、および EJB (Enterprise JavaBeans) を使用します。

UDF での Java API の使用

次の UDF (User-Defined Function : ユーザー定義関数) の例は、Common Function Library プロジェクト www.cflib.org にある UDF NetLib ライブラリの GetHostAddress 関数と同様に機能します。標準 Java 2 java.net パッケージの InetAddress クラスを使用して、指定されたホストのインターネットアドレスを取得します。

<cfscript>
function GetHostAddress(host) {
   // 関数のローカル変数を定義します。
   var iaddrClass="";
   var address="";
   // Java クラスを初期化します。
   iaddrClass=CreateObject("java", "java.net.InetAddress");
   // アドレスオブジェクトを取得します。
   address=iaddrClass.getByName(host);
   // アドレスを返します。
   return address.getHostAddress();
}
</cfscript>
<cfoutput>#gethostaddress("macromedia.com")#</cfoutput> 

EJB の使用

ColdFusion MX では、JRun 4.0 サーバーが提供する EJB を使用できます。JRun サーバーの "jrun.jar" ファイルのバージョンは、ColdFusion の "jrun.jar" ファイルのバージョンと同じである必要があります。

EJB を呼び出すには、cfobject type="Java" タグを使用して、該当オブジェクトを作成して呼び出します。EJB を使用するには、その前に、次の作業を行う必要があります。

  1. 正しくデプロイした EJB を J2EE サーバー上で実行します。この bean は JNDI サーバーに登録する必要があります。
  2. 次の情報を用意します。
  3. ColdFusion Web サーバー上に、EJB ホームおよびコンポーネントインターフェイスのコンパイル済みクラスをインストールします。具体的には、<Web のルートディレクトリ>/WEB-INF/classes ディレクトリ内にクラスファイルとしてインストールするか、または、<Web のルートディレクトリ>/WEB-INF/lib ディレクトリ内に JAR ファイルにパッケージしてインストールします。

メモ: JRun サーバーによって提供される EJB を使用するには、インストールされている ColdFusion の "jrun.jar" ファイルと、EJB をホスティングする JRun サーバーの "jrun.jar" ファイル (ColdFusion の <CF のルートディレクトリ>¥runtime¥lib ディレクトリにあります) のバージョンが同じである必要があります。

EJB を使用するための具体的な手順は、EJB サーバーおよび使用する EJB によって異なりますが、通常は次の手順に従います。

EJB を使用するには :

  1. cfobject タグを使用して JNDI ネーミングコンテキストクラス (javax.naming.Context) のオブジェクトを作成します。このクラスのフィールドを使用して、EJB の検索に使用する情報を定義します。フィールドのみを使用するので、オブジェクトは初期化しません。
  2. cfobject タグを使用して、コンテキストオブジェクトプロパティを保存する java.util.Properties クラスオブジェクトを作成します。
  3. init メソッドを呼び出して Properties オブジェクトを初期化します。
  4. Properties オブジェクトを設定して、初期 JNDI ネーミングコンテキストの作成に必要なプロパティを含めます。この必要なプロパティには、INITIAL_CONTEXT_FACTORY および PROVIDER_URL プロパティがあります。ネーミングコンテキストに安全にアクセスするには、SECURITY_PRINCIPAL および SECURITY_CREDENTIALS 値も指定する必要があります。これらのプロパティの詳細については、JNDI のドキュメントを参照してください。
  5. cfobject タグを使用して JNDI InitialContext (javax.naming. InitialContext) オブジェクトを作成します。
  6. Properties オブジェクト値を持つ InitialContext オブジェクトに対して、init メソッドを呼び出して InitialContext オブジェクトを初期化します。
  7. InitialContextext オブジェクトの lookup メソッドを呼び出して、bean のホームインターフェイスへのリファレンスを取得します。lookup 引数として bean の JNDI 名を指定します。
  8. bean のホームオブジェクトの create メソッドを呼び出して、bean の新規インスタンスを作成します。エンティティ bean を使用するときは、一般に finder メソッドを代わりに使用します。finder メソッドは、1 つ以上の既存のエンティティ bean を配置します。
  9. ここで、アプリケーションに必要な bean のメソッドを使用できます。
  10. 終了したら、コンテキストオブジェクトの close メソッドを呼び出して、オブジェクトを閉じます。

次のコードは、JRun 4.0 サーバー上で簡単な Java エンティティ bean を使用する方法を示しています。このコードは、bean の getMessage メソッドを呼び出して、メッセージを取得します。

<html>
<head>
   <title>cfobject のテスト</title>
</head>

<body>
<H1>cfobject のテスト</H1>
<!-- Context オブジェクトを作成して、スタティックフィールドで取得します。 --->
<CFOBJECT
   action=create 
   name=ctx 
   type="JAVA"
   class="javax.naming.Context">

<!-- Properties オブジェクトを作成し、明示的なコンストラクタを呼び出します。--->
<CFOBJECT
   action=create 
   name=prop 
   type="JAVA"
   class="java.util.Properties">

<!--- init メソッド (cfobject が提供) を呼び出して、
      Properties オブジェクトコンストラクタを呼び出します。 --->
<cfset prop.init()>

<!--- リモートサーバーにのみ必要なプロパティを指定します。 --->
<cfset prop.put(ctx.INITIAL_CONTEXT_FACTORY, "jrun.naming.JRunContextFactory")>
<cfset prop.put(ctx.PROVIDER_URL, "localhost:2908")>
<!--- <cfset prop.put(ctx.SECURITY_PRINCIPAL, "admin")>
      <cfset prop.put(ctx.SECURITY_CREDENTIALS, "admin")>
 --->
<!--- InitialContext を作成します。--->
<CFOBJECT
   action=create 
   name=initContext 
   type="JAVA"
   class="javax.naming.InitialContext">

<!--- init メソッド (cfobject が提供) を呼び出して、
      InitialContext コンストラクタにプロパティを渡します。 --->
<cfset initContext.init(prop)>

<!--- ホームオブジェクトへのリファレンスを取得します。 --->
<cfset home = initContext.lookup("SimpleBean")>

<!--- エンティティ bean の新規インスタンスを作成します
      (ハードワイヤードアカウント番号)。あるいは、
      find メソッドを使用して、既存のエンティティ bean を検索します。 --->
<cfset mySimple = home.create()>

<!--- エンティティ bean のメソッドを呼び出します。 --->
<cfset myMessage = mySimple.getMessage()>

<cfoutput>
   #myMessage#<br>
</cfoutput>

<!--- コンテキストを閉じます。 --->
<cfset initContext.close()>

</body>
</html>

カスタム Java クラスの使用

次のコードは、簡単な Java クラスの作成と使用の例よりも複雑なカスタムクラスを示しています。Example クラスでは、整数、浮動小数点数、配列、ブール値、および Example オブジェクトタイプを操作します。

Example クラス

次の Java コードは Example クラスを定義します。Java クラス Example は、パブリック整数メンバー mPublicInt を持ちます。このコンストラクタは、mPublicInt を 0 か、整数の引数に初期化します。Example クラスは、次のパブリックメソッドを持ちます。

メソッド 説明

ReverseString

文字列を逆順にします。

ReverseStringArray

文字列内の配列の要素を逆順にします。

Add

オーバーロード。2 つの整数または浮動小数点数を追加して返すか、または 2 つの Example クラスオブジェクトの mPublicInt メンバーを追加して Example クラスオブジェクトを返します。

SumArray

整数配列内の要素の合計を返します。

SumObjArray

Example クラスオブジェクトの配列の mPublicInt メンバーの値を追加し、Example クラスオブジェクトを返します。

ReverseArray

整数配列を逆順にします。

Flip

ブール値を切り替えます。

public class Example {
   public int mPublicInt;

   public Example() {
      mPublicInt = 0;
   }

   public Example(int IntVal) {
      mPublicInt = IntVal;
   }

   public String ReverseString(String s) {
      StringBuffer buffer = new StringBuffer(s);
      return new String(buffer.reverse());
   }

   public String[] ReverseStringArray(String [] arr) {
      String[] ret = new String[arr.length];
      for (int i=0; i < arr.length; i++) {
         ret[arr.length-i-1]=arr[i];
      }
      return ret;
   }

   public int Add(int a, int b) {
      return (a+b);
   }

   public float Add(float a, float b) {
      return (a+b);
   }

   public Example Add(Example a, Example b) {
      return new Example(a.mPublicInt + b.mPublicInt);
   }

   static public int SumArray(int[] arr) {
      int sum=0;
      for (int i=0; i < arr.length; i++) {
         sum += arr[i];
      }
      return sum;
   }

   static public Example SumObjArray(Example[] arr) {
      Example sum= new Example();
      for (int i=0; i < arr.length; i++) {
         sum.mPublicInt += arr[i].mPublicInt;
      }
      return sum;
   }

   static public int[] ReverseArray(int[] arr) {
      int[] ret = new int[arr.length];
      for (int i=0; i < arr.length; i++) {
         ret[arr.length-i-1]=arr[i];
      }
      return ret;
   }

   static public boolean Flip(boolean val) {
      System.out.println("flipboolean を呼び出しています");
      return val?false:true;
   }
}

ColdFusion の useExample ページ

次の useExample.cfm ページでは、Example クラスを使用して数値、文字列、ブール値、および Example オブジェクトを操作します。JavaCast CFML 関数は、CFML 変数を適切な Java データタイプに確実に変換します。

<html>
<head>
   <title>CFOBJECT と Java の例</title>
</head>
<body>

<!--- Example オブジェクトへのリファレンスを作成します。--->
<cfobject action=create type=java class=Example name=obj>
<!--- オブジェクトを作成し、パブリックメンバーを 5 に初期化します。--->
<cfset x=obj.init(JavaCast("int",5))>

<!--- 配列を作成して文字列値を挿入し、
      次に Java オブジェクトを使用してそれら文字列値を逆順にします。 --->
<cfset myarray=ArrayNew(1)>
<cfset myarray[1]="1 番め">
<cfset myarray[2]="2 番め">
<cfset myarray[3]="3 番め">
<cfset ra=obj.ReverseStringArray(myarray)>

<!--- 結果を表示します。--->
<cfoutput>
   <br>   
   オリジナルの配列要素 1:#myarray[1]#<br>
   オリジナルの配列要素 2:#myarray[2]#<br>
   オリジナルの配列要素 3:#myarray[3]#<br>
   逆転後の要素 1:#ra[1]#<br>
   逆転後の要素 2:#ra[2]#<br>
   逆転後の要素 3:#ra[3]#<br>
   <br>
</cfoutput>


<!--- Java オブジェクトを使用してブール値をフリップし、文字列を逆順にします。
      さらに、2 つの整数を追加し、2 つの浮動小数点数を追加します。--->
<cfset c=obj.Flip(true)>
<cfset StringVal=obj.ReverseString("これはテストです")>
<cfset IntVal=obj.Add(JavaCast("int",20),JavaCast("int",30))>
<cfset FloatVal=obj.Add(JavaCast("float",2.56),JavaCast("float",3.51))>

<!--- 結果を表示します。--->
<cfoutput>
   <br>
   StringVal:#StringVal#<br>
   IntVal:#IntVal#<br>
   FloatVal:#FloatVal#<br>
   <br>
</cfoutput>

<!--- 2 つの要素を持つ配列を作成してそれらの値を合計し、
      要素を逆順にします。--->
<cfset intarray=ArrayNew(1)>
<cfset intarray[1]=1>
<cfset intarray[2]=2>
<cfset IntVal=obj.sumarray(intarray)>
<cfset reversedarray=obj.ReverseArray(intarray)>

<!--- 結果を表示します。--->
<cfoutput>
   <br>
   IntVal1 :#IntVal#<br>
   array1:#reversedarray[1]#<br>
   array2:#reversedarray[2]#<br>
   <br>
</cfoutput><br>

<!--- 2 つの Example オブジェクトを持つ ColdFusion 配列を作成します。
      SumObjArray メソッドを使用してオブジェクトを配列に追加します。
      生成されたオブジェクトのパブリックメンバーを取得します。--->
<cfset oa=ArrayNew(1)>
<cfobject action=create type=java class=Example name=obj1>
<cfset VOID=obj1.init(JavaCast("int",5))>
<cfobject action=create type=java class=Example name=obj2>
<cfset VOID=obj2.init(JavaCast("int",10))>
<cfset oa[1] = obj1>
<cfset oa[2] = obj2>
<cfset result = obj.SumObjArray(oa)>
<cfset intval = result.mPublicInt>

<!--- 結果を表示します。--->
<cfoutput>
   <br>
   intval1:#intval#<br>
   <br>
</cfoutput><br>
</body>
</html>

ColdFusion MX 7 | ColdFusion MX 6.1 | ColdFusion MX* | ColdFusion 5* | フォーラム* | デベロッパーセンター | サポート情報 | バグ報告

バージョン7