级别: 中级 Roland Barcia (barcia@us.ibm.com), 认证 IT 专家, IBM
2007 年 6 月 18 日 WebSphere 咨询师 Roland Barcia 解答有关在 WebSphere® 中使用 Ajax 技术构建 Web 2.0 应用程序的问题。
引言
 | |
请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何关于 Ajax 的新信息都能在这里找到。
|
|
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 抽象和小部件库的浏览器工具包:
- 调试框架:
- 服务器端 Java 框架:
另外,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 中人工任务组件的参考资料:
问:您如何在 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 安全性的文章:
除了这些“旧”的内容之外,我们必须认识到,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 提供者:
- 对于 Version 6,使用 WebSphere MQ 作为 JMS 提供者:
- 对于 Version 5:
如果您正在使用资源引用,请记住在 JNDI 查找前面加上 java:comp/env 限定。
问:这是在 WebSphere Integration Developer v6.0.1 中自动生成的 .wsdl 文件中显示的错误:
- cvc-attribute.3: The Value "of attribute 'name' on element 'definitions' is not valid with respect to its ,'NcName'.
- 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 对撰写本文提供的帮助。
参考资料
关于作者  | |  |
Roland Barcia 是位于纽约/新泽西地区的IBM WebSphere 软件服务部的一位认证 IT 专家。他是 IBM WebSphere: Deployment and Advanced Configuration 的合著者之一。有关 Roland 的详细信息,请访问他的网站。 |
对本文的评价
|