﻿<?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-Linden.zhang-文章分类-Jsf</title><link>http://www.blogjava.net/linden/category/23055.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2007 17:17:41 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2007 17:17:41 GMT</pubDate><ttl>60</ttl><item><title>JavaScript 访问 JSF 组件的方法</title><link>http://www.blogjava.net/linden/articles/123738.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Tue, 12 Jun 2007 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/123738.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/123738.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/123738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/123738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/123738.html</trackback:ping><description><![CDATA[<p><span style="FONT-FAMILY: Arial">先看下面的 JSF 页面：</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: rgb(230,230,230) 0% 50%; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; FONT-FAMILY: Arial; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><img id=_2_44_Open_Image onclick="this.style.display='none'; document.getElementById('_2_44_Open_Text').style.display='none'; document.getElementById('_2_44_Closed_Image').style.display='inline'; document.getElementById('_2_44_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif"><img id=_2_44_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_2_44_Closed_Text').style.display='none'; document.getElementById('_2_44_Open_Image').style.display='inline'; document.getElementById('_2_44_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif"><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,0)">&lt;%</span><span id=_2_44_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_2_44_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">@&nbsp;page&nbsp;language</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">java</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;pageEncoding</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">UTF-8</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,0)">%&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img id=_50_103_Open_Image onclick="this.style.display='none'; document.getElementById('_50_103_Open_Text').style.display='none'; document.getElementById('_50_103_Closed_Image').style.display='inline'; document.getElementById('_50_103_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif"><img id=_50_103_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_50_103_Closed_Text').style.display='none'; document.getElementById('_50_103_Open_Image').style.display='inline'; document.getElementById('_50_103_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,0)">&lt;%</span><span id=_50_103_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_50_103_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">@&nbsp;taglib&nbsp;uri</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">http://java.sun.com/jsf/html</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;prefix</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">h</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,0)">%&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img id=_109_162_Open_Image onclick="this.style.display='none'; document.getElementById('_109_162_Open_Text').style.display='none'; document.getElementById('_109_162_Closed_Image').style.display='inline'; document.getElementById('_109_162_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif"><img id=_109_162_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_109_162_Closed_Text').style.display='none'; document.getElementById('_109_162_Open_Image').style.display='inline'; document.getElementById('_109_162_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,0)">&lt;%</span><span id=_109_162_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_109_162_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">@&nbsp;taglib&nbsp;uri</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">http://java.sun.com/jsf/core</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;prefix</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">f</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,0)">%&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">html</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">head</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">title</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">My&nbsp;JSF&nbsp;'login.jsp'&nbsp;starting&nbsp;page</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">title</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img id=_270_762_Open_Image onclick="this.style.display='none'; document.getElementById('_270_762_Open_Text').style.display='none'; document.getElementById('_270_762_Closed_Image').style.display='inline'; document.getElementById('_270_762_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif"><img id=_270_762_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_270_762_Closed_Text').style.display='none'; document.getElementById('_270_762_Open_Image').style.display='inline'; document.getElementById('_270_762_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">script&nbsp;</span><span style="COLOR: rgb(255,0,0)">type</span><span style="COLOR: rgb(0,0,255)">="text/javascript"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span id=_270_762_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_270_762_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)"><br><img id=_294_757_Open_Image onclick="this.style.display='none'; document.getElementById('_294_757_Open_Text').style.display='none'; document.getElementById('_294_757_Closed_Image').style.display='inline'; document.getElementById('_294_757_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=_294_757_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_294_757_Closed_Text').style.display='none'; document.getElementById('_294_757_Open_Image').style.display='inline'; document.getElementById('_294_757_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">function</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;isEmpty()&nbsp;</span><span id=_294_757_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_294_757_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">var</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;username&nbsp;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;document.getElementById(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">formLogin:txtUsername</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">).value;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">var</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;password&nbsp;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">=</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;document.getElementById(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">formLogin:txtPassword</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">).value;<br><img id=_475_598_Open_Image onclick="this.style.display='none'; document.getElementById('_475_598_Open_Text').style.display='none'; document.getElementById('_475_598_Closed_Image').style.display='inline'; document.getElementById('_475_598_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=_475_598_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_475_598_Closed_Text').style.display='none'; document.getElementById('_475_598_Open_Image').style.display='inline'; document.getElementById('_475_598_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">if</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">(username&nbsp;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">==</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">""</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">)&nbsp;</span><span id=_475_598_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_475_598_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">给老子输用户名！</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">formLogin:txtUsername</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">).focus();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">return</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">false</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)"><br><img id=_625_751_Open_Image onclick="this.style.display='none'; document.getElementById('_625_751_Open_Text').style.display='none'; document.getElementById('_625_751_Closed_Image').style.display='inline'; document.getElementById('_625_751_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif"><img id=_625_751_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_625_751_Closed_Text').style.display='none'; document.getElementById('_625_751_Open_Image').style.display='inline'; document.getElementById('_625_751_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">if</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">(password&nbsp;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">==</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">""</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">)&nbsp;</span><span id=_625_751_Closed_Text style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">...</span><span id=_625_751_Open_Text><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">不输密码你登录个铲铲！</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">formLogin:txtPassword</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">"</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">).focus();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">return</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">&nbsp;</span><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(245,245,245)">false</span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(245,245,245)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">script</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">head</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">body</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">center</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">f:view</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:form&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="formLogin"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">div&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="input"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:outputLabel&nbsp;</span><span style="COLOR: rgb(255,0,0)">value</span><span style="COLOR: rgb(0,0,255)">="用户名："</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:inputText&nbsp;</span><span style="COLOR: rgb(255,0,0)">value</span><span style="COLOR: rgb(0,0,255)">="#{LoginManager.username}"</span><span style="COLOR: rgb(255,0,0)">&nbsp;id</span><span style="COLOR: rgb(0,0,255)">="txtUsername"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleClass</span><span style="COLOR: rgb(0,0,255)">="formText"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">br</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:outputLabel&nbsp;</span><span style="COLOR: rgb(255,0,0)">value</span><span style="COLOR: rgb(0,0,255)">="密码："</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:inputSecret&nbsp;</span><span style="COLOR: rgb(255,0,0)">value</span><span style="COLOR: rgb(0,0,255)">="#{LoginManager.password}"</span><span style="COLOR: rgb(255,0,0)">&nbsp;id</span><span style="COLOR: rgb(0,0,255)">="txtPassword"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleClass</span><span style="COLOR: rgb(0,0,255)">="formText"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">div</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">div&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="submit"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:commandButton&nbsp;</span><span style="COLOR: rgb(255,0,0)">value</span><span style="COLOR: rgb(0,0,255)">="提交"</span><span style="COLOR: rgb(255,0,0)">&nbsp;action</span><span style="COLOR: rgb(0,0,255)">="#{LoginManager.check}"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick</span><span style="COLOR: rgb(0,0,255)">="return&nbsp;isEmpty();"</span><span style="COLOR: rgb(255,0,0)">&nbsp;styleClass</span><span style="COLOR: rgb(0,0,255)">="formButton"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">h:commandButton&nbsp;</span><span style="COLOR: rgb(255,0,0)">value</span><span style="COLOR: rgb(0,0,255)">="重置"</span><span style="COLOR: rgb(255,0,0)">&nbsp;type</span><span style="COLOR: rgb(0,0,255)">="button"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick</span><span style="COLOR: rgb(0,0,255)">="javascript:document.getElementById('formLogin').reset();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('formLogin:txtUsername').focus();"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styleClass</span><span style="COLOR: rgb(0,0,255)">="formButton"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">div</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">h:form</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">f:view</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">center</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">body</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">html</span><span style="COLOR: rgb(0,0,255)">&gt;</span></div>
</div>
<br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">这个页面使用 JavaScript 来确认登录时用户名和密码是否为空，表单名为 </span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: Arial">formLogin</span><span style="FONT-FAMILY: Arial">，两个输入组件名为 </span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: Arial">txtUsername</span><span style="FONT-FAMILY: Arial"> 和 </span><span style="COLOR: rgb(51,153,102); FONT-FAMILY: Arial">txtPassword</span><span style="FONT-FAMILY: Arial">，当单击按钮时，将调用 JavaScript 函数 </span><span style="COLOR: rgb(51,102,255); FONT-FAMILY: Arial">isEmpty()</span><span style="FONT-FAMILY: Arial">，根据条件判断显示对话框或是提交表单。</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"><span style="COLOR: rgb(0,0,0); FONT-FAMILY: Arial">要<span style="COLOR: rgb(255,0,0)">注意</span>的是，不能在 JavaScript 函数中使用如下类似语法来访问表单组件：</span><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">document.formLogin.txtUsername.value;</span><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">而应使用：</span><br style="FONT-FAMILY: Arial"><span style="COLOR: rgb(255,0,0); FONT-FAMILY: Arial">document.getElementById("formLogin:txtUsername").value;</span><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">或者：</span><br style="FONT-FAMILY: Arial"><span style="COLOR: rgb(255,0,0); FONT-FAMILY: Arial">document.forms.formLogin["formLogin:txtUsername"].value;</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">这是因为 JSF 解释上面的 &lt;h:form id="formForm"&gt;...&lt;/h:form&gt; 一段时会生成如下代码：</span><br style="FONT-FAMILY: Arial"><br style="FONT-FAMILY: Arial">
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: rgb(230,230,230) 0% 50%; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; FONT-FAMILY: Arial; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">form&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="formLogin"</span><span style="COLOR: rgb(255,0,0)">&nbsp;method</span><span style="COLOR: rgb(0,0,255)">="post"</span><span style="COLOR: rgb(255,0,0)">&nbsp;action</span><span style="COLOR: rgb(0,0,255)">="/Project_Blog/login.faces"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;enctype</span><span style="COLOR: rgb(0,0,255)">="application/x-www-form-urlencoded"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">div&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="input"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">label</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">用户名：</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">label</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">input&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="formLogin:txtUsername"</span><span style="COLOR: rgb(255,0,0)">&nbsp;type</span><span style="COLOR: rgb(0,0,255)">="text"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="COLOR: rgb(0,0,255)">="formLogin:txtUsername"</span><span style="COLOR: rgb(255,0,0)">&nbsp;class</span><span style="COLOR: rgb(0,0,255)">="formText"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">br</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">label</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)">密码：</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">label</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">input&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="formLogin:txtPassword"</span><span style="COLOR: rgb(255,0,0)">&nbsp;type</span><span style="COLOR: rgb(0,0,255)">="password"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="COLOR: rgb(0,0,255)">="formLogin:txtPassword"</span><span style="COLOR: rgb(255,0,0)">&nbsp;value</span><span style="COLOR: rgb(0,0,255)">=""</span><span style="COLOR: rgb(255,0,0)">&nbsp;class</span><span style="COLOR: rgb(0,0,255)">="formText"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">div</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">div&nbsp;</span><span style="COLOR: rgb(255,0,0)">id</span><span style="COLOR: rgb(0,0,255)">="submit"</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">input&nbsp;</span><span style="COLOR: rgb(255,0,0)">type</span><span style="COLOR: rgb(0,0,255)">="submit"</span><span style="COLOR: rgb(255,0,0)">&nbsp;name</span><span style="COLOR: rgb(0,0,255)">="formLogin:_id2"</span><span style="COLOR: rgb(255,0,0)">&nbsp;value</span><span style="COLOR: rgb(0,0,255)">="&#25552;&#20132;"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick</span><span style="COLOR: rgb(0,0,255)">="return&nbsp;isEmpty();"</span><span style="COLOR: rgb(255,0,0)">&nbsp;class</span><span style="COLOR: rgb(0,0,255)">="formButton"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">input&nbsp;</span><span style="COLOR: rgb(255,0,0)">type</span><span style="COLOR: rgb(0,0,255)">="button"</span><span style="COLOR: rgb(255,0,0)">&nbsp;name</span><span style="COLOR: rgb(0,0,255)">="formLogin:_id3"</span><span style="COLOR: rgb(255,0,0)">&nbsp;value</span><span style="COLOR: rgb(0,0,255)">="&#37325;&#32622;"</span><span style="COLOR: rgb(255,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick</span><span style="COLOR: rgb(0,0,255)">="javascript:document.getElementById('formLogin').reset();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById('formLogin:txtUsername').focus();"</span><span style="COLOR: rgb(255,0,0)">&nbsp;class</span><span style="COLOR: rgb(0,0,255)">="formButton"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">div</span><span style="COLOR: rgb(0,0,255)">&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif">&nbsp;&nbsp;</span><span style="COLOR: rgb(0,0,255)">&lt;</span><span style="COLOR: rgb(128,0,0)">input&nbsp;</span><span style="COLOR: rgb(255,0,0)">type</span><span style="COLOR: rgb(0,0,255)">="hidden"</span><span style="COLOR: rgb(255,0,0)">&nbsp;name</span><span style="COLOR: rgb(0,0,255)">="formLogin"</span><span style="COLOR: rgb(255,0,0)">&nbsp;value</span><span style="COLOR: rgb(0,0,255)">="formLogin"</span><span style="COLOR: rgb(255,0,0)">&nbsp;</span><span style="COLOR: rgb(0,0,255)">/&gt;</span><span style="COLOR: rgb(0,0,0)"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top ilo-full-src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="COLOR: rgb(0,0,255)">&lt;/</span><span style="COLOR: rgb(128,0,0)">form</span><span style="COLOR: rgb(0,0,255)">&gt;</span></div>
</div>
<br style="FONT-FAMILY: Arial"><span style="FONT-FAMILY: Arial">JSF 产生的所有表单控件都有符合 <span style="COLOR: rgb(255,0,0)">formName:componentName</span> 格式的名称，这里的 formName 表示控件的表单的名称，而 componentName 表示组件名称。如果没有指定 id 属性，则 JSF 框架会自动创建标识符，就象上面的 HTML 片段中的按钮一样。因此，要访问上面的用户名字段，必须使用下列方法：</span><br style="FONT-FAMILY: Arial"><span style="COLOR: rgb(255,0,0); FONT-FAMILY: Arial">document.getElementById("formLogin:txtUsername").value;</span><br style="FONT-FAMILY: Arial">
<img src ="http://www.blogjava.net/linden/aggbug/123738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-12 23:14 <a href="http://www.blogjava.net/linden/articles/123738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF中实现分页（三） </title><link>http://www.blogjava.net/linden/articles/123663.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Tue, 12 Jun 2007 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/123663.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/123663.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/123663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/123663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/123663.html</trackback:ping><description><![CDATA[<p><font size=2>好久没有写点东西了，这次想把JSF中的分页系列文章再扩充一点，说明一下查询和分页结合的情况，当我们把查询条件和查询结果放到一个页面上时，查询还是非常容易实现的，甚至不需要我们手工去从数据库中查询。</font> </p>
<p><font size=2>在本系列文章中的第二篇中，介绍了一种 Load On Demand的方式，我们在这里需要继续利用这种方式，并对其做一些小小的扩展。这里我们使用 Hibernate3 作为持久化方案。</font> </p>
<p><font size=2>简单的介绍一下应用情景，一个系统中包含了一些 Customer 的信息，我们需要对其进行查询并对查询结果进行分页。</font> </p>
<p><font size=2>首先处理条件查询的情况，通常会根据 VO 中的字段进行 like 型查询，有时候时间或数字之类的会使用Between查询，因为查询条件一般不会很复杂，在这里，使用 Hibernate3 中的 Criteria 查询来处理这样的情况，我们把所有的查询条件通过 Customer 这个 VO 传进来，然后只对非空字段进行 like 查询，我们用到这样的方法。</font> <font size=2></font></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;List&nbsp;queryByConditions(Customer&nbsp;customer,&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;startRow,&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;pageSize)<br>{<br>&nbsp;Criteria&nbsp;criteria&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;getSession().createCriteria(Customer.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">);<br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">StringUtils.isEmpty(customer.getCustomerName()))<br>&nbsp;{<br>&nbsp;&nbsp;criteria.add(QueryUtils.getCriteriaParam(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">customerName</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;customer.getCustomerName()));<br>&nbsp;}<br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">StringUtils.isEmpty(customer.getAddress()))<br>&nbsp;{<br>&nbsp;&nbsp;criteria.add(QueryUtils.getCriteriaParam(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">address</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;customer.getAddress()));<br>&nbsp;}<br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">StringUtils.isEmpty(customer.getFax()))<br>&nbsp;{<br>&nbsp;&nbsp;criteria.add(QueryUtils.getCriteriaParam(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">fax</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;customer.getFax()));<br>&nbsp;}&nbsp;<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;criteriaPagedList(criteria,&nbsp;startRow,&nbsp;pageSize);<br>}</span> </div>
<p><font size=2>另外对应的一个count方法略去，只需要在前面加入一个<br>criteria.setProjection(Projections.count("customerId"));</font> </p>
<p><font size=2>因为考虑到以后的扩展，使用了一个Utils方法，QueryUtils.getCriteriaParam方法</font> </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">final</span> <span style="COLOR: #000000">&nbsp;SimpleExpression&nbsp;getCriteriaParam(String&nbsp;name,&nbsp;String&nbsp;param)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;Expression.like(name,&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">&nbsp;param&nbsp;</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">%</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br>}</span> </div>
<p><font size=2>我们可以很容易的在 Backing Bean 上通过 Service 层拿到这个查询结果的 List 和 Count 值，相关的getDatePage方法如下。<br>如果你不了解这个 getDataPage 方法的含义，请仔细阅读&#8220;在JSF中实现分页(二)&#8221;一文，并仔细思考该方法的含义。</font> <font size=2></font></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">protected</span> <span style="COLOR: #000000">&nbsp;DataPage&nbsp;getDataPage(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;startRow,&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;pageSize)<br>{<br>&nbsp;List&nbsp;queryCustomerList&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;customerService.queryCustomer(customer,&nbsp;</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">.startRow,&nbsp;</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">.getPageSize());<br>&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;dataSetSize&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;customerService.countQueryCustomer(customer);<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;DataPage(dataSetSize,&nbsp;startRow,&nbsp;queryCustomerList);<br>}</span> </div>
<p><font size=2>在同一个 Backing Bean 中，我们放了一个存放查询条件的VO - Customer，并在页面中使用&lt;t:saveState&gt;保存其状态，使其查询条件不会随着翻页而丢失。</font> </p>
<p><font size=2>&lt;t:saveState value="#{customerListBean.customer}"/&gt;</font> </p>
<p><font size=2>在页面中，我们把所有的查询条件都放到该 VO 中，在 getDataPage 方法中就会在适当的时候调用新的查询条件来查询新的数据，这一切都不需要我们动手的。</font> </p>
<p><font size=2>在 Backing Bean 中有这样的一个方法：</font> <font size=2></font></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;String&nbsp;query()<br>{<br>&nbsp;dataModel.setWrappedData(getDataPage(</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">,&nbsp;getPageSize()));<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">success</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;<br>}</span> </div>
<p><font size=2>只是把数据清空，并强制 PagedListDataModel 读取数据，然后我们返回相同的页面，这个时候，系统按照用户输入的查询条件拿到查询结果以后，返回同一页面，该页面中的使用 LocalDataModel 的那个 DataTable 就会把结果显示出来。</font> </p>
<p><font size=2>请注意，这里 LocalDataModel 和 Customer 都在同一个 Backing Bean 中。</font> </p>
<p><font size=2>是不是觉得很简单呢，一切都归功于 getDataPage 这个方法，我们几乎不需要做什么额外的操作就可以达到我们的目的。</font> </p>
<p><font size=2>因为该方法在一个商业项目中使用，代码不便公布，只能把里面的一些代码抽取出来，零零碎碎的拿给大家看，如果大家有什么疑问的话，可以在论坛上提出来，我会尽力解答的，另外这个方法也会在空闲的时候 Merge 到 MyPSP 项目中去。</font> </p>
<img src ="http://www.blogjava.net/linden/aggbug/123663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-12 17:01 <a href="http://www.blogjava.net/linden/articles/123663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF中实现分页（二）</title><link>http://www.blogjava.net/linden/articles/123658.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Tue, 12 Jun 2007 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/123658.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/123658.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/123658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/123658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/123658.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 前面一篇直接使用了Myfaces中的两个Component完成了一个简单的分页，这里将会介绍一种On-demand loading的方法来进行分页，仅仅在需要数据的时候加载。 &nbsp;&nbsp;&nbsp;&nbsp; 先来说一些题外话，为了实现这种方式的分页，公司里大约5-6个人做了半个多月的工作，扩展了dataTable，修改了dataScrollor，以及各种其他的方...&nbsp;&nbsp;<a href='http://www.blogjava.net/linden/articles/123658.html'>阅读全文</a><img src ="http://www.blogjava.net/linden/aggbug/123658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-12 16:54 <a href="http://www.blogjava.net/linden/articles/123658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF中实现分页（一） </title><link>http://www.blogjava.net/linden/articles/123656.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Tue, 12 Jun 2007 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/123656.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/123656.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/123656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/123656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/123656.html</trackback:ping><description><![CDATA[&nbsp;<span>对于大多数<span>Web</span>应用，分页都是必不可少的功能，当然在<span>JSF</span>中也一样，我在这里用两篇文章介绍两种方法来展示一下，如何在<span>JSF</span>中实现分页。本文假定你已经对<span>JSF</span>有了一些简单的了解，懂得基本配置和使用，并建立起一个<span>blank</span>项目。</span>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>Myfaces</span><span>是<span>Apache</span>基金会中的一个一级项目，除了实现<span>JSF</span>标准外，做了很多的扩展工作，在<span>Myfaces</span>包中有一个扩展包<span>Tomahawk</span>，我们将主要使用其中的两个<span>Component</span>实现分页：一个是<span>&lt;t:dataTable&gt;</span>，另一个是<span>&lt;t:dataScroller&gt;</span>，在第一篇里面，我们简易的组合这两个<span>Component</span>来实现一种简单，但并不高效的分页。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>下面的例子来自于<span>Myfaces-Sample</span>，我省去了其中和分页逻辑无关的内容，详细的例子可以下载<span>Myfaces-Sample</span>包或者访问<span><a href="http://www.irian.at/myfaces/home.jsf"><span>http://www.irian.at/myfaces/home.jsf</span></a> </span>查看。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>第一部分：<span>dataTable<br><br></span></span></p>
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span>&lt;</span><span>t:dataTable&nbsp;</span><span>id</span><span>="data"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var</span><span>="car"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span>="#{pagedSort.cars}"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows</span><span>="10"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span>&lt;/</span><span>t:dataTable</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>
<p align=left><span>在这一部分中，<span>dataTable</span>绑定了一个<span>backing bean - pagedSort</span>中的<span>cars</span>属性，我们可以在这个属性中加入数据访问逻辑，从数据库或者其他来源取得用于显示的数据。比如我们可以通过<span>Hibernate</span>获取一个<span>List</span>，其中包含有我们用于显示的<span>POJOs</span>。</span></p>
<p align=left><span>注意，<span>dataTable</span>中的<span>rows</span>属性指的是每页的行数，是必须指定的，否则是无法进行分页的，如果在项目中会使用固定行数的分页，建议把这个值写在<span>BaseBackingBean</span>中，并暴露一个<span>property</span>，供页面调用，所以每次在页面中就可以这么写<span>#{backingBean.pageSize}</span>。<br><span><br></p>
<p align=left><span>第二部分：<span>dataScroller<br><br></p>
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:dataScroller&nbsp;</span><span>id</span><span>="scroll_1"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for</span><span>="data"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastStep</span><span>="10"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paginator</span><span>="true"</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paginatorMaxPages</span><span>="9"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>f:facet&nbsp;</span><span>name</span><span>="first"</span>&nbsp;<span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:graphicImage&nbsp;</span><span>url</span><span>="images/arrow-first.gif"</span><span>&nbsp;border</span><span>="1"</span>&nbsp;<span>/&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>f:facet</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>f:facet&nbsp;</span><span>name</span><span>="last"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:graphicImage&nbsp;</span><span>url</span><span>="images/arrow-last.gif"</span><span>&nbsp;border</span><span>="1"</span>&nbsp;<span>/&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>f:facet</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>f:facet&nbsp;</span><span>name</span><span>="previous"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:graphicImage&nbsp;</span><span>url</span><span>="images/arrow-previous.gif"</span><span>&nbsp;border</span><span>="1"</span>&nbsp;<span>/&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>f:facet</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>f:facet&nbsp;</span><span>name</span><span>="next"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:graphicImage&nbsp;</span><span>url</span><span>="images/arrow-next.gif"</span><span>&nbsp;border</span><span>="1"</span>&nbsp;<span>/&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>f:facet</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>f:facet&nbsp;</span><span>name</span><span>="fastforward"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:graphicImage&nbsp;</span><span>url</span><span>="images/arrow-ff.gif"</span><span>&nbsp;border</span><span>="1"</span>&nbsp;<span>/&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>f:facet</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>f:facet&nbsp;</span><span>name</span><span>="fastrewind"</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>t:graphicImage&nbsp;</span><span>url</span><span>="images/arrow-fr.gif"</span><span>&nbsp;border</span><span>="1"</span>&nbsp;<span>/&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>f:facet</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>t:dataScroller</span><span>&gt;</span><span><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p align=left><br></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>这里定义了我们用于分页的<span>&lt;t:dataScroller&gt;</span>，最主要的是配置该分页<span>Component</span>针对哪个<span>dataTable</span>进行分页的&#8220;<span>for</span>&#8221;属性，该属性与<span>dataTable</span>绑定，并对其进行分页，在这里，绑定了第一部分中的<span>id="data"</span></span><span>的</span><span>dataTable</span><span>，下面有很多的</span><span>&lt;t:facet&gt;</span><span>是指定分页的导航样式的，这里使用了图片作为导航，可以把他们改成文字形式的导航。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>当然这只是最简单，也是一种不推荐的分页方式，因为在每次进行分页的时候，将会从数据库中取回所有的记录放入</span><span>List</span><span>中，然后，</span><span>dataScroller</span><span>在对这个</span><span>List</span><span>进行分页，如果在数据量很大的情况下，这种方式显然是不符合要求的，假设每条记录占用</span><span>1k</span><span>内存，数据库中有</span><span>100</span><span>万条记录，每次要把这个</span><span>List</span><span>全部读取出来将占用</span><span>1G</span><span>内存。我们需要一种</span><span>Load on demand</span><span>方式的读取，也就是只在需要查看某页的时候读取该页的数据。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>另外一方面，</span><span>JSF</span><span>的生命周期中有多个阶段会调用到</span><span>#{pagedSort.cars}</span><span>中对应的方法，如果在这里调用了数据访问逻辑，就会在只显示一次页面的情况下进行多次数据库操作，也是相当的耗费资源的。</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>所以我们需要有更好的分页方式去解决以上问题，下一篇我将介绍另一种方法以改善这些问题。</span></span></span></span></span></p>
<img src ="http://www.blogjava.net/linden/aggbug/123656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-12 16:51 <a href="http://www.blogjava.net/linden/articles/123656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF入门与提高目录</title><link>http://www.blogjava.net/linden/articles/122644.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Thu, 07 Jun 2007 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/122644.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/122644.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/122644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/122644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/122644.html</trackback:ping><description><![CDATA[<p>如果您是从使用的角度来看JSF，则您不用理会HTTP、数据转换等细节，JSF将细节都隐藏起来了，无论您是网页设计人员或是应用程序设计人员，都可以使用自己熟悉的方式来看JSF。</p>
<p>入门<br>藉由以下的几个主题，可以大致了解JSF的轮廓与特性，我们来看看网页设计人员与应用程序设计人员各负责什么。<br>o <a href="http://www.blogjava.net/linden/articles/122651.html">简介JSF<br></a><a href="http://www.blogjava.net/linden/articles/122652.html">o 第一个JSF程序<br></a><a href="http://www.blogjava.net/linden/articles/122654.html">o 简单的导航 Navigation</a><br><a href="http://www.blogjava.net/linden/articles/122653.html">o 导航规则设置</a><br><a href="http://www.blogjava.net/linden/articles/122655.html">o JSF Expression Language</a><br><a href="http://www.blogjava.net/linden/articles/122657.html">o 国际化讯息 </a><br>Managed Beans<br>JSF 使用 Bean 来达到逻辑层与表现层分离的目的，Bean 的管理集中在组态档案中，您只要修改组态档案，就可以修改 Bean 之间的相依关系。<br><a href="http://www.blogjava.net/linden/articles/122658.html">o Backing Beans</a><br><a href="http://www.blogjava.net/linden/articles/122659.html">o Beans 的组态与设定<br></a><a href="http://www.blogjava.net/linden/articles/122660.html">o Beans 上的 List, Map </a><br>数据转换与验证<br>转换器（Converter）协助模型与视图之间的数据转换，验证器（Validator）协助进行语意检验（Semantic Validation）。<br><a href="http://www.blogjava.net/linden/articles/122661.html">o 标准转换器<br></a><a href="http://www.blogjava.net/linden/articles/122664.html">o 自订转换器<br></a><a href="http://www.blogjava.net/linden/articles/122663.html">o 标准验证器<br></a><a href="http://www.blogjava.net/linden/articles/122664.html">o 自订验证器</a><br><a href="http://www.blogjava.net/linden/articles/122666.html">o 错误讯息处理</a><br><a href="http://www.blogjava.net/linden/articles/122667.html">o 自订转换, 验证标签<br></a>事件处理<br>JSF的事件模型提供一个近似的桌面GUI事件模式，让熟悉GUI设计的人员也能快速上手Web程序设计。<br><a href="http://www.blogjava.net/linden/articles/122668.html">o 动作事件</a><br><a href="http://www.blogjava.net/linden/articles/122669.html">o 实时事件</a><br><a href="http://www.blogjava.net/linden/articles/122670.html">o 值变事件</a><br><a href="http://www.blogjava.net/linden/articles/122671.html">o Phase 事件<br></a>　JSF 标签</p>
<p>　　网页设计人员要作的就是了解JSF的标签的使用方式，这就像是学习进阶的HTML标签，另一件事就是与程序设计人员沟通好各个Bean的名称绑定。</p>
<p>标签入门<br>卷标的相关属性查询，您可以参考 Tag Library Documentation，这边的介绍只是一些简单的入门实例。<br><a href="http://www.blogjava.net/linden/articles/122674.html">o 简介JSF标准标签<br>o 输出类标签<br>o 输入类标签<br>o 命令类标签<br>o 选择类标签 一<br>o 选择类标签 二<br>o 其它标签</a><br><br>表格处理<br>对于必须使用表格方式呈现的数据，JSF 的 &lt;h:dataTable&gt; 卷标协助您进行动态表格数据的输出。<br><a href="http://www.blogjava.net/linden/articles/122676.html">o 简单的表格<br>o 表头, 表尾<br>o TableModel 类别</a><br>　<br>自订组件</p>
<p>　　JSF 让您可以自订组件，每个组件都是可替换的，这使得组件在搭配时更有弹性，但相对的却使开发组件的过程复杂的多，这边对自订JSF 组件只是个入门砖，更多有关自订组件的细节可得要专书来说明。</p>
<p>JSF 生命周期与组件概述<br>要开发 JSF 组件，您需要更深入了解 JSF 的一些处理细节，包括了 JSF 生命周期以及 JSF 框架。<br><a href="http://www.blogjava.net/linden/articles/122678.html">o JSF 生命周期<br>o 概述自订组件</a><br>简单实例<br>在不考虑组件有子组件的情况下，这边以实际的一个例子来说明开发组件的过程，至于考虑子组件的情况请参考专书介绍。<br><a href="http://www.blogjava.net/linden/articles/122679.html">o 编码, 译码<br>o 组件卷标<br>o 使用自订组件<br>o 自订 Renderer</a></p>
<p><a href="http://www.djyeh.com/post/789.html"></a>&nbsp;</p>
<img src ="http://www.blogjava.net/linden/aggbug/122644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-07 17:06 <a href="http://www.blogjava.net/linden/articles/122644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX+JSF组件实现高性能的文件上载</title><link>http://www.blogjava.net/linden/articles/122549.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Thu, 07 Jun 2007 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/122549.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/122549.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/122549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/122549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/122549.html</trackback:ping><description><![CDATA[<strong>一、 引言<br><br></strong>　　基于浏览器的文件上传，特别是对于通过＜input type="file"＞标签包含到Web页面来实现上传的情况，还存在较严重的性能问题。我们知道，超过10MB的上传文件经常导致一种非常痛苦的用户体验。一旦用户提交了文件，在浏览器把文件上传到服务器的过程中，界面看上去似乎处于静止状态。由于这一切发生在后台，所以许多没有耐心的用户开始认为服务器"挂"了，因而再次提交文件，这当然使得情况变得更糟糕。<br><br>　　为了尽可能使得文件上传感觉更友好些，一旦用户提交文件，许多站点将显示一个中间过程动画（例如一旋转图标）。尽管这一技术在上传提交到服务器时起一些作用，但它还是提供了太少的有关文件上传状态的信息。解决这个问题的另外一种尝试是实现一个applet——它通过FTP把文件上传到服务器。这一方案的缺点是：限制了你的用户，必须要有一个支持Java的浏览器。<br><br>　　在本文中，我们将实现一个具有AJAX能力的组件——它不仅实现把文件上传到服务器，而且"实时地"监视文件上传的实际过程。这个组件工作的四个阶段显示于下面的图1，2，3和4中：<br><br>
<table width="90%" align=center border=0>
    <tbody>
        <tr>
            <td>
            <div align=center><img src="http://dev.yesky.com/imagelist/06/03/b4b3ew7lf623.jpg" border=0><br>图1.阶段1:选择文件上传<br><img src="http://dev.yesky.com/imagelist/06/03/4664p76dh8a0.jpg" border=0><br>图2.阶段2:上传该文件到服务器<br><img src="http://dev.yesky.com/imagelist/06/03/481i3j42vlh1.jpg" border=0><br>图3.阶段3:上传完成<br><img src="http://dev.yesky.com/imagelist/06/03/smrjvdmq7hk0.jpg" border=0><br>图4.阶段4:文件上传摘要</div>
            </td>
        </tr>
    </tbody>
</table>
<br>　　<strong>二、 实现该组件</strong><br><br>　　首先，我们分析创建多部分过滤的过程，它将允许我们处理并且监视文件上传。然后，我们将继续实现JavaServer Faces（JSF）组件-它将提供给用户连续的回馈，以支持AJAX的进度条方式。<br><br>　　(一) 多部分过滤：UploadMultipartFilter<br><br>　　多部分过滤的任务是拦截到来的文件上传并且把该文件写到一个服务器上的临时目录中。同时，它还将监视接收的字节数并且确定已经上载该文件的程度。幸运的是，现在有一个优秀的Jakarta-Commons开源库可以利用（FileUpload），可以由它来负责分析一个HTTP多部分请求并且把文件上传到服务器。我们要做的是扩展该库并且加入我们需要的"钩子"来监视已经处理了多少字节。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public class UploadMultipartFilter implements Filter{ <br>　public void doFilter(ServletRequest request，ServletResponse response，FilterChain chain) <br>　throws IOException， ServletException {<br>　　HttpServletRequest hRequest = (HttpServletRequest)request;<br>　　//检查是否我们在处理一个多部分请求<br>　　String contentHeader = hRequest.getHeader("content-type");<br>　　boolean isMultipart = ( contentHeader != null &amp;&amp; contentHeader.indexOf("multipart/form-data") != -1); <br>　　if(isMultipart == false){<br>　　　chain.doFilter(request，response);<br>　　}else{<br>　　　UploadMultipartRequestWrapper wrapper = new UploadMultipartRequestWrapper(hRequest);<br>　　　chain.doFilter(wrapper，response);<br>　　}<br>　　...<br>　} </td>
        </tr>
    </tbody>
</table>
<br>　　正如你所见，UploadMultipartFilter类简单地检查了当前的请求是否是一个多部分请求。如果该请求不包含文件上传，该请求将被传递到请求链中的下一个过滤，而不进行任何另外的处理。否则，该请求将被包装在一个UploadMultipartRequestWrapper中。<br><br>　　(二) UploadMultipartRequestWrapper类<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public class UploadMultipartRequestWrapper <br>extends HttpServletRequestWrapper{<br>　private Map＜String，String＞ formParameters;<br>　private Map＜String，FileItem＞ fileParameters;<br>　public UploadMultipartRequestWrapper(HttpServletRequest request) {<br>　　super(request);<br>　　try{<br>　　　ServletFileUpload upload = new ServletFileUpload();<br>　　　upload.setFileItemFactory(new ProgressMonitorFileItemFactory(request));<br>　　　List fileItems = upload.parseRequest(request);<br>　　　formParameters = new HashMap＜String，String＞();<br>　　　fileParameters = new HashMap＜String，FileItem＞();<br>　　　for(int i=0;i＜fileItems.size();i++){<br>　　　　FileItem item = (FileItem)fileItems.get(i);<br>　　　　if(item.isFormField() == true){<br>　　　　　formParameters.put(item.getFieldName()，item.getString());<br>　　　　}else{<br>　　　　　fileParameters.put(item.getFieldName()，item);<br>　　　　　request.setAttribute(item.getFieldName()，item);<br>　　　　}<br>　　　}<br>　　　}catch(FileUploadException fe){<br>　　　　//请求时间超过-用户可能已经转到另一个页面。<br>　　　　//作一些记录<br>　　　　//...<br>　　　}<br>　　　...</td>
        </tr>
    </tbody>
</table>
<br>　　在UploadMultipartRequestWrapper类中，我们将初始化ServletFileUpload类，它负责分析我们的请求并且把文件写到服务器上的缺省临时目录。ServletFileUpload实例针对在该请求中遇到的每一个字段创建一个FileItem实例（它们包含文件上传和正常的表单元素）。之后，一个FileItem实例用于检索一个提交字段的属性，或者，在文件上传的情况下，检索一个到底层的临时文件的InputStream。总之，UploadMultipartRequestWrapper负责分析该文件并且设置任何FileItem-它在该请求中把文件上传描述为属性。然后，这些属性由JSF组件所进一步收集，而正常表单字段的行为保持不变。<br><br>　　默认情况下，通用FileUpload库将使用DiskFileItems类的实例来处理文件上传。尽管DiskFileItem在处理整个临时文件业务时是很有用的，但在准确监视该文件已经处理程度方面存在很少支持。自版本1.1以来，通用FileUpload库能够使开发者指定用于创建FileItem的工厂。我们将使用ProgressMonitorFileItemFactory和ProgressMonitorFileItem类来重载缺省行为并监视文件上传过程。<br><br>　　(三) ProgressMonitorFileItemFactory类<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public class ProgressMonitorFileItemFactory extends DiskFileItemFactory {<br>　private File temporaryDirectory;<br>　private HttpServletRequest requestRef;<br>　private long requestLength;<br>　public ProgressMonitorFileItemFactory(HttpServletRequest request) {<br>　　super();<br>　　temporaryDirectory = (File)request.getSession().getServletContext().getAttribute("javax.servlet.context.tempdir");<br>　　requestRef = request;<br>　　String contentLength = request.getHeader("content-length");<br>　　if(contentLength != null){requestLength = Long.parseLong(contentLength.trim());}<br>　}<br>　public FileItem createItem(String fieldName， String contentType，boolean isFormField， String fileName) {<br>　　SessionUpdatingProgressObserver observer = null;<br>　　if(isFormField == false) //这必须是一文件上传.<br>　　　observer = new SessionUpdatingProgressObserver(fieldName，fileName);<br>　　　ProgressMonitorFileItem item = new ProgressMonitorFileItem(<br>　　　　　fieldName，contentType，isFormField，<br>　　　　　fileName，2048，temporaryDirectory，<br>　　　　　observer，requestLength);<br>　　　　return item;<br>　}<br>　...<br>　public class SessionUpdatingProgressObserver implements ProgressObserver {<br>　　private String fieldName;<br>　　private String fileName;<br>　　...<br>　　public void setProgress(double progress) {<br>　　　if(request != null){<br>　　　　request.getSession().setAttribute("FileUpload.Progress."+fieldName，progress);<br>　　　　request.getSession().setAttribute("FileUpload.FileName."+fieldName，fileName);<br>　　　}<br>　　}<br>　}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　ProgressMonitorFileItemFactory Content-Length头由浏览器设置并且假定它是被设置的上传文件的精确长度。这种确定文件长度的方法确实限制了你在每次请求中上传的文件-如果有多个文件在该请求中被编码的话，不过这个值是不精确的。这是由于，浏览器仅仅发送一个Content-Length头，而不考虑上传的文件数目。 <br><br>　　除了创建ProgressMonitorFileItem实例之外，ProgressMonitorFileItemFactory还注册了一个ProgressObserver实例，它将由ProgressMonitorFileItem来发送文件上传过程中的更新。我们所使用的ProgressObserver的实现（SessionUpdatingProgressObserver）针对被提交字段的id把进度百分数设置到用户的会话中。然后，这个值可以由JSF组件存取以便把更新发送给用户。<br>(四) ProgressMonitorFileItem类<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public class ProgressMonitorFileItem extends DiskFileItem {<br>　private ProgressObserver observer;<br>　private long passedInFileSize;<br>　...<br>　private boolean isFormField;<br>　...<br>　@Override<br>　public OutputStream getOutputStream() throws IOException {<br>　　OutputStream baseOutputStream = super.getOutputStream();<br>　　if(isFormField == false){<br>　　　return new BytesCountingOutputStream(baseOutputStream);<br>　　}else{return baseOutputStream;}<br>　}<br>　...<br>　private class BytesCountingOutputStream extends OutputStream{<br>　　private long previousProgressUpdate;<br>　　private OutputStream base;<br>　　public BytesCountingOutputStream(OutputStream ous){ base = ous; } <br>　　...<br>　　private void fireProgressEvent(int b){<br>　　　bytesRead += b;<br>　　　...<br>　　　double progress = (((double)(bytesRead)) / passedInFileSize);<br>　　　progress *= 100.0<br>　　　observer.setProgress(); <br>　　}<br>　}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　ProgressMonitorFileItem把DiskFileItem的缺省OutputStream包装到一个BytesCountingOutputStream中，这可以在每次读取一定数目的字节后更新相关的ProgressObserver。<br><br>　　(五) 支持AJAX的JavaServer Faces（JSF）上传组件<br><br>　　这个组件负责生成HTML文件上传标签，显示一个进度条以监视文件上传，并且生成一旦文件上传成功需要被显示的组件。使用JavaServer Faces实现这个组件的一个主要优点是，大多数复杂性被隐藏起来。开发人员只需要把组件标签添加到JSP，而后由组件负责所有的AJAX及相关的进度条监控细节问题。下面的JSP代码片断用于把上传组件添加到页面上。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>＜comp:fileUpload <br>　value="#{uploadPageBean.uploadedFile}"<br>　uploadIcon="images/upload.png"<br>　styleClass="progressBarDiv"<br>　progressBarStyleClass="progressBar"<br>　cellStyleClass="progressBarCell"<br>　activeStyleClass="progressBarActiveCell"＞<br>＜%--下面是一旦文件上传完成将成为可见的组件--%＞<br>＜h:panelGrid columns="2" cellpadding="2" cellspacing="0" width="100%"＞<br>＜f:facet name="header"＞<br>＜h:outputText styleClass="text"<br>value="文件上传成功." /＞<br>＜/f:facet＞<br>＜h:panelGroup style="text-align:left;display:block;width:100%;"＞<br>＜h:commandButton action="#{uploadPageBean.reset}"<br>image="images/reset.png"/＞<br>＜/h:panelGroup＞<br>＜h:panelGroup style="text-align:right;display:block;width:100%;"＞<br>＜h:commandButton action="#{uploadPageBean.nextPage}"<br>image="images/continue.png"/＞<br>＜/h:panelGroup＞<br>＜/h:panelGrid＞<br>＜/comp:fileUpload＞</td>
        </tr>
    </tbody>
</table>
<br>　　文件上传组件的value属性需要用一个拥有一个FileItem的属性绑定到一个bean上。组件只有在该文件被服务器成功收到时才显示。<br><br>　　<strong>三、 实现AJAX文件上传组件</strong><br><br>　　实质上，上载组件或者生成一个完整的自已，或者在一个AJAX请求的情况下，只生成部分XML以更新在页面上进度条的状态。为了防止JavaServer Faces生成完整的组件树（这会带来不必要的负荷），我们还需要实现一个PhaseListener（PagePhaseListener）以取消该faces的请求处理的其它部分-如果遇到一个AJAX请求的话。我在本文中略去了所有的关于标准配置（faces-config.xml和标签库）的讨论，因为它们相当直接且已经在以前讨论过；而且这一切都包含在随同本文的源码中，你可以详细分析。<br><br>　　(一) AJAX文件上传组件生成器<br><br>　　该组件和标签类的实现比较简单。大量的逻辑被包含到生成器中，具体地说，它负责以下：<br><br>　　&#183; 编码整个的上传组件（和完整的HTML文件上传标签）、文件被上传完成后要显示的组件，还有实现AJAX请求的客户端JavaScript代码。<br><br>　　&#183; 适当地处理部分AJAX请求并且发送回必要的XML。<br><br>　　&#183; 解码一个文件上传并且把它设置为一个FileItem实例。<br><br>　　(二) 编码整个上传组件<br><br>　　前面已经提及，文件上传组件由三个阶段组成。在该组件的整个编码期间，我们将详细分析这三个阶段的编码。注意，在页面上的该组件的可视化（使用CSS显示）属性将由AJAX JavaScript来控制。<br><br>　　(三) 阶段一<br><br>　　图5显示了该上传组件的第一个阶段。<br><br>
<table width="90%" align=center border=0>
    <tbody>
        <tr>
            <td>
            <div align=center><img src="http://dev.yesky.com/imagelist/06/03/8z9l4zjc5hk6.jpg" border=0><br>图5.选择文件上传</div>
            </td>
        </tr>
    </tbody>
</table>
<br><br>　　在第一阶段中，我们需要生成HTML文件Upload标签和点击Upload按钮时相应的执行代码。一旦用户点击了Upload按钮，表单将被一个IFRAME（为防止页面阻塞）提交并初始化第二个阶段。下面是生成代码的一部分：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>//文件上传组件<br>writer.startElement("input"， component);<br>writer.writeAttribute("type"， "file"， null);<br>writer.writeAttribute("name"， component.getClientId(context)， "id");<br>writer.writeAttribute("id"， component.getClientId(context)，"id");<br>if(input.getValue() != null){<br>　//如果可用，则生成该文件名.<br>　FileItem fileData = (FileItem)input.getValue();<br>　writer.writeAttribute("value"， fileData.getName()， fileData.getName());<br>}<br>writer.endElement("input");<br>String iconURL = input.getUploadIcon();<br>//生成图像，并把JavaScript事件依附到其上.<br>writer.startElement("div"， component);<br>writer.writeAttribute("style"，"display:block;width:100%;text-align:center;"， "style");<br>writer.startElement("img"， component);<br>writer.writeAttribute("src"，iconURL，"src");<br>writer.writeAttribute("type"，"image"，"type");<br>writer.writeAttribute("style"，"cursor:hand;cursor:pointer;"，"style");<br>UIForm form = FacesUtils.getForm(context，component);<br>if(form != null) {<br>　String getFormJS = "document.getElementById('" + form.getClientId(context) + "')";<br>　String jsFriendlyClientID = input.getClientId(context).replace(":"，"_");<br>　//设置表单的编码为multipart以用于文件上传，并且通过一个IFRAME<br>　//来提交它的内容。该组件的第二个阶段也在500毫秒后被初始化.<br>　writer.writeAttribute("onclick"，getFormJS + ".encoding='multipart/form-data';" +<br>getFormJS + ".target='" + iframeName + "';" + getFormJS + ".submit();" +<br>getFormJS + ".encoding='application/x-www-form-urlencoded';" +<br>getFormJS + ".target='_self';" +<br>"setTimeout('refreshProgress" + jsFriendlyClientID + "();'，500);"，null);<br>}<br>...<br>writer.endElement("img");<br>//现在实现我们将要把该文件/表单提交到的IFRAME.<br>writer.startElement("iframe"， component);<br>writer.writeAttribute("id"， iframeName， null);<br>writer.writeAttribute("name"，iframeName，null);<br>writer.writeAttribute("style"，"display:none;"，null);<br>writer.endElement("iframe");<br>writer.endElement("div");<br>writer.endElement("div"); //阶段1结束</td>
        </tr>
    </tbody>
</table>
<br>　　(四) 阶段二<br><br>　　第二阶段是显示当前百分比的进度条和标签，如图6所示。该进度条是作为一个具有100个内嵌span标签的div标签实现的。这些将由AJAX JavaScript根据来自于服务器的响应进行设置。<br><br>
<table width="90%" align=center border=0>
    <tbody>
        <tr>
            <td>
            <div align=center><img src="http://dev.yesky.com/imagelist/06/03/lqsgq122n83c.jpg" border=0><br>图6.上传文件到服务器</div>
            </td>
        </tr>
    </tbody>
</table>
<br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>writer.startElement("div"，component);<br>writer.writeAttribute("id"， input.getClientId(context) + "_stage2"， "id");<br>...<br>writer.writeAttribute("style"，"display:none"， "style");<br>String progressBarID = component.getClientId(context) + "_progressBar";<br>String progressBarLabelID = component.getClientId(context) + "_progressBarlabel";<br>writer.startElement("div"， component);<br>writer.writeAttribute("id"，progressBarID，"id");<br>String progressBarStyleClass = input.getProgressBarStyleClass();<br>if(progressBarStyleClass != null) <br>writer.writeAttribute("class"，progressBarStyleClass，"class");<br>for(int i=0;i＜100;i++){<br>　writer.write("＜span＞ ＜/span＞");<br>}<br>writer.endElement("div");<br>writer.startElement("div"，component);<br>writer.writeAttribute("id"，progressBarLabelID，"id");<br>...<br>writer.endElement("div");<br>writer.endElement("div"); //阶段2结束</td>
        </tr>
    </tbody>
</table>
<br>　　(五) 阶段三<br><br>　　最后，作为阶段三，一旦文件成功上传，需要被显示的组件即被生成，见图7。这些是在生成器的encodeChildren方法中实现的。<br><br>
<table width="90%" align=center border=0>
    <tbody>
        <tr>
            <td>
            <div align=center><img src="http://dev.yesky.com/imagelist/06/03/6n38g8m6gup3.jpg" border=0><br>图7.上传完成</div>
            </td>
        </tr>
    </tbody>
</table>
<br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public void encodeChildren(FacesContext context，<br>UIComponent component) throws IOException {<br>　ResponseWriter writer = context.getResponseWriter();<br>　UIFileUpload input = (UIFileUpload)component;<br>　//一旦文件上传成功，处理将被显示的子结点<br>　writer.startElement("div"， component);<br>　writer.writeAttribute("id"， input.getClientId(context) + "_stage3"， "id"); //阶段3.<br>　if(input.getValue() == null){<br>　　writer.writeAttribute("style"，"display:none;"，null); <br>　}else{<br>　　writer.writeAttribute("style"，"display:block"，null);<br>　}<br>　List＜UIComponent＞ children = input.getChildren();<br>　for(UIComponent child : children){<br>　　FacesUtils.encodeRecursive(context，child);<br>　}<br>　writer.endElement("div"); //阶段3结束<br>}</td>
        </tr>
    </tbody>
</table>
<strong>四、处理AJAX请求<br><br></strong>　　AJAX请求的生成是在这个组件的解码方法中处理的。我们需要检查这是否是一个实际的AJAX请求（为了区别于正常的编译行为），然后基于由ProgressMonitorFileItemFactory类的SessionUpdatingProgressObserver实例设置在会话中的值把一个XML响应发送回客户端。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>public void decode(FacesContext context， UIComponent component) {<br>　UIFileUpload input = (UIFileUpload) component;<br>　//检查是否这是一个上传进度请求，或是一个实际的上传请求.<br>　ExternalContext extContext = context.getExternalContext();<br>　Map parameterMap = extContext.getRequestParameterMap();<br>　String clientId = input.getClientId(context);<br>　Map requestMap = extContext.getRequestParameterMap();<br>　if(requestMap.get(clientId) == null){<br>　　return;//什么也不做，返回<br>　}<br>　if(parameterMap.containsKey(PROGRESS_REQUEST_PARAM_NAME)){<br>　　//这是一个在该文件请求中的得到进度信息的请求.<br>　　//得到该进度信息并把它生成为XML<br>　　HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();<br>　　//设置响应的头信息<br>　　response.setContentType("text/xml");<br>　　response.setHeader("Cache-Control"， "no-cache");<br>　　try {<br>　　　ResponseWriter writer = FacesUtils.setupResponseWriter(context);<br>　　　writer.startElement("progress"， input);<br>　　　writer.startElement("percentage"， input);<br>　　　//从会话中获得当前进度百分数(由过滤器所设置).<br>　　　Double progressCount = (Double)extContext.getSessionMap().<br>　　　get("FileUpload.Progress." +input.getClientId(context)); <br>　　　if(progressCount != null){<br>　　　　writer.writeText(progressCount， null);<br>　　　}else{<br>　　　　writer.writeText("1"， null);//我们还没有收到上传<br>　　　}<br>　　　writer.endElement("percentage");<br>　　　writer.startElement("clientId"， input);<br>　　　writer.writeText(input.getClientId(context)， null);<br>　　　writer.endElement("clientId");<br>　　　writer.endElement("progress");<br>　　} catch(Exception e){<br>　　　//做一些错误记录...<br>　　}<br>　　}else{<br>　　　//正常的译码请求.<br>　　...</td>
        </tr>
    </tbody>
</table>
<br>　　<strong>五、 正常的译码行为</strong><br><br>　　在正常的编译期间，文件上传生成器从请求属性中检索FileItem，正是在此处它被过滤器所设置，并且更新该组件的值绑定。然后，该会话中的进度被更新到100％，这样在页面上的JavaScript就可以把组件送入第3个阶段。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>//正常的译码请求.<br>if(requestMap.get(clientId).toString().equals("file")){<br>try{<br>　HttpServletRequest request = (HttpServletRequest)extContext.getRequest();<br>　FileItem fileData = (FileItem)request.getAttribute(clientId);<br>　if(fileData != null) input.setSubmittedValue(fileData);<br>　//现在我们需要清除与该项相关的任何进度<br>　extContext.getSessionMap().put("FileUpload.Progress." + input.getClientId(context)，new Double(100));<br>}catch(Exception e){<br>　throw new RuntimeException("不能处理文件上传" +" - 请配置过滤器."，e); <br>}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　客户端JavaScript负责向服务器发出进度请求并通过不同阶段来移动组件。为了简化处理所有的浏览器特定的XMLHttpRequest对象的问题，我选用了Matt Krause提供的AjaxRequest.js库。该库最大限度地减少我们需要编写的JavaScript代码的数量，同时可以使这个组件正常工作。也许把这部分JavaScript代码打包为该组件的一部分，然后从PhaseListener生成它更好一些，但是，我已经通过定义一个到JSP页面上的JavaScript库的链接来尽力使得它简单。<br><br>　　组件中的getProgressBarJavaScript方法被调用以生成JavaScript。使JavaScript正常工作通常是实现AJAX组件最困难的部分；不过我想，下面的代码已经非常清晰易于理解了。尽管在我的示例中JavaScript是嵌入到Java代码中的，但是把它放到一个外部独立的文件中也许更好一些。在本文中，我只是想使问题更为简单些且只关心本文的主题。下面是一个将由组件生成的JavaScript的示例。其中假定，fileUpload1是被赋值到该文件组件的客户端JSF Id，而uploadForm是HTML表单的Id。<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>function refreshProgress(){ <br>　// 假定我们正在进入到阶段2.<br>　document.getElementById('fileUpload1_stage1').style.display = 'none';<br>　document.getElementById('fileUpload1_stage2').style.display = '';<br>　document.getElementById('fileUpload1_stage3').style.display = 'none';<br>　//创建AJAX寄送<br>　AjaxRequest.post( <br>　{<br>　　//指定正确的参数，以便<br>　　//该组件在服务器端被正确处理 <br>　　'parameters':{ 'uploadForm':'uploadForm'，<br>　　'fileUpload1':'fileUpload1'，<br>　　'jsf.component.UIFileUpload':'1'，<br>　　'ajax.abortPhase':'4' } //Abort at Phase 4.<br>　　//指定成功处理相应的回调方法.<br>　　，'onSuccess':function(req) { <br>　　var xml = req.responseXML;<br>　　if( xml.getElementsByTagName('clientId').length == 0) { <br>　　　setTimeout('refreshProgress()'，200); return;<br>　　} <br>　　var clientId = xml.getElementsByTagName('clientId');<br>　　clientId = clientId[0].firstChild.nodeValue + '_progressBar';<br>　　//从XML获取百分比<br>　　var percentage = xml.getElementsByTagName('percentage')[0].firstChild.nodeValue;<br>　　var innerSpans = document.getElementById(clientId).getElementsByTagName('span');<br>　　document.getElementById(clientId + 'label').innerHTML = Math.round(percentage) + '%';<br>　　//基于当前进度，设置这些span的式样类。<br>　　for(var i=0;i＜innerSpans.length;i++){<br>　　　if(i ＜ percentage){<br>　　　　innerSpans[i].className = 'active';<br>　　　}else{<br>　　　　innerSpans[i].className = 'passive'; <br>　　　}<br>　　}<br>　　//如果进度不是100，我们需要继续查询服务器以实现更新.<br>　　if(percentage != 100){ <br>　　　setTimeout('refreshProgress()'，400);<br>　　} else { <br>　　　//文件上传已经完成，我们现在需要把该组件送入到第3个阶段.<br>　　　document.getElementById('fileUpload1_stage1').style.display = 'none';<br>　　　document.getElementById('fileUpload1_stage2').style.display = 'none'; <br>　　　document.getElementById('fileUpload1_stage3').style.display = '';<br>　　} <br>　}<br>});<br>}<br>return builder.toString();</td>
        </tr>
    </tbody>
</table>
<br>　　<strong>六、 结论</strong><br><br>　　我很希望，本文能够在有关如何使得文件上传更具有用户友好性，并且把AJAX和JavaServer Faces用于实现高级用户接口组件的可能性方面引发你的进一步思考。毫无疑问，本文中的方案比较冗长并且有可能得到进一步的改进。我希望你能详细地分析一下本文中所提供的完整的源代码来深入理解本文中所讨论的概念。<br>
<img src ="http://www.blogjava.net/linden/aggbug/122549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-07 11:48 <a href="http://www.blogjava.net/linden/articles/122549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf国际化</title><link>http://www.blogjava.net/linden/articles/122415.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Wed, 06 Jun 2007 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/122415.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/122415.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/122415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/122415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/122415.html</trackback:ping><description><![CDATA[JSF的国际化（Internnationalization）信息处理是基于Java对国际化的支援，您可以在一个信息资源档中统一管理信息资源，资源文件的名称是.properties，而內容是名称与值的配对，例如： &nbsp;<br><br>messages.properties &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;titleText=JSF &nbsp;Demo &nbsp;<br>&nbsp;hintText=Please &nbsp;input &nbsp;your &nbsp;name &nbsp;and &nbsp;password &nbsp;<br>&nbsp;nameText=name &nbsp;<br>&nbsp;passText=password &nbsp;<br>&nbsp;commandText=Submit &nbsp;<br><br>资源档名称由basename加上语言与地区来组成，例如： &nbsp;<br><br>basename.properties &nbsp; &nbsp;<br>basename_en.properties &nbsp; &nbsp;<br>basename_zh_TW.properties &nbsp; &nbsp;<br>&nbsp; &nbsp;<br><br>&nbsp; &nbsp; &nbsp; &nbsp;沒有指定语言与地区的basename是预设的资源档名称，JSF会根据浏览器送來的Accept-Language &nbsp;header中的內容来決定该使用哪一个资源档名称，例如： &nbsp;<br><br><br>Accept-Language: &nbsp;zh_TW, &nbsp;en-US, &nbsp;en &nbsp;<br><br><br>&nbsp; &nbsp; &nbsp; &nbsp;如果浏览器送来这些header，则预设会使用繁体中文，接著是美式英文，再来是英文语系，如果找不到对应的信息资源档，则会使用预设的信息资源档。 &nbsp;<br><br><br>&nbsp; &nbsp; &nbsp; &nbsp;由于信息资源档必須是ISO-8859-1编码，所以对于非西方语系的处理，必须先将之转换为Java &nbsp;Unicode &nbsp;Escape格式，例如您可以先在信息资源档中写下以下的內容： &nbsp;<br><br>messages_zh_TW.txt &nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;titleText=JSF示範 &nbsp;<br>&nbsp;hintText=請輸入名稱與密碼 &nbsp;<br>&nbsp;nameText=名稱 &nbsp;<br>&nbsp;passText=密碼 &nbsp;<br>&nbsp;commandText=送出 &nbsp;<br>&nbsp; &nbsp;<br><br><br>然后使用JDK的工具程式native2ascii来转换，例如： &nbsp;<br><br><br>native2ascii &nbsp;-encoding &nbsp;Big5 &nbsp;messages_zh_TW.txt &nbsp;messages_zh_TW.properties &nbsp;<br><br><br>转换后的內容会如下： &nbsp;<br><br>messages_zh_TW.properties &nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;titleText=JSF\u793a\u7bc4 &nbsp;<br>&nbsp;hintText=\u8acb\u8f38\u5165\u540d\u7a31\u8207\u5bc6\u78bc &nbsp;<br>&nbsp;nameText=\u540d\u7a31 &nbsp;<br>&nbsp;passText=\u5bc6\u78bc &nbsp;<br>&nbsp;commandText=\u9001\u51fa &nbsp;<br>&nbsp; &nbsp;<br>（所有资源文件放入你的JFS应用的WEB-INF/classes目录下） &nbsp;<br><br>接下来您可以使用&lt;f:loadBundle&gt;标记來指定载入信息资源，一个例子如下： &nbsp;<br><br>index.jsp &nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;&lt;%@ &nbsp;taglib &nbsp;uri="http://java.sun.com/jsf/core" &nbsp;prefix="f" &nbsp;%&gt; &nbsp;<br>&nbsp;&lt;%@ &nbsp;taglib &nbsp;uri="http://java.sun.com/jsf/html" &nbsp;prefix="h" &nbsp;%&gt; &nbsp;<br>&nbsp;&lt;%@page &nbsp;contentType="text/html;charset=UTF8"%&gt; &nbsp;<br><br>&nbsp;&lt;f:view&gt; &nbsp;<br>&nbsp;&lt;f:loadBundle &nbsp;basename="messages" &nbsp;var="msgs"/&gt; &nbsp;<br><br>&nbsp;&lt;html&gt; &nbsp;<br>&nbsp;&lt;head&gt; &nbsp;<br>&nbsp;&lt;title&gt;&lt;h:outputText &nbsp;value="#{msgs.titleText}"/&gt;&lt;/title&gt; &nbsp;<br>&nbsp;&lt;/head&gt; &nbsp;<br>&nbsp;&lt;body&gt; &nbsp;<br><br>&nbsp; &nbsp; &nbsp; &nbsp;&lt;h:form&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;h3&gt;&lt;h:outputText &nbsp;value="#{msgs.hintText}"/&gt;&lt;/h3&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;h:outputText &nbsp;value="#{msgs.nameText}"/&gt;: &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;h:inputText &nbsp;value="#{user.name}"/&gt;&lt;p&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;h:outputText &nbsp;value="#{msgs.passText}"/&gt;: &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;h:inputSecret &nbsp;value="#{user.password}"/&gt;&lt;p&gt; &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;h:commandButton &nbsp;value="#{msgs.commandText}" &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;actionListener="#{user.verify}" &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;action="#{user.outcome}"/&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp;&lt;/h:form&gt; &nbsp;<br><br>&nbsp;&lt;/body&gt; &nbsp;<br>&nbsp;&lt;/html&gt; &nbsp;<br><br>&nbsp;&lt;/f:view&gt; &nbsp;<br><br>&nbsp; &nbsp; &nbsp;如此一來，如果您的浏览器预设接受zh_TW语系的话，则页面上就可以显示中文，否則预设将以英文显示，也就是messages.properties的內容，为了能显示多国语系，我们设定网页编码为UTF8。 &nbsp;<br><br><br>&lt;f:view&gt;可以设定locale属性，直接指定所要使用的语系，例如： &nbsp;<br><br>&nbsp; &nbsp;<br>&nbsp;&lt;f:view &nbsp;locale="zh_TW"&gt; &nbsp;<br>&nbsp;&lt;f:loadBundle &nbsp;basename="messages" &nbsp;var="msgs"/&gt; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp;直接指定以上的話，则会使用繁体中文来显示，JSF会根据&lt;f:loadBundle&gt;的basename属性加上&lt;f:view&gt;的locale属性來決定要使用哪一个信息资源档，就上例而言，就是使用messages_zh_TW.properties，如果设定为以下的话，就会使用messages_en.properties： &nbsp;<br><br>&nbsp; &nbsp;<br>&nbsp;&lt;f:view &nbsp;locale="en"&gt; &nbsp;<br>&nbsp;&lt;f:loadBundle &nbsp;basename="messages" &nbsp;var="msgs"/&gt; &nbsp;<br>&nbsp; &nbsp;<br><br><br>您也可以在faces-config.xml中设定语系，例如： &nbsp;<br><br>&nbsp; &nbsp;<br>&nbsp;&lt;faces-config&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;&lt;application&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;local-config&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;default-locale&gt;en&lt;/default-locale&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;supported-locale&gt;zh_TW&lt;/supported-locale&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;/local-config&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp;&lt;/application&gt; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;..... &nbsp;<br>&nbsp;&lt;/faces-config&gt; &nbsp;<br>&nbsp; &nbsp;<br><br>&nbsp; &nbsp; &nbsp; &nbsp;在&lt;local-config&gt;一定有一个&lt;default-locale&gt;，而&lt;supported-locale&gt;可以有好几个，这告訴JSF您的应用程序支援哪些语系。 &nbsp;<br><br><br>&nbsp; &nbsp; &nbsp; &nbsp;当然，如果您可以提供一个选项让使用者选择自己的语系会是更好的方式，例如根据user这个Bean的locale属性来决定页面语系： &nbsp;<br><br>&nbsp; &nbsp;<br>&nbsp;&lt;f:view &nbsp;locale="#{user.locale}"&gt; &nbsp;<br>&nbsp;&lt;f:loadBundle &nbsp;basename="messages" &nbsp;var="msgs"/&gt; &nbsp; &nbsp;<br><br><br>在页面中设定一个表单，可以让使用者选择语系，例如设定单选钮： &nbsp;<br><br>&nbsp; &nbsp;<br>&nbsp;&lt;h:selectOneRadio &nbsp;value="#{user.locale}"&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;f:selectItem &nbsp;itemValue="zh_TW" &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;itemLabel="#{msgs.zh_TWText}"/&gt; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;f:selectItem &nbsp;itemValue="en" &nbsp; &nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;itemLabel="#{msgs.enText}"/&gt; &nbsp;<br>&nbsp;&lt;/h:selectOneRadio&gt;&nbsp;&nbsp;<br>
<img src ="http://www.blogjava.net/linden/aggbug/122415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-06 17:32 <a href="http://www.blogjava.net/linden/articles/122415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf简单例子 </title><link>http://www.blogjava.net/linden/articles/122411.html</link><dc:creator>Linden.zhang</dc:creator><author>Linden.zhang</author><pubDate>Wed, 06 Jun 2007 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/linden/articles/122411.html</guid><wfw:comment>http://www.blogjava.net/linden/comments/122411.html</wfw:comment><comments>http://www.blogjava.net/linden/articles/122411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linden/comments/commentRss/122411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linden/services/trackbacks/122411.html</trackback:ping><description><![CDATA[从下载的jsf-1_1_01中看到了四个例子，(下载地址： &nbsp;http://java.sun.com/j2ee/javaserverfaces/download.html)，自己jsf刚刚起步，应该认真研究。<br>&nbsp; &nbsp;首先下载jsf-1_1_01.zip，并解压。在解压的目录中找到samples目录，把其中的jsf-cardemo.war放到Tomcat &nbsp;5的webapps目录中，启动Tomcat &nbsp;5,在浏览器中输入：http://127.0.0.1:8080/jsf-guessNumber/。<br><br><a href="http://www.javatx.cn/upfiles/club/20071/2007013121090858142.jpg" target=_blank><img onerror="javascript:this.src='/club/GVimgs/imgErr.gif'" src="http://www.javatx.cn/upfiles/club/20071/2007013121090858142.jpg" border=0></a><br><br><br>&nbsp; &nbsp; &nbsp; &nbsp;<br>例子是简单了点！<br>greeting.jsp<br><br>
<table cellSpacing=1 cellPadding=4 width="98%" align=center bgColor=#bad5ef border=0>
    <tbody>
        <tr>
            <td bgColor=#e6eef7 height=25>程序代码：</td>
        </tr>
        <tr>
            <td bgColor=#ffffff>&lt;%@&nbsp;page&nbsp;contentType=<span>"text/html;charset=GBK"</span>%&gt;&nbsp;<br>&lt;HTML&gt;<br>&lt;HEAD&gt;&nbsp;&lt;title&gt;Hello&lt;/title&gt;&nbsp;&lt;/HEAD&gt;<br>&lt;%@&nbsp;taglib&nbsp;uri=<span>"http:<span>//java.sun.com/jsf/html"</span>&nbsp;prefix=<span>"h"</span>&nbsp;%&gt;</span><br>&lt;%@&nbsp;taglib&nbsp;uri=<span>"http:<span>//java.sun.com/jsf/core"</span>&nbsp;prefix=<span>"f"</span>&nbsp;%&gt;</span><br>&lt;body&nbsp;bgcolor=<span>"white"</span>&gt;<br>&lt;f:view&gt;<br>&lt;h:form&nbsp;id=<span>"helloForm"</span>&nbsp;&gt;<br>&lt;h2&gt;我的名字叫Duke.&nbsp;我想好了一个数字，范围是<br>&lt;h:outputText&nbsp;value=<span>"#{UserNumberBean.minimum}"</span>/&gt;&nbsp;到<br>&lt;h:outputText&nbsp;value=<span>"#{UserNumberBean.maximum}"</span>/&gt;.&nbsp;你能猜出它？<br>&lt;/h2&gt;&nbsp;&nbsp;&nbsp;<br><br><br>&lt;h:graphicImage&nbsp;id=<span>"waveImg"</span>&nbsp;url=<span>"/wave.med.gif"</span>&nbsp;/&gt;<br>&lt;h:inputText&nbsp;id=<span>"userNo"</span>&nbsp;value=<span>"#{UserNumberBean.userNumber}"</span>&nbsp;&nbsp;&nbsp;&nbsp;validator=<span>"#{UserNumberBean.validate}"</span>/&gt;&nbsp;<br>&lt;h:commandButton&nbsp;id=<span>"submit"</span>&nbsp;action=<span>"success"</span>&nbsp;value=<span>"Submit"</span>&nbsp;/&gt;<br>&lt;p&gt;<br>&lt;h:message&nbsp;style=<span>"color:&nbsp;red;&nbsp;font-family:&nbsp;'<span>new&nbsp;</span>Century&nbsp;Schoolbook',&nbsp;serif;&nbsp;font-style:&nbsp;oblique;&nbsp;text-decoration:&nbsp;overline"</span>&nbsp;id=<span>"errors1"</span>&nbsp;for=<span>"userNo"</span>/&gt;<br><br>&lt;/h:form&gt;<br>&lt;/f:view&gt;<br>&lt;/body&gt;<br>&lt;/HTML&gt;&nbsp;</td>
        </tr>
    </tbody>
</table>
<br><br>&nbsp; &nbsp; &nbsp; &nbsp;数字的最大值、最小值、猜对与否、及数字的验证都绑到了UserNumberBean上，没有使用标准验证器。且来看看这个应用中的主角： &nbsp;<br><br>
<table cellSpacing=1 cellPadding=4 width="98%" align=center bgColor=#bad5ef border=0>
    <tbody>
        <tr>
            <td bgColor=#e6eef7 height=25>程序代码：</td>
        </tr>
        <tr>
            <td bgColor=#ffffff><span>package</span>&nbsp;guessNumber;<br>import&nbsp;javax.faces.component.UIComponent;<br>import&nbsp;javax.faces.context.FacesContext;<br>import&nbsp;javax.faces.validator.LongRangeValidator;<br>import&nbsp;javax.faces.validator.Validator;<br>import&nbsp;javax.faces.validator.ValidatorException;<br>import&nbsp;java.util.Random;<br><span>public&nbsp;</span>class&nbsp;UserNumberBean&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;userNumber&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;random<span>int&nbsp;</span>=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;response&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>protected&nbsp;</span>String[]&nbsp;status&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;</span><span>int&nbsp;</span>minimum&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;</span>boolean&nbsp;minimumSet&nbsp;=&nbsp;<span>false</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;</span><span>int&nbsp;</span>maximum&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;</span>boolean&nbsp;maximumSet&nbsp;=&nbsp;<span>false</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>UserNumberBean()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Random&nbsp;randomGR&nbsp;=&nbsp;<span>new&nbsp;</span>Random();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;random<span>int&nbsp;</span>=&nbsp;<span>new&nbsp;</span>Integer(randomGR.nextInt(10));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span>"Duke's&nbsp;number:&nbsp;"</span>&nbsp;+&nbsp;randomInt);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>void&nbsp;setUserNumber(Integer&nbsp;user_number)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userNumber&nbsp;=&nbsp;user_number;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span>"Set&nbsp;userNumber&nbsp;"</span>&nbsp;+&nbsp;userNumber);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>Integer&nbsp;getUserNumber()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span>"get&nbsp;userNumber&nbsp;"</span>&nbsp;+&nbsp;userNumber);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>userNumber;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>String&nbsp;getResponse()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(userNumber&nbsp;!=&nbsp;<span>null</span>&nbsp;&amp;&amp;&nbsp;userNumber.compareTo(randomInt)&nbsp;==&nbsp;0)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span><span>"Yay!&nbsp;You&nbsp;got&nbsp;it!"</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>else</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span><span>"Sorry,&nbsp;"</span>&nbsp;+&nbsp;userNumber&nbsp;+&nbsp;<span>"&nbsp;is&nbsp;incorrect."</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>String[]&nbsp;getStatus()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>status;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>void&nbsp;setStatus(String[]&nbsp;newStatus)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;newStatus;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>int&nbsp;</span>getMaximum()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(<span>this</span>.maximum);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>void&nbsp;setMaximum(<span>int&nbsp;</span>maximum)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this</span>.maximum&nbsp;=&nbsp;maximum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this</span>.maximumSet&nbsp;=&nbsp;<span>true</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>int&nbsp;</span>getMinimum()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(<span>this</span>.minimum);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>void&nbsp;setMinimum(<span>int&nbsp;</span>minimum)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this</span>.minimum&nbsp;=&nbsp;minimum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this</span>.minimumSet&nbsp;=&nbsp;<span>true</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span>void&nbsp;validate(FacesContext&nbsp;context,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIComponent&nbsp;component,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value)&nbsp;throws&nbsp;ValidatorException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((context&nbsp;==&nbsp;<span>null</span>)&nbsp;||&nbsp;(component&nbsp;==&nbsp;<span>null</span>))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span><span>null</span>PointerException();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(value&nbsp;!=&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;</span>converted&nbsp;=&nbsp;intValue(value);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maximumSet&nbsp;&amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(converted&nbsp;&gt;&nbsp;maximum))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(minimumSet)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span>ValidatorException(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFactory.getMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(context,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validator.NOT_IN_RANGE_MESSAGE_ID,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Object[]{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Integer(minimum),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Integer(maximum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;}&nbsp;<span>else</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span>ValidatorException(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFactory.getMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(context,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LongRangeValidator.MAXIMUM_MESSAGE_ID,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Object[]{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Integer(maximum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;}<br>&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;if&nbsp;(minimumSet&nbsp;&amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(converted&nbsp;&lt;&nbsp;minimum))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(maximumSet)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span>ValidatorException(MessageFactory.getMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(context,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validator.NOT_IN_RANGE_MESSAGE_ID,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Object[]{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Double(minimum),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Double(maximum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;}&nbsp;<span>else</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span>ValidatorException(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFactory.getMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(context,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LongRangeValidator.MINIMUM_MESSAGE_ID,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Object[]{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Integer(minimum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;}<br>&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;<span>catch</span>&nbsp;(NumberFormatException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span>ValidatorException(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFactory.getMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(context,&nbsp;LongRangeValidator.TYPE_MESSAGE_ID));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;</span><span>int&nbsp;</span>intValue(Object&nbsp;attributeValue)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;NumberFormatException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(attributeValue&nbsp;instanceof&nbsp;Number)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(((Number)&nbsp;attributeValue).intValue());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>else</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(Integer.parseInt(attributeValue.toString()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</td>
        </tr>
    </tbody>
</table>
<br><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;数字的最小值，最大值在faces-config.xml中设置。这里主要看看那个validate方法，它在数字不在0-10范围时，抛出ValidatorException异常。异常信息将会由标记&lt;h:message &nbsp;for="userNo"&gt;输出。这些异常信息如何本地化定制？那就是从资源包中获取！请看：<br><br>
<table cellSpacing=1 cellPadding=4 width="98%" align=center bgColor=#bad5ef border=0>
    <tbody>
        <tr>
            <td bgColor=#e6eef7 height=25>程序代码：</td>
        </tr>
        <tr>
            <td bgColor=#ffffff><span>package</span>&nbsp;guessNumber;<br>import&nbsp;javax.faces.application.Application;<br>import&nbsp;javax.faces.application.FacesMessage;<br>import&nbsp;javax.faces.context.FacesContext;<br>import&nbsp;java.text.MessageFormat;<br>import&nbsp;java.util.Locale;<br>import&nbsp;java.util.MissingResourceException;<br>import&nbsp;java.util.ResourceBundle;<br><span>public&nbsp;</span>class&nbsp;MessageFactory&nbsp;extends&nbsp;Object&nbsp;{<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;</span>MessageFactory()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;<span>//这个方法是用做参数替换</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>String&nbsp;substituteParams(Locale&nbsp;locale,&nbsp;String&nbsp;msgtext,&nbsp;Object&nbsp;params[])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;localizedStr&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(params&nbsp;==&nbsp;<span>null</span>&nbsp;||&nbsp;msgtext&nbsp;==&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>msgtext;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;b&nbsp;=&nbsp;<span>new&nbsp;</span>StringBuffer(100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageFormat&nbsp;mf&nbsp;=&nbsp;<span>new&nbsp;</span>MessageFormat(msgtext);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(locale&nbsp;!=&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mf.setLocale(locale);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append(mf.format(params));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localizedStr&nbsp;=&nbsp;b.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>localizedStr;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><span>//上面方法的用法例子</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>void&nbsp;main(String&nbsp;args[]){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msgtext=<span>"我由于{0},不能去{1}"</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;params[]={<span>"有事"</span>,<span>"北京"</span>};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s=substituteParams(Locale.CHINESE,msgtext,params);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);&nbsp;&nbsp;&nbsp;}&nbsp;<br><span>/**<br>&nbsp;运行结果：&nbsp;&nbsp;D:\java&gt;java&nbsp;&nbsp;&nbsp;Test&nbsp;&nbsp;我由于有事,不能去北京<br>&nbsp;&nbsp;&nbsp;D:\java&gt;<br>*/</span>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>/**<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;version&nbsp;of&nbsp;getMessage()&nbsp;is&nbsp;used&nbsp;in&nbsp;the&nbsp;RI&nbsp;for&nbsp;localizing&nbsp;RI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;specific&nbsp;messages.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(String&nbsp;messageId,&nbsp;Object&nbsp;params[])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;locale&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FacesContext&nbsp;context&nbsp;=&nbsp;FacesContext.getCurrentInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;context.getViewRoot()&nbsp;may&nbsp;not&nbsp;have&nbsp;been&nbsp;initialized&nbsp;at&nbsp;this&nbsp;point.</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(context&nbsp;!=&nbsp;<span>null</span>&nbsp;&amp;&amp;&nbsp;context.getViewRoot()&nbsp;!=&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;=&nbsp;context.getViewRoot().getLocale();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(locale&nbsp;==&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;=&nbsp;Locale.getDefault();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>else</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;=&nbsp;Locale.getDefault();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>getMessage(locale,&nbsp;messageId,&nbsp;params);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><span>//从资源包中获取信息，从而构造jsf页面标记&lt;h:message&gt;与&lt;h:messages&gt;中所要显示的详细和摘要信息</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(Locale&nbsp;locale,&nbsp;String&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;params[])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FacesMessage&nbsp;result&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;summary&nbsp;=&nbsp;<span>null</span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detail&nbsp;=&nbsp;<span>null</span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bundleName&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResourceBundle&nbsp;bundle&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;see&nbsp;if&nbsp;we&nbsp;have&nbsp;a&nbsp;user-provided&nbsp;bundle</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;!=&nbsp;(bundleName&nbsp;=&nbsp;getApplication().getMessageBundle()))&nbsp;{<span>//资源包的名字</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;!=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(bundle&nbsp;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResourceBundle.getBundle(bundleName,&nbsp;locale,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCurrentLoader(bundleName))))&nbsp;{<span>//获取资源包</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;see&nbsp;if&nbsp;we&nbsp;have&nbsp;a&nbsp;hit</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;summary&nbsp;=&nbsp;bundle.getString(messageId);<span>//从资源包中获取信息摘要</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>catch</span>&nbsp;(MissingResourceException&nbsp;e)&nbsp;{<br>&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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;如果不能在用户提供的资源包中获取信息摘要，再从默认的资源包中查找</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;==&nbsp;summary)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;see&nbsp;if&nbsp;we&nbsp;have&nbsp;a&nbsp;summary&nbsp;in&nbsp;the&nbsp;app&nbsp;provided&nbsp;bundle</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bundle&nbsp;=&nbsp;ResourceBundle.getBundle(FacesMessage.FACES_MESSAGES,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCurrentLoader(bundleName));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;==&nbsp;bundle)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span><span>null</span>PointerException(<span>"&nbsp;bundle&nbsp;"</span>&nbsp;+&nbsp;bundle);<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;<span>//&nbsp;see&nbsp;if&nbsp;we&nbsp;have&nbsp;a&nbsp;hit</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;summary&nbsp;=&nbsp;bundle.getString(messageId);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>catch</span>&nbsp;(MissingResourceException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;we&nbsp;couldn't&nbsp;find&nbsp;a&nbsp;summary&nbsp;anywhere!&nbsp;&nbsp;<span>return&nbsp;</span><span>null</span></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;==&nbsp;summary)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span><span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;At&nbsp;this&nbsp;point,&nbsp;we&nbsp;have&nbsp;a&nbsp;summary&nbsp;and&nbsp;a&nbsp;bundle.</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;==&nbsp;summary&nbsp;||&nbsp;<span>null</span>&nbsp;==&nbsp;bundle)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span><span>null</span>PointerException(<span>"&nbsp;summary&nbsp;"</span>&nbsp;+&nbsp;summary&nbsp;+&nbsp;<span>"&nbsp;bundle&nbsp;"</span>&nbsp;+&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bundle);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><span>//参数替换，用参数params替换摘要中的{0},{1}等占位符。</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;summary&nbsp;=&nbsp;substituteParams(locale,&nbsp;summary,&nbsp;params);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try</span>&nbsp;{<br><span>//详细信息</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;detail&nbsp;=&nbsp;substituteParams(locale,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bundle.getString(messageId&nbsp;+&nbsp;<span>"_detail"</span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>catch</span>&nbsp;(MissingResourceException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(<span>new&nbsp;</span>FacesMessage(summary,&nbsp;detail));<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>//</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;Methods&nbsp;from&nbsp;MessageFactory</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(FacesContext&nbsp;context,&nbsp;String&nbsp;messageId)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>getMessage(context,&nbsp;messageId,&nbsp;<span>null</span>);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(FacesContext&nbsp;context,&nbsp;String&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;params[])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(context&nbsp;==&nbsp;<span>null</span>&nbsp;||&nbsp;messageId&nbsp;==&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span><span>null</span>PointerException(<span>"&nbsp;context&nbsp;"</span>&nbsp;+&nbsp;context&nbsp;+&nbsp;<span>"&nbsp;messageId&nbsp;"</span>&nbsp;+&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageId);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Locale&nbsp;locale&nbsp;=&nbsp;<span>null</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;viewRoot&nbsp;may&nbsp;not&nbsp;have&nbsp;been&nbsp;initialized&nbsp;at&nbsp;this&nbsp;point.</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(context&nbsp;!=&nbsp;<span>null</span>&nbsp;&amp;&amp;&nbsp;context.getViewRoot()&nbsp;!=&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;=&nbsp;context.getViewRoot().getLocale();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>else</span>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;=&nbsp;Locale.getDefault();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(<span>null</span>&nbsp;==&nbsp;locale)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;<span>new&nbsp;</span><span>null</span>PointerException(<span>"&nbsp;locale&nbsp;"</span>&nbsp;+&nbsp;locale);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FacesMessage&nbsp;message&nbsp;=&nbsp;getMessage(locale,&nbsp;messageId,&nbsp;params);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(message&nbsp;!=&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>message;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locale&nbsp;=&nbsp;Locale.getDefault();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(getMessage(locale,&nbsp;messageId,&nbsp;params));<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(FacesContext&nbsp;context,&nbsp;String&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;param0)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>getMessage(context,&nbsp;messageId,&nbsp;<span>new&nbsp;</span>Object[]{param0});<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(FacesContext&nbsp;context,&nbsp;String&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;param0,&nbsp;Object&nbsp;param1)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>getMessage(context,&nbsp;messageId,&nbsp;<span>new&nbsp;</span>Object[]{param0,&nbsp;param1});<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(FacesContext&nbsp;context,&nbsp;String&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;param0,&nbsp;Object&nbsp;param1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;param2)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>getMessage(context,&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Object[]{param0,&nbsp;param1,&nbsp;param2});<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;</span><span>static&nbsp;</span>FacesMessage&nbsp;getMessage(FacesContext&nbsp;context,&nbsp;String&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;param0,&nbsp;Object&nbsp;param1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;param2,&nbsp;Object&nbsp;param3)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>getMessage(context,&nbsp;messageId,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;</span>Object[]{param0,&nbsp;param1,&nbsp;param2,&nbsp;param3});<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>protected&nbsp;</span><span>static&nbsp;</span>Application&nbsp;getApplication()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>(FacesContext.getCurrentInstance().getApplication());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<span>//获取当前的类加载器，需要该类加载器来查找资源包</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span>protected&nbsp;</span><span>static&nbsp;</span>ClassLoader&nbsp;getCurrentLoader(Object&nbsp;fallbackClass)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader&nbsp;loader&nbsp;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread().getContextClassLoader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(loader&nbsp;==&nbsp;<span>null</span>)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader&nbsp;=&nbsp;fallbackClass.getClass().getClassLoader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;</span>loader;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}&nbsp;//&nbsp;end&nbsp;of&nbsp;class&nbsp;MessageFactory</td>
        </tr>
    </tbody>
</table>
<br><br><br>当然我们需要在faces-config.xml中定义资源包名<br><br>
<table cellSpacing=1 cellPadding=4 width="98%" align=center bgColor=#bad5ef border=0>
    <tbody>
        <tr>
            <td bgColor=#e6eef7 height=25>程序代码：</td>
        </tr>
        <tr>
            <td bgColor=#ffffff>&lt;application&gt;<br>&lt;locale-config&gt;<br>&nbsp;&nbsp;&lt;default-locale&gt;zh_CN&lt;/default-locale&gt;<br>&nbsp;&nbsp;&nbsp;&lt;supported-locale&gt;en&lt;/supported-locale&gt;<br>&nbsp;&nbsp;&nbsp;&lt;supported-locale&gt;fr&lt;/supported-locale&gt;<br>&nbsp;&nbsp;&nbsp;&lt;supported-locale&gt;es&lt;/supported-locale&gt;<br>&lt;/locale-config&gt;<br>&lt;message-bundle&gt;guessNumber.messages&lt;/message-bundle&gt;<br>&lt;/application&gt;</td>
        </tr>
    </tbody>
</table>
<br><br><br>并写出messages_zh_CN.properties文件:<br>javax.faces.validator.NOT_IN_RANGE=验证错误: &nbsp;数字应该在{0}和{1}之间<br>javax.faces.validator.LongRangeValidator.MAXIMUM=验证错误: &nbsp;数字不应该比{0}大<br>javax.faces.validator.LongRangeValidator.MINIMUM=验证错误:数字不应该比{0}小 &nbsp;<br>javax.faces.validator.LongRangeValidator.TYPE=验证错误:数字类型错误. &nbsp;<br>javax.faces.component.UIInput.CONVERSION=转换数字时发生错误. &nbsp;<br>javax.faces.component.UIInput.REQUIRED=请输入数字 &nbsp;...
<img src ="http://www.blogjava.net/linden/aggbug/122411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linden/" target="_blank">Linden.zhang</a> 2007-06-06 17:27 <a href="http://www.blogjava.net/linden/articles/122411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>