如果你刚开始考虑应用portal解决方案,或者想了解把一个新的或现有的JSF应用整合进一个portal环境有多容易,那么本文绝对值得你仔细研读。
在过去几年中,portals无论是在企业还是在增强的portlet 2.0(JSR 286)规范中都得到了长足发展。新2.0版本的portlets在聚合不同的应用,并将其呈现在同一个页面的不同窗口方面赋于开发人员很大的自由。此外,它还提供了认证功能,成熟的个性化特性和更好的处理AJAX的现成方法。
JSR 301 portlet桥接规范(portlet bridge specification)的出现,使我们具备了运行JSF应用的标准方式,不论portlets版本是1.0还是2.0.portlet桥(bridge)可以支配portal的Action/Render范式适当地处理JSF的生命周期。本教程将主要向你展示配置与开发JSF portlet是多么容易的一件事情,同时还会介绍新的JBoss Portlet Container 2.0及其一些很酷的新特性。
本文是由三部分组成的系列文章的第一篇。该系列文章从基本的JSF portlet和portal知识一直讲到portlet环境中的AJAX和Seam的高级用法。
现在准备开始吧!
项目安装开发工具:
要想成功实践文中的范例就要下载最新版本的Maven(我用的是2.0.9版本)。
安装 Maven 2.0.9+。
设置 Maven二进制版本的环境变量。
例子中用到的服务器和二进制版本:
JBoss Portal’s Portlet Container 2.0
JBoss Portlet Bridge Beta3
目前,JBoss Portlet Bridge是JSR 301规范的唯一实现,它允许你运行JSF、RichFaces和Seam的任意组合。你项目的Maven配置可安排下载打包在一起的JBoss AS和JBoss Portlet Container 2.0,如果你想分别下载它们,可以在此处找到这些文件。否则,就给Maven几分钟让它去自行下载适当的文件。
注意——在当前的2.6.5.SP1版本的JBoss Portal中同样可以运行这个portlet ,我在本文中使用了JBoss Portlet Container 2.0,但是桥(bridge)在两者中都能工作。你可通过此处了解令其可在任意版本的JBoss Portal中运行的配置方法。
下述Maven原型(Maven archetype)是创建项目的一种简易方式,可以快速建立并运行一个启始项目(或者模板项目)。一旦你运行了这些命令,就可获得实践本文示例所需的一切文件。
打开一个终端窗口并运行如下指令:
mvn archetype:generate -DarchetypeGroupId=org.jboss.portletbridge.archetypes
-DarchetypeArtifactId=1.2-basic
-DarchetypeVersion=1.0.0.B3 -DgroupId=org.whatever.project -DartifactId=myprojectname
-DarchetypeRepository=http://repository.jboss.org/maven2/ -Dversion=1.0.0.B3
现在,找到你的新建项目所在文件目录(如果你使用的跟上面的例子一样,那么目录名就应该是 “myprojectname”),浏览其中刚刚创建的所有文件,你将会看到一个基本Maven文件结构,其中带有适用于本文范例的源码。现在你就可以打开最喜欢的IDE环境,引入这个Maven项目了。
Portlet桥配置要求
从现在开始的开发过程更像是在Servlet世界中开发JSF应用,不同之处在于:处理类似单点登录这样的问题;诸如命名空间(namespacing)这样的需要portletContext 和访问变量的问题;以及portlet中像“Help”和“Edit”这样的窗口模式问题。我不想在本文讲述过多portlet的细节,但我会提供进行基本开发的必要信息。如果你想了解更多portlets的信息,请参考JSR 168或JSR 286规范说明。
JBoss Portlet Bridge比较酷的一点在于它不是一个portlet,它只是portlet和JSF之间的媒介。而你的JSF应用则是个portlet,不过除了 WEB-INF目录下3到4个额外的xml文件和关于bridge的Jar包外,它的其余部分与你的Servlet版本的应用毫无二致。下面几个配置文件是主要区别:
portlet.xml
<portlet>
...v <portlet-class>
javax.portlet.faces.GenericFacesPortlet
</portlet-class>
<init-param>
<name>javax.portlet.faces.defaultViewId.view</name>
<value>/home.xhtml</value>
</init-param>
<init-param>
<name>javax.portlet.faces.defaultViewId.edit</name>
<value>/jsf/edit.xhtml</value>
</init-param>
<init-param>
<name>javax.portlet.faces.defaultViewId.help</name>
<value>/jsf/help.xhtml</value>
</init-param>
...
</portlet>
web.xml
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>
org.jboss.portletbridge.application.FaceletPortletViewHandler
</param-value>
</context-param>
<context-param>
<param-name>javax.portlet.faces.renderPolicy</param-name>
<param-value>
ALWAYS_DELEGATE
</param-value>
</context-param>
faces-config.xml
<application>
<view-handler>
org.jboss.portletbridge.application.PortletViewHandler
</view-handler>
<state-manager>org.jboss.portletbridge.application.PortletStateManager</state-manager>
</application>
由于上述设置已经应用在你刚刚设定的Maven原型中,因此现在我们就可以编译项目,并在JBoss Portal上部署它了。