jsf标签<p:ajax>
如果您只是开始考虑使用门户网站解决方案,或者想了解将新的或现有的JSF应用程序集成到门户网站环境中是多么容易,那么本文适合您。
在过去的几年中,门户网站在企业中以及Portlet 2.0( JSR 286 )规范的新增强中都取得了很多进展。 新的2.0 Portlet使您可以自由地聚合不同的应用程序并将它们显示在一页上的不同窗口中。 当然,您将获得身份验证,完善的个性化功能以及开箱即用的处理AJAX的更好方法。
有了JSR 301 Portlet桥接规范,我们现在有了运行JSF应用程序的标准方法,既可以是1.0也可以是2.0 Portlet。 Portlet桥接器处理门户网站Action / Render范例以正确处理JSF生命周期。 尽管本教程主要向您展示配置和开发JSF Portlet的过程是多么容易,但我还将展示新的JBoss Portlet Container 2.0及其一些很酷的新功能。
这是三篇系列文章中的第一篇,其文章涵盖了从基本的JSF Portlet和门户知识到在Portlet环境中高级使用AJAX和Seam的范围。
现在,让我们继续。
项目设置
开发工具:
要遵循本指南,请下载最新版本的Maven。 (我正在使用2.0.9) Maven 2.0.9+ Maven二进制文件在您的路径上示例中使用的服务器和二进制文件:
JBoss Portal的Portlet容器2.0当前,JBoss Portlet Bridge是JSR 301规范的唯一实现,它允许您运行JSF,RichFaces和Seam的任意组合。 已设置项目的Maven配置,以下载打包在一起的JBoss AS和JBoss Portlet Container 2.0。 如果要单独下载它们,可以在此处找到它们。 否则,请在接下来的步骤中让Maven几分钟下载正确的文件。
注–该Portlet也可以在当前的2.6.5.SP1版本的JBoss Portal中运行。 我在本文中使用的是JBoss Portlet Container 2.0,但该桥在任何一个中均可工作。 您可以在此处阅读如何配置以在任何版本的JBoss Portal中运行。
以下Maven原型是使用入门(或模板)项目快速启动并运行的简单方法。 运行此命令后,您将拥有开发和遵循本指南所需的一切。
打开一个终端并运行:
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应用程序一样。 唯一的区别是处理诸如单点登录,portletContext和访问诸如命名空间之类的东西所需的变量,以及访问portlet中的窗口模式(如“帮助”和“编辑”模式)所需的变量。 我将不涉及Portlet世界的极端细节,但我将为您提供进行基本开发所需的信息。 如果您需要有关Portlet的更多信息,请阅读JSR 168或JSR 286规范。
关于JBoss Portlet Bridge的很酷的事情是,它不是Portlet。 它只是Portlet和JSF世界之间的中介者。 您的JSF应用程序是portlet。 您的WEB-INF目录将包含3或4个额外的xml文件以及桥罐,但其他所有内容与应用程序的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。
运行演示应用程序
编译新项目,并分两个步骤进行部署:
第1步: mvn install cargo:start -Premote-portal -Dpc20
此命令将花费几分钟的时间下载服务器+门户捆绑软件,因此请等到看到以下内容后再进行下一步:
*注意-在服务器启动之前,您还将看到PortletException。 这是正常现象,并且是Portlet Container 2.0演示程序的FailDuringInitPortlet
的FailDuringInitPortlet
。
接下来打开第二个终端窗口,导航到JSF portlet项目根目录并运行:
第2步: mvn cargo:deploy -Premote-portal -Dpc20
命令行参数指示货物有关JBoss + Portal软件包位于何处以及正在运行的门户版本。 您也可以在兼容JSR 168的最新版本的JBoss Portal 2.6.5.SP1上运行此示例。 欲了解更多信息和Maven的命令见了JBoss的Portlet Bridge文档找到这里 。 要查看已部署的JSF Portlet,请访问: http:// localhost:8080 / simple-portal / demo / jsr-301.jsp
JSF Portlet开发
现在,让我们看一下将Portlet和JSF开发联系在一起的几件事。
以普通的Webapp方式查看您的Portlet
当将您的应用程序视为servlet端Web应用程序时,portlet桥是透明的。 作为Portlet开发人员,很高兴每隔一段时间进行一次健全性检查,以确保您正在开发的内容不会因为在门户网站环境中运行而被破坏。 要查看此演示应用程序或通过桥接器部署的任何应用程序,可以访问http:// localhost:8080 / JSFRIPortlet / home.jsf
命名空间
该网桥处理门户网站环境中JSF的命名空间组合。 在需要在JSF / xhtml标记中使用元素的ID的情况下,通常会在呈现的标记中看到类似“ form1:myBtn”的内容。 但是现在使用桥命名空间,您将看到类似于以下内容:
jbpns_2fdefault_2fNews_2fStories_2fStoryTemplateWindow12snpbj:_viewRoot:form1:myBtn
为了克服这个问题,您可以在Facelets页面中使用以下表达式将名称空间添加到javascript代码之前:
document.getElementById('#{facesContext.externalContext.response.namespace}the_rest_of_JSF_ID');
请注意,由于它使用portletResponse,因此一旦您尝试在servlet应用程序侧查看此页面,您将获得异常。 为避免这种情况,您需要检查后备bean中的响应类型,并为UI分配一个新的“安全”名称空间变量。
reserveActionParams
当在web.xml中将prepareActionParams设置为TRUE时,网桥必须维护在portlet的操作请求期间分配的所有请求参数。 请求参数在“桥接请求范围”中维护。 当此属性不存在或为FALSE时,仅在portlet请求范围内维护操作的请求参数。
<init-param>
<param-name>javax.portlet.faces.preserveActionParams</param-name>
<param-value>true</param-value>
<init-param>
在Facelets页面中使用#{request.yourParam}之类的东西将利用此设置。
从网桥请求范围中排除属性
当您的应用程序基于每个请求使用请求属性,并且您不希望在扩展桥请求范围中管理该特定属性时,必须在faces-config.xml中使用以下配置。 在下面,您将看到命名为foo.bar或以foo.baz(通配符)开头的任何属性将从桥请求范围中排除,并且仅按该应用程序的请求使用:
<application>
<application-extension>
<bridge:excluded-attributes>
<bridge:excluded-attribute>foo.bar</bridge:excluded-attribute>
<bridge:excluded-attribute>foo.baz.*</bridge:excluded-attribute>
</bridge:excluded-attributes>
</application-extension>
</application>
或者,您可以使用javax.portlet.faces.annotation.ExcludeFromManagedRequestScope
批注通过对不希望包含在请求中的对象类进行批注来完成同样的事情。
结论
如您所见,JSR 301规范不仅使将现有JSF Web应用程序设置为portlet变得简单,而且为您(开发人员)提供了一种管理和处理JSF与portlet之间差异的方法。 话虽如此,该规范仍在严格审查和修订中。 在撰写本文时,Early Draft Review 3是最新的公开版本,但在JSR 301专家组内部的此修订版基础上,已经有了很多改进。 桥的最大增强功能之一是Portlet模式导航和状态,它将在JBoss Portlet Bridge的下一版本(测试版4)中实现。
要了解有关该项目的更多信息,桥接器支持的兼容版本,或参加社区论坛,请访问我们的项目页面和博客 。
jsf标签<p:ajax>