﻿<?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-java--jwebee-随笔分类-JSF</title><link>http://www.blogjava.net/zhouxing/category/31678.html</link><description>对IT人来说，要成为一个优秀的技术型管理者，除了需要具备扎实的技术基础之外，还应该培养良好的人际关系能力、谈判与沟通技能、客户关系与咨询技能、商业头脑和财务技能以及创新意识，此外还要有巧妙的激励技巧和化解冲突与解决突发问题的能力.</description><language>zh-cn</language><lastBuildDate>Mon, 26 May 2008 23:02:45 GMT</lastBuildDate><pubDate>Mon, 26 May 2008 23:02:45 GMT</pubDate><ttl>60</ttl><item><title>jsf-Managed Beans -Beans 上的 List、Map </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/26/BeanWithListMap.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Mon, 26 May 2008 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/26/BeanWithListMap.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202880.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/26/BeanWithListMap.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202880.html</trackback:ping><description><![CDATA[<div id="wikitext">如果您的Bean上有接受List或Map型態的屬性，則您也可以在組態檔案中直接設定這些屬性的值，一個例子如下：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;someBean&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.SomeBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;someProperty&lt;/property-name&gt;<br />
&lt;list-entries&gt;<br />
&lt;value-class&gt;java.lang.Integer&lt;/value-class&gt;<br />
&lt;value&gt;1&lt;/value&gt;<br />
&lt;value&gt;2&lt;/value&gt;<br />
&lt;value&gt;3&lt;/value&gt;<br />
&lt;/list-entries&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
這是一個設定接受List型態的屬性，我們使用&lt;list-entries&gt;標籤指定將設定一個List物件，其中&lt;value-class&gt;指定將存入List的型態，而&lt;value&gt;指定其值，如果是基本型態，則會嘗試使用指定的 &lt;value-class&gt;來作Wrapper類別。<br />
<p>&nbsp;</p>
設定Map的話，則是使用&lt;map-entries&gt;標籤，例如：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;someBean&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.SomeBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;someProperty&lt;/property-name&gt;<br />
&lt;map-entries&gt;<br />
&lt;value-class&gt;java.lang.Integer&lt;/value-class&gt;<br />
&lt;map-entry&gt;<br />
&lt;key&gt;someKey1&lt;/key&gt;<br />
&lt;value&gt;100&lt;/value&gt;<br />
&lt;/map-entry&gt;<br />
&lt;map-entry&gt;<br />
&lt;key&gt;someKey2&lt;/key&gt;<br />
&lt;value&gt;200&lt;/value&gt;<br />
&lt;/map-entry&gt;<br />
&lt;/map-entries&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
由於Map物件是以key-value對的方式來存入，所以我們在每一個&lt;map-entry&gt;中使用&lt;key&gt;與&lt; value&gt;標籤來分別指定。<br />
<p>&nbsp;</p>
您也可以直接像設定Bean一樣，設定一個List或Map物件，例如在JSF附的範例中，有這樣的設定：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;description&gt;<br />
Special expense item types<br />
&lt;/description&gt;<br />
&lt;managed-bean-name&gt;specialTypes&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
java.util.TreeMap<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;application&lt;/managed-bean-scope&gt;<br />
&lt;map-entries&gt;<br />
&lt;value-class&gt;java.lang.Integer&lt;/value-class&gt;<br />
&lt;map-entry&gt;<br />
&lt;key&gt;Presentation Material&lt;/key&gt;<br />
&lt;value&gt;100&lt;/value&gt;<br />
&lt;/map-entry&gt;<br />
&lt;map-entry&gt;<br />
&lt;key&gt;Software&lt;/key&gt;<br />
&lt;value&gt;101&lt;/value&gt;<br />
&lt;/map-entry&gt;<br />
&lt;map-entry&gt;<br />
&lt;key&gt;Balloons&lt;/key&gt;<br />
&lt;value&gt;102&lt;/value&gt;<br />
&lt;/map-entry&gt;<br />
&lt;/map-entries&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
而範例中另一個設定List的例子如下：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;statusStrings&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
java.util.ArrayList<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;<br />
&lt;list-entries&gt;<br />
&lt;null-value/&gt;<br />
&lt;value&gt;Open&lt;/value&gt;<br />
&lt;value&gt;Submitted&lt;/value&gt;<br />
&lt;value&gt;Accepted&lt;/value&gt;<br />
&lt;value&gt;Rejected&lt;/value&gt;<br />
&lt;/list-entries&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
</div>
<div id="printfoot"><br />
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-26 12:39 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/26/BeanWithListMap.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf-Managed Beans-Beans 的組態與設定 </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/26/ConfigBeans.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Mon, 26 May 2008 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/26/ConfigBeans.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202879.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/26/ConfigBeans.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202879.html</trackback:ping><description><![CDATA[JSF預設會讀取faces-config.xml中關於Bean的定義，如果想要自行設置定義檔的名稱，我們是在web.xml中提供javax.faces.CONFIG_FILES參數，例如：<br />
<pre> <br />
&lt;web-app&gt;<br />
&lt;context-param&gt;<br />
&lt;param-name&gt;javax.faces.CONFIG_FILES&lt;/param-name&gt;<br />
&lt;param-value&gt;/WEB-INF/beans.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
<br />
...<br />
&lt;/web-app&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
定義檔可以有多個，中間以 "," 區隔，例如：<br />
<pre> <br />
/WEB-INF/navigation.xml,/WEB-INF/beans.xml<br />
<br />
</pre>
<p>&nbsp;</p>
一個Bean最基本要定義Bean的名稱、類別與存活範圍，例如：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;user&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.UserBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
如果要在其它類別中取得Bean物件，則可以先取得javax.faces.context.FacesContext，它代表了JSF目前的執行環境物件，接著嘗試取得javax.faces.el.ValueBinding物件，從中取得指定的Bean物件，例如：<br />
<pre> <br />
FacesContext context = FacesContext.getCurrentInstance();<br />
ValueBinding binding = <br />
context.getApplication().createValueBinding("#{user}");<br />
UserBean user = (UserBean) binding.getValue(context); <br />
<br />
</pre>
<p>&nbsp;</p>
如果只是要嘗試取得Bean的某個屬性，則可以如下：<br />
<pre> <br />
FacesContext context = FacesContext.getCurrentInstance();<br />
ValueBinding binding = <br />
context.getApplication().createValueBinding(<br />
"#{user.name}");<br />
String name = (String) binding.getValue(context);<br />
<br />
</pre>
<p>&nbsp;</p>
如果有必要在啟始Bean時，自動設置屬性的初始值，則可以如下設定：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;user&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.UserBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;name&lt;/property-name&gt;<br />
&lt;value&gt;caterpillar&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;password&lt;/property-name&gt;<br />
&lt;value&gt;123456&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
如果要設定屬性為 null 值，則可以使用&lt;null-value/&gt;標籤，例如：<br />
<pre> <br />
....<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;name&lt;/property-name&gt;<br />
&lt;null-value/&gt;<br />
&lt;/managed-property&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;password&lt;/property-name&gt;<br />
&lt;null-value/&gt;<br />
&lt;/managed-property&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
當然，您的屬性不一定是字串值，也許會是int、float、boolean等等型態，您可以設定&lt;value&gt; 值時指定這些值的字串名稱，JSF會嘗試進行轉換，例如設定為true時，會嘗試使用Boolean.valueOf()方法轉換為boolean的 true，以下是一些可能進行的轉換：<br />
<p>&nbsp;</p>
<table width="100%" border="1">
    <tbody>
        <tr>
            <td valign="top" align="left">型態 </td>
            <td valign="top" align="left">轉換 </td>
        </tr>
        <tr>
            <td valign="top" align="left">short、int、long、float、double、byte，或相應的Wrapper類別 </td>
            <td valign="top" align="left">嘗試使用Wrapper的valueOf()進行轉換，如果沒有設置，則設為 0 </td>
        </tr>
        <tr>
            <td valign="top" align="left">boolean 或 Boolean </td>
            <td valign="top" align="left">嘗試使用Boolean.valueOf()進行轉換，如果沒有設置，則設為 false </td>
        </tr>
        <tr>
            <td valign="top" align="left">char 或 Character </td>
            <td valign="top" align="left">取設置的第一個字元，如果沒有設置，則設為0 </td>
        </tr>
        <tr>
            <td valign="top" align="left">String 或 Object </td>
            <td valign="top" align="left">即設定的字串值，如果沒有設定，則為空字串new String("") </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
您也可以將其它產生的Bean設定給另一個Bean的屬性，例如：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;user&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.UserBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;/managed-bean&gt;<br />
<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;other&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.OtherBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;managed-property&gt;<br />
&lt;property-name&gt;user&lt;/property-name&gt;<br />
&lt;value&gt;#{user}&lt;/value&gt;<br />
&lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
在上面的設定中，在OtherBean中的user屬性，接受一個UserBean型態的物件，我們設定為前一個名稱為user的UserBean物件。<br /><img src ="http://www.blogjava.net/zhouxing/aggbug/202879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-26 12:37 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/26/ConfigBeans.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf-Managed Beans-Backing Beans </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/26/BackingBeans.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Mon, 26 May 2008 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/26/BackingBeans.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202878.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/26/BackingBeans.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202878.html</trackback:ping><description><![CDATA[<div id="wikitext">JSF使用 <a class="wikilink" href="http://caterpillar.onlyfun.net/PmWiki/pmwiki.php/JSPServlet/JavaBeanABC">JavaBean</a> 來達到程式邏輯與視圖分離的目的，在JSF中的Bean其角色是屬於Backing Bean，又稱之為Glue Bean，其作用是在真正的業務邏輯Bean及UI元件之間搭起橋樑，在Backing Bean中會呼叫業務邏輯Bean處理使用者的請求，或者是將業務處理結果放置其中，等待UI元件取出當中的值並顯示結果給使用者。<br />
<p>&nbsp;</p>
JSF將Bean的管理集中在faces-config.xml中，一個例子如下：<br />
<pre> <br />
....<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;user&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.UserBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;/managed-bean&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
這個例子我們在 <a class="wikilink" href="http://www.1cn.biz/docs/LanguageTech/JavaServerFaces/FirstJSF.htm">第一個JSF程式</a> 看過，&lt;managed-bean-class&gt;設定所要使用的Bean類別，&lt;managed-bean-name&gt;設定之名稱，可供我們在JSF頁面上使用Expression Language來取得或設定Bean的屬性，例如：<br />
<pre> <br />
&lt;h:inputText value="#{user.name}"/&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
&lt;managed-bean-scope&gt;設定Bean的存活範圍，您可以設定為request、session 與application，設定為request時，Bean的存活時間為請求階最，設定為session則在使用者應用程式交互開始，直到關閉瀏覽器或顯式的結束會話為止（例如登出程式），設定為application的話，則Bean會一直存活，直到應用程式關閉為止。<br />
<p>&nbsp;</p>
您還可以將存活範圍設定為none，當設定為none時會在需要的時候生成一個新的Bean，例如您在一個method中想要生成一個臨時的Bean，就可以將之設定為none。<br />
<p>&nbsp;</p>
在JSF頁面上要取得Bean的屬性，是使用 <a class="wikilink" href="http://www.1cn.biz/docs/LanguageTech/JavaServerFaces/JSFExpressionLanguage.htm">JSF表示語言（Expression Language）</a>，要注意到的是，JSF表示語言是寫成 #{expression}，而 <a class="wikilink" href="http://caterpillar.onlyfun.net/PmWiki/pmwiki.php/JSPServlet/ExpressioLanguage">JSP 表示語言</a> 是寫成 ${expression}，因為表示層可能是使用JSP，所以必須特別區分，另外要注意的是，JSF的標籤上之屬性設定時，只接受JSF表示語言。<br />
<p>&nbsp;</p>
</div>
<div id="printfoot"><br />
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-26 12:36 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/26/BackingBeans.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf-國際化訊息 </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/I18NMessages.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/I18NMessages.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202138.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/I18NMessages.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202138.html</trackback:ping><description><![CDATA[<div id="wikitext">JSF的國際化（Internnationalization）訊息處理是基於Java對國際化的支援，您可以在一個訊息資源檔中統一管理訊息資源，資源檔的名稱是.properties，而內容是名稱與值的配對，例如：<br />
<ul>
    <li>messages.properties </li>
</ul>
<pre> <br />
titleText=JSF Demo<br />
hintText=Please input your name and password<br />
nameText=name<br />
passText=password<br />
commandText=Submit<br />
<br />
</pre>
<p>&nbsp;</p>
資源檔名稱由basename加上語言與地區來組成，例如：<br />
<ul>
    <li>basename.properties
    <li>basename_en.properties
    <li>basename_zh_TW.properties </li>
</ul>
<p>&nbsp;</p>
沒有指定語言與地區的basename是預設的資源檔名稱，JSF會根據瀏覽器送來的Accept-Language header中的內容來決定該使用哪一個資源檔名稱，例如：<br />
<p>&nbsp;</p>
<em><strong>Accept-Language: zh_TW, en-US, en</strong></em><br />
<p>&nbsp;</p>
如果瀏覽器送來這些header，則預設會使用繁體中文，接著是美式英文，再來是英文語系，如果找不到對應的訊息資源檔，則會使用預設的訊息資源檔。<br />
<p>&nbsp;</p>
由於訊息資源檔必須是ISO-8859-1編碼，所以對於非西方語系的處理，必須先將之轉換為Java Unicode Escape格式，例如您可以先在訊息資源檔中寫下以下的內容：<br />
<ul>
    <li>messages_zh_TW.txt </li>
</ul>
<pre> <br />
titleText=JSF示範<br />
hintText=請輸入名稱與密碼<br />
nameText=名稱<br />
passText=密碼<br />
commandText=送出<br />
<br />
</pre>
<p>&nbsp;</p>
然後使用JDK的工具程式native2ascii來轉換，例如：<br />
<p>&nbsp;</p>
<em><strong>native2ascii -encoding Big5 messages_zh_TW.txt messages_zh_TW.properties</strong></em><br />
<p>&nbsp;</p>
轉換後的內容會如下：<br />
<ul>
    <li>messages_zh_TW.properties </li>
</ul>
<pre> <br />
titleText=JSF\u793a\u7bc4<br />
hintText=\u8acb\u8f38\u5165\u540d\u7a31\u8207\u5bc6\u78bc<br />
nameText=\u540d\u7a31<br />
passText=\u5bc6\u78bc<br />
commandText=\u9001\u51fa<br />
<br />
</pre>
<p>&nbsp;</p>
接下來您可以使用&lt;f:loadBundle&gt;標籤來指定載入訊息資源，一個例子如下：<br />
<ul>
    <li>index.jsp </li>
</ul>
<pre> <br />
&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;<br />
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;<br />
&lt;%@page contentType="text/html;charset=UTF-8"%&gt;<br />
<br />
&lt;f:view&gt;<br />
&lt;f:loadBundle basename="messages" var="msgs"/&gt;<br />
<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;&lt;h:outputText value="#{msgs.titleText}"/&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
<br />
&lt;h:form&gt;<br />
&lt;h3&gt;&lt;h:outputText value="#{msgs.hintText}"/&gt;&lt;/h3&gt;<br />
&lt;h:outputText value="#{msgs.nameText}"/&gt;:<br />
&lt;h:inputText value="#{user.name}"/&gt;&lt;p&gt;<br />
&lt;h:outputText value="#{msgs.passText}"/&gt;: <br />
&lt;h:inputSecret value="#{user.password}"/&gt;&lt;p&gt; <br />
&lt;h:commandButton value="#{msgs.commandText}" <br />
actionListener="#{user.verify}"<br />
action="#{user.outcome}"/&gt;<br />
&lt;/h:form&gt;<br />
<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
&lt;/f:view&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
如此一來，如果您的瀏覽器預設接受zh_TW語系的話，則頁面上就可以顯示中文，否則預設將以英文顯示，也就是messages.properties的內容，為了能顯示多國語系，我們設定網頁編碼為UTF8。<br />
<p>&nbsp;</p>
&lt;f:view&gt;可以設定locale屬性，直接指定所要使用的語系，例如：<br />
<pre> <br />
&lt;f:view locale="zh_TW"&gt;<br />
&lt;f:loadBundle basename="messages" var="msgs"/&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
直接指定以上的話，則會使用繁體中文來顯示，JSF會根據&lt;f:loadBundle&gt;的basename屬性加上&lt;f:view&gt;的locale屬性來決定要使用哪一個訊息資源檔，就上例而言，就是使用 messages_zh_TW.properties，如果設定為以下的話，就會使用messages_en.properties：<br />
<pre> <br />
&lt;f:view locale="en"&gt;<br />
&lt;f:loadBundle basename="messages" var="msgs"/&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
您也可以在faces-config.xml中設定語系，例如：<br />
<pre> <br />
&lt;faces-config&gt;<br />
&lt;application&gt;<br />
&lt;local-config&gt;<br />
&lt;default-locale&gt;en&lt;/default-locale&gt;<br />
&lt;supported-locale&gt;zh_TW&lt;/supported-locale&gt;<br />
&lt;/local-config&gt;<br />
&lt;/application&gt;<br />
<br />
.....<br />
&lt;/faces-config&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
在&lt;local-config&gt;一定有一個&lt;default-locale&gt;，而&lt;supported- locale&gt;可以有好幾個，這告訴JSF您的應用程式支援哪些語系。<br />
<p>&nbsp;</p>
當然，如果您可以提供一個選項讓使用者選擇自己的語系會是更好的方式，例如根據user這個Bean的locale屬性來決定頁面語系：<br />
<pre> <br />
&lt;f:view locale="#{user.locale}"&gt;<br />
&lt;f:loadBundle basename="messages" var="msgs"/&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
在頁面中設定一個表單，可以讓使用者選擇語系，例如設定單選鈕：<br />
<pre> <br />
&lt;h:selectOneRadio value="#{user.locale}"&gt;<br />
&lt;f:selectItem itemValue="zh_TW" <br />
itemLabel="#{msgs.zh_TWText}"/&gt;<br />
&lt;f:selectItem itemValue="en" <br />
itemLabel="#{msgs.enText}"/&gt;<br />
&lt;/h:selectOneRadio&gt;<br />
<br />
</pre>
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:39 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/I18NMessages.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF Expression Language </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/JSFExpressionLanguage.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/JSFExpressionLanguage.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202137.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/JSFExpressionLanguage.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202137.html</trackback:ping><description><![CDATA[<div id="wikitext">JSF Expression Language 搭配 JSF 標籤來使用，是用來存取資料物件的一個簡易語言。<br />
<p>&nbsp;</p>
JSF EL是以#開始，將變數或運算式放置在 { 與 } 之間，例如：<br />
<pre> <br />
#{someBeanName}<br />
<br />
</pre>
<p>&nbsp;</p>
變數名稱可以是faces-config.xml中定義的名稱，如果是Bean的話，可以透過使用 '.' 運算子來存取它的屬性，例如：<br />
<pre> <br />
...<br />
&lt;f:view&gt;<br />
&lt;h:outputText value="#{userBean.name}"/&gt;<br />
&lt;/f:view&gt;<br />
...<br />
<br />
</pre>
<p>&nbsp;</p>
在JSF標籤的屬性上，" 與 " （或'與'）之間如果含有EL，則會加以運算，您也可以這麼使用它：<br />
<pre> <br />
...<br />
&lt;f:view&gt;<br />
名稱, 年齡：&lt;h:outputText <br />
value="#{userBean.name}, #{userBean.age}"/&gt;<br />
&lt;/f:view&gt;<br />
...<br />
<br />
</pre>
<p>&nbsp;</p>
一個執行的結果可能是這樣顯示的：<br />
<pre> <br />
名稱, 年齡：Justin, 29<br />
<br />
</pre>
<p>&nbsp;</p>
EL的變數名也可以程式執行過程中所宣告的名稱，或是JSF EL預設的隱含物件，例如下面的程式使用param隱含物件來取得使用者輸入的參數：<br />
<pre> <br />
&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;<br />
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;<br />
&lt;%@page contentType="text/html; charset=Big5"%&gt;<br />
<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;f:view&gt;<br />
&lt;b&gt; 您好, &lt;h:outputText value="#{param.name}"/&gt; &lt;/b&gt;<br />
&lt;/f:view&gt;<br />
<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
param是JSF EL預設的隱含物件變數，它代表request所有參數的集合，實際是一個java.util.Map型態物件，JSF所提供的隱含物件，大致上對應於 <a class="wikilink" href="http://caterpillar.onlyfun.net/PmWiki/pmwiki.php/JSPServlet/ELImplicitObject">JSP 隱含物件</a>，不過JSF隱含物件移除了pageScope與pageContext，而增加了facesContext與view，它們分別對應於 javax.faces.context.FacesContext與javax.faces.component.UIViewRoot。<br />
<p>&nbsp;</p>
對於Map型態物件，我們可以使用 '.' 運算子指定key值來取出對應的value，也可以使用 [ 與 ] 來指定，例如：<br />
<pre> <br />
...<br />
&lt;f:view&gt;<br />
&lt;b&gt; 您好, &lt;h:outputText value="#{param['name']}"/&gt; &lt;/b&gt;<br />
&lt;/f:view&gt;<br />
...<br />
<br />
</pre>
<p>&nbsp;</p>
在 [ 與 ] 之間，也可以放置其它的變數值，例如：<br />
<pre> <br />
...<br />
&lt;f:view&gt;<br />
&lt;h:outputText value="#{someBean.someMap[user.name]}"/&gt; <br />
&lt;/f:view&gt;<br />
...<br />
<br />
</pre>
<p>&nbsp;</p>
如果變數是List型態或陣列的話，則可以在 [] 中指定索引，例如：<br />
<pre> <br />
....<br />
&lt;f:view&gt;<br />
&lt;h:outputText value="#{someBean.someList[0]}"/&gt; <br />
&lt;h:outputText value="#{someBean.someArray[1]}"/&gt;<br />
&lt;h:outputText<br />
value="#{someBean.someListOrArray[user.age]}"/&gt;  <br />
&lt;/f:view&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
您也可以指定字面常數，對於true、false、字串、數字，JSF EL會嘗試進行轉換，例如：<br />
<pre> <br />
....<br />
&lt;h:outputText value="#{true}"/&gt;<br />
....<br />
<br />
&lt;h:outputText value="#{'This is a test'}"/&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
如果要輸出字串，必須以單引號 ' 或雙引數 " 括住，如此才不會被認為是變數名稱。<br />
<p>&nbsp;</p>
在宣告變數名稱時，要留意不可與JSF的保留字或關鍵字同名，例如不可取以下這些名稱：<br />
<pre> <br />
true false null div mod and or not eq ne lt gt le ge instanceof empty<br />
<br />
</pre>
<p>&nbsp;</p>
使用EL，您可以直接實行一些算術運算、邏輯運算與關係運算，其使用就如同在一般常見的程式語言中之運算。 <br />
<p>&nbsp;</p>
算術運算子有：加法 (+), 減法 (-), 乘法 (*), 除法 (/ or div) 與餘除 (% or mod) 。下面是算術運算的一些例子： <br />
<table width="50%" border="1">
    <tbody>
        <tr>
            <td valign="top" align="left">運算式 </td>
            <td valign="top" align="left">結果 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1} </td>
            <td valign="top" align="left">1 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1 + 2} </td>
            <td valign="top" align="left">3 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1.2 + 2.3} </td>
            <td valign="top" align="left">3.5 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1.2E4 + 1.4} </td>
            <td valign="top" align="left">12001.4 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{-4 - 2} </td>
            <td valign="top" align="left">-6 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{21 * 2} </td>
            <td valign="top" align="left">42 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{3/4} </td>
            <td valign="top" align="left">0.75 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{3 div 4} </td>
            <td valign="top" align="left">0.75，除法 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{3/0} </td>
            <td valign="top" align="left">Infinity </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{10%4} </td>
            <td valign="top" align="left">2 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{10 mod 4} </td>
            <td valign="top" align="left">2，也是餘除 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{(1==2) ? 3 : 4} </td>
            <td valign="top" align="left">4 </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
如同在Java語法一樣 ( expression ? result1 : result2）是個三元運算，expression為true顯示result1，false顯示result2。 <br />
<p>&nbsp;</p>
邏輯運算有：and(或&amp;&amp;)、or(或!!)、not(或!)。一些例子為： <br />
<table width="50%" border="1">
    <tbody>
        <tr>
            <td valign="top" align="left">運算式 </td>
            <td valign="top" align="left">結果 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{true and false} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{true or false} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{not true} </td>
            <td valign="top" align="left">false </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
關係運算有：小於Less-than (&lt; or lt)、大於Greater-than (&gt; or gt)、小於或等於Less-than-or-equal (&lt;= or le)、大於或等於Greater-than-or-equal (&gt;= or ge)、等於Equal (== or eq)、不等於Not Equal (!= or ne)，由英文名稱可以得到lt、gt等運算子之縮寫詞，以下是Tomcat的一些例子： <br />
<table width="50%" border="1">
    <tbody>
        <tr>
            <td valign="top" align="left">運算式 </td>
            <td valign="top" align="left">結果 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1 &lt; 2} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1 lt 2} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1 &gt; (4/2)} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{1 &gt; (4/2)} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{4.0 &gt;= 3} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{4.0 ge 3} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{4 &lt;= 3} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{4 le 3} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{100.0 == 100} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{100.0 eq 100} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{(10*10) != 100} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{(10*10) ne 100} </td>
            <td valign="top" align="left">false </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
