1. 什麼是JSF
a. jsf是一個基於web的GUI組件和相關處理器的集合
jsf提供了許多內建的包含組件事件處理代碼的html組件
b. jsf是一個獨立的GUI組件架構
jsf可以組建圖表等,比起html來說功能更強大,而且JSF不是僅僅依賴於HTTP協議。
c. 可以作為比struts更優秀的mvc架構
象Apache的Struts,jsf也可以被看作一個MVC架構,它可以構建html表單,驗證表單域,調用商務邏輯,顯示結果等。
2. JSF的優點
a. 自訂GUI組件
b. 事件處理機制
c. 受管Bean
d. jsf運算式語言
e. 表單域的資料類型轉換與驗證
f. 集中控制的基於檔案的配置
3. JSF的缺點
a. 較長的學習曲線
b. 很少的文檔資料
c. 較少的開發工具
4. 安裝和配置JSF
a. 下載 the JSF 1.1 zip file
http://java.sun.com/j2ee/javaserverfaces/download.html
http://www.myfaces.org/
b. 構建應用程式目錄
/WEB-INF/
--web.xml
--faces-config.xml
--classes/
--lib/
---commons-beanutils.jar
---commons-collections.jar
---commons-digester.jar
---commons-logging.jar
---jsf-api.jar
---jsf-impl.jar
---jstl.jar
---standard.jar
JSF入門 二 頁面導航
1. JSF的控制流程程
a. 由各種GUI組件構建的web表單顯示給使用者
b. 這個表單被提交給自己
c. 建立一個描繪表單資料的bean
d. 在form中描述的action方法被調用
e. action方法返回一個條件
f. 相應於這個條件的頁面返回給使用者
2. 使用JSF開發的步驟
a. 建立一個描繪表單資料的Bean
b. 使用f:view和h:form來建立輸入表單
c. 用h:commandButton的 action屬性來詳細說明一個Action controller
d. 建立一個Action controller來讀取資料,調用商務邏輯,儲存結果,返回一個和某結果頁面相關的條件。
e. 使用faces-config.xml來聲明form bean和頁面導航。
f. 建立和每一條件相關聯的jsp頁面。
3. 案例1:靜態導航
a. 輸入表單
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
<!DOCTYPE …>
<HTML>
<HEAD>…</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">New Account Registration</TH></TR>
</TABLE>
<P>
<h:form>
Email address: <h:inputText/><BR>
Password: <h:inputSecret/><BR>
<h:commandButton value="Sign Me Up!" action="login"/>
</h:form>
</CENTER></BODY></HTML>
</f:view>
b. 頁面導航
<faces-config>
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/WEB-INF/…/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
c. 說明
由於是靜態導航,所以h:commandButton中的action屬性沒有指明控制器中的方法,而是直間賦予了導航條件(from-outcome),因此當點擊按鈕後會直接轉向result.jsp頁面.(當然一般情況下應在action屬性中指明控制器處理方法)
4. 案例2:動態導航
a. 輸入表單
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
…
<h:form>
First name: <h:inputText/><BR>
Last name: <h:inputText/><BR>
...
<h:commandButton
value="Sign Me Up!"
action="#{loginAction.validate}"/>
</h:form>…
</f:view>
b. 控制器
public class LoginAction {
public String validate() {
if (...) {
return "error";
}
else {
return "success";
}
}
}
c. 導航
<faces-config>
<navigation-rule>
<managed-bean>
<managed-bean-name>
loginAction
</managed-bean-name>
<managed-bean-class>
net.boyce.LoginAction
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<from-view-id>/signup.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/WEB-INF/results/success.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>error</from-outcome>
<to-view-id>/WEB-INF/results/error.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
d. 說明
在action屬性中指明了控制器,由控制器返回條件,再根據導航轉到不同的結果頁面。注意在action屬性中指明的控制器方法是無輸入參數,且返回String類的函數。