﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-大鱼-随笔分类-richfaces</title><link>http://www.blogjava.net/luluyanglu/category/38268.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Oct 2009 15:29:24 GMT</lastBuildDate><pubDate>Wed, 28 Oct 2009 15:29:24 GMT</pubDate><ttl>60</ttl><item><title>JSF中隐藏A4J按钮和普通按钮的JS单击事件</title><link>http://www.blogjava.net/luluyanglu/archive/2009/10/25/299709.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Sun, 25 Oct 2009 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/10/25/299709.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/299709.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/10/25/299709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/299709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/299709.html</trackback:ping><description><![CDATA[<div class="blog_content">HTML按钮：document.getElementById("Button").click(); <br />
<br />
A4J按钮：document.getElementById("a4jButton").onclick(); <br />
<br />
JS操作HTML中的&lt;select&gt;标签： <br />
获取值：document.getElementById("form1:goods_category").value; <br />
获取文本：document.getElementById("form1:goods_category").text; <br />
新增OPTION： <br />
document.getElementById("formdata:ListBoxPersonSelected").options[document.getElementById("formdata:ListBoxPersonSelected").options.length] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Option(textlist,valuelist,true,true); <br />
<br />
<br />
例子： <br />
for(var i =0;i &lt;document.getElementById("formdata:ListBoxPerson").options.length;i++) <br />
&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp; if(document.getElementById("formdata:ListBoxPerson").options[i].selected) <br />
&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valuelist = document.getElementById("formdata:ListBoxPerson").options[i].value; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textlist = document.getElementById("formdata:ListBoxPerson").options[i].text; <br />
<br />
if(document.getElementById("formdata:ListBoxPersonSelected").options.length == 0) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("formdata:ListBoxPersonSelected").options[document.getElementById("formdata:ListBoxPersonSelected").options.length] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Option(textlist,valuelist,true,true);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var j =0;j &lt;document.getElementById("formdata:ListBoxPersonSelected").options.length;j++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(valuelist == document.getElementById("formdata:ListBoxPersonSelected").options[j].value) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flg = true; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flg == false) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById("formdata:ListBoxPersonSelected").options[document.getElementById("formdata:ListBoxPersonSelected").options.length] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new Option(textlist,valuelist,true,true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{flg = false;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp; } </div>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/299709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-10-25 23:45 <a href="http://www.blogjava.net/luluyanglu/archive/2009/10/25/299709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RichFaces 配置及一些用法(web.xml)</title><link>http://www.blogjava.net/luluyanglu/archive/2009/09/17/295413.html</link><dc:creator>大鱼</dc:creator><author>大鱼</author><pubDate>Thu, 17 Sep 2009 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/luluyanglu/archive/2009/09/17/295413.html</guid><wfw:comment>http://www.blogjava.net/luluyanglu/comments/295413.html</wfw:comment><comments>http://www.blogjava.net/luluyanglu/archive/2009/09/17/295413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luluyanglu/comments/commentRss/295413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luluyanglu/services/trackbacks/295413.html</trackback:ping><description><![CDATA[<div class="ns_content">
<p><br />
一、RichFaces (3.1.x) 技术需求 </p>
<p>1.JDK 1.5 或更高版本； </p>
<p>2.支持的 JSF 实现： <br />
Sun JSF 1.1 RI - 1.2 <br />
MyFaces 1.1.1 - 1.1.5 <br />
Facelets JSF 1.1.1 - 1.2 </p>
<p>3.支持的应用服务器： <br />
Apache Tomcat 4.1 - 6.0 <br />
IBM WebSphere 5.1 - 6.0 <br />
BEA WebLogic 8.1 - 9.0 <br />
Oracle AS/OC4J 10.1.3 <br />
Resin 3.0 <br />
Jetty 5.1.X <br />
Sun Application Server 8 (J2EE 1.4) <br />
Glassfish (J2EE 5) <br />
JBoss 3.2 - 4.0.x <br />
Sybase EAServer 6.0.1 </p>
<p>4.支持的浏览器： <br />
Internet Explorer 5.5 - 7.0 <br />
Firefox 1.5 - 2.0 <br />
Opera 8.5 - 9.0 <br />
Netscape 7.0 <br />
Safari 2.0 </p>
<p><br />
二、安装配置 </p>
<p>1.解压下载的压缩包文件，复制其中的&#8220;richfaces-api-3.1.0.jar&#8221;，&#8220;richfaces-impl-3.1.0.jar&#8221;，&#8220;richfaces-ui-3.1.0.jar&#8221;文件到应用程序 "WEB-INF/lib" 目录下。 </p>
<p>2.添加如下内容到应用程序&#8220;WEB-INF/web.xml&#8221;文件中。 <br />
&lt;context-param&gt; <br />
&lt;param-name&gt;org.richfaces.SKIN&lt;/param-name&gt; <br />
&lt;param-value&gt;blueSky&lt;/param-value&gt; <br />
&lt;/context-param&gt; <br />
&lt;filter&gt; <br />
&lt;display-name&gt;RichFaces Filter&lt;/display-name&gt; <br />
&lt;filter-name&gt;richfaces&lt;/filter-name&gt; <br />
&lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt; <br />
&lt;/filter&gt; <br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;richfaces&lt;/filter-name&gt; <br />
&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt; <br />
&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; <br />
&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; <br />
&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt; <br />
&lt;/filter-mapping&gt; </p>
<p>3.添加如下几行到应用程序 JSP 页面中： <br />
&lt;%@ taglib uri="<a href="http://richfaces.org/a4j">http://richfaces.org/a4j</a>" prefix="a4j" %&gt; <br />
&lt;%@ taglib uri="<a href="http://richfaces.org/rich">http://richfaces.org/rich</a>" prefix="rich" %&gt; </p>
<p>对于 XHTML 页面： <br />
&lt;xmlns:a4j="<a href="http://richfaces.org/a4j">http://richfaces.org/a4j</a>" /&gt; <br />
&lt;xmlns:rich="<a href="http://richfaces.org/rich">http://richfaces.org/rich</a>" /&gt; </p>
<p><br />
三、web.xml 中的 Richfaces 参数 </p>
<p>I、初始化参数（&lt;context-param&gt;） <br />
1.org.richfaces.SKIN <br />
默认值：DEFAULT </p>
<p>其它八种预定义的皮肤： <br />
DEFAULT <br />
plain <br />
emeraldTown <br />
blueSky <br />
wine <br />
japanCherry <br />
ruby <br />
classic <br />
deepMarine </p>
<p>其值为在应用中使用的皮肤的名字。其值可用一个精确（大小写）的字符串做为皮肤名字，或指向一个字符串属性的 EL 表达式（#{...}），或 org.richfaces.framework.skin 类型的一个属性。 </p>
<p>2.org.ajax4jsf.LOGFILE <br />
默认值：none </p>
<p>这是一个指向应用程序或容器日志文件的 URL （如果有日志文件的话）。如果设置了这个参数，那么日志文件的内容将会作为一个调试错误页面在框架（iframe）窗口中显示。 </p>
<p>3.org.ajax4jsf.VIEW_HANDLERS <br />
默认值：none </p>
<p>这是一个由逗号分隔的自定义 ViewHandler 实例的序列，用于插入到 Handlers 链路上。Handlers 按照给定的顺序被插入到 RichFaces viewhandlers 之前。例如，在 facelets 应用程序中，这个参数必须包含 com.sun.facelets.FaceletViewHandler，来代替在 faces-onfig.xml 文件中的声明。 </p>
<p>4.org.ajax4jsf.CONTROL_COMPONENTS <br />
默认值：none </p>
<p>这是一个逗号分隔的名字序列，用于将一个组件作为一个特殊的控制情形，例如资源文件加载器，别名（alias）bean 组件等等。这是一个从 COMPONENT_TYPE 静态属生反射得到的一个组件类型。对于这样类型组件的编码方法常常在呈现的 Ajax 响应中被调用，尽管这个组件不在被更新部分中。</p>
<p>5.org.ajax4jsf.ENCRYPT_RESOURCE_DATA <br />
默认值：false </p>
<p>为了生成的资源，例如加密生成的数据，它会在资源的 URL 上被编码加密。例如，URL 指向一个由 mediaOutput 组件生成的图片，而 mediaOutput 组件包含一个生成方法的名字，那么对于一个黑客的攻击来说，他很可能创建一个对于任何 JSF baked beans 或其它属性的请求。为了避免这样的攻击，在重要的应用程序中设置这个参数为&#8220;true&#8221;（应用于 JRE &gt; 1.4）。 </p>
<p>6.org.ajax4jsf.ENCRYPT_PASSWORD <br />
默认值：random </p>
<p>用于资源数据加密的一个密码。如果没有设置，将使用一个随机的密码。 </p>
<p>7.org.ajax4jsf.COMPRESS_SCRIPT <br />
默认值：true </p>
<p>不允许框架重新格式化 JavaScript 文件（使其不利于调试） </p>
<p>II、org.ajax4jsf.Filter 初始化参数 <br />
1.log4j-init-file </p>
<p>这是一个指向 log4j.xml 配置文件的路径（相对于应用程序上下文），log4j.xml 可用于创建每个应用程序的自定义日志信息。 </p>
<p>2.enable-cache <br />
默认值：true </p>
<p>启用框架所生成资源（JavaScript，CSS，images，等等）的缓存。为了调试开发自定义的 JavaScript 或 Style(css) 目的，应避免在浏览器中使用旧的缓存数据。 </p>
<p>3.forceparser <br />
默认值：true </p>
<p>通过一个 HTML 语法检查器强制解析每一个 JSF 页面。如果为&#8220;false&#8221;，只有 Ajax 响应才被语法检查器解析且被转换为规范的 XML。设置为&#8220;false&#8221;除了提高了性能，还为 Ajax 更新提供视觉的效果。 </p>
<p><br />
四、其他 </p>
<p>因为本人现在使用的是 Myfaces，所以下面列出了有关 Myfaces 与 RichFaces 集成的问题： </p>
<p>问题在于 web.xml 文件中所定义的多个不同的过滤器之间存在冲突。为了避免这些问题，RichFaces 过滤器在配置文件中的位置必须被定义在其它过滤器之上。 </p>
<p>当使用 MyFaces + Seam 时，还有其它问题。如果使用这个组合，那么应该在 &lt;f:view&gt; 标签内部使用 &lt;a4j:page&gt; 标签，然后再在 &lt;a4j:page&gt; 标签中包含其它内容，因为 Myfaces 中的 &lt;f:view&gt; 实现存在一些问题。 </p>
<p>这个问题可能在不久的将来被攻克。 </p>
<p><br />
RichFaces 3.1.3 发布了, 相关主要改动介绍如下: from <a href="http://in.relation.to/Bloggers/RichFaces313Released">http://in.relation.to/Bloggers/RichFaces313Released</a></p>
<p>Updated - 添加了&lt;rich:orderingList /&gt; 组件, calendar组件添加了locale设置</p>
<p>RichFaces 开发小组发布了 RichFaces 3.1.3.GA. 这是自从 3.1.0以后的第一个发布版本,包含了一些新的组件(也包含3.1.1 和3.1.2中的bug 修复),因此这里我想着重介绍下主要的改进地方.</p>
<p>Time Picker</p>
<p>RichFaces timepicker 漂亮的地方是和calendar control集成了 - 你可以很容易的为 date, time or date and time 字段提供一个图形输入控件.这是很容易使用的, 仅仅绑定该组件到模型上就可以了:<br />
&lt;rich:calendar value="#{flight.departureDate}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; locale="#{locale}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datePattern="dd/M/yy hh:mm" /&gt;<br />
就如你看到的一样, 她还是完全国际化的呢!<br />
Controlling one component from another</p>
<p>当一个js事件在当前的控件上触发时,&lt;rich:componentControl /&gt; 允许你再另外一个组件上触发一个动作. 这是非常强大的功能,所以可能很难理解. 下面我们来看个简单的例子:这里我们有个modal panel (a bit like a css/div based popup), 我们想从页面上的其他地方来启动这个panel:</p>
<p>&lt;rich:modalPanel id="panel" width="350" height="100"&gt;<br />
&nbsp; &lt;f:facet name="header"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h:outputText value="Modal Panel" /&gt;<br />
&nbsp; &lt;/f:facet&gt;<br />
&nbsp; &lt;h:outputText value="This panel is called using rich:componentControl"/&gt;<br />
&lt;/rich:modalPanel&gt;<br />
&lt;h:outputLink value="#"&gt;<br />
&nbsp; Show Modal Panel<br />
&nbsp; &lt;rich:componentControl for="panel" attachTo="link" operation="show" event="onclick"/&gt;<br />
&lt;/h:outputLink&gt;</p>
<p>不用调用一些js代码了, 我们只要再link上面添加一个component controller,然后告诉她在什么组件上执行什么动作就可以了.</p>
<p>&lt;rich:componentControl /&gt; 可以做的不只这些 - 详细情况请参考 online demo .</p>
<p>Shuttle list</p>
<p>这是个很不错的控件, 我很赞赏RichFaces guys,当然这也很容易使用:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&lt;rich:listShuttle sourceValue="#{items.availableItems}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targetValue="#{items.selectedItems}" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var="item"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sourceCaptionLabel="Available Items"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targetCaptionLabel="Currently Active Items"&gt;</p>
<p>&nbsp; &lt;rich:column width="18"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h:graphicImage value="#{item.icon}"/&gt;<br />
&nbsp; &lt;/rich:column&gt;<br />
&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{item.label}"/&gt;<br />
&nbsp; &lt;/rich:column&gt;</p>
<p>&lt;/rich:listShuttle&gt;<br />
注意我们是如何在lists 面板上添加其他 rich 组件的.<br />
Notice how we've embedded other rich components to layout the lists!<br />
Orderable list</p>
<p>另外一个类似的组件是 orderable list. 使用起来也是很简单的</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&lt;rich:orderingList value="#{myMusic}" var="album"&gt;</p>
<p>&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;f:facet name="header"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Song Name<br />
&nbsp;&nbsp;&nbsp; &lt;/f:facet&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{album.title}"/&gt;<br />
&nbsp; &lt;/rich:column&gt;</p>
<p>&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;f:facet name="header"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Artist Name<br />
&nbsp;&nbsp;&nbsp; &lt;/f:facet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{album.artist.name}" /&gt;<br />
&nbsp; &lt;/rich:column&gt;</p>
<p>&lt;/rich:orderingList&gt;<br />
Context sensitive menu</p>
<p>RichFaces 已经有组件来显示 menu bar了,现在在 3.1.3又添加了右键菜单.<br />
&lt;s:div id="flower"&gt;<br />
&nbsp; &lt;h:graphicImage value="flower.jpg"/&gt;<br />
&nbsp; &lt;rich:contextMenu event="oncontextmenu" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attached="true" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; submitMode="none"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;rich:menuItem value="Zoom In" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onclick="enlarge();"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;rich:menuItem value="Zoom Out" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onclick="decrease();"/&gt;<br />
&nbsp; &lt;/rich:contextMenu&gt;<br />
&lt;/s:div&gt;<br />
我们添加了一个上下文右键菜单到&lt;s:div /&gt; 中.<br />
There's also</p>
<p>Big improvements to Portal support (we are just finishing off support for Seam and RichFaces in a portlet)<br />
A system for customising how styles are loaded (one big lump, or on demand)<br />
Over 180 bug fixes (see the release notes)<br />
Congratulations to the RichFaces team!</p>
<p><br />
使用 Richfaces/Ajax4Jsf 创建 Web 应用<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
文档选项<br />
&nbsp;&nbsp;<br />
打印本页<br />
&nbsp;&nbsp;<br />
将此页作为电子邮件发送<br />
&nbsp;&nbsp;<br />
样例代码</p>
<p>级别： 初级<br />
周 进光 (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#104;&#111;&#117;&#106;&#105;&#110;&#103;&#117;&#97;&#110;&#103;&#64;&#121;&#97;&#104;&#111;&#111;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">zhoujinguang@yahoo.com.cn</a>), 软件工程师, 舜联软件科技<br />
2007 年 11 月 30 日<br />
本文简要介绍如何运用 Richfaces/A4J 来构建 JSF 应用，包括如何定义配置文件、控件使用等。<br />
概念介绍<br />
JSF 和 Ajax 概念大家一定不陌生，二者结合起来衍生出 A4J（Ajax4JSF）。其目的就是将 Ajax 的功能集成到 JSF 组件中去。后来 JBoss 收购 A4J 后，又将其集成到 RichFaces 中，不但丰富了控件库和还添加了新功能。现在 RichFaces 已经是一个具有 Ajax 和 JSF 特性 的 Web 框架。对开发人员来说，只要按照 JSF 的组件规范来组织页面，免去了书写或调用庞杂的 JavaScript 代码或库，就能达到梦寐以求的 Ajax 效果 ---- 可以只更新局部内容而不用刷新整个页面，增强了用户体验。<br />
&nbsp;<br />
请访问 Ajax 技术资源中心，这是有关 Ajax 编程模型信息的一站式中心，包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。</p>
<p>&nbsp; &nbsp;订阅 Ajax 相关文章和教程的 RSS 提要</p>
<p>样例<br />
下面就举一个简单的例子来说明如何使用 Richfaces。该例是一个对列表的编辑，实现对数据的修改/删除/添加，主要用到了 rich:dataTable 控件。如下图示：</p>
<p>图 1. 样例<br />
&nbsp;<br />
Jar 包<br />
开发 RichFaces 应用，除了 RichFaces 的 Jar 文件外，还需用到 Jsf，jakatar-commons 以及 log4j 等 Jar 包。本例中用到的 RichFaces 的版本为 3.1.0, Jsf 采用 Apache MyFaces 1.1.5。详细 Jar 包列表如下图：</p>
<p>图 2. Jar 包清单<br />
&nbsp;<br />
类图<br />
JSF 需要把页面数据和操作对象化，通过 component 来封装。这里有两个类，其中 Bean 为控制类，定义响应用户点击按钮的事件方法，并作为连接视图和数据层的桥梁。 Person 为数据类，用来封装页面数据。它们之间关系参见下图：</p>
<p>图 3. 类图<br />
&nbsp;<br />
配置文件<br />
Java 的 Web 运用一般通过 War 的形式发布，其中需要 web.xml 作为应用的配置文件。RichFaces 要求在该配置文件中除了通常的 JSF Servlet 定义外，再加上一个 RichFaces 的过滤器就行了。下面是样例配置说明。<br />
web.xml 文件</p>
<p>图 4. web.xml 配置<br />
&nbsp;<br />
faces-config.xml 文件<br />
按照 JSF 要求，需要配置 faces-config.xml 文件，如下图所示：</p>
<p>图 5. faces-config.xml 配置<br />
&nbsp;<br />
代码<br />
这里着重介绍视图 JSP 页面的编码。首先申明所需的 taglib，如下：<br />
&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/core">http://java.sun.com/jsf/core</a>" prefix="f"%&gt;<br />
&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/html">http://java.sun.com/jsf/html</a>" prefix="h"%&gt;<br />
&lt;%@ taglib uri="<a href="http://richfaces.org/a4j">http://richfaces.org/a4j</a>" prefix="a4j"%&gt;<br />
&lt;%@ taglib uri="<a href="http://richfaces.org/rich">http://richfaces.org/rich</a>" prefix="rich"%&gt;</p>
<p>f，h 用来引用 JSF 的控件，a4j 和 rich 用来引用 Ajax4JSF 和 RichFaces 控件。<br />
先建立 a4j:form，并将 rich:dataTable 放在里面。dataTable 作为数据显示的载体。<br />
&lt;rich:dataTable id="p" value="#{bean.people}" var="person" width="100%"<br />
&nbsp;&nbsp;&nbsp;&nbsp; binding="#{bean.table}"&gt;<br />
&nbsp;&lt;f:facet name="header"&gt;<br />
&nbsp;&nbsp;&lt;rich:columnGroup&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;h:outputText value="name"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;h:outputText value="agender"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;h:outputText value="age"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;h:outputText value="address"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;h:outputText value="action"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&lt;/rich:columnGroup&gt;<br />
&nbsp;&lt;/f:facet&gt;<br />
&nbsp;<br />
&nbsp;&lt;rich:columnGroup&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{person.name}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{person.agender}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:inputText id="age" value="#{person.age}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="#{person.address}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a4j:commandLink onclick="checkDel()" value="delete"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action="#{bean.del}" reRender="p"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a4j:actionparam name="rowIndex" value="#{bean.table.rowIndex}" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assignTo="#{bean.curRow}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/a4j:commandLink&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&lt;/rich:columnGroup&gt;<br />
&nbsp;<br />
&nbsp;&lt;f:facet name="footer"&gt;<br />
&nbsp;&nbsp;&lt;rich:columnGroup&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;rich:column colspan="5"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h:outputText value="total is #{bean.table.rowCount} items"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:column&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/rich:columnGroup&gt;<br />
&nbsp;&nbsp; &lt;/f:facet&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;/rich:dataTable&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>请注意 delete 按钮，它的 Action 绑定到 Bean 的方法 del()。最神奇的地方是通过 reRender 属性来把动作执行的结果来刷新整个 dataTable。这就是 richfaces 体现 ajax 特性的地方。当删除一行时，页面没有感觉刷新，但表格发生了变化。</p>
</div>
<img src ="http://www.blogjava.net/luluyanglu/aggbug/295413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luluyanglu/" target="_blank">大鱼</a> 2009-09-17 11:18 <a href="http://www.blogjava.net/luluyanglu/archive/2009/09/17/295413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>