jsf标签<p:ajax>_使用JSF,Ajax和Seam开发Portlet(第1部分,共3部分)

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 168JSR 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演示程序的FailDuringInitPortletFailDuringInitPortlet

接下来打开第二个终端窗口,导航到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)中实现。

要了解有关该项目的更多信息,桥接器支持的兼容版本,或参加社区论坛,请访问我们的项目页面博客

翻译自: https://www.infoq.com/articles/jsf-ajax-seam-portlets-pt-1/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

jsf标签<p:ajax>

Ajax请求session超时处理流程 java服务器端处理: SessionValidateFilter中修改: if (ServerInfo.isAjax(request)) { request.setAttribute("statusCode", 301); request.setAttribute("message", "Session timeout!"); response.sendRedirect(response.encodeRedirectURL("/ajaxDone.jsp"); else { response.sendRedirect(response.encodeRedirectURL(this.loginUrl + java.net.URLEncoder.encode(backToUrl, "UTF-8"))); } ajaxDone.jsp页面 <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> { statusCode:${statusCode}, message:"${message}", objectId:"${objectId}" } js客户端处理: ajax load页面碎片处理: 自己写一个loadUrl()方法,不能使用jquery自带的load(). 当客户端调用loadUrl()超时,弹出一个登录框,并加一个背景层下面的整个浏览器.这时浏览器窗口内容不能变,只是上面加了一个登录框和一个背景层 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录失败alert出错信息,浏览器窗口内容还是不变. var DWZ = { loginUrl:"/render.do?method=login", ajaxDoneEval:function (json) { //session timeout try{ return eval('(' + json + ')'); } catch (e){ return {}; } } }; (function($){ $.extend({ loadUrl: function(url,data,callback){ var aData = data || {}; aData["timestamp"] = new Date().getTime(); var $this = $(this); $.get(url, aData, function(data){ var json = DWZ.ajaxDoneEval(data); if (json.statusCode==301){ alertMsg.error(json.message, {okCall:function(){ window.location = "/render.do?method=login"; //popLoginWin(); }}); } else { $this.html(data).initUI(); if (jQuery.isFunction(callback)) callback(); } }); } }); })(jQuery); ajax post 表单数据处理: 当客户端ajax提交表单超时, 弹出一个登录框,并加一个背景层下面的整个浏览器. 当用户输入username and password登录成功后,去掉登录框和背景层.这时用户可以继续操作. 登录失败alert出错信息. $.post(form.action, params, callback(json){ if (json.statusCode == 301) { //301 状态表示 session timeout popLoginWin(); }else if (json.statusCode == 300) { //300 状态表示 操作失败 alertMsg.error(json.message); } else if(json.statusCode == 200) { //300 状态表示 操作成功 alertMsg.correct(json.message); } }, "json");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值