技术开发 频道

专家访谈: Roland Barcia 谈 JMS 和 JSF 的使用

  【IT168技术文档引言

  IBM® WebSphere® Application Server 是基于 Java 的 Web 应用服务器,它创建于开放标准之上,使您能部署和管理从简单 Web 站点到强大的电子商务解决方案的各种应用程序。IBM WebSphere Studio Application Developer(下文中简称为 WebSphere Studio)是一个集成开发环境,可以用来构建、测试、部署 J2EE 和 Web Services 应用程序。更进一步的信息,请参阅 developerWorks WebSphere Application Server 专区和 developerWorks WebSphere Studio 专区。

  JavaServer Faces 曾经是 J2EE Web 开发中最被看好的技术之一。在 WebSphere Studio 中,JavaServer Faces 已经可以使用了。JavaServer Faces (JSF) 提供了可视化开发 J2EE Web 应用程序新的途径。

  : 这是一个很基本的问题。您能比较一下 JSF 和 Struts 之间各自的优缺点吗。如何了解现在和将来的技术趋势,JSF 如何以及是否将会发展成为相对于 Struts 更出色的技术。另外,WSAD 如果可以使两者不同的话,将在两者的比较中将会充当什么样的角色。

  : 这是近期很热门的一个问题。一般来说,JSF 仍然是相当新的技术,需要时间来完全地成熟。然而,我看到 JSF 已经可以完成 Struts 可以做的任何事,而且做的更多。Struts 并不是来自于强制性的需求。它是开发人员厌烦了一次次的编写相同的逻辑而创造的。JSF 的出现,既是必然的需要也是竞争的结果。

  Struts 有以下优点:

  ·Struts 是一个成熟的、被证实了的框架。它已经使用了几年,且被成功部署到许多项目中。WebSphere Application Server 管理控制台就是一个 Struts 应用程序。

  ·Struts 使用 Front Controller 和 Command 模式,可以处理复杂的控制器逻辑。

  ·除了核心的控制器功能以外,它还有很多其他的优点,比如使用 Tiles 布局、说明性(declarative)异常处理以及国际化。

  以下是其缺点:

  ·Struts 是非常以 JSP 为中心的,必须使用其他框架来适应其他视图技术。

  ·尽管 Struts 有丰富的标记库,但是它只能帮助进行控制器方面的开发,当您处理关于页面的组件时,它没有任何意义。因此,从视图的角度来看,它没有提供好的工具。

  ·Struts 需要关于 Java™ 的知识。其目的是帮助 Java 开发人员,而不是隐藏 Java。它在对 Web 开发人员隐藏 Java 语言的细节这一方面做的并不好。

  ·ActionForms 被程式化的与 Struts 框架链接。因此,为了降低模型的耦合度,您需要编写传送代码或者在输入时使用工具将数据从 Action Forms 移动到 Model。

  JSF 从包括 Struts 的少数框架发展而来。Struts 的创建者,Craig McClanahan,即是 JSF 规范的领导人之一。因此,能看到 Struts 和 JSF 之间的一些相似之处,这并不是偶然的。JSF 的主要目的之一就是使得 J2EE Web 应用程序在 RAD 工具下易于开发。同样地,它也引入了丰富的组件模型。JSF 有如下优点:

  ·JSF 是一个来自 Sun® 的规范,将会被包括在 J2EE 规范的未来版本之中。各主要供应商都保证对 JSF 提供强力支持。

  ·JSF 使用 Page Controller Pattern,因此会对页面密集型应用程序有帮助。相应组件会对来自页面上组件的事件作出响应。

  ·JSF 有一个明确定义的请求生命周期,保证了在不同级别上的可插入性(plugability)。

  ·可插入性的一个有力的例子是构建您自己的 render 工具包。将框架中的呈现(rendering)部分和控制器部分分离的能力实现了良好的可扩展性。组件供应商可以编写他们自己的工具包以处理不同的标记语言,如 XML 或 WML。另外,render 工具包也不依赖于 JSP。

  ·因为 JSF 有一个丰富的组件模型,所以它支持 RAD 类型的开发。现在我可以使用拖放技术来构建我的 Web 页面。此外,JSF 提供在不打破层次布局的条件下,将可视组件同后台模型组件连接起来的途径。

  JSF 有以下缺点:

  ·JSF 仍是相当新的并处于发展过程中。要看到成功的部署和广泛的应用还需要一段时间。另外,组件供应商可能并不能做您想让他们完成的所有事情。

  ·手工方式的 JSF 并不比 Struts 简单。它的目标更倾向于 RAD。那些喜欢手工开发的人(例如,那些不喜欢 IDE 的 vi 类型的人)可能会发现 Struts 更容易开发。

  ·Struts 导航可能会更加灵活一些,但同时也导致控制器逻辑更加复杂。

  JSF 和 Struts 将会继续共存一段时间。Struts 社区已经了解了 JSF 并在作出一些改变以对 JSF 提供强大的支持。参见 What about JSTL and JavaServer faces?

  在工具的角度,如果您留意了 WebSphere Studio 对 JSF 和 Struts 的工具支持,将会发现 Struts 工具集中于控制器方面。Web Diagram 编辑器帮助构建您的 Struts 配置,而向导/编辑器构建 Struts 构件。JSF 工具适合于构建页面,而实质上向您隐藏了 JSF 框架。可以预计 WebSphere Studio 将暂时同时支持两种框架。当 JSF 趋于成熟以后,预计将可以在 JSF 中看到一些控制器方面的可用工具。

  : 将大型应用程序从 Struts 向 JSF 进行迁移的非常好的途径是什么?是否有一些有帮助的支持工具?

  : 这是一个决定于您的 Struts 应用程序的复杂任务。因为两种框架有着不同的目标,这将存在一些挑战。首先迁移您的响应页面。保留 Struts 控制器,同时在前端使用 JSF 页面。然后您可以配置 Struts 前端以检查 Faces servlet。可以考虑参考 Apache 的 Struts-Faces 框架。参见 JSF in Action的框架一章。

  :是否有从 Struts 到 JSF 的迁移途径?比起 Struts,JSF 的成熟性如何?

  : 对于第一个问题,参见前一个问题的回答。对于第二个问题,参见问题 1 的回答。

  : 我能否用 Message-Driven bean 来代替 Stateless session bean?

  : 程式化地说,任何事都是可能的。但是这种类型的改变应该是需求驱动的。Message Driven Bean (MDB) 是一个用来接收 JMS 消息的异步监听器。Stateless Session Bean 既通过本地接口进行监听,也使用远程接口通过 RMI/IIOP 进行监听。应用程序逻辑应该根据向多个客户端提供服务的方式进行分层。您可能考虑通过 MDB 来取代 Stateless Session Bean,以便增加其可被多个客户端访问的能力。图 1 展示了相关概念。

  图 1. 概念  

  有关这个话题, Enterprise Java Programming with IBM WebSphere, Second Edition是一个很好的资料。

  : 我在使用 WSAD 5.1.1。与 Sun JSF 1.1 发布对应,WSAD 中支持 JSF1.1 的 RAD 组件何时才能用于产品应用? (由 Jay B. 提出)

  : IBM 近期还没有转向 JSF 1.1 的计划,因为原来的实现(WebSphere Studio 5.1.2 中所附带的)包括了对 JSF 1.1 中缺陷的更正。采用 JSF 1.1 对于 IBM 已经发布的代码来说是多余的。应当提醒的是 IBM 是 JSF 工程主要的代码提供者,并且 IBM 在 WebSphere Studio 5.1.2 中附带的更正是算作 JSF 1.1 一部分的。当 JSF 经过一段时间的继续发展以后,IBM 将会采用新的版本。

  : 合适的 WSAD 和 Portal Toolkit 开发环境是什么样子的?我们的团队必须在 Portal Server 4.2.1 上部署应用程序。我们也正在使用 Rational XDE。计划在 2005 年 2 月将整个产品转向 WAS 5.1。我们将使用 Struts 并将考虑使用 JSF。

  我们是否能使用 WSAD 5.1.2 加上 Portal Toolkit 5.0.2.2?我希望能在开始向 Portal Server 4.2.1 部署时,使开发人员的生产率最大化。请问您推荐什么样的 WSAD 和 Portal Toolkit 开发环境呢?

  : 要向 WebSphere Portal 4.2.1 部署,您可以使用 WebSphere Studio 5.1.2,并使用 WebSphere Portal 4 测试环境配置。WebSphere Studio 向后兼容 4 版本的 WebSphere Portal。然而,与对应于 WebSphere Portal 5 的版本 5 的 Unit Test Environment 不同,您需要单独安装 WebSphere Portal 4 UTE。像 JSF 等一些特性在版本 4 的 WebSphere Portal 中并不可用。此外,您也不能使用 J2EE 1.3 API 或者 JSR 168 Portlet 规范。一旦您移向 WebSphere Portal 5.0.2,就可以构建基于 JSF 的 portlet 了。

  一旦您移向 5.1 版本的 WebSphere Application Server,就可以使用 JSF 特性了。然而,在您的环境下,使用 IBM Portlet API 的 Struts 应该是非常好的的解决方案,因为它同时被版本 4 和 5 支持。然而,版本 4 的 Struts 支持是基于 1.0 的,而版本 5 是 Struts 1.1。您可能需要对 Struts 代码进行少量的迁移以使用 Struts 1.1。

  : 我正在从 WAS 4 向 WAS 5 迁移。虽然没有任何编译错误,但是当我测试应用程序时,在控制台上打印出如下错误:

[6/23/04 12:59:047 SGT] 493877ce WebGroup E SRVE0020E:
[Servelt
Error]-[BF02SPINSLoginServlet]:
Failed
to load servlet:
java.lang.NoClassDefFoundError:
com
/ibm/ejs/models/base/config/applicationserver/WebModuleRef
at java.lang.Class.newInstance0(Native Method)
at java.lang.Class.newInstance(Class.java.
262)
at java.lang.Class.Instantiate(Beans.java.
233)
at java.lang.Class.Instantiate(Beans.java.
77)
at com.ibm.ws.webcontainer.webapp.WebAppServletManager.loadServlet
(WebAppServletManager.java.
188)

  我试图在 class path 中添加 ws-base-config,但还是出现问题。

  : 迁移 J2EE 应用程序和服务器有时候是需要技巧的。没有更多的信息,是很难诊断您的问题的。J2EE 1.2 应用程序应该可以不作任何修改在 WebSphere Application Server 上运行的。确保服务器包含的必要的配置资源。例如,对于 J2EE 1.2 应用程序,确保配置了一个 WebSphere Application Server 4 数据源。

  如果您的的迁移包括了对 J2EE 应用程序从版本 1.2 到 1.3 的升级,可以参阅 Migrating to WebSphere V5.0, An End-to-End Migration Guide。

  我建议在 WebSphere Application Server 5 上运行版本 1.2 的 J2EE 应用程序,以消除任何服务器配置的问题。然后您可以集中精力进行应用程序迁移。

  : 在我编写应用程序时,是否可以在 SWING 上使用 JSF(或者反过来)?是否有这样的成功案例?

  : JSF 主要还是一个运行 J2EE Web 应用程序的 MVC 框架。JSF 组件模型的意图是帮助开发人员使用 RAD 工具来开发 Web 应用程序,这些工具是胖客户端应用程序开发人员所习惯使用的。尽管您可以创建自定义的 render 工具包来扩展 JSF,以处理 来自服务器的胖客户端控件,JSF 的目标或者基于 Web 的应用程序。您应该考虑回答这样的问题:“我是要构建一个胖 GUI 的应用程序还是一个基于 Web 的系统?”

  : 我现在正在设计一个应用程序,考虑使用 Struts 还是 JSF。我应该用什么样的标准在两者之间选择?

  : 这是一个普遍的问题。问题 1 的答案可能是有帮助的。此外,考虑以下方面:

  ·计划中的部署日期是什么时候?如果需要立即部署,那么应该选择 Struts。如果部署的时间比较远,应该选择 JSF。

  ·您的开发人员技术水平如何?采用他们擅长的 RAD IDE 类型的方法,或者采用他们更喜欢的手工编程方式。您的视图开发和控制器开发是否由不同的开发人员来完成?我一直认为应该考虑他们开发团队适合的水平。

  ·您的控制器逻辑复杂程度如何?您的页面复杂程度如何?Struts 支持复杂的控制器逻辑(使用输入的逻辑对导航有主要的影响)。JSF 更擅长于复杂的页面逻辑(需要丰富的事件模型和模型同步的许多组件)。

  ·您有什么类型的模型(EJB、JavaBeans、JDBC 等等)?向您的 JSF 供应商核对被支持的数据组件。例如,WebSphere Studio 将其简化为直接把 SDO 或 JavaBean 对象拖到页面上合适的位置。

  ·您是从零开始构建新的页面/Web 应用程序,或者重用/迁移现有的应用程序?如果您有使用 Struts 实现的现有页面或现有应用程序,那么您必须考虑迁移的代价。

  ·供应商支持的重要性如何?JSF 和 Struts 同时被 IBM 支持。

  ·您的企业应用程序将有什么类型的客户机?(Web Based、HTML、XML、Mobile、GUI 等等)

  : 我正在使用 WebSphere MQ 5.3 Publish/Subscribe 功能。我如何使用 WebSphere MQ 5.3 在服务器和客户机计算机上配置代理拓扑(broker topology)?以及,我如何创建主题层次以便利用 WebSphere MQ 提供的这个特性?

  : 当 WebSphere MQ 和 WebSphere Application Server 一起使用时,有许多拓扑选项设置。在 WebSphere MQ JMS 提供者那里设置 Topic Connection Factories 和 Queue Connection Factories。

  以下的书籍和文章包含您所需要的信息:

  ·Enterprise Messaging using JMS and IBM WebSphere··

  ·IBM WebSphere: Deployment and Advanced Configuration

  ·JMS Topologies and Configurations with WebSphere Application Server and WebSphere Studio Version 5

  关于层次的话题,JMS 并没有规定内容如何被组织成主题层次。这是一个和具体提供者相关的方面。在 MQ JMS 中,主题被安排成树状层次。您必须在 JNDI 命名空间中注册 Topic,您不能在 MQ 中执行创建任务。当某一特定主题的发布者或订阅者被第一次创建时,代理例示主题。

  : 我正在试图解决我的 wsadmin jacl 脚本中的问题。当创建 Application Server 时,使用 wsadmin 脚本怎样做以下工作: 1)启用 ORB Pass By Reference 选项。 2)设置 Generic JVM Args。

  在创建数据库提供者时: 1)即使在组件管理的持久别名被设置时,AuthData 别名还是没有被设置(Admin Console 的下拉菜单)为容器管理的持久。

  在部署时: 1)Resources 的 Map Resource Reference 属性 - JNDI 名称没有被正确设置。

  我正在试图寻找 wsadmin 脚本提供的参数名称。例如,我使用 SOAP_CONNECTOR_ADDRESS。它不起作用,但是 BOOTSTRAP_ADDRESS 起作用。如果在什么地方能找到这些参数的名字,那将是非常有帮助的。 (由 Nisha 提出)

  : 在 WebSphere Application Server 5.1 Information Center 中有许多 wsadmin 的例子。我写的书 IBM WebSphere: Deployment and Advanced Configuration,也有一个关于 wsadmin 的完整例子。

  关于启用 ORB Pass By Reference 选项,参见 Configuring an ORB service using wsadmin。关于设置一般的 JVM args,参见 Configuring the JVM using wsadmin。

  关于创建数据库提供者,有关信息可能不在 Information Center 中,所以,我附上我书中的一个程序片断。关于创建容器管理的别名,您必须把 J2C 别名附在映射模块上,而不是 DataSource 本身。