左邊是運算子的使用方式，右邊的是運算結果，關係運算也可以用來比較字元或字串，按字典順序來決定比較結果，例如： <br />
<table width="50%" border="1">
    <tbody>
        <tr>
            <td valign="top" align="left">運算式 </td>
            <td valign="top" align="left">結果 </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{'a' &lt; 'b'} </td>
            <td valign="top" align="left">true </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{'hip' &gt; 'hit'} </td>
            <td valign="top" align="left">false </td>
        </tr>
        <tr>
            <td valign="top" align="left">#{'4' &gt; 3} </td>
            <td valign="top" align="left">true </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
EL運算子的執行優先順序與Java運算子對應，如果有疑慮的話，也可以使用括號()來自行決定先後順序。 <br />
<p>&nbsp;</p>
</div>
<div id="printfoot"><br />
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:38 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/JSFExpressionLanguage.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf-導航規則設置 </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/ConfigNavigationRule.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/ConfigNavigationRule.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202136.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/ConfigNavigationRule.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202136.html</trackback:ping><description><![CDATA[<div id="wikitext">在JSF中是根據faces-config.xml中&lt;navigation-rule&gt;設定，以決定在符合的條件成立時，該連結至哪一個頁面，一個基本的設定如下：<br />
<pre> <br />
....<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/pages/index.jsp&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;success&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/welcome.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;failure&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/index.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
對於JSF，每一個視圖（View）都有一個獨特的識別（identifier），稱之為View ID，在JSF中的View ID是從Web應用程式的環境相對路徑開始計算，設定時都是以/作為開頭，如果您請求時的路徑是/pages/index.faces，則JSF會將副檔名改為/pages/index.jsp，以此作為view-id。<br />
<p>&nbsp;</p>
在&lt;navigation-rule&gt;中的&lt;from-view-id&gt;是個選擇性的定義，它規定了來源頁面的條件，&lt;navigation-case&gt;中定義各種導覽條件，&lt;from-outcome&gt;定義當表單結果符合的條件時，各自改導向哪一個目的頁面，目的頁面是在&lt;to-view-id&gt;中定義。<br />
<p>&nbsp;</p>
您還可以在&lt;navigation-case&gt;中加入&lt;from-action&gt;，進一步規範表單結果必須根據哪一個動作方法（action method），當中是使用 <a class="wikilink" href="http://www.1cn.biz/docs/LanguageTech/JavaServerFaces/JSFExpressionLanguage.htm">JSF Expression Language</a> 來設定，例如：<br />
<pre> <br />
....<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/pages/index.jsp&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-action&gt;#{user.verify}&lt;/from-action&gt;<br />
&lt;from-outcome&gt;success&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/welcome.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
....<br />
&lt;/navigation-rule&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
在導航時，預設都是使用forward的方式，您可以在&lt;navigation-case&gt;中加入一個&lt;redirect/&gt;，讓JSF發出讓瀏覽器重新導向（redirect）的header，讓瀏覽器主動要求新網頁，例如：<br />
<pre> <br />
....<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/pages/index.jsp&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;success&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/welcome.jsp&lt;/to-view-id&gt;<br />
&lt;redirect/&gt;<br />
&lt;/navigation-case&gt;<br />
....<br />
&lt;/navigation-rule&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
您的來源網頁可能是某個特定模組，例如在/admin/下的頁面，您可以在&lt;from-view-id&gt;中使用wildcards，也就是使用 * 字元，例如：<br />
<pre> <br />
....<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/admin/*&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-action&gt;#{user.verify}&lt;/from-action&gt;<br />
&lt;from-outcome&gt;success&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/welcome.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
....<br />
&lt;/navigation-rule&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
在上面的設定中，只要來源網頁是從/admin來的，都可以開始測試接下來的&lt;navigation-case&gt;。<br />
<p>&nbsp;</p>
&lt;from-view-id&gt;如果沒有設定，表示來源網頁不作限制，您也可以使用 * 顯式的在定義檔中表明，例如：<br />
<pre> <br />
....<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/*&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
....<br />
&lt;/navigation-rule&gt;<br />
....<br />
<br />
</pre>
<p>&nbsp;</p>
或者是這樣：<br />
<pre> <br />
....<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;*&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
....<br />
&lt;/navigation-rule&gt;<br />
....<br />
<br />
</pre>
</div>
<div id="printfoot"><br />
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:36 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/ConfigNavigationRule.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf-簡單的導航（Navigation） </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/SimpleNavigation.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/SimpleNavigation.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202134.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/SimpleNavigation.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202134.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202134.html</trackback:ping><description><![CDATA[<div id="wikitext">在 <a class="wikilink" href="http://www.1cn.biz/docs/LanguageTech/JavaServerFaces/FirstJSF.htm">第一個JSF程式</a> 中，我們簡單的定義了頁面的流程由 index.jsp 到 welcome.jsp，接下來我們擴充程式，讓它可以根據使用者輸入的名稱與密碼是否正確，決定要顯示歡迎訊息或是將使用者送回原頁面進行重新登入。<br />
<p>&nbsp;</p>
首先我們修改一下UserBean：<br />
<ul>
    <li>UserBean.java </li>
</ul>
<pre> <br />
package onlyfun.caterpillar;<br />
<br />
public class UserBean {<br />
private String name;<br />
private String password;<br />
private String errMessage;<br />
<br />
public void setName(String name) {<br />
this.name = name;<br />
}<br />
<br />
public String getName() {<br />
return name;<br />
}<br />
<br />
public void setPassword(String password) {<br />
this.password = password;<br />
}<br />
<br />
public String getPassword() {<br />
return password;<br />
}<br />
<br />
public void setErrMessage(String errMessage) {<br />
this.errMessage = errMessage;<br />
}<br />
<br />
public String getErrMessage() {<br />
return errMessage;<br />
}<br />
<br />
public String verify() {<br />
if(!name.equals("justin") ||<br />
!password.equals("123456")) {<br />
errMessage = "名稱或密碼錯誤";<br />
return "failure";<br />
}<br />
else {<br />
return "success";<br />
}<br />
}<br />
}<br />
<br />
</pre>
<p>&nbsp;</p>
在UserBean中，我們增加了密碼與錯誤訊息屬性，在verify()方法中，我們檢查使用者名稱與密碼，它傳回一個字串，"failure"表示登入錯誤，並會設定錯誤訊息，而"success"表示登入正確，這個傳回的字串將決定頁面的流程。<br />
<p>&nbsp;</p>
接下來我們修改一下 faces-config.xml 中的頁面流程定義：<br />
<ul>
    <li>faces-config.xml </li>
</ul>
<pre> <br />
&lt;?xml version="1.0"?&gt;<br />
&lt;!DOCTYPE faces-config PUBLIC<br />
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"<br />
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd"&gt;<br />
<br />
&lt;faces-config&gt;<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/pages/index.jsp&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;success&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/welcome.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;failure&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/index.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;<br />
<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;user&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.UserBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;/managed-bean&gt;<br />
&lt;/faces-config&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
根據上面的定義，當傳回的字串是"success"時，將前往 welcome.jsp，如果是"failure"的話，將送回 index.jsp。<br />
<p>&nbsp;</p>
接下來告訴網頁設計人員Bean名稱與相關屬性，以及決定頁面流程的verify名稱，我們修改 index.jsp 如下：<br />
<ul>
    <li>index.jsp </li>
</ul>
<pre> <br />
&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;<br />
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;<br />
&lt;%@page contentType="text/html;charset=Big5"%&gt; <br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;第一個JSF程式&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;f:view&gt;<br />
&lt;h:form&gt;<br />
&lt;h3&gt;請輸入您的名稱&lt;/h3&gt;<br />
&lt;h:outputText value="#{user.errMessage}"/&gt;&lt;p&gt;<br />
名稱: &lt;h:inputText value="#{user.name}"/&gt;&lt;p&gt;<br />
密碼: &lt;h:inputSecret value="#{user.password}"/&gt;&lt;p&gt; <br />
&lt;h:commandButton value="送出" <br />
action="#{user.verify}"/&gt;<br />
&lt;/h:form&gt;<br />
&lt;/f:view&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
當要根據verify運行結果來決定頁面流程時，action屬性中使用 <a class="wikilink" href="http://www.1cn.biz/docs/LanguageTech/JavaServerFaces/JSFExpressionLanguage.htm">JSF Expression Language</a> "#{user.verify}"，如此JSF就知道必須根據verify傳回的結果來導航頁面。<br />
<p>&nbsp;</p>
&lt;h:outputText&gt;可以取出指定的Bean之屬性值，當使用者因驗證錯誤而被送回原頁面時，這個錯誤訊息就可以顯示在頁面上。<br />
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:35 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/SimpleNavigation.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一個 JSF 程式 </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/FirstJSF.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/FirstJSF.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202133.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/FirstJSF.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202133.html</trackback:ping><description><![CDATA[<div id="wikitext">現在可以開發一個簡單的程式了，我們將設計一個簡單的登入程式，使用者送出名稱，之後由程式顯示使用者名稱及歡迎訊息。<br />
<p>&nbsp;</p>
<h2>程式開發人員</h2>
先看看應用程式開發人員要作些什麼事，我們撰寫一個簡單的JavaBean：<br />
<ul>
    <li>UserBean.java </li>
</ul>
<pre> <br />
package onlyfun.caterpillar;<br />
<br />
public class UserBean {<br />
private String name;<br />
<br />
public void setName(String name) {<br />
this.name = name;<br />
}<br />
<br />
public String getName() {<br />
return name;<br />
}<br />
}<br />
<br />
</pre>
<p>&nbsp;</p>
這個Bean將儲存使用者的名稱，編譯好之後放置在/WEB-INF/classes下。<br />
<p>&nbsp;</p>
接下來設計頁面流程，我們將先顯示一個登入網頁/pages/index.jsp，使用者填入名稱並送出表單，之後在 /pages/welcome.jsp中顯示Bean中的使用者名稱與歡迎訊息。<br />
<p>&nbsp;</p>
為了讓JSF知道我們所設計的Bean以及頁面流程，我們定義一個/WEB-INF/faces-config.xml：<br />
<ul>
    <li>faces-config.xml </li>
</ul>
<pre> <br />
&lt;?xml version="1.0"?&gt;<br />
&lt;!DOCTYPE faces-config PUBLIC<br />
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"<br />
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd"&gt;<br />
<br />
&lt;faces-config&gt;<br />
&lt;navigation-rule&gt;<br />
&lt;from-view-id&gt;/pages/index.jsp&lt;/from-view-id&gt;<br />
&lt;navigation-case&gt;<br />
&lt;from-outcome&gt;login&lt;/from-outcome&gt;<br />
&lt;to-view-id&gt;/pages/welcome.jsp&lt;/to-view-id&gt;<br />
&lt;/navigation-case&gt;<br />
&lt;/navigation-rule&gt;<br />
<br />
&lt;managed-bean&gt;<br />
&lt;managed-bean-name&gt;user&lt;/managed-bean-name&gt;<br />
&lt;managed-bean-class&gt;<br />
onlyfun.caterpillar.UserBean<br />
&lt;/managed-bean-class&gt;<br />
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&lt;/managed-bean&gt;<br />
&lt;/faces-config&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
在&lt;navigation-rule&gt;中，我們定義了頁面流程，當請求來自&lt;from-view- id&gt;中指定的頁面，並且指定了&lt;navigation-case&gt;中的&lt;from-outcome&gt;為login時，則會將請求導向至&lt;to-view-id&gt;所指定的頁面。<br />
<p>&nbsp;</p>
在&lt;managed-bean&gt;中我們可以統一管理我們的Bean，我們設定Bean物件的存活範圍是session，也就是使用者開啟瀏覽器與程式互動過程中都存活。<br />
<p>&nbsp;</p>
接下來要告訴網頁設計人員的資訊是，他們可以使用的Bean名稱，即&lt;managed-bean-name&gt;中設定的名稱，以及上面所定義的頁面流程。<br />
<p>&nbsp;</p>
<h2>網頁設計人員</h2>
<p>&nbsp;</p>
首先網頁設計人員撰寫index.jsp網頁：<br />
<ul>
    <li>index.jsp </li>
</ul>
<pre> <br />
&lt;%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;<br />
&lt;%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;<br />
&lt;%@page contentType="text/html;charset=Big5"%&gt; <br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;第一個JSF程式&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;f:view&gt;<br />
&lt;h:form&gt;<br />
&lt;h3&gt;請輸入您的名稱&lt;/h3&gt;<br />
名稱: &lt;h:inputText value="#{user.name}"/&gt;&lt;p&gt;<br />
&lt;h:commandButton value="送出" action="login"/&gt;<br />
&lt;/h:form&gt;<br />
&lt;/f:view&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
我們使用了JSF的core與html標籤庫，core是有關於UI元件的處理，而html則是有關於HTML的進階標籤。<br />
<p>&nbsp;</p>
&lt;f:view&gt;與&lt;html&gt;有類似的作用，當您要開始使用JSF元件時，這些元件一定要在&lt;f: view&gt;與&lt;/f:view&gt;之間，就如同使用HTML時，所有的標籤一定要在&lt;html&gt;與&lt; /html&gt;之間。<br />
<p>&nbsp;</p>
html標籤庫中幾乎都是與HTML標籤相關的進階標籤，&lt;h:form&gt;會產生一個表單，我們使用&lt;h: inputText&gt;來顯示user這個Bean物件的name屬性，而&lt;h:commandButton&gt;會產生一個提交按鈕，我們在action屬性中指定將根據之前定義的login頁面流程中前往welcome.jsp頁面。<br />
<p>&nbsp;</p>
網頁設計人員不必理會表單傳送之後要作些什麼，他只要設計好歡迎頁面就好了：<br />
<ul>
    <li>welcome.jsp </li>
</ul>
<pre> <br />
&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;<br />
&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;<br />
&lt;%@page contentType="text/html;charset=Big5"%&gt; <br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;第一個JSF程式&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;f:view&gt;<br />
&lt;h:outputText value="#{user.name}"/&gt; 您好！<br />
&lt;h3&gt;歡迎使用 JavaServer Faces！&lt;/h3&gt;<br />
&lt;/f:view&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
</pre>
<p>&nbsp;</p>
這個頁面沒什麼需要解釋的了，如您所看到的，在網頁上沒有程式邏輯，網頁設計人員所作的就是遵照頁面流程，使用相關名稱取出資料，而不用擔心實際上程式是如何運作的。<br />
<p>&nbsp;</p>
接下來啟動Container，連接上您的應用程式網址，例如：http://localhost: 8080/jsfDemo/pages/index.faces，填入名稱並送出表單，您的歡迎頁面就會顯示了。<br />
</div><img src ="http://www.blogjava.net/zhouxing/aggbug/202133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:34 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/FirstJSF.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>簡介 JSF </title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/IntroduceJSF.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/IntroduceJSF.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202132.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/IntroduceJSF.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202132.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/zhouxing/archive/2008/05/22/IntroduceJSF.html'>阅读全文</a><img src ="http://www.blogjava.net/zhouxing/aggbug/202132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:32 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/IntroduceJSF.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaServer Faces</title><link>http://www.blogjava.net/zhouxing/archive/2008/05/22/javaserverfaces.html</link><dc:creator>周行</dc:creator><author>周行</author><pubDate>Thu, 22 May 2008 04:31:00 GMT</pubDate><guid>http://www.blogjava.net/zhouxing/archive/2008/05/22/javaserverfaces.html</guid><wfw:comment>http://www.blogjava.net/zhouxing/comments/202130.html</wfw:comment><comments>http://www.blogjava.net/zhouxing/archive/2008/05/22/javaserverfaces.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhouxing/comments/commentRss/202130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhouxing/services/trackbacks/202130.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JavaServer Faces [http://java.sun.com/j2ee/javaserverfaces/] 於2004年三月1.0版正式提出，清楚的將Web應用程式的開發者劃分了三個角色：網頁設計人員、應用程式設計人員以及UI元件開發人員。從使用的角度來看，網頁設計人員與應用程式設計人員可以他們所熟悉的方式開發程式，而不用侵入彼此的工作範圍，而UI元件開發人員可以獨立的開發個別元件，細節的部份留給了他們來處理。&nbsp;&nbsp;<a href='http://www.blogjava.net/zhouxing/archive/2008/05/22/javaserverfaces.html'>阅读全文</a><img src ="http://www.blogjava.net/zhouxing/aggbug/202130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhouxing/" target="_blank">周行</a> 2008-05-22 12:31 <a href="http://www.blogjava.net/zhouxing/archive/2008/05/22/javaserverfaces.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>