摘要http://dev2dev.bea.com.cn/techdoc/wlportal/200409255.html
WebLogic Portal 8.1 Service Pack 2已经面世几个月了。到本文发表时,Service Pack 3可能也会面世。我利用该版本完成了几个WebLogic Portal项目,这期间我碰到了几个大大小小的问题。
作者:Kunal Mittal
WebLogic Portal 8.1 Service Pack 2已经面世几个月了。到本文发表时,Service Pack 3可能也会面世。我利用该版本完成了几个WebLogic Portal项目,这期间我碰到了几个大大小小的问题。
本文将提供几个技巧和窍门来解决这些问题,并附上合适的代码片断帮助门户(Portal)开发人员。请注意这几个代码片断可在BEA新闻组和/或作为BEA WebLogic Portal示例的部分中找到,BEA WebLogic Portal示例是与WebLogic Platform下载一同发布的。不过 ,我已经摘录了这些代码片断中的大部分并对其进行了修改,以适应我将要在本文中使用的用例。让我们开始吧……
技巧 1:登录门户
BEA 示例箱提供了几个登录例子。选择登录类型时,有几件事情要牢记在心:您想支持使用cookie的自动登录、使用控制器或备份文件的登录吗?有一件事要记着,您在登录后总是希望更新门户,这样才能获得利益。有两个示例值得关注,就是位于指南门户目录下的AutoLoginBacking.java 和LoginBacking.java文件。我喜欢为登录过程使用备份文件,这样就可以执行自动登录和其他的登录核对而无需考虑用户标记的确切页的URL。表1显示了AutoLoginBacking.java。我已经采用了BEA提供的原始AutoLoginBacking.java,并将其与LoginBacking.java合并。在删除有关注销的cooky时我碰到了一些问题。在本例中您将看到一个完整的工作实现(本文的代码可在www.sys-con.com/weblogic/sourcec.cfm中找到)。
技巧2:利用Portlet Maximize 和 Minimize工作
您将经常感觉到有必要控制portlet的最大化和最小化行为。我将为您展示一个代码片断,对该代码片断进行适当的调整,就可用于几乎所有需要的场景。让我们先看一下代码,然后我将讨论在何时、何处使用这段代码。
首先您需要做的是获得一个PortletBackingContext:
PortletBackingContext context =
PortletBackingContext.getPortletBackingContext(request);
在上下文对象上,您可以做一些事情,比如修改模式(View Mode 或 Edit Mode),或修改状态(Normal、Minimized 或 Maximized)。您将需要这样的代码:
context.setupModeChangeEvent(WindowCapabilities.VIEW.getName());
context.setupStateChangeEvent(WindowCapabilities.MAXIMIZED.getName());
您也可以编程来隐藏按钮。例如,为了隐藏最大化按钮,可使用如下代码:
context.setCapabilityVisible(WindowCapabilities.MAXIMIZED, getName(), false);
上面所展示的是您在利用portlet的状态、模式和可视性工作时所需要的所有代码行。我已经将其用于备份文件和控制器。例如,考虑如下的用例:
1. 您有4个页面,每个页面有一些portlet。比如说用户位于Page 1,并且他们将Portlet最大化。接着他们转到Page 2。当他们回到Page 1时,默认情况下已经最大化的Portlet仍将保持最大化。如果希望恢复该页面,那么您需要使用一个位于页面或Portlet级的备份文件。
2. 您已经在Portlet标题栏上启用了EDIT按钮。如果您希望编辑页始终以最大化视图的方式显示,那么您仍然需要备份文件。在这种情况下,您需要检查模式,如果模式为EDIT,那么您需要将porlet最大化,类似地,如果模式为VIEW,则您需要将portlet恢复到其最初的状态。
3. 您不希望将最大化按钮显示给用户,但您仍然支持上面的两种用例。在这种情况下,您无法关闭最大化功能,但是您可以使用上述代码隐藏图标。
4. 您也可在控制器的beforeAction() 和 afterAction()方法中使用该代码,以便控制portlet的行为。
技巧3:为控制器刷新Action
在Service Pack 2中发布了一个补丁,每次刷新页面时,该补丁可强制控制器重新执行。没有该补丁,在刷新时控制器就不会执行(补丁编号为CR129301,来自BEA)。本人推荐您下载这个补丁,因为您将几乎确定无疑地需要它。该补丁有希望成为Service Pack 3的一部分。
技巧4:SR 168 Portlet中的IconUrl
您无法使用WebLogic Workshop中的iconUrl特性来为JSR 168 portlet设置标题栏中的图形。您需要编辑weblogic-portlet.xml文件来完成这项工组。请参见下面的代码片断。
<portlet>
<portlet-name>myPortlet</portlet-name>
<supports>
<mime-type>text/html</mime-type>
<titlebar-presentation>
<id>jsr-titlebar</id>
<icon-url>window-icon.gif</icon-url>
</titlebar-presentation>
</portlet>
技巧5:DotPortal 与流动模式
这些模式的基本不同之处在于,您是要从那些在EAR中绑定的XML文件中还是要从数据库中读取门户定义。在流动模式中部署,以便为portlet定义权利是一个不错的主意。并且,在流动模式中您可以动态地控制portlet的布局、外观和感觉以及其他的类似用户属性。
从开发的观点来看,这里真正的技巧在于保持所有URL的关系。在流动模式中,所有的URL都将改变,因此您需要注意这一点。这里有一个代码片断,可以使用它检查您是处于DotPortal还是流动模式。
<%@ page import="com.bea.netuix.servlets.manager.AppContext"%>
if (session.getAttribute("DOT_PORTAL") == null)
{
AppContext appContext = AppContext.getAppContext(request);
if (appContext.isDotPortal())
{
session.setAttribute("DOT_PORTAL", new Boolean(true));
}
else
{
session.setAttribute("DOT_PORTAL", new Boolean(false));
}
}
结束语
本文针对我在建立门户应用程序的过程中碰到的常见问题,提供了一些简单的技巧和窍门。这些技巧和窍门中有很多与那些应该成为Service Pack 3一部分的补丁和bug有关。其他的则是一些基于您特定的用例的简单调整。
关于作者
Kunal Mittal是Web服务和面向服务的架构的实现和策略顾问。他与其他人共同编著和撰写了几本Java、WebLogic 和 Web 服务方面的书籍。(更多)
源代码
Source Code - Zip file