在过去,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能力。
闽公网安备 35060202000074号