﻿<?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-♂梦想～天堂♀-文章分类-JSF--组件</title><link>http://www.blogjava.net/ysong1987/category/23133.html</link><description>每一步一个脚印 这里会记录我成长的点点滴滴……</description><language>zh-cn</language><lastBuildDate>Sat, 16 Jun 2007 13:01:11 GMT</lastBuildDate><pubDate>Sat, 16 Jun 2007 13:01:11 GMT</pubDate><ttl>60</ttl><item><title>《JSF标签》简体中文版</title><link>http://www.blogjava.net/ysong1987/articles/122619.html</link><dc:creator>月半弯</dc:creator><author>月半弯</author><pubDate>Thu, 07 Jun 2007 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/ysong1987/articles/122619.html</guid><wfw:comment>http://www.blogjava.net/ysong1987/comments/122619.html</wfw:comment><comments>http://www.blogjava.net/ysong1987/articles/122619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ysong1987/comments/commentRss/122619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ysong1987/services/trackbacks/122619.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>JSF标签 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>原文：<a href="http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630">http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630</a></p>
<p>繁简转换与修订：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#110;&#122;&#103;&#121;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">jnzgy@163.com</a></p>
<p>声明：为方便简体中文读者阅读，特将原文转换为简体，对一些习惯用语做了替换，同时对部分内容<br>做了修订。版权归原文作者所有，未经许可，不得用于商业目的。 </p>
<p>2006年3月27日 </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1. 标签入门.....................................................................................................................................2 <br>1.1 简介JSF标准标签............................................................................................................2 <br>1.2 输出类标签........................................................................................................................3 <br>1.3 输入类标签........................................................................................................................4 <br>1.4 命令类标签........................................................................................................................4 <br>1.5 选择类标签 一..................................................................................................................5 <br>1.6 选择类标签 二..................................................................................................................7 <br>1.7 其它标签............................................................................................................................9 <br>2. 表格处理...................................................................................................................................11 <br>2.1 简单的表格......................................................................................................................11 <br>2.2 表头、表尾......................................................................................................................14 <br>2.3 TableModel类..................................................................................................................16 <br><br>网页设计人员要做的就是了解JSF的标签的使用方式，这就像是学习进阶的<br>HTML标签，另一件事就是与程序设计人员沟通好各个Bean的名称绑定。 </p>
<p>1. 标签入门 </p>
<p>标签的相关属性查询，您可以参考 Tag Library Documentation，这边的介<br>绍只是一些简单的入门实例。 </p>
<p>1.1 简介JSF标准标签 </p>
<p>&nbsp;JSF提供了标准的HTML Renderer Kit，可以让您搭配JSF组件输出HTML文件，<br>标准的HTML Renderer Kit主要包括了几个类别： </p>
<p>.. 输出（Outputs） </p>
<p><br>&nbsp;其名称以output作为开头，作用为输出指定的信息或绑定值。 </p>
<p>.. 输入（Inputs） </p>
<p><br>&nbsp;其名称以input作为开头，其作用为提供使用者输入框。 </p>
<p>.. 命令（Commands） </p>
<p><br>&nbsp;其名称以command作为开头，其作用为提供命令或链接按钮。 </p>
<p>.. 选择（Selections） </p>
<p><br>&nbsp;其名称以select作为开头，其作用为提供使用者选项的选取。 </p>
<p>.. 其它 </p>
<p><br>&nbsp;包括了form、message、messages、graphicImage等等未分类的标签。 </p>
<p>&nbsp;</p>
<p>&nbsp;JSF标准HTML标签包括了几个共通的属性，整理如下： </p>
<p>属性名称 </p>
<p>适用 </p>
<p>说明 </p>
<p>id </p>
<p>所有组件 </p>
<p>可指定id名称，以让其它标签或组件<br>参考 </p>
<p>binding </p>
<p>所有组件 </p>
<p>绑定至UIComponent </p>
<p>rendered </p>
<p>所有组件 </p>
<p>是否显示组件 </p>
<p>styleClass </p>
<p>所有组件 </p>
<p>设定Cascading stylesheet(CSS) </p>
<p>value </p>
<p>输入、输出、命<br>令组件 </p>
<p>设定值或绑定至指定的值 </p>
<p>valueChangeListener </p>
<p>输入组件 </p>
<p>设定值变事件处理者 </p>
<p>converter </p>
<p>输入、输出组件</p>
<p>设定转换器 </p>
<p>validator </p>
<p>输入组件 </p>
<p>设定验证器 </p>
<p>required </p>
<p>输入组件 </p>
<p>是否验证必填输入框 </p>
<p>immediate </p>
<p>输入、命令组件</p>
<p>是否为即时事件 </p>
<p>&nbsp;</p>
<p>&nbsp;除了共通的属性之外，您还可以在某些组件上设定标签HTML 4.01的属性，<br>像是size、alt、width等属性，或者是设定DHTML事件属性，例如onchange、onclick<br>等等。 </p>
<p>&nbsp;除了JSF的标准HTML标签之外，您还需要一些标准核心标签，这些标签是独<br>立于Renderer Kit的，JSF并不限制在HTML输出表示层，核心标签可以搭配其它</p>
<p><br>的Renderer Kit来使用。 </p>
<p>详细的HTML标签或核心标签的使用与属性说明可以查询 Tag Library <br>Documentation 文件 </p>
<p>1.2 输出类标签 </p>
<p>&nbsp;输出类的标签包括了outputLabel、outputLink、outputFormat与 <br>outputText，分别举例说明如下： </p>
<p>.. outputLabel </p>
<p><br>&nbsp;产生&lt;label&gt; HTML标签，使用for属性指定组件的client ID，例如： </p>
<p>&lt;h:inputText id="user" value="#{user.name}"/&gt; </p>
<p>&lt;h:outputLabel for="user" value="#{user.name}"/&gt; </p>
<p>&nbsp;这会产生像是以下的标签： </p>
<p>&lt;input id="user" type="text" name="user" value="guest" /&gt; </p>
<p>&lt;label for="user"&gt; </p>
<p>.. outputLink </p>
<p><br>&nbsp;产生&lt;a&gt; HTML标签，例如： </p>
<p>&lt;h:outputLink value="../index.jsp"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Link to Index"/&gt; </p>
<p>&nbsp;&lt;f:param name="name" value="MyName"/&gt; </p>
<p>&lt;/h:outputLink&gt; </p>
<p>&nbsp;你可搭配&lt;f:param&gt;帮链结加上参数，所有的参数都会变成 name=value 的<br>类型附加在链接后。 </p>
<p>&nbsp;value所指定的内容也可以是JSF EL绑定。 </p>
<p>.. outputFormat </p>
<p><br>&nbsp;产生指定的文字信息，可以搭配&lt;f:param&gt;来设定信息的参数以格式化文字<br>信息，例如： </p>
<p>&lt;f:loadBundle basename="messages" var="msgs"/&gt; </p>
<p>&nbsp;&lt;h:outputFormat value="#{msgs.welcomeText}"&gt; </p>
<p>&nbsp;&lt;f:param value="Hello"/&gt; </p>
<p>&nbsp;&lt;f:param value="Guest"/&gt; </p>
<p>&nbsp;&lt;/h:outputFormat&gt; </p>
<p>&nbsp;如果您的messages.properties包括以下的内容： </p>
<p>welcomeText={0}, Your name is {1}. </p>
<p>&nbsp;则{0}与{1}会被取代为&lt;f:param&gt;设定的文字，最后显示的文字会是： </p>
<p>Hello, Your name is Guest. </p>
<p>&nbsp;另一个使用的方法则是： </p>
<p>&lt;h:outputFormat value="{0}, Your name is {1}."&gt; </p>
<p>&nbsp;&lt;f:param value="Hello"/&gt; </p>
<p>&nbsp;&lt;f:param value="Guest"/&gt; </p>
<p>&nbsp;&lt;/h:outputFormat&gt; </p>
<p>.. outputText </p>
<p><br>&nbsp;简单的显示指定的值或绑定的信息，例如： </p>
<p>&lt;h:outputText value="#{user.name}"/&gt; </p>
<p><br>1.3 输入类标签 </p>
<p>&nbsp;输入类标签包括了inputText、inputTextarea、inputSecret、 inputHidden，<br>分别举例说明如下： </p>
<p>.. inputText </p>
<p><br>&nbsp;显示单行输入框，即输出&lt;input&gt; HTML标签，其type属性设定为text，例如： </p>
<p>&lt;h:inputText value="#{user.name}"/&gt; </p>
<p>.. inputTextarea </p>
<p><br>&nbsp;显示多行输入文字区域，即输出&lt;textarea&gt; HTML标签，例如： </p>
<p>&lt;h:inputTextarea value="#{user.command}"/&gt; </p>
<p>.. inputSecret </p>
<p><br>&nbsp;显示密码输入框，即输出&lt;input&gt; HTML标签，其type属性设定为password，<br>例如： </p>
<p>&lt;h:inputSecret value="#{user.password}"/&gt; </p>
<p>&nbsp;您可以设定redisplay属性以决定是否要显示密码栏目的值，预设是false。 </p>
<p>.. inputHidden </p>
<p><br>&nbsp;隐藏输入框，即输出&lt;input&gt; HTML标签，其type属性设定为hidden，隐藏输<br>入框的值用于保留一些信息于客户端，以在下一次发送表单时一并提交，例如： </p>
<p>&lt;h:inputHidden value="#{user.hiddenInfo}"/&gt; </p>
<p>1.4 命令类标签 </p>
<p>&nbsp;命令类标签包括commandButton与commandLink，其主要作用在于提供一个命<br>令按钮或链接，以下举例说明： </p>
<p>.. commandButton </p>
<p><br>&nbsp;显示一个命令按钮，即输出&lt;input&gt; HTML标签，其type属性可以设定为<br>button、submit或reset，预设是submit，按下按钮会触发 javax.faces.event. <br>ActionEvent，使用例子如下： </p>
<p>&lt;h:commandButton value="提交" action="#{user.verify}"/&gt; </p>
<p>&nbsp;您可以设定image属性，指定图片的URL，设定了image属性的话，&lt;input&gt;<br>标签的type属性会被设定为image，例如： </p>
<p>&lt;h:commandButton value="#{msgs.commandText}" </p>
<p>&nbsp;image="images/logowiki.jpg" </p>
<p>&nbsp;action="#{user.verify}"/&gt; </p>
<p>.. commandLink </p>
<p><br>&nbsp;产生超链接，会输出&lt;a&gt; HTML标签，而href属性会有'#'，而onclick属性会<br>含有一段JavaScript程序，这个JavaScript的目的是按下链接后自动提交表单，<br>具体来说其作用就像按钮，但外观却是超链接，包括在本体部份的内容都会成为<br>超链接的一部份，一个使用的例子如下： </p>
<p>&lt;h:commandLink value="#{msgs.commandText}" </p>
<p>&nbsp;action="#{user.verify}"/&gt; </p>
<p>&nbsp;产生的HTML输出范例如下： </p>
<p>&nbsp;</p>
<p><br>&lt;a href="#" onclick="document.forms['_id3']['_id3:_idcl'].value='_id3:_id13'; <br>document.forms['_id3'].submit(); return false;"&gt;Submit&lt;/a&gt; </p>
<p>&nbsp;如果搭配&lt;f:param&gt;来使用，则所设定的参数会被当作请求参数一并提交，<br>例如： </p>
<p>&nbsp;</p>
<p>&lt;h:commandLink&gt; </p>
<p>&nbsp;&lt;h:outputText value="welcome"/&gt; </p>
<p>&nbsp;&lt;f:param name="locale" value="zh_CN"/&gt; </p>
<p>&nbsp;&lt;/h:commandLink&gt; </p>
<p>1.5 选择类标签 一 </p>
<p>&nbsp;选择类的标签可大致分为单选标签与多选标签，依外型的不同可以分为单选<br>钮（Radio）、复选框（CheckBox）、列表框（ListBox）与菜单（Menu），以下<br>分别先作简单的说明。 </p>
<p>.. &lt;h:selectBooleanCheckbox&gt; </p>
<p><br>&nbsp;在视图上呈现一个复选框，例如： </p>
<p>我同意 &lt;h:selectBooleanCheckbox value="#\{user.aggree\}"/&gt; </p>
<p>&nbsp;value所绑定的属性必须接受与传回boolean类型。这个组件在网页上呈现的<br>外观如下： </p>
<p>&nbsp;</p>
<p>.. &lt;h:selectOneRadio&gt;、&lt;h:selectOneListbox&gt;、&lt;h: selectOneMenu&gt; </p>
<p><br>&nbsp;这三个标签的作用，是让使用者从其所提供的选项中选择一个项目，所不同<br>的就是其外观上的差别，例如： </p>
<p>&lt;h:selectOneRadio value="#{user.education}"&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="高中" itemValue="高中"/&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="大学" itemValue="大学"/&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="研究所以上" itemValue="研究所以上"/&gt; </p>
<p>&nbsp;&lt;/h:selectOneRadio&gt;&lt;p&gt; </p>
<p>&nbsp;value所绑定的属性可以接受字符串以外的类型或是自定义类型，但记得如<br>果是必须转换的类型或自定义类型，必须搭配 标准转换器 或 自定义转换器 来<br>转换为对象，&lt;h:selectOneRadio&gt;的外观如下： </p>
<p>&nbsp;</p>
<p>&nbsp;您也可以设定layout属性，可设定的属性是lineDirection、pageDirection，<br>预设是lineDirection，也就是由左到右来排列选项，如果设定为pageDirection，<br>则是由上至下排列选项，例如设定为： </p>
<p>&lt;h:selectOneRadio layout="pageDirection" </p>
<p>&nbsp;value="#{user.education}"&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="高中" itemValue="高中"/&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="大学" itemValue="大学"/&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="研究所以上" itemValue="研究所以上"/&gt; </p>
<p>&nbsp;&lt;/h:selectOneRadio&gt;&lt;p&gt; </p>
<p><br>&nbsp;则外观如下： </p>
<p>&nbsp;</p>
<p>&nbsp;&lt;h:selectOneListbox&gt;、&lt;h:selectOneMenu&gt;的设定方法类似于&lt;h: <br>selectOneRadio&gt;，以下分别列出&lt;h:selectOneListbox&gt;、&lt;h: selectOneMenu&gt;<br>的外观： </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>.. &lt;h:selectManyCheckbox&gt;、&lt;h:selectManyListbox&gt;、&lt;h: selectManyMenu&gt; </p>
<p><br>&nbsp;这三个标签提供使用者复选项目的功能，一个&lt;h:selectManyCheckbox&gt;例子<br>如下： </p>
<p>&lt;h:selectManyCheckbox layout="pageDirection" </p>
<p>&nbsp;value="#{user.preferColors}"&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="红" itemValue="false"/&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="黄" itemValue="false"/&gt; </p>
<p>&nbsp;&lt;f:selectItem itemLabel="蓝" itemValue="false"/&gt; </p>
<p>&nbsp;&lt;/h:selectManyCheckbox&gt;&lt;p&gt; </p>
<p>&nbsp;value所绑定的属性必须是列表或集合（Collection）对象，在这个例子中<br>所使用的是boolean列表，例如： </p>
<p>. UserBean.java </p>
<p><br>package onlyfun.caterpillar; </p>
<p>&nbsp;</p>
<p>&nbsp;public class UserBean { </p>
<p>&nbsp;private boolean[] preferColors; </p>
<p>&nbsp;</p>
<p>&nbsp;public boolean[] getPreferColors() { </p>
<p>&nbsp;return preferColors; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public void setPreferColors(boolean[] preferColors) { </p>
<p>&nbsp;this.preferColors = preferColors; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;...... </p>
<p>&nbsp;} </p>
<p><br>&nbsp;如果是其它类型的对象，必要时必须搭配转换器（Converter）进行字符串<br>与对象之间的转换。 </p>
<p>&nbsp;下图是&lt;h:selectManyCheckbox&gt;的外观，这是将layout设定为<br>pageDirection的外观： </p>
<p>&nbsp;</p>
<p>&nbsp;&lt;h:selectManyListbox&gt;的设定方法类似，其外观如下： </p>
<p>&nbsp;</p>
<p>&nbsp;&lt;h:selectManyMenu&gt;在不同的浏览器中会有不同的外观，在Mozilla <br>Firefox中是这样的： </p>
<p>&nbsp;</p>
<p>&nbsp;在Internet Explorer则是这样的： </p>
<p>&nbsp;</p>
<p>1.6 选择类标签 二 </p>
<p>&nbsp;选择类标签可以搭配&lt;f:selectItem&gt;或&lt;f:selectItems&gt;标签来设定选项，例<br>如： </p>
<p>&lt;f:selectItem itemLabel="高中" </p>
<p>&nbsp;itemValue="高中" </p>
<p>&nbsp;itemDescription="学历" </p>
<p>&nbsp;itemDisabled="true"/&gt; </p>
<p>&nbsp;itemLabel属性设定显示在网页上的文字，itemValue设定发送至伺服端时的<br>值，itemDescription 设定文字描述，它只作用于一些工具程序，对HTML没有什<br>么影响，itemDisabled设定是否选项是否作用，这些属性也都可以使用JSF <br>Expression Language来绑定至一个值。 </p>
<p>&nbsp;&lt;f:selectItem&gt;也可以使用value来绑定一个传回javax.faces.model. <br>SelectItem的方法，例如： </p>
<p>&lt;f:selectItem value="#{user.sex}"/&gt; </p>
<p>&nbsp;则绑定的Bean上必须提供下面这个方法： </p>
<p>.... </p>
<p>&nbsp;public SelectItem getSex() { </p>
<p>&nbsp;return new SelectItem("男"); </p>
<p>&nbsp;} </p>
<p>&nbsp;.... </p>
<p>&nbsp;如果要一次提供多个选项，则可以使用&lt;f:selectItems&gt;，它的value绑定至</p>
<p><br>一个提供传回SelectItem的列表、集合，或者是Map对象的方法，例如： </p>
<p>&lt;h:selectOneRadio value="#{user.education}"&gt; </p>
<p>&nbsp;&lt;f:selectItems value="#{user.educationItems}"/&gt; </p>
<p>&nbsp;&lt;/h:selectOneRadio&gt;&lt;p&gt; </p>
<p>&nbsp;这个例子中&lt;f:selectItems&gt;的value绑定至user.educationItems，其内容<br>如下： </p>
<p>.... </p>
<p>&nbsp;private SelectItem[] educationItems; </p>
<p>&nbsp;</p>
<p>&nbsp;public SelectItem[] getEducationItems() { </p>
<p>&nbsp;if(educationItems == null) { </p>
<p>&nbsp;educationItems = new SelectItem[3]; </p>
<p>&nbsp;educationItems[0] = </p>
<p>&nbsp;new SelectItem("高中", "高中"); </p>
<p>&nbsp;educationItems[1] = </p>
<p>&nbsp;new SelectItem("大学", "大学"); </p>
<p>&nbsp;educationItems[2] = </p>
<p>&nbsp;new SelectItem("研究所以上", "研究所以上"); </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;return educationItems; </p>
<p>&nbsp;} </p>
<p>&nbsp;.... </p>
<p>&nbsp;在这个例子中，SelectItem的第一个构造参数用以设定value，而第二个参<br>数用以设定label，SelectItem还提供有数个构造函数，记得可以参考一下联机<br>API文件。 </p>
<p>&nbsp;您也可以提供一个传回Map对象的方法，Map的key-value会分别作为选项的<br>label-value，例如： </p>
<p>&lt;h:selectManyCheckbox layout="pageDirection" </p>
<p>&nbsp;value="#{user.preferColors}"&gt; </p>
<p>&nbsp;&lt;f:selectItems value="#{user.preferColorItems}"/&gt; </p>
<p>&nbsp;&lt;/h:selectManyCheckbox&gt;&lt;p&gt; </p>
<p>&nbsp;您要提供下面的程序来搭配上面这个例子： </p>
<p>.... </p>
<p>&nbsp;private Map preferColorItems; </p>
<p>&nbsp;</p>
<p>&nbsp;public Map getPreferColorItems() { </p>
<p>&nbsp;if(preferColorItems == null) { </p>
<p>&nbsp;preferColorItems = new HashMap(); </p>
<p>&nbsp;preferColorItems.put("红", "Red"); </p>
<p>&nbsp;preferColorItems.put("黄", "Yellow"); </p>
<p>&nbsp;preferColorItems.put("蓝", "Blue"); </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p><br>&nbsp;return preferColorItems; </p>
<p>&nbsp;} </p>
<p>&nbsp;.... </p>
<p>1.7 其它标签 </p>
<p>&nbsp;&lt;h:messages&gt;或&lt;h:message&gt;标签的介绍，在 错误信息处理 中已经有介绍了。 </p>
<p>.. &lt;h:graphicImage&gt; </p>
<p><br>&nbsp;这个标签会绘制一个HTML &lt;img&gt;标签，value可以指定路径或图片URL，路径<br>可以指定相对路径或绝对路径，例如： </p>
<p>&lt;h:graphicImage value="/images/logowiki.jpg"/&gt; </p>
<p>.. &lt;h:panelGrid&gt; </p>
<p><br>&nbsp;这个标签可以用来作简单的组件排版，它会使用HTML表格标签来绘制表格，<br>并将组件置于其中，主要指定columns属性，例如设定为 2： </p>
<p>&lt;h:panelGrid columns="2"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Username"/&gt; </p>
<p>&nbsp;&lt;h:inputText id="name" value="#{userBean.name}"/&gt; </p>
<p>&nbsp;&lt;h:outputText value="Password"/&gt; </p>
<p>&nbsp;&lt;h:inputText id="password" value="#{userBean.password}"/&gt; </p>
<p>&nbsp;&lt;h:commandButton value="submit" action="login"/&gt; </p>
<p>&nbsp;&lt;h:commandButton value="reset" type="reset"/&gt; </p>
<p>&nbsp;&lt;/h:panelGrid&gt; </p>
<p>&nbsp;则自动将组件分作 2 个 column来排列，排列出来的样子如下： </p>
<p>&nbsp;</p>
<p>&nbsp;&lt;h:panelGrid&gt;的本体间只能包括JSF组件，如果想要放入非JSF组件，例如<br>简单的样版（template）文字，则要使用 &lt;f:verbatim&gt;包括住，例如： </p>
<p>&lt;h:panelGrid columns="2"&gt; </p>
<p>&nbsp;&lt;f:verbatim&gt;Username&lt;/f:verbatim&gt; </p>
<p>&nbsp;&lt;h:inputText id="name" value="#{userBean.name}"/&gt; </p>
<p>&nbsp;&lt;f:verbatim&gt;Password&lt;/f:verbatim&gt; </p>
<p>&nbsp;&lt;h:inputText id="password" value="#{userBean.password}"/&gt; </p>
<p>&nbsp;&lt;h:commandButton value="submit" action="login"/&gt; </p>
<p>&nbsp;&lt;h:commandButton value="reset" type="reset"/&gt; </p>
<p>&nbsp;&lt;/h:panelGrid&gt; </p>
<p>.. &lt;h:panelGroup&gt; </p>
<p><br>&nbsp;这个组件用来将数个JSF组件包装起来，使其看来像是一个组件，例如： </p>
<p>&lt;h:panelGrid columns="2"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Username"/&gt; </p>
<p>&nbsp;&lt;h:inputText id="name" value="#{userBean.name}"/&gt; </p>
<p>&nbsp;&lt;h:outputText value="Password"/&gt; </p>
<p>&nbsp;&lt;h:inputText id="password" value="#{userBean.password}"/&gt; </p>
<p><br>&nbsp;&lt;h:panelGroup&gt; </p>
<p>&nbsp;&lt;h:commandButton value="submit" action="login"/&gt; </p>
<p>&nbsp;&lt;h:commandButton value="reset" type="reset"/&gt; </p>
<p>&nbsp;&lt;/h:panelGroup&gt; </p>
<p>&nbsp;&lt;/h:panelGrid&gt; </p>
<p>&nbsp;在&lt;h:panelGroup&gt;中包括了两个&lt;h:commandButton&gt;，这使得&lt; <br>h:panelGrid&gt;在处理时，将那两个&lt;h:commandButton&gt;看作是一个组件来看待，<br>其完成的版面配置如下所示： </p>
<p>&nbsp;</p>
<p><br>2. 表格处理 </p>
<p>对于必须使用表格方式呈现的数据，JSF 的 &lt;h:dataTable&gt; 标签协助您进<br>行动态表格数据的输出。 </p>
<p>2.1 简单的表格 </p>
<p>&nbsp;很多数据经常使用表格来表现，JSF提供&lt;h:dataTable&gt;标签让您得以列举数<br>据并使用表格方式来呈现，举个实际的例子来看，假设您编写了以下的两个类： </p>
<p>. UserBean.java </p>
<p><br>package onlyfun.caterpillar; </p>
<p>&nbsp;</p>
<p>&nbsp;public class UserBean { </p>
<p>&nbsp;private String name; </p>
<p>&nbsp;private String password; </p>
<p>&nbsp;</p>
<p>&nbsp;public UserBean() { </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public UserBean(String name, String password) { </p>
<p>&nbsp;this.name = name; </p>
<p>&nbsp;this.password = password; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public String getName() { </p>
<p>&nbsp;return name; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public void setName(String name) { </p>
<p>&nbsp;this.name = name; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public String getPassword() { </p>
<p>&nbsp;return password; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public void setPassword(String password) { </p>
<p>&nbsp;this.password = password; </p>
<p>&nbsp;} </p>
<p>&nbsp;} </p>
<p><br>. TableBean.java </p>
<p><br>package onlyfun.caterpillar; </p>
<p>&nbsp;</p>
<p>&nbsp;import java.util.*; </p>
<p>&nbsp;</p>
<p>&nbsp;public class TableBean { </p>
<p>&nbsp;private List userList; </p>
<p>&nbsp;</p>
<p>&nbsp;public List getUserList() { </p>
<p>&nbsp;if(userList == null) { </p>
<p>&nbsp;userList = new ArrayList(); </p>
<p>&nbsp;userList.add(new UserBean("caterpillar", "123456")); </p>
<p>&nbsp;userList.add(new UserBean("momor", "654321")); </p>
<p>&nbsp;userList.add(new UserBean("becky", "7890")); </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;return userList; </p>
<p>&nbsp;} </p>
<p>&nbsp;} </p>
<p>&nbsp;在TableBean中，我们假设getUserList()方法实际上是从数据库中查询出<br>UserBean的内容，之后传回List对象，若我们的 faces-config.xml如下： </p>
<p>. faces-config.xml </p>
<p><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt; </p>
<p>&nbsp;&lt;!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, </p>
<p>&nbsp;Inc.//DTD JavaServer Faces Config 1.0//EN" </p>
<p>&nbsp;"<a href="http://java.sun.com/dtd/web-facesconfig_1_0.dtd">http://java.sun.com/dtd/web-facesconfig_1_0.dtd</a>"&gt; </p>
<p>&nbsp;</p>
<p>&nbsp;&lt;faces-config&gt; </p>
<p>&nbsp;&lt;managed-bean&gt; </p>
<p>&nbsp;&lt;managed-bean-name&gt;tableBean&lt;/managed-bean-name&gt; </p>
<p>&nbsp;&lt;managed-bean-class&gt; </p>
<p>&nbsp;onlyfun.caterpillar.TableBean </p>
<p>&nbsp;&lt;/managed-bean-class&gt; </p>
<p>&nbsp;&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; </p>
<p>&nbsp;&lt;/managed-bean&gt; </p>
<p>&nbsp;&lt;managed-bean&gt; </p>
<p>&nbsp;&lt;managed-bean-name&gt;userBean&lt;/managed-bean-name&gt; </p>
<p>&nbsp;&lt;managed-bean-class&gt; </p>
<p>&nbsp;onlyfun.caterpillar.UserBean </p>
<p>&nbsp;&lt;/managed-bean-class&gt; </p>
<p>&nbsp;&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; </p>
<p>&nbsp;&lt;/managed-bean&gt; </p>
<p><br>&nbsp;&lt;/faces-config&gt; </p>
<p>&nbsp;我们可以如下使用&lt;h:dataTable&gt;来产生表格数据： </p>
<p>. index.jsp </p>
<p><br>&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/html">http://java.sun.com/jsf/html</a>" prefix="h" %&gt; </p>
<p>&nbsp;&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/core">http://java.sun.com/jsf/core</a>" prefix="f" %&gt; </p>
<p>&nbsp;&lt;html&gt; </p>
<p>&nbsp;&lt;body&gt; </p>
<p>&nbsp;&lt;f:view&gt; </p>
<p>&nbsp;&lt;h:dataTable value="#{tableBean.userList}" var="user"&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.name}"/&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.password}"/&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;/h:dataTable&gt; </p>
<p>&nbsp;&lt;/f:view&gt; </p>
<p>&nbsp;&lt;/body&gt; </p>
<p>&nbsp;&lt;/html&gt; </p>
<p>&nbsp;&lt;h:dataTable&gt;的value值绑定tableBean的userList方法，它会一个一个取<br>出 List中的数据并设定给var设定的user，之后在每一个column中我们可以显示<br>所列举出的user.name与user.password，程序的结果会如下所示： </p>
<p>（注：此处应该有图，但是原文就没有附上。） </p>
<p>&nbsp;所产生的HTML表格标签如下： </p>
<p>&lt;table&gt; </p>
<p>&nbsp;&lt;tbody&gt; </p>
<p>&nbsp;&lt;tr&gt; </p>
<p>&nbsp;&lt;td&gt;caterpillar&lt;/td&gt; </p>
<p>&nbsp;&lt;td&gt;123456&lt;/td&gt; </p>
<p>&nbsp;&lt;/tr&gt; </p>
<p>&nbsp;&lt;tr&gt; </p>
<p>&nbsp;&lt;td&gt;momor&lt;/td&gt; </p>
<p>&nbsp;&lt;td&gt;654321&lt;/td&gt; </p>
<p>&nbsp;&lt;/tr&gt; </p>
<p>&nbsp;&lt;tr&gt; </p>
<p>&nbsp;&lt;td&gt;becky&lt;/td&gt; </p>
<p>&nbsp;&lt;td&gt;7890&lt;/td&gt; </p>
<p>&nbsp;&lt;/tr&gt; </p>
<p>&nbsp;&lt;/tbody&gt; </p>
<p>&nbsp;&lt;/table&gt; </p>
<p>&nbsp;&lt;h:dataTable&gt;的value值绑定的对象可以是以下的类型： </p>
<p>.. 列表 </p>
<p><br><br>.. java.util.List的实例 <br>.. java.sql.ResultSet的实例 <br>.. javax.servlet.jsp.jstl.sql.Result的实例 <br>.. javax.faces.model.DataModel的实例 </p>
<p><br>2.2 表头、表尾 </p>
<p>&nbsp;&lt;h:dataTable&gt;配合&lt;h:column&gt;来以表格的方式显示数据，&lt; h:column&gt;中只<br>能包括 JSF组件或者是&lt;f:facet&gt;，JSF支援两种facet：header与footer。分别<br>用以设定表格的表头与表尾文字，一个设定的例子如下： </p>
<p>&lt;h:dataTable value="#{tableBean.userList}" var="user"&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;f:facet name="header"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Name"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.name}"/&gt; </p>
<p>&nbsp;&lt;f:facet name="footer"&gt; </p>
<p>&nbsp;&lt;h:outputText value="****"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;f:facet name="header"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Password"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.password}"/&gt; </p>
<p>&nbsp;&lt;f:facet name="footer"&gt; </p>
<p>&nbsp;&lt;h:outputText value="****"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;/h:dataTable&gt; </p>
<p>&nbsp;所产生的表格如下所示： </p>
<p>&nbsp;</p>
<p>&nbsp;另外，对于表头、表尾乃至于每一行列，都可以分别设定CSS风格，例如下<br>面这个styles.css摘录自Core JSF一书： </p>
<p>. styles.css </p>
<p><br>.orders { </p>
<p>&nbsp;border: thin solid black; </p>
<p><br>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;.ordersHeader { </p>
<p>&nbsp;text-align: center; </p>
<p>&nbsp;font-style: italic; </p>
<p>&nbsp;color: Snow; </p>
<p>&nbsp;background: Teal; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;.evenColumn { </p>
<p>&nbsp;height: 25px; </p>
<p>&nbsp;text-align: center; </p>
<p>&nbsp;background: MediumTurquoise; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;.oddColumn { </p>
<p>&nbsp;text-align: center; </p>
<p>&nbsp;background: PowderBlue; </p>
<p>&nbsp;} </p>
<p>&nbsp;可以在我们的页面中如下加入： </p>
<p>.... </p>
<p>&nbsp;&lt;link href="styles.css" rel="stylesheet" type="text/css"/&gt; </p>
<p>&nbsp;.... </p>
<p>&nbsp;&lt;h:dataTable value="#{tableBean.userList}" var="user" </p>
<p>&nbsp;styleClass="orders" </p>
<p>&nbsp;headerClass="ordersHeader" </p>
<p>&nbsp;rowClasses="evenColumn,oddColumn"&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;f:facet name="header"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Name"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.name}"/&gt; </p>
<p>&nbsp;&lt;f:facet name="footer"&gt; </p>
<p>&nbsp;&lt;h:outputText value="****"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;f:facet name="header"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Password"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.password}"/&gt; </p>
<p>&nbsp;&lt;f:facet name="footer"&gt; </p>
<p>&nbsp;&lt;h:outputText value="****"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p><br>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;/h:dataTable&gt; </p>
<p>&nbsp;则显示的表格结果如下： </p>
<p>&nbsp;</p>
<p>2.3 TableModel类 </p>
<p>&nbsp;在 简单的表格 中曾经提过，&lt;h:dataTable&gt;可以列举以下几种类型的数据： </p>
<p>.. 列表 <br>.. java.util.List的实例 <br>.. java.sql.ResultSet的实例 <br>.. javax.servlet.jsp.jstl.sql.Result的实例 <br>.. javax.faces.model.DataModel的实例 </p>
<p><br>&nbsp;对于前四种类型，JSF实际上是以javax.faces.model.DataModel加以包装，<br>DataModel是个抽象类，其子类都是位于 javax.faces.model这个package下： </p>
<p>ArrayDataModel </p>
<p>ListDataModel </p>
<p>ResultDataModel </p>
<p>ResultSetDataModel </p>
<p>ScalarDataModel </p>
<p>&nbsp;如果您想要对表格数据有更多的控制，您可以直接使用DataModel来设定表<br>格数据，调用DataModel的setWrappedObject()方法可以让您设定对应类型的数<br>据，调用getWrappedObject()则可以取回数据，例如： </p>
<p>. TableBean.java </p>
<p><br>package onlyfun.caterpillar; </p>
<p>&nbsp;</p>
<p>&nbsp;import java.util.*; </p>
<p>&nbsp;import javax.faces.model.DataModel; </p>
<p>&nbsp;import javax.faces.model.ListDataModel; </p>
<p>&nbsp;</p>
<p>&nbsp;public class TableBean { </p>
<p>&nbsp;private DataModel model; </p>
<p>&nbsp;private int rowIndex = -1; </p>
<p>&nbsp;</p>
<p>&nbsp;public DataModel getUsers() { </p>
<p><br>&nbsp;if(model == null) { </p>
<p>&nbsp;model = new ListDataModel(); </p>
<p>&nbsp;model.setWrappedData(getUserList()); </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;return model; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;private List getUserList() { </p>
<p>&nbsp;List userList = new ArrayList(); </p>
<p>&nbsp;userList.add(new UserBean("caterpillar", "123456")); </p>
<p>&nbsp;userList.add(new UserBean("momor", "654321")); </p>
<p>&nbsp;userList.add(new UserBean("becky", "7890")); </p>
<p>&nbsp;</p>
<p>&nbsp;return userList; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public int getSelectedRowIndex() { </p>
<p>&nbsp;return rowIndex; </p>
<p>&nbsp;} </p>
<p>&nbsp;</p>
<p>&nbsp;public String select() { </p>
<p>&nbsp;rowIndex = model.getRowIndex(); </p>
<p>&nbsp;return "success"; </p>
<p>&nbsp;} </p>
<p>&nbsp;} </p>
<p>&nbsp;在这个Bean中，我们直接设定DataModel，将userList设定给它，如您所看<br>到的，我们还可以取得DataModel的各个变量，在这个例子中，select()将作为<br>点选表格之后的事件处理方法，我们可以借由DataModel的getRowIndex()来取得<br>所点选的是哪一row的数据，例如： </p>
<p>index.jsp </p>
<p>&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/html">http://java.sun.com/jsf/html</a>" prefix="h" %&gt; </p>
<p>&nbsp;&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/core">http://java.sun.com/jsf/core</a>" prefix="f" %&gt; </p>
<p>&nbsp;&lt;html&gt; </p>
<p>&nbsp;&lt;link href="styles.css" rel="stylesheet" type="text/css"/&gt; </p>
<p>&nbsp;&lt;body&gt; </p>
<p>&nbsp;&lt;f:view&gt; </p>
<p>&nbsp;&lt;h:form&gt; </p>
<p>&nbsp;&lt;h:dataTable value="#{tableBean.users}" var="user" </p>
<p>&nbsp;styleClass="orders" </p>
<p>&nbsp;headerClass="ordersHeader" </p>
<p>&nbsp;rowClasses="evenColumn,oddColumn"&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;f:facet name="header"&gt; </p>
<p><br>&nbsp;&lt;h:outputText value="Name"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;h:commandLink action="#{tableBean.select}"&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.name}"/&gt; </p>
<p>&nbsp;&lt;/h:commandLink&gt; </p>
<p>&nbsp;</p>
<p>&nbsp;&lt;f:facet name="footer"&gt; </p>
<p>&nbsp;&lt;h:outputText value="****"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;h:column&gt; </p>
<p>&nbsp;&lt;f:facet name="header"&gt; </p>
<p>&nbsp;&lt;h:outputText value="Password"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;h:outputText value="#{user.password}"/&gt; </p>
<p>&nbsp;&lt;f:facet name="footer"&gt; </p>
<p>&nbsp;&lt;h:outputText value="****"/&gt; </p>
<p>&nbsp;&lt;/f:facet&gt; </p>
<p>&nbsp;&lt;/h:column&gt; </p>
<p>&nbsp;&lt;/h:dataTable&gt; </p>
<p>&nbsp;&lt;/h:form&gt; </p>
<p>&nbsp;Selected Row: &lt;h:outputText </p>
<p>&nbsp;value="#{tableBean.selectedRowIndex}"/&gt; </p>
<p>&nbsp;&lt;/f:view&gt; </p>
<p>&nbsp;&lt;/body&gt; </p>
<p>&nbsp;&lt;/html&gt; </p>
<p>&nbsp;DataModel的rowIndex是从0开始计算，当处理ActionEvent时，JSF会逐次递<br>增rowIndex的值，这让您可以得知目前正在处理的是哪一个row的数据，一个执<br>行的图示如下： </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br></p>
<img src ="http://www.blogjava.net/ysong1987/aggbug/122619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ysong1987/" target="_blank">月半弯</a> 2007-06-07 15:58 <a href="http://www.blogjava.net/ysong1987/articles/122619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《JSF入门 》全集</title><link>http://www.blogjava.net/ysong1987/articles/122618.html</link><dc:creator>月半弯</dc:creator><author>月半弯</author><pubDate>Thu, 07 Jun 2007 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/ysong1987/articles/122618.html</guid><wfw:comment>http://www.blogjava.net/ysong1987/comments/122618.html</wfw:comment><comments>http://www.blogjava.net/ysong1987/articles/122618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ysong1987/comments/commentRss/122618.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ysong1987/services/trackbacks/122618.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;JSF入门 &nbsp;原文：http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630繁简转换与修订：jnzgy@163.com声明：为方便简体中文读者阅读，特将原文转换为简体，对一些习惯用语做了替换，同时对部分内容做了修订。版权归原文作者所有，未经许可，不得用于...&nbsp;&nbsp;<a href='http://www.blogjava.net/ysong1987/articles/122618.html'>阅读全文</a><img src ="http://www.blogjava.net/ysong1987/aggbug/122618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ysong1987/" target="_blank">月半弯</a> 2007-06-07 15:54 <a href="http://www.blogjava.net/ysong1987/articles/122618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>