﻿<?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-♂梦想～天堂♀</title><link>http://www.blogjava.net/ysong1987/</link><description>每一步一个脚印 这里会记录我成长的点点滴滴……</description><language>zh-cn</language><lastBuildDate>Fri, 19 Jun 2026 10:17:34 GMT</lastBuildDate><pubDate>Fri, 19 Jun 2026 10:17:34 GMT</pubDate><ttl>60</ttl><item><title>关于jsp乱码问题的解决</title><link>http://www.blogjava.net/ysong1987/articles/122633.html</link><dc:creator>月半弯</dc:creator><author>月半弯</author><pubDate>Thu, 07 Jun 2007 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/ysong1987/articles/122633.html</guid><wfw:comment>http://www.blogjava.net/ysong1987/comments/122633.html</wfw:comment><comments>http://www.blogjava.net/ysong1987/articles/122633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ysong1987/comments/commentRss/122633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ysong1987/services/trackbacks/122633.html</trackback:ping><description><![CDATA[<div class=tit>&nbsp;</div>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>
            <p style="TEXT-INDENT: 2em" align=center><strong><font size=4>关于jsp乱码问题的解决。</font></strong></p>
            <p style="TEXT-INDENT: 2em">1 最基本的乱码问题。</p>
            <p style="TEXT-INDENT: 2em">这个乱码问题是最简单的乱码问题。一般新会出现。就是页面编码不一致导致的乱码。</p>
            <p style="TEXT-INDENT: 2em">&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;%@ page contentType="text/html;charset=iso8859-1"%&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;html&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;head&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;title&gt;中文问题&lt;/title&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;/head&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;/head&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;body&gt;</p>
            <p style="TEXT-INDENT: 2em">&nbsp;&nbsp; 我是个好人</p>
            <p style="TEXT-INDENT: 2em">&lt;/body&gt;</p>
            <p style="TEXT-INDENT: 2em">&lt;/html&gt;</p>
            <p style="TEXT-INDENT: 2em">三个地方的编码。</p>
            <p style="TEXT-INDENT: 2em">第一个地方的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件，包括里面的汉字。</p>
            <p style="TEXT-INDENT: 2em">第二处编码为解码格式。因为存为UTF-8的文件被解码为iso8859-1，这样 如有中文肯定出乱码。也就是必须一致。而第二处所在的这一行，可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有这一行的话，&#8220;我是个好人&#8221;也会出现乱码。必须一致才可以。</p>
            <p style="TEXT-INDENT: 2em">&nbsp;&nbsp; 第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话，这个编码格式没有关系。有的网页出现乱码，就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面，导致浏览器混淆了编码格式。出现了乱码。</p>
            <p style="TEXT-INDENT: 2em">2 表单使用Post方式提交后接收到的乱码问题</p>
            <p style="TEXT-INDENT: 2em">这个问题也是一个常见的问题。这个乱码也是tomcat的内部编码格式iso8859-1在捣乱，也就是说post提交时，如果没有设置提交的编码格式，则会以iso8859-1方式进行提交，接受的jsp却以utf-8的方式接受。导致乱码。既然这样的原因，下面有几种解决方式，并比较。</p>
            <p style="TEXT-INDENT: 2em">A 接受参数时进行编码转换</p>
            <p style="TEXT-INDENT: 2em">String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8") ； 这样的话，每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。</p>
            <p style="TEXT-INDENT: 2em">B 在请求页面上开始处，执行请求的编码代码， request.setCharacterEncoding("UTF-8")，把提交内容的字符集设为UTF－8。这样的话，接受此参数的页面就不必在转码了。直接使用</p>
            <p style="TEXT-INDENT: 2em">String str = request.getParameter("something")；即可得到汉字参数。但每页都需要执行这句话。这个方法也就对post提交的有效果，对于get提交和上传文件时的enctype="multipart/form-data"是无效的。稍后下面单独对这个两个的乱码情况再进行说明。</p>
            <p style="TEXT-INDENT: 2em">C 为了避免每页都要写request.setCharacterEncoding("UTF-8")，建议使用过滤器对所有jsp</p>
            <p style="TEXT-INDENT: 2em">&nbsp;&nbsp; 进行编码处理。这个网上有很多例子。请大家自己查阅。</p>
            <p style="TEXT-INDENT: 2em">3 表单get提交方式的乱码处理方式。</p>
            <p style="TEXT-INDENT: 2em">如果使用get方式提交中文，接受参数的页面也会出现乱码，这个乱码的原因也是tomcat的内部编码格式iso8859-1导致。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码，编码后追加到url，导致接受页面得到的参数为乱码/、。</p>
            <p style="TEXT-INDENT: 2em">解决办法：</p>
            <p style="TEXT-INDENT: 2em">A 使用上例中的第一种方式，对接受到的字符进行解码，再转码。</p>
            <p style="TEXT-INDENT: 2em">B Get走的是url提交，而在进入url之前已经进行了iso8859-1的编码处理。要想影响这个编码则需要在server.xml的Connector节点增加useBodyEncodingForURI="true" </p>
            <p style="TEXT-INDENT: 2em">属性配置，即可控制tomcat对get方式的汉字编码方式，上面这个属性控制get提交也是用request.setCharacterEncoding("UTF-8")所设置的编码格式进行编码。所以自动编码为utf-8，接受页面正常接受就可以了。但我认为真正的编码过程是，tomcat又要根据</p>
            <p style="TEXT-INDENT: 2em">&lt;Connector port="8080" </p>
            <p style="TEXT-INDENT: 2em">maxThreads="150" minSpareThreads="25" maxSpareThreads="75" </p>
            <p style="TEXT-INDENT: 2em">enableLookups="false" redirectPort="8443" acceptCount="100" </p>
            <p style="TEXT-INDENT: 2em">debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" </p>
            <p style="TEXT-INDENT: 2em">disableUploadTimeout="true" URIEncoding=&#8221;UTF-8&#8221;/&gt;</p>
            <p style="TEXT-INDENT: 2em">里面所设置的URIEncoding=&#8221;UTF-8&#8221;再进行一次编码，但是由于已经编码为utf-8，再编码也不会有变化了。如果是从url获取编码，接受页面则是根据URIEncoding=&#8221;UTF-8&#8221;来进行解码的。</p>
            <p style="TEXT-INDENT: 2em">4 上传文件时的乱码解决</p>
            <p style="TEXT-INDENT: 2em">&nbsp;&nbsp; 上传文件时，form表单设置的都是enctype="multipart/form-data"。这种方式以流方式提交文件。如果使用apach的上传组件，会发现有很多乱码想象。这是因为apach的先期commons-fileupload.jar有bug，取出汉字后进行解码，因为这种方式提交，编码又自动使用的是tomcat缺省编码格式iso-8859-1。但出现的乱码问题是： 句号，逗号，等特殊符号变成了乱码，汉字如果数量为奇数，则会出现乱码，偶数则解析正常。</p>
            <p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; 解决方式： 下载commons-fileupload-1.1.1.jar 这个版本的jar已经解决了这些bug。</p>
            <p style="TEXT-INDENT: 2em">但是取出内容时仍然需要对取出的字符进行从iso8859-1到utf-8转码。已经能得到正常所有汉字以及字符。</p>
            <p style="TEXT-INDENT: 2em">5 Java代码关于url请求，接受参数的乱码</p>
            <p style="TEXT-INDENT: 2em">url的编码格式，取决于上面所说的URIEncoding=&#8221;UTF-8&#8221;。 如果设定了这个编码格式，则意味着所有到url的汉字参数，都必须进行编码才可以。否则得到的汉字参数值都是乱码，例如</p>
            <p style="TEXT-INDENT: 2em">一个链接 Response.sendDerect（&#8220;/a.jsp?name=张大维&#8221;）；而在a.jsp里面直接使用</p>
            <p style="TEXT-INDENT: 2em">String name"）；得到的就是乱码。因为规定了必须是utf-8才可以，所以，这个转向应该这样写： </p>
            <p style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Response.sendDerect（&#8220;/a.jsp?name=URLEncode.encode(&#8220;张大维&#8221;,&#8221;utf-8&#8221;)；才可以。</p>
            <p style="TEXT-INDENT: 2em">如果不设置这个参数URIEncoding=&#8221;UTF-8&#8221;， 会怎么样呢? 不设置则就使用了缺省的编码格式iso8859-1。问题又出来了，第一就是参数值的个数如果是奇数个数，则就可以正常解析，如果使偶数个数，得到最后字符就是乱码。还有就是如果最后一个字符如果是英文，则就能正常解析，但中文的标点符号仍出现乱码。权宜之计，如果您的参数中没有中文标点符号，则可以在参数值最后加一个英文符号来解决乱码问题，得到参数后再去掉这个最后面的符号。也可以凑或使用。</p>
            <p style="TEXT-INDENT: 2em">6 脚本代码关于url请求，接受到的参数乱码</p>
            <p style="TEXT-INDENT: 2em">脚本中也会进行页面转向的控制，也会涉及到附带参数，并在接受页面解析这个参数的情况。如果这个汉字参数不进行URIEncoding=&#8221;UTF-8&#8221;所指定的编码处理，则接受页面接受到的汉字也是乱码。脚本处理编码比较麻烦，必须有相应的编码脚本对应文件，然后调用脚本中的方法对汉字进行编码即可。</p>
            <p style="TEXT-INDENT: 2em">7 关于jsp在MyEclipse中打开的乱码问题</p>
            <p style="TEXT-INDENT: 2em">对于一个已经存在的项目，Jsp文件的存储格式可能是utf-8。如果新安装的eclipse，则缺省打开使用的编码格式都是iso8859-1。所以导致jsp里面的汉字出现乱码。这个乱码比较容易解决，直接到eclipse3.1的偏好设置里面找到general-〉edidor，设置为您的文件打开编码为utf-8即可。Eclipse会自动重新以新的编码格式打开。汉字即可正常显示。</p>
            <p style="TEXT-INDENT: 2em">8 关于html页面在eclipse中打开出现乱码情况</p>
            <p style="TEXT-INDENT: 2em">由于大部分页面都是由dreamweaver制作，其存储格式跟eclipse的识别有差别导致。</p>
            <p style="TEXT-INDENT: 2em">一般这种情况，在eclipse中新建一个jsp，直接从dreamweaver复制页面内容粘贴到jsp即可。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/ysong1987/aggbug/122633.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 16:19 <a href="http://www.blogjava.net/ysong1987/articles/122633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>