在上一篇文章的基础上,本文介绍结合RichFaces的相关知识。
1、执行Maven命令:
mvn archetype:generate -DarchetypeGroupId=org.jboss.portletbridge.archetypes -DarchetypeArtifactId=richfaces-basic -DarchetypeVersion=1.0.0.B3 -DgroupId=org.my.project -DartifactId=richfacesproject -DarchetypeRepository=http://repository.jboss.org/maven2/ -Dversion=1.0.0.B3
2、web.xml
<context-param> <param-name>org.richfaces.LoadStyleStrategy</param-name> <param-value>NONE</param-value> </context-param> <context-param> <param-name>org.richfaces.LoadScriptStrategy</param-name> <param-value>NONE</param-value> </context-param> <context-param> <param-name>org.ajax4jsf.RESOURCE_URI_PREFIX</param-name> <param-value>rfRes</param-value> </context-param> <filter> <display-name>Ajax4jsf Filter</display-name> <filter-name>ajax4jsf</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>ajax4jsf</filter-name> <servlet-name>FacesServlet</servlet-name> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
以上配置有部分是为了让RichFaces不要在每个portlet加载的时候都去加载一边CSS和JS文件,在Portal页面加载的时候加载一边就行了。
3、jboss-portlet.xml
<portlet> <portlet-name>ajaxPortlet</portlet-name> <header-content> <script src="/faces/rfRes/org/ajax4jsf/framework.pack.js" type="text/javascript"></script> <script src="/faces/rfRes/org/richfaces/ui.pack.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="/faces/rfRes/org/richfaces/skin.xcss"/> </header-content> </portlet>
这里可以看见,rfRes就是web.xml中出现过的RESOURCE_URI_PREFIX
4、运行demo程序
与上一篇文章基本相同。
mvn install cargo:start -Plocal-portal -DJBOSS_ZIP_HOME=/path_to_bundle_zip/jboss- portal-2.7.0.B1-bundled.zip -DJBOSS_HOME_DIR=jboss-portal-2.7.0.B1- bundled/jboss-portal-2.7.0.B1
别忘了将path_to_bundle_zip改成你的JBoss AS的地址
然后进入刚创建的richfacesproject项目根目录下,运行以下命令:
mvn cargo:deploy -Plocal-portal -DJBOSS_ZIP_HOME=/path_to_bundle_zip/jboss- portal-2.7.0.B1-bundled.zip -DJBOSS_HOME_DIR=jboss-portal-2.7.0.B1-bundled/jboss- portal-2.7.0.B1
然后就可以运行JBoss AS,通过地址http://localhost:8080/portal/portal/default/RichFacesEchoPortlet浏览demo项目的效果了。
默认情况下,portlet中的Ajax请求是无法获得Portal Session中的数据的,我们需要实现一个方法来做到这一点(http://blog.jboss-portal.org/2007/11/portlet-window-data-scoping.html),最终,你想要存储在Portal Session中的对象为'javax.portlet.p.XYZ?YourObject',其中XYZ为portlet的window ID,YourObject就是你存储的对象。
获得界面中的windowID或者scopeID,你可以使用以下代码:
#{facesContext.externalContext.sessionMap['org.jboss.portletbridge.WINDOW_ID_RETRIVER'].windowID} #{facesContext.externalContext.sessionMap['org.jboss.portletbridge.WINDOW_ID_RETRIVER'].scopeId}
在以下情况下你可能会想要获得Portal Session中的对象:
- 使用Ajax进行登录验证
- 动态生成网站资源,例如JS、CSS等
所有RichFaces的组件演示,可以再这里下载到。
演示效果图: