在過去,ColdFusion和WebSphere並不是被看好的一對組合。 但是,隨著ColdFusion MX的出現,這個狀況變了。本文將向開發者介紹如何把他們的ColdFusion代碼配置進WebSphere Application Server J2EE環境。
介紹
ColdFusion標注語言( CFML)是一門很容易學的腳本語言。基於ColdFusion標記的程序設計模型考慮到快速網絡開發的需要,並且這個模型固有的簡明性使得Internet應用程序開發對於廣大開發者都成為可能。
在本文中,我們將介紹用於IBM WebSphere Application Server(簡稱Application Server)的Macromedia ColdFusion MX可以在ColdFusion和J2EE組件之間共享會話變量。我們將介紹如何使這兩個強大的產品成為最佳的組合。
本文將講述如何配置ColdFusion MX,和Application Server共享會話數據。
使用ColdFusion MX管理員界面使其能夠使用會話內存變量
在開始之前,請保證用於IBM WebSphere Application Server的ColdFusion MX正在運行。
1. 登錄到ColdFusion MX管理員界面,可使用下面的幾種方法中的一種:
o 選擇 開始>程序> Macromedia ColdFusion MX J2EE > ColdFusion MX Administrator,或者
o 打開一個浏覽器,輸入
http://<server:port>/<cfmx_contextroot>/CFIDE/administrator/index.cfm
o 例如, http://localhost/cfmx/CFIDE/administrator/index.cfm
2. 從ColdFusion MX管理員界面中,從主菜單的服務器設置中選擇內存變量(Memory Variables),如圖1所示:
圖1:從服務器設置中選擇內存變量
3. 在下一個面板中,保證Use J2EE session variables(使用J2EE會話變量)和Enable Session Variables(允許使用會話變量)這兩個選項被選中,如圖⒉所示。點擊Submit Changes(提交更改)來應用所做出的更改。
圖2允許使用J2EE會話變量
4. 重新啟動用於IBM WebSphere Application Server的ColdFusion MX。
恭喜你,你已經成功的允許使用J2EE會話管理。
應用程序開發
在本節,我們將進入兩個"登錄"示例應用程序。 第一個應用程序,名為CFMXSESSIONA,將介紹一個Java開發者如何使用在ColdFusion中創建的會話對象。第二個,名為CFMXSESSIONB,將介紹一個ColdFusion開發者如何使用在Java中創建的會話對象。
允許使用用於ColdFusion MX應用程序的會話管理
在CFMXSESSIONA中,ColdFusion需要創建和管理會話對象。ColdFusion使用一個<cfapplication>標記,這個標記在名為Application.cfm的文件中(在CFMX根目錄下的網絡應用程序的根目錄中),來定義了應用程序的設置,如圖3所示。
圖3網絡應用程序根目錄中的APPLICATION.CFM文件
NAME屬性定義了ColdFusion MX應用程序名,如下面列表1所示。 這是一個使用會話變量所需的屬性。
列表1CFAPPLICATION的NAME屬性
<cfapplication name="CFMXSESSIONA" clientmanagement="no" sessionmanagement="yes" sessiontimeout="#createtimespan(0,0,15,0)#">
接下來,我們通過設置sessionmanagement屬性為YES,允許在你的ColdFusion MX應用程序裡使用會話變量,如列表2所示。
目錄2允許使用ColdFusion MX應用程序的會話管理
<cfapplication name="CFMXSESSIONA" clientmanagement="no" sessionmanagement="yes" sessiontimeout="#createtimespan(0,0,15,0)#">
選擇性地,就象我們在示例應用程序中所做的一樣,你可能覆蓋定義在ColdFusion管理界面中的默認會話超時時間間隔,通過明確地指定sessiontimeout期望的時間間隔(見列表2)。 我們使用ColdFusion函數createtimespan,以(Days,Hours,Minutes,Seconds)這樣的格式創建期望的時間間隔。
創建會話對象
本節向ColdFusion開發者和J2EE開發者介紹創建會話的必要的步驟,這些會話對象很容易在這兩種技術之間共享,這取決於哪種技術將負責會話管理。
在ColdFusion MX中創建會話
首先,在一個稱為LoginAction.cfm的ColdFusion頁面中,我們定義了作為一個ColdFusion struct集合對象的會話,存儲一組屬性,如列表3所示。
目錄3創建一個會話結構保存屬性
<!--- 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>
接下來,我們添加象userid這樣的屬性到新定義的session集合中,如列表4所示。
目錄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中創建會話對象,我們把屬性放入一個名為LoginAction.jsp的文件的java.util.Map結構中,如列表5所示。
列表5、在一個java.util.map結構中創建屬性
// Define Variables within a java.util.Mapmap.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")));
我們把Map對象作為CFMXSESSIONB存儲進會話,如列表6所示。
列表6 把java.util.map結構存儲進會話
// Store the Map in the HttpSessionsession.setAttribute("CFMXSESSIONB",map);
會話變量數據類型翻譯
用於Application Server的ColdFusion MX讓J2EE開發者和ColdFusion在這兩個技術之間相互映射數據類型,這樣致使信息交換非常容易。 表1顯示公用數據類型的樣例。 想得到詳細信息,請參閱Macromedia ColdFusion MX技術資料。
表1. ColdFusion和Java之間的數據類型映射
ColdFusion 數據類型 Java數據類型
ARRAY java.util.Vector
DATE java.util.Date
NUMBER java.lang.Double (默認)
RECORDSET java.sql.ResultSet
STRING java.lang.String
STRUCT java.util.Map
訪問會話變量
既然我們在Java和ColdFusion這兩種技術中創建了會話對象,我們想使用一種"異花授粉"類型方法論共享會話內容。 通過共享包含在會話中的數據對象,這兩個技術之間無縫的交互作用讓技術熟練的ColdFusion和J2EE開發者可以使用單一的整合的解決方案工作。
在Java中訪問ColdFusion MX創建的會話對象
在"在ColdFusion MX中創建會話"這節, 我們定義了一個ColdFusion struct集合對象來存儲我們的屬性。 在Java中,你可能把ColdFusion struct對象解釋為一個java.util.Map(見表1)。 因此,Map是我們將使用來存取會話結構內容的數據類型。
ColdFusion注冊session結構為定義在<CFAPPLICATION>標記中的name屬性值(見列表1)。 因此,我們可以在一個Java頁面中訪問ColdFusion創建的會話對象,在我們的例子DisplaySession.jsp中,通過調用標准getAttribute方法,把返回對象強制轉化為一個java.util.Map,如列表7所示。
列表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結構被保存,我們可以調用標准get方法來訪問它的值,如列表8所示。
列表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>
在ColdFusion MX中訪問Java創建的會話對象
既然我們已經從ColdFusion MX共享數據到Java,讓我們從相反的方向來考慮這個問題。 在本節,我們將在一個名為DisplaySession.cfm的ColdFusion頁面中訪問Java創建的會話對象。 ColdFusion開發者可以通過使用createObject函數在一個ColdFusion頁面內創建" Java "對象。 我們將需要創建三個Java對象,如列表9所示。
列表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")>
現在,我們必須取得一個被傳送到javax.servlet.http.HttpServletRequest對象中的java.servlet.http.HttpSession會話對象。 一旦這步完成,我們可以通過調用會話的getAttribute方法訪問會話對象,如列表10中所示。
列表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結構,我們可以通過使用標准ColdFusion變量輸出約定顯示會話值,如列表11所示。
列表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>
示例應用程序
下載程序包(ftp://www6.software.ibm.com/software/developer/library/i-coldstudio.zip)包含一個用於J2EE的簡單的ColdFusion MX應用程序,使用ColdFusion Java組件之間共享的會話變量。 閱讀readme.doc文件,取得完整的安裝教程。
圖4給你關於我們的應用程序的一瞥。 這裡,我們已經成功地在一個ColdFusion MX頁面中取得Java會話數據。
圖4示例應用程序
結論
過去,WebSphere Application Server和ColdFusion在J2EE方面的結合並不徹底。在本文中,我們介紹了如何在ColdFusion和你的WebSphere J2EE軟件產品中共享會話數據。這樣共享的會話數據讓你利用這兩種技術的優勢來格式化網絡應用程序,而不破壞IBM WebSphere Application Server的J2EE能力。