puts "\nCreating the datasource $dsName"
set attrs2 [subst {{name "$dsName"} {description "$dsDescription"}}]
set ds1 [$AdminConfig create DataSource $jdbcProviderID $attrs2]
#
Set the properties for the data source...
set propSet1 [$AdminConfig create J2EEResourcePropertySet $ds1 {}]
set attrs3 [subst {{name databaseName} {type java.lang.String} {value "$databaseName1"}}]
puts
"\nj2eeresourceproperty"
$AdminConfig create J2EEResourceProperty $propSet1 $attrs3
set attrs4 [subst {{jndiName $jndiName}
{statementCacheSize $statementCacheSize}
{datasourceHelperClassname $datasourceHelperClassname}
{authMechanismPreference
"BASIC_PASSWORD"}}]
$AdminConfig modify $ds1 $attrs4
#Create the connection pool
object...
$AdminConfig create ConnectionPool $ds1
{{connectionTimeout
1000} {maxConnections 30} {minConnections 1}
{agedTimeout
1000} {reapTime 2000} {unusedTimeout 3000} }
#
Set the auth mapping properties
set authDataAliasList [list authDataAlias $aliasName ]
set mappingConfigAliasList [list mappingConfigAlias DefaultPrincipalMapping ]
set mappingList [list $authDataAliasList $mappingConfigAliasList]
$AdminConfig create MappingModule $ds1 $mappingList

  关于 Resources 的 Map Resource Reference 属性 - JNDI 名称没有被正确设置,参见 Wsadmin tool。

  : 我的站点是一个中等规模的银行(200,000 名顾客),在 Windows 2000 服务器上运行 WebSphere 4.05,使用 SQL2000 作为 WebSphere 存储库。首先我想知道的是“这是否是一个不正常的配置?”您是否也可以告诉我什么样的配置最能适合这样规模的应用?我想问的另一个问题是关于脚本部署,当前我们使用手工部署,大多数网站是怎么做的呢? (由 bendigobank.com.au 的 StephenP 提出)

  : 关于您的第一个问题,有许多性能方面需要考虑的事情,比如 windows 服务器的数量、您的 SQL2000 服务器的冗余等等。不同的顾客使用不同的平台和环境。我曾经看到用户在 AIX®、Solaris®、Linux、Windows® 和 z/OS 上成功地运行 WebSphere。这个问题很难给出这样一个普遍的答案。可以考虑去看我的同事 Stacy Joines、Ruth Willenborg、Ken Hygh 所著的书 Performance Analysis for Java Websites。这本书里有大量的关于衡量 Web 站点规模和性能测试应用程序的参考。

  关于您的第二个问题,使用脚本可以使许多以前由开发人员、组装人员、部署人员和管理员所做的单调乏味的手工工作自动化,这是一个高效的方法。如果您的应用程序封装的比较简单,手工部署对于小到中规模的应用程序还是可以成功的。然而,自动化可是帮你免除重复的劳动,为其他任务空出资源来。这是我所写的书 IBM WebSphere: Deployment and Advanced Configuration 中主要的论题。在书中,我们分析了各种各样的组装和部署模型,并阐述了为什么使用脚本的自动化是有益的。

  : 我们开发了一个 J2EE 的银行 Web 应用程序。在启用以后,我们收到了储户强烈的抱怨:网站太慢了,不能浏览,也无法连接。我们知道问题所在:在上午时间(9-11时)我们能收到 500 个并发连接。我们担心 WebSphere 服务器不能同时连接超过 500 个用户。是否有什么优化应用程序性能的方法。请告诉我们大多数流行的网站所使用的性能优化技术。 (由 Brijesh 提出)

  : 关于性能的问题,没有简单的答案。这可能包括从应用程序到配置的各种问题。我曾经看到因为开发人员在他们的登录框架里没有初始化 StringBuffers,导致应用程序在垃圾收集上运行极其缓慢。要解决您的性能问题,参阅 Performance Analysis for Java Websites。

  一般情况下,性能测试应该是您的产品正式使用之前的部署过程中的一个主要部分。我需要关于您的问题的更多信息。当您说 500 个并发连接时,我理解为您是指 Web 容器。您是否聚集了您的应用程序?您是否有 Web 服务器?在下列资源中您可以看到各种各样的布局:

  ·IBM WebSphere: Deployment and Advanced Configuration

  ·IBM WebSphere V5.1 Performance, Scalability, and High Availability WebSphere Handbook Series

  : 是否有什么方法能提供以前遗留的 I-Series 上的 RPGLE 程序到 VARPG 的接口。换句话说,程序的前端 GUI 屏幕已经设计并运行在 AS400 上了?

  : 这种案例实际上我也没有经历过。不过,您想要看到的可能是以下这些产品:

  ·WebSphere Host Access Transformation Service (HATS)

  ·WebSphere Host On Demand

  ·WebSphere Studio Enterprise Developer

  ·iSeries Development Family

  : 我在用不同于 Java 的其他语言(例如 Borland Delphi 和 C++)连接 MQ 5.3,以使用 WebSphere MQ - mqic32.dll 中的库。但是,在发送前将消息转换到 JMS-format 时,会出现问题。IBM 是否有相应的 dll 库或别的构件来与 Java 以外的其他语言中的 JMS 操作一起工作?

  : 您需要在 WebSphere MQ Queue 配置中将 Target Client Flag 设置成 MQ。

  这在 JMS Topologies and Configurations with WebSphere Application Server and WebSphere Studio Version 5 中有讲述。您可以在 WebSphere MQ Queue 的配置下设置目标客户机。

  图 2. 新建 WebSphere MQ Queue  

  通过对 JMS 进行这样的设置,您的 JMS 程序将被限制于只能理解被其他 JMS 程序写或者读的消息。通过将目标客户机设置成 MQ,WebSphere 中的 JMS 程序就能够理解 MQ 支持的其他 API 向 WebSphere MQ 所写的消息。

  图 3. 设置目标客户机  

0
相关文章