级别: 中级 Stefan Hepper, WebSphere Portal 编程模型架构师, IBM
2006 年 3 月 16 日 在这篇一问一答的文章里,我们邀请 WebSphere® Portal 专家 Stefan Hepper 来回答有关门户编程和 JSR 168 Portlet 规范方面的问题。
引言 WebSphere Portal 专家 Stefan Hepper 回答您在门户编程、JSR 168 Portlet 规范和 Java™ Portlet 开发方面的问题:为什么事情是这样而不是那样、如何解决特定问题、为什么缺少功能 XYZ 或者更一般的体系结构和策略性问题。WebSphere Portal 是市场中领先的门户产品,它提供与应用程序、内容、过程和人员的单点个性化交互。Portlet 是基于 Java 的 Web 组件,它可以生成能够插入到门户中的动态内容。有关 WebSphere Portal 的更多信息,请参阅 WebSphere Portal 专区。 问:从 Portlet 访问 HttpSession 的推荐方法是什么?我们想在会话中存储给定用户的有关信息,所以需要使用 HttpSession。 答: Portlet 会话是 HttpSession 上的一个 Facade。您放在应用程序作用域内的 Portlet 会话中的全部内容都将对此 Portlet 应用程序的所有 Portlet 和 Servlet 可见。请使用带有 APPLICATION_SCOPE 的 PortletSession。 问: IBM 是否提供通过 WebSphere Portal 实现的 .Net 应用程序示例? 答: 是的,在 http://wps51.dfw.ibm.com/ 中,您可以看到一个演示版的 WebSphere Portal。注册后,您可以在 My Work Developer's Area\WSRP 页面下方看到一个通过 WebSphere Portal 中的 Web Services for Remote Portlets (WSRP) 显示的 .Net Portlet。 问: 创建门户使用情况统计的最佳方式是什么?如何获得 Portlet 中选定的项(例如,指向后端 Notes 服务器中的文档的链接)的信息呢? 答:您可以使用当前用于 Web 站点分析的任何工具。WebSphere Portal 生成了一个 sa.log 文件,它遵循 Web 站点分析工具可以读取和评估的 NCSA Combined 日志格式。请参阅 Configuring WebSphere Portal for site analysis logging 和 Understanding the site analysis log。 问:如何才能禁止在 JSR 168 Portlet 中出现最小化和最大化按钮呢? 答:您在 Portlet 中无法做到这一点,因为这些按钮是由门户提供的。因此,对于特定的 Portlet,您的门户不需要呈现这些按钮。在 WebSphere Portal 中,可以通过创建特殊的皮肤来做到这一点。 问:要使用 JSR 168 Portlet 开发一个 Internet 银行应用程序,它包含领先的 J2EE、EJB 框架(如 Spring、Struts 等),将它部署在 WebSphere Portal 中是否是个很好的解决方案?有 25 万用户将访问此站点,WebSphere Portal 的性能如何?关于在 WebSphere Portal 中开发和部署什么类型的应用程序您有什么建议?据我所知,如果客户想要开发 Content Delivery System(包括第三方集成和协作),那么 WebSphere Portal 是最好的选择。但对于事务管理系统、B2B 应用程序等,也是如此吗?WebSphere Portal 适合开发这些应用程序吗? 答: WebSphere Portal 是在 WebSphere 平台上运行的,您可以利用 WebSphere 的所有 J2EE 功能,包括事务管理。是的,WebSphere Portal 非常适合于开发企业应用程序,我们的有些客户也正在运行有几百万用户访问的 WebSphere Portal。我们有许多客户将 Spring、Struts 或 JSF 等框架与 WebSphere Portal 一起使用。 问:我看过几个应用程序,它们都比较独立,但将它们放在 WebSphere Portal 后,它们都将使用 Web 门户来呈现。它们都需要各种输入表单供用户填写。这种情况的最佳体系结构是什么?是否应该为每个表单准备不同的 Portlet,或者有一种“表格驱动”的方式来做到这一点呢?我一直在考虑面向服务的体系结构的思想,我想您应该能够创建一种“表单服务”来完成这一工作。 答:您可以使用 Workplace Forms Designer 以所见即所得的方式创建这些表单,并将它们导出为 Portlet。 问:我试图对 WebSphere Portal 用户进行一些访问限制,即只允许他们密码输入错误几次,然后就阻止他们访问一段时间。有什么设置或解决方案可以实现这种情况吗?或者有什么地方可以让我获得此问题的解决办法呢?我试图在 IBM 和 WebSphere 站点上寻找关于此问题的建议方法或解决办法,但没有成功。 答:这个问题目前没有现成的解决方案,但是您可以从 Portlet 写入您的 LDAP 目录中,因为 WebSphere Portal V 5.1.0.1 附带了 com.ibm.portal.um 用户管理包。 问:我们的 WAR 中的 Java 类需要引用 WAR 外部的一些类。WebSphere Portal 5.1 中支持使用什么方式来做到这一点? 答:您可以将该 jar 文件放在 PortalServer/shared/app 目录中,以便所有 Portlet 应用程序都可以访问它们。 问:是否可以将登录用户作为 Theme JSP 文件中的脚本变量进行访问呢?我有一个自定义的主题。在我的自定义主题的 Banner.jsp 中,我试图访问用户对象中的登录用户的属性,以便可以在我的 scriptlet 中将用户属性作为字符串对象进行访问。可以在 <wps:if loggedIn="yes"> 中访问 <wps:user attribute=""/> 标记以显示用户属性。但遗憾的是,<wps:user> 标记并没有返回任何脚本变量来将一些自定义代码写入 scriptlet 中。我也试图通过在 Banner.jsp 中编写以下代码来实例化用户对象:
<%@ taglib uri="/WEB-INF/tld/portlet.tld" prefix="portletAPI" %>
<portletAPI:init />
User user = portletRequest.getUser();
|
但是 Portlet API 不能够在门户级别初始化。以上代码会引发某些异常。我需要实现以下逻辑:如果给出用户昵称,则显示该昵称,否则显示用户的全称。 答:自 WebSphere Portal 5.1.0.1 起,您可以通过 Portlet 或主题和皮肤来访问用户管理系统。请注意,Portlet 标记库或 API 一直都不应该用于主题和皮肤。您可以在您的主题中执行以下操作:
Context ctx = new InitialContext();
com.ibm.portal.um.PumaHome home = (PumaHome)
ctx.lookup(portal:service/usermanagement/Puma);
// note: you need to do the lookup only once
PumaProfile profile = home.getProfile(request);
// note: you need to get the profile for each request again
Map userattributes = profile.getAttributes(profile.getCurrentUser(),
listOfAttributes) ;
if ( userattributes.containsKey(nickname) )
|
问:我需要同时在 Login Portlet 和 Login 屏幕中显示无效登录错误消息。当用户输入无效的用户 ID 或密码时,我需要同时在缺省的 Login Portlet 和缺省的 Login 屏幕中显示适当的错误消息。目前,我只能在 Login Portlet 和 Login 屏幕的其中之一显示错误消息。但是我需要在这二者中都启用此错误消息显示功能。我尝试过更改 AuthenticationService.properties 文件中 authentication.screen.login 属性的值,但是并没有解决问题。您有什么建议? 答:您只应该使用这二者之一。首选的是 Login Portlet。 问:我们需要自定义 Login Portlet 和 Selfcare Portlet,在其中添加更多的字段。我们应该选择屏幕选项,还是应该选择 Portlet 选项?作出这一选择应该考虑什么因素呢?我们试过修改 Selfcare Portlet JSP,使之符合我们的需要,它们看起来也工作得很好,但是这种方法是否正确呢?或者只应该切换到屏幕选项呢? 答:使用 Portlet 的方法更加灵活。仍然支持屏幕的主要原因是为了与旧式版本相兼容。 问:我们有一个门户应用程序,它紧紧依靠 Portal Messaging 功能在 Portlet 之间交换数据。我们也需要使该应用程序对非 WebSphere 客户可用。但是 JSR 168 看起来并不支持任何 Portlet 间的消息传递。是否在什么时候 JSR 168 会支持消息传递?我们可以采取什么替代方法? 答:交换数据唯一的标准方式是通过作用域为一个 Portlet 应用程序中的 Portlet 的 Portlet 会话应用程序,或者通过跨应用程序的 EJB。Portlet 间通信将在 Portlet Specification 第 2.0 版解决,该规范已作为 JSR 286 提交给 JCP 了。 问:我们需要在 Solo 模式的弹出窗口中显示 Portlet。要在弹出窗口中显示的 Portlet 所在页面还有其他两个 Portlet。如何获得拥有此 Portlet 的控件的 objectID 或 uniquename,以便能够在 urlGeneration 标记中使用它? 答:目前,为 Portlet 指定唯一名称的唯一方式是通过 XMLAccess。我们将在下一版本的 WebSphere Portal 中通过 UI 来提供此功能。而目前,您需要在 XMLAccess 脚本中执行以下操作:
<request ...>
<portal action="locate">
...
<content-node content-parentref="Content.Root.My_Portal" action="update"
active="true" objectid="my.page.1" uniquename="my.unique.name.page"
type="page" skinref="undefined">
...
<component action="update" ordinal="100" type="control"
uniquename="my.unique.name.portlet">
<portletinstance action="update" objectid="my.page.1.portlet1"
portletref="ExtReg"/>
</component>
...
</content-node>
</portal>
</request>:
|
如果您只需要拥有一个弹出窗口,则也可以通过以下方式来实现:
<portal:urlGeneration contentNode="my.unique.name.page"
layoutNode="my.unique.name.portlet"
portletWindowState="maximized" newWindow="true">
<a href="<% wpsURL.write(out); %>">MyPortletInNewWindow</a>
</portal:urlGeneration>
|
对于 JSR 168 Portlet,Solo 模式支持目前不太容易使用,因为这些 Portlet 需要自己创建返回 URL(使用 com.ibm.portal.state API)。
参考资料 学习
讨论
关于作者  | 
|  | Stefan Hepper 是负责 WebSphere Portal 编程模型和公共 API 的架构师。他是 Java Portlet Specification JSR 168 的负责人之一。他也在 Apache 上启动提供 JSR 168 引用实现的 Pluto 项目。Stefan 在国际会话(例如 JavaOne)上发表了大量演讲和各种论文,并且与人合作撰写了图书 Pervasive Computing(Addison-Wesley,2001 年)。他的研究兴趣是基于组件的软件体系结构、普及基础设施,当然还有门户和 Portlet。Stefan 在德国的卡尔斯鲁厄大学获得计算机科学的毕业文凭,并于 1998 年加入 IBM Boblingen Development Laboratory。 |
对本文的评价
|