レベル: 中級 Kulvir Bhogal (kbhogal@us.ibm.com), Software Engineer, FIT Team, IBM China Development Lab Kwang Kang (kkwang@us.ibm.com)FIT Team, IBM China Development Lab
2003年 5月 01日 ColdFusionとWebSphereの利点を組み合わせるということは、以前はあまり現実的な選択肢ではありませんでした。しかし、ColdFusion MXの登場で事態は変わりました。この記事では、開発者の皆さんに、ColdFusionのコードをWebSphere Application ServerのJ2EE環境で展開する方法について説明します。
はじめに
ColdFusionマークアップ言語 (CFML) は、習得が簡単なスクリプト言語だと言われています。ColdFusionのタグに基づくプログラミング・モデルは、短期間のWeb開発を可能にします。またこのモデルはもともと単純であるため、より広い層の開発者がインターネット・アプリケーションを開発することができます。
この記事では、Macromedia ColdFusion MX for IBM WebSphere Application Server (以下Application Server) で、どのようにColdFusionとJ2EEコンポーネントの間でセッション変数を共有できるかを説明します。また、この強力な2つの製品を組み合わせて使用することによってもたらされる共同作用の効果についても説明します。
Application Serverとともに使用するためのColdFusionの設定
このセクションでは、Application Serverとセッション・データを共有するようにColdFusion MXを設定する方法について説明します。
ColdFusion MX Administratorインターフェースを使用してセッションのメモリー変数を有効にする
あらかじめ、ColdFusion MX for IBM WebSphere Application Serverが起動されていることを確認してください。
- 次のいずれかの方法でColdFusion MX Administratorインターフェースにログインします。
-
スタート>プログラム>Macromedia ColdFusion MX J2EE>ColdFusion MX Administratorの順に選択します。
- Webブラウザーを開き、以下にアクセスします。
http://<server:port>/<cfmx_contextroot>/CFIDE/administrator/index.cfm |
たとえば、http://localhost/cfmx/CFIDE/administrator/index.cfm
のように入力します。
-
図1のように、ColdFusion MX Administratorインターフェースのメイン・メニューにあるServer Settingsから、Memory Variablesを選択します。
図1. Server Settingsからメモリー変数を選択する
- 次に表示されるパネルで、図2のようにUse J2EE session variablesとEnable Session Variablesの両方のオプションが選択されていることを確認します。Submit Changesをクリックして変更を適用します。
図2. J2EEセッション変数の有効化
- ColdFusion MX for IBM WebSphere Application Serverを再起動します。
これで、J2EEセッション管理が正常に有効化されました。
アプリケーションの開発
このセクションでは、2つの「ログイン」アプリケーションのサンプルを考察します。最初のアプリケーションはCFMXSESSIONAという名前で、Java開発者がColdFusionで作成されたセッション・オブジェクトを使用する方法を示しています。次のアプリケーションはCFMXSESSIONBという名前で、ColdFusion開発者がJavaで作成されたセッション・オブジェクトを使用する方法を示しています。
ColdFusion MXアプリケーションのセッション管理を有効にする
CFMXSESSIONAでは、ColdFusionがセッション・オブジェクトを作成および管理する必要があります。ColdFusionは、図3のように、Application.cfm (CFMXのルート・ディレクトリーにあるWebアプリケーションのルート・ディレクトリー内) という名前のファイル内で<cfapplication>タグを使用してアプリケーションの設定を定義します。
図3. Webアプリケーションのルート・ディレクトリー内のAPPLICATION.CFMファイル
次のリスト1に示すように、NAME属性はColdFusion MXアプリケーションの名前を定義します。これは、セッション変数を使用するために必要な属性です。
リスト1. CFAPPLICATIONのNAME属性
<cfapplication
name="CFMXSESSIONA"
clientmanagement="no"
sessionmanagement="yes"
sessiontimeout="#createtimespan(0,0,15,0)#">
|
次に、リスト2のように、sessionmanagement属性をYESに設定して、ColdFusion MXアプリケーションでセッション変数を使用できるようにします。
リスト2. ColdFusion MXアプリケーションのセッション管理の有効化
<cfapplicationname="CFMXSESSIONA"clientmanagement="no"
sessionmanagement="yes"sessiontimeout="#createtimespan(0,0,15,0)#">
|
オプションとして、サンプル・アプリケーションで実行したように、sessiontimeoutに明示的に希望の間隔を指定することにより、ColdFusion Administrationインターフェースで定義されたデフォルトのセッション・タイムアウト間隔をオーバーライドできます (リスト2を参照)。前出の例では、ColdFusionの関数createtimespanを使用して、希望のタイムアウト間隔を (日, 時, 分, 秒) の形式で作成しています。
セッション・オブジェクトの作成
このセクションでは、ColdFusionとJ2EEの開発者に向けて、この2つのテクノロジーで簡単に共有できるセッション・オブジェクトを作成するために必要な手順を、どちらのテクノロジーがセッション管理を受け持つかという場合に分けて説明します。
ColdFusion MXでセッションを作成する
最初に、プロパティー・セットを保存するため、リスト3のようにして、LoginAction.cfmという名前のColdFusionページにセッションをColdFusionstructコレクション・オブジェクトとして定義します。
リスト3. プロパティーを保存するためのsession構造体の作成
<!--- Create Session Structure ---> <cfset
SESSION = StructNew()>
<!-- Define Variables within the Session Structure -->
<cfset SESSION.SESSIONCREATEDBY = "ColdFusion">
<cfset SESSION.ISAUTHENTICATED = "Y">
<cfset SESSION.USERID = selectUser.userid>
<cfset SESSION.USERNAME = selectUser.username>
<cfset SESSION.ROLE = selectUser.role>
|
次に、リスト4のように、新しく定義したsessionコレクションにuseridなどのプロパティーを追加します。
リスト4.session構造体でのプロパティーの作成
<!--- Create Session Structure ---> <cfset
SESSION = StructNew()>
<!-- Define Variables within the Session
Structure --> <cfset SESSION.SESSIONCREATEDBY
= "ColdFusion"> <cfset
SESSION.ISAUTHENTICATED = "Y">
<cfset SESSION.USERID = selectUser.userid>
<cfset SESSION.USERNAME = selectUser.username>
<cfset SESSION.ROLE = selectUser.role>
|
Javaでセッションを作成する
今度は、前のセクションと同じ内容を、J2EE開発者の立場から実行します。簡単にColdFusionに変換できるセッション・オブジェクトをJavaで作成するには、リスト5のように、LoginAction.jspというファイルのjava.util.Map構造体にプロパティーを保存します。
リスト5.java.util.Map構造体でのプロパティーの作成
// Define Variables within a java.util.Map
map.put("SESSIONCREATEDBY","JAVA");
map.put("ISAUTHENTICATED","Y");
map.put("USERID",Integet.toString(resultSet.getInt("USERID")));
map.put("USERNAME",resultSet.getString("USERNAME"));
map.put("ROLE",Integer.toString(resultSet.getInt("ROLE")));
|
リスト6のように、ここではMapオブジェクトをCFMXSESSIONBとしてセッションに保存します。
リスト6. java.util.Map構造体のセッションへの保存
// Store the Map in the HttpSession
session.setAttribute("CFMXSESSIONB",map);
|
セッション変数のデータ型変換
ColdFusion MX for Application Serverの使用により、J2EEおよびColdFusion開発者は、この2つのテクノロジー間でデータ型をマッピングし、情報を簡単に交換できるようになります。表1に一般的なデータ型のサンプルを示します。詳細については、Macromedia ColdFusion MXのマニュアル (参考文献を参照) を参照してください。
表1. ColdFusionとJava間のデータ型のマッピング
|
ColdFusionのデータ型
|
Javaのデータ型
| | ARRAY | java.util.Vector | | DATE | java.util.Date | | NUMBER | java.lang.Double (default) | | RECORDSET | java.sql.ResultSet | | STRING | java.lang.String | | STRUCT | java.util.Map |
セッション変数へのアクセス
JavaとColdFusionの両方のテクノロジーでセッション・オブジェクトを定義したところで、今度はそのセッションの内容を相互交流的な方法で共有しましょう。データ・オブジェクト (セッションに含まれるオブジェクトなど) の共有によるこの2つのテクノロジーのシームレスな対話により、スキルのあるColdFusionおよびJ2EE開発者は、単一の統合ソリューションを共同で使用することができます。
ColdFusion MXで作成されたオブジェクトにJavaでアクセスする
「ColdFusion MXでセッションを作成する」のセクションでは、プロパティーを保存するためにColdFusionのstructコレクション・オブジェクトを定義しました。Javaでは、このstructオブジェクトをjava.util.Mapと解釈することができます (詳細については表1を参照)。したがって、セッション構造体の内容にアクセスするために使用するデータ型は、Mapになります。
ColdFusionでは、session構造体は<CFAPPLICATION>タグで定義されるname属性の値として登録されます (リスト1を参照)。したがって、Javaページ、つまりこの例のDisplaySession.jspでは、リスト7のように、標準のgetAttributeメソッドを呼び出して返されたオブジェクトをjava.util.Mapにキャストすることにより、ColdFusionで作成されたセッション・オブジェクトにアクセスできます。
リスト7. CFMXセッション・オブジェクトの取得とjava.util.Mapへのキャスト
//////////////////////////////////////////////////////////////
// Get the CFMX Created Session Object // // The CF
Session is automatically named as the
CFAPPLICATION's // NAME attribute value
/////////////////////////////////////////////////////////////
map = (java.util.Map)
session.getAttribute("CFMXSESSIONA");
|
セッションの内容はjava.util.Map構造体として保存されているため、ここではリスト8のように標準のgetメソッドを呼び出してその値にアクセスすることができます。
リスト8.getメソッドによる値へのアクセス
<%-- Display session variables --%>
<tr>
<td align="right" class="label" width="250">USERID</td>
<td width="300"><%= map.get("USERID") %></td>
</tr>
<tr>
<td align="right" class="label">USERNAME</td>
<td><%= map.get("USERNAME")%></td>
</tr>
<tr>
<td align="right" class="label">ROLE:</td>
<td><%= map.get("ROLE")%></td>
</tr>
<tr>
<td align="right" class="label">SESSION CREATED IN:</td>
<td><b><%= map.get("SESSIONCREATEDBY")%></b></td>
</tr>
|
Javaで作成されたセッション・オブジェクトにColdFusion MXでアクセスする
ColdFusion MXからJavaへの共有が終わったので、今度はその逆について考えてみましょう。このセクションでは、Javaで作成されたセッション・オブジェクトにDisplaySession.cfmというColdFusionページでアクセスします。ColdFusion開発者は、createObject関数を使用して、ColdFusionページ内に"Java"オブジェクトを作成することができます。リスト9のように、ここでは3つのJavaオブジェクトを作成する必要があります。
リスト9. 必要なJavaオブジェクトの作成
<!-- Create Java objects within CF --->
<cfset
REQ=createObject("Java","javax.servlet.http.HttpServletRequest")>
<cfset
SES=createObject("Java","javax.servlet.http.HttpSession")>
<cfset
MAP=createObject("Java","java.util.Map")>
|
ここでは、セッション、つまりjava.servlet.http.HttpSessionオブジェクトをjavax.servlet.http.HttpServletRequestオブジェクトに渡す必要があります。これが完了すれば、リスト10のように、セッションのgetAttributeメソッドを呼び出すことによって、このセッション・オブジェクトにアクセスできるようになります。
リスト10. セッション・オブジェクトにアクセスするためのJavaメソッド
<!--- Get the HttpServletRequest --->
<cfset REQ = GetPageContext().getRequest()>
<!--- Get the HttpSession --->
<cfset SES = req.getSession()>
<!--- Get the CFMX session object (java.util.Map) --->
<cfset MAP = ses.getAttribute("CFMXSESSIONB")>
|
ColdFusionはjava.util.Map構造体を解釈できるため、次のリスト11のように、標準のColdFusion変数出力変換を使用してセッションの値を表示することができます。
リスト11. 標準のColdFusion変換を使用した値へのアクセス
<!--- Display Session Variables --->
<tr>
<td align="right" class="label" width="250">USERID</td>
<td width="300">#MAP.USERID#</td>
</td>
<tr>
<td align="right" class="label">USERNAME</td>
<td width="300">#MAP.USERNAME#</td>
</tr>
<tr>
<td align="right" class="label">ROLE:</td>
<td width="300">#MAP.ROLE#</td>
</tr>
<tr>
<td align="right" class="label">SESSION CREATED IN:</td>
<td width="300"><b>#MAP.SESSIONCREATEDBY#</b></td>
</tr>
|
サンプル・アプリケーション
ダウンロード・パッケージには、ColdFusionおよびJavaコンポーネント間のセッション変数の共有を使用した簡単なColdFusion MX for J2EEアプリケーションが入っています。詳細な設定手順については、readme.docファイルをお読みください。
図4は、このアプリケーションを実行したときの様子の一部です。ここでは、ColdFusion MXページでJavaのセッション・データがうまく取得されています。
図4. サンプル・アプリケーション
まとめ
これまでは、J2EE中心のWebSphere Application Serverの世界とColdFusionには互換性がありませんでした。この2つのソフトウェア製品およびサービスは、開発者や開発者が携わるプロジェクトに多くのメリットをもたらすものであり、この事実は残念なことでした。この記事では、ColdFusionと皆さんが作成したWebSphere J2EEソフトウェアの間でセッション・データを共有する方法について説明しました。このようなセッション・データの共有により、2つのテクノロジーの最も優れた部分を利用して、IBM WebSphere Application Serverの持つ広範なJ2EE機能を損なうことなく、CFMLによって提供されるスピードを備えた強力なWebアプリケーションを作成することができるようになります。
ダウンロード | ファイル名 | サイズ | ダウンロード形式 |
|---|
| i-coldstudio.zip | | HTTP |
参考文献
- 共有セッション変数を使用した簡単なColdFusion MX for J2EEアプリケーションのサンプル・アプリケーションをダウンロードしてください。
- データ型の詳細については、Macromedia ColdFusion MXのマニュアルを参照してください。
-
WebSphereには、開発者向けの記事、チュートリアル、およびダウンロード・ファイルがあります。
著者について  | 
|  | Kulvir Singh Bhogalは、IBMコンサルタントとして、米国中のお客様サイトでJava中心のソリューションの考案および実装を行っています。 |
 | |  | IBMのSoftware Services for WebSphereのコンサルタントであるKwang S. Kang氏は、IBMのWebSphereとMacromediaのCold Fusionプラットフォームにおける企業ソリューションの提供で幅広い経験を持っています。Kwangの連絡先は、kkwang@us.ibm.com です。 |
記事の評価
|