引言
WebSphere 咨詢師 Roland Barcia 解答有關在 WebSphere 中使用 Ajax 技術構建 Web 2.0 應用程序的問題。他解答了有關從 Ajax 客戶端調用 WebSphere 應用程序的問題,客戶端包括 WebSphere Process Server、WebSphere Enterprise Service Bus 和 WebSphere Application Server。 主題包括常用的數據傳輸格式(如 REST、JSON-RPC 和 SOAP)、工具(如 Eclipse Ajax Toolkit 和 Rational 工具)、或 Ajax 工具包(如 Dojo Toolkit 和 DWR)。他還討論了如何將 Ajax 技術與 IBM 的 SOA 平台進行集成。
問:IBM 為支持 Ajax 服務器端組件框架做了哪些工作?
答:Web 2.0 對於 IBM® 來說非常重要。IBM 將 Web 2.0 作為面向服務的體系結構 (SOA) 中關鍵的部分,它 是到 SOA 企業的接入點。對於服務器端,在未來的幾個月內,IBM 即將發布幾種技術,它們允許使用 Web 2.0 協議(如 REST 和 JSON)來調用服務。您可以在我們的 WebSphere 產品棧中使用該技術。包括 下列產品,如 WebSphere Portal 和 WebSphere Business Integration 產品,以及 WebSphere Process Server 和 WebSphere Enterprise Server Bus。您還可將看到以其他編程語言(如 PHP)編寫的 Web 2.0 服務器端組件。
IBM 在 Web 2.0 之上進行構建以滿足企業級需求,如安全性,最終 Web 2.0 將會成為主流平台。安全性是基於 Ajax 的應用程序的一個重要問題。IBM 還通過 Open Ajax Alliance 與社區合作,幫助定義行業標准。
問:什麼是最好的 Ajax 工具包?我們可以在 WebSphere Developer Studio Client 中使用 Ajax 嗎?如果可以,應該怎樣使用呢?
答:所謂“最好 的”工具,這始終取決與您的具體需求。我可以告訴您我最喜歡的框架是什麼,但我無法知道您需 要的是什麼。您應該問問自己下列問題:
您需要提供異步調用抽象的 JavaScript 框架嗎?
您需要一組豐富的預構建小部件以及創建自己的小部件功能嗎?
您需要為以 XML 或 JSON 形式進入的 Ajax 請求處理封送的服務器端框架嗎?
您需要幫助調試 Ajax 應用程序的開發環境 嗎?
您可以從下面這些框架中選擇。請記住,有些是開放源碼的框架,您不得不從提供支持的社 區那裡獲得這些框架的支持。
面向 JavaScript 抽象和小部件庫的浏覽器工具包:
Dojo Toolkit
IBM JavaServer Faces Client
Google® Web Toolkit(使用 Java™ 語 言構建 Ajax 應用程序)
調試框架:
Eclipse Ajax Toolkit
Firebug® and coding tools
Firefox® Web Developer
Internet Explorer Developer Toolbar
服務器端 Java 框架:
Direct Web Remoting (DWR)
JSON-RPC for Java
Ajax4jsf - Open Source Framework
另外,IBM 將會發布前一個問題中所列舉的那些 Web 2.0 功能。
大多數基於 Ajax 的框架都是基於 JavaScript 的,所以您可以在 WebSphere Developer Studio Client for iSeries 上使用基於 JavaScript 的框架。然而,無法使用 Eclipse Toolkit,因為它基於較新版本的 Eclipse。您可以考慮使用上面列出的任意一個浏覽器調試工具。
問:可以從 WebSphere Process Server 的活動中以同步調用的方式調用外部 Web 應用程序嗎? 在業務流程的活動步驟中將這個 Web 應用程序顯示給用戶,通過完成這個 Web 應用程序步驟來完成這項 活動,然後轉到業務流程中的下一個步驟。如果是這樣,那麼如何實現這種操作?
答:我想,您 是在問我們是否支持人工任務。答案是肯定的。您可以讓 Web 應用程序頁面自己進行刷新,以檢查是否 存在一項使用了人工任務管理器 API 的活動。具體的步驟與下面所示類似:
業務流程可以調用人 工任務組件來創建一項活動。
Web 頁面可以使用人工任務 API 來訪問隊列中的活動。您可以在後 台使用某種異步 Ajax 請求,以便不時地進行檢查,以接近實時的方式發送通知。
然後,用戶可 以訪問該活動,輸入數據,並將該活動推進到下一個步驟(可能通過調用 Web 服務)。
這裡提供 了一些關於 WebSphere Process Server 中人工任務組件的參考資料:
用於實現 Web 服務的 SOA 編程模型,第 8 部分: 基於人工的 Web 服務
使用 WebSphere Process Server 實現業務狀態機 和人工任務之間的雙向交互
開發使用 IBM WebSphere Portal 和 WebSphere Process Server 的業務流程
問:您如何在 Rational Application Developer (RAD) V6.0 中設置系統屬性?然而,我並不希望在 WebSphere Application Server 中定義系統屬性(以下稱為 Application Server)。
答:我不是很清楚您 需要的是什麼。您是希望在 Eclipse 工作台運行的時候為 JVM 添加系統屬性嗎?您可以在啟動 RAD 時 使用 -vmargs 輸入命令參數。有關更多的信息,請參閱 The Eclipse runtime options。
您是希 望為正在測試的 J2SE 應用程序設置系統屬性嗎?對於您所啟動的任何其他的 JVM(如客戶端應用程序) ,IBM 啟動程序(通過 Run 調用)允許您對各種類型的 Java 應用程序進行配置,並且通常具有一個 Environment 選項卡。
您是希望為 WebSphere Application Server V6 Test Server 設置系統屬 性嗎?這必須通過 WebSphere 管理控制台來完成,因為 RAD 中 Application Server V6 的測試環境是 完整的 WebSphere Application Server。
問:您可以推薦一種合適的策略,以便管理通過 Servlet 發出的基於 Ajax 的 XML 數據請求的安全性,其中應用程序開發為 Portlet。(稍後當 Portlet 2.0 規范和資源請求可用時,再來解決這個問題。)
答:首先,您應該確保您的 Servlet 使用了 J2EE 安全角色。這將僅允許經過身份驗證的浏覽器進入。對於 Ajax,安全性是一個比 較棘手的問題。Ajax 是新舊並存的。對於任何 Web 應用程序,有許多“舊”的問題需要解決 。請參閱下面的關於加強 WebSphere 安全性的文章:
WebSphere Application Server V6 高級安 全性加強,第 1 部分:安全性加強概述和方法
WebSphere Application Server V6 高級安全性加 強,第 2 部分:高級安全性注意事項
除了這些“舊”的內容之外,我們必須認識到, Ajax 是一種新的、功能強大且復雜的技術,盡管基於舊思想進行構建,但在實際的使用過程中,還可能 引入新的漏洞。正因為如此,它改變了某些事物的本質。例如,因為人們通過浏覽器發送更多的 XML 請 求,您可能會遇到更多的 XML 威脅。可以使用 SOA Appliance 作為一種解決方案,如 DataPower,它專 門處理 XML 威脅。有關這個問題的更多信息,請參閱 評論專欄: Bill Hines:(XML) 威脅無處不在 ……。
另外,客戶端面臨著插入到響應處理程序中的惡意 JavaScript 代碼的危險 。請確保您的浏覽器僅執行來自受信任的服務器站點的 JavaScript。例如,Mozilla® 只允許執行經 過簽名的腳本。
對於 Web 2.0 站點,您需要考慮下列所有問題:
使用 JavaScript 可以 進行許多攻擊(已出現過這樣的情況)。
在客戶端保存狀態可能產生危險,是否對其進行了保護 ?
客戶端的代碼可能產生危險,我是否可以確定您系統的工作方式?浏覽器中過多的業務邏輯可 能是一個嚴重的危險,並公開業務過程。
是否可以更容易地欺騙浏覽器以運行惡意代碼?
浏覽器中的 Javascript 甚至可能從企業網絡內部 對公司進行攻擊。
對於服務器,可能還需要考 慮其他一些問題:
通過 Internet 公開許多細粒度服務將會增加攻擊范圍。
對服務器的 SQL 和 XML 注入。
對於 Ajax 和 Web 2.0 的安全性問題,還有許多尚未可知的問題,只有隨著時間 和技術的成熟,我們才能夠發現所有可能的威脅。有關更多的信息,請參閱 Ajax and security。
問:Ajax 是不是破壞了 Model 2 編程,並將我們帶回到像以前那種 Web 頁面中包括非表示邏輯 的情況?這是不是一種臨時搭配,以嘗試和模擬真正的桌面 GUI 應用程序功能?
答:答案是,這 取決於實際情況。先回頭看一下 Model 2,這是 MVC 模式的 J2EE 編程實現。下面的圖 1 描述了 Model 2。
圖 1. Model 2
在 J2EE Model 2 體系結構中,Servlet 是 UI 控制器,負責獲取輸入數據,調用某些後端的業務邏輯,然後決定轉發到哪 一個 JSP。JSP 負責生成頁面。然而,還存在應用程序控制器的概念,有時實現於會話外觀層,它負責控 制底層任務以進行調用,然後構建某種類型的響應。
類似地,可以考慮將這些應用程序控制器( 或外觀層)作為 Web 服務公開。通常,Web 服務框架包含某種前端 Servlet,它負責接收 SOAP 輸入, 將輸入封送給某個後端服務,接收響應,並生成 XML 標記而不是 HTML 標記。
Ajax 使得我們可以直接從浏覽器調用服務。如果您通過像 Struts 這樣的模型-視圖-控制器框架來調 用這些服務,那麼您最終將會得到如圖 2 所示的 MVC 膨脹。
圖 2. MVC 膨脹
然而,在 Web 2.0 模型中,可以將一些控制器邏輯和呈現邏輯轉移到客戶端(請參見圖 3)。
圖 3. Web 2.0 模型
在這種情況下,您的模型視圖框架,如 Struts 和 JSF,將負責初始的頁面生成,使用傳統的 Model 2 體系結構。不過,隨後可以將一些 UI 控制器邏輯轉移到客戶端。
請記住,業務邏輯和安全數據應該在服務器上進行維護。Ajax 為您提供了更具可擴展性和無狀態的中 間層。然而,我認為只有處理了相關的安全性問題,我們才能在將來看到融合(請參見前面的安全性問題 )。優化用於安全性的 SOA Appliance,像 Data Power,可能可以幫助更快地實現這個目標。
問:我正在安裝 WebSphere Process Server,這是四個步驟的安裝過程之一。我的 IBM WebSphere Integration Developer 已安裝成功,但是在第 3 步中,即安裝 WebSphere Application Server Network Deployment 和 WebSphere Process Server 時,我在日志中得到了這樣的錯誤。我試圖手動更 新 wps_install.bat 文件,以便獲得 WAS_SRC=%~1 和 WID_TARGET_DIR=%~2 的值,但是我所有的努力都 失敗了。Launchpad 在調用安裝過程的第 3 步時失敗了,並且日志文件中顯示了下面的錯誤:
(Sep 16, 2006 9:06:11 AM), Install, com.ibm.wstools.CustomExec, err, Error when
getting Resource Path: java.io.IOException: File does not exist: c:\software\
wpsinstall\disk5\external\WBI\extref.tmp
(Sep 16, 2006 9:06:11 AM), Install, com.ibm.wstools.CustomExec, err, Error when
changing permission of files: ServiceException: (error code = 399; message =
"/wps_install.bat does not exist"; severity = 0)
(Sep 16, 2006 9:06:11 AM), Install, com.ibm.wstools.CustomExec, err, IO Error
when Execute commands: java.io.IOException: CreateProcess: /wps_install.bat
C:\WID\WebSphere error=2
答:碰到這樣的問題,我會打開 PMR,請求 IBM Support 的幫助。您可以查看 Troubleshooting installations and updates to WebSphere Integration Developer。我曾在磁盤空間耗盡、在計算機上不具有正確的權限、或從網絡安裝目錄進行安裝時,碰到 過類似的問題。通常,在 WebSphere Integration Developer 安裝結束後,您可以運行 wps_install.bat。
問:我正在進行 JMS 點到點隊列消息傳遞,得到了下面的錯誤:
javax.naming.NameNotFoundException: Context: blrkec32515d/nodes
/blrkec32515d/servers/server1, name: jms/QCF: First component in name
QCF not found. Root exception is
org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org
/CosNaming/NamingContext/NotFound:1.0
at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read
(NotFoundHelper.java:84)
at com.ibm.WsnOptimizedNaming._NamingContextStub.resolve_complete_info
(Unknown Source)
at com.ibm.ws.naming.jndicos.CNContextImpl.cosResolve
(CNContextImpl.java:3491)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup
(CNContextImpl.java:1519)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup
(CNContextImpl.java:1480)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt
(CNContextImpl.java:1187)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookup
(CNContextImpl.java:1067)
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:132)
at javax.naming.InitialContext.lookup(InitialContext.java:360)
at PointToPoint.<init> (PointToPoint.java:41)
at PointToPoint.main(PointToPoint.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:79)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:41)
at java.lang.reflect.Method.invoke(Method.java:386)
at com.ibm.websphere.client.applicationclient.launchClient.createContainer
AndLaunchApp (launchClient.java:627)
at com.ibm.websphere.client.applicationclient.launchClient.main (launchClient.
java:422)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.
java:79)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:41)
at java.lang.reflect.Method.invoke(Method.java:386)
at com.ibm.ws.bootstrap.WSLauncher.main(WSLauncher.java:105)
答:WebSphere Application Server 支持許多不同的 JMS 提供者,包括內置的 Service Integration Bus 和 WebSphere MQ。從您的問題中,看不出您究竟使用的哪一個。有關如何在 WebSphere 中配置 JMS,請參閱下面的文章:
對於 Version 6,使用 Service Integration Bus 作為 JMS 提供者:
將消息驅動 bean 和 JMS 應用程序部署到服務集成總線中
IBM WebSphere 開發者技術期刊: 在服務集成總線中部署發布/訂閱應 用程序
對於 Version 6,使用 WebSphere MQ 作為 JMS 提供者:
IBM WebSphere 開發者技術期刊: 讓 WebSphere MQ 成為部署在 WebSphere Application Server 中的應用程序的 JMS 提供程序
對於 Version 5:
JMS Topologies and Configurations with WebSphere Application Server and WebSphere Studio Version 5
如果您正在使用資源引用,請記住在 JNDI 查找前面加上 java:comp/env 限定。
問:這是在 WebSphere Integration Developer v6.0.1 中自動生成的 .wsdl 文件中顯示的錯誤:
1.cvc-attribute.3: The Value "of attribute 'name' on element 'definitions' is not valid with respect to its ,'NcName'.
2.cvc-datatype-valid.1.2.1: "is Not a valid value for 'NcName'.
下面是我的 .wsdl 文件:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns="http://QuoteBusinessIntegration/com/satyam/aupl/components/
humantask/AcceptQuoteHT" xmlns:ns0="http://QuoteBusinessIntegration/com/
satyam/aupl/comonent/interfaces/
BusinessRules" xmlns:plnk="http://schemas.xmlsoap.org/ws/2004/03/partner- link/"
xmlns:tns="http://www.QuoteBusinessIntegration.process/AutoQuoteCGBS67378
/AutoQuoteCGBSArtifacts"
xmlns:wsdl0="http://QuoteBusinessIntegration/com/satyam/aupl/component
/interfaces/CreditScoreBridge"
xmlns:wsdl1="http://QuoteBusinessIntegration/com/satyam/aupl/component
/interfaces/QuoteBridge"
xmlns:wsdl2="http://QuoteBusinessIntegration/com/satyam/aupl/component
/interfaces/InsuredInfoBridge"
xmlns:wsdl3="http://QuoteBusinessIntegration/com/satyam/aupl/process
/AutoQuoteCGBSInterface" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="" targetNamespace="http://www.QuoteBusinessIntegration.process
/AutoQuoteCGBS67378/
AutoQuoteCGBSArtifacts">
<plnk:partnerLinkType name="CreditScoreBridgePLT">
<plnk:role name="CreditScoreBridgeRole">
<plnk:portType name="wsdl0:CreditScoreBridge"/>
</plnk:role>
</plnk:partnerLinkType>
答:Definitions 語句包括了屬性 name="" 。要麼該屬性不應該存在(根據我的習慣),要麼它必須有一個值。
致謝
作者感謝 Joseph Sharpe、Keys Botzum、Robert Peterson、Tom Kristek 和 Russell Butek 對撰寫 本文提供的幫助。