JSF是JAVA EE規范的一部分。它是:Java Web應用的用戶界面框架。
l JSF提供一套API以及標簽庫,用來創建頁面表單以及復雜的界面元素
l JSF使得編寫表單提交的代碼更加簡單,這些代碼可以響應那些不同的按鈕提交,改變某些值或某些用戶的選擇等等
l Managed beans:使得JSF簡化了處理請求參數的方法
l EL(Expression Language):JSF有一套表達式語言用來訪問java bean的屬性以及集合元素等。
l 提供表單域類型轉換以及驗證
實現包
Apache的myfaces包是第一個開源的JSF實現。Myfaces有一些擴展的包,這些包是對JSF標準組件的擴充,可以協助我們更加快速的開發。Myfaces的擴展包括:
* Tomahawk
* Tobago:目標是提供一套基于JSF以及myfaces的良好設計的UI組件。Tobago不僅僅只是一套標簽庫。下面的幾點讓它與其它框架不同:
- 無需HTML設計,聚焦于商業應用程序的開發。開發者可以將精力集中在用戶界面上,而不是網頁。
- UI組件是對HTML的抽象,它不僅僅可以用于HTML頁面,它的輸出格式可以定制。
- “主題”機制,使得可以很容易切換應用程序的外觀。
- 布局管理器可以自動排列組件,這就意味著無需使用HTML表格或其它技術來手工管理組件的布局。
* Trinidad:JSF1.1的組件庫
最新的myfaces包(版本是:
UI組件模型
JSF提供一套豐富靈活的組件模型,包括:
l 一套UIComponent類,定義UI組件的狀態和行為。
l 呈現模型:定義如何用不同的方式來呈現組件
l 事件和監聽器模型用來處理組件的事件。
l 轉換模型:進行數據轉換
l 驗證模型:如何驗證數據的合法性
UI組件類
比如UIForm、UIInput等等,具體請參考文檔。
組件呈現模型
不同的組件會有不同的呈現方式,同一個組件可能會有不同的呈現方式,比如UISelectOne,可以使用radio來呈現,也可以使用下拉框來呈現等。這些,都是通過呈現模型來定義的。
數據轉換模型
當一個組件綁定到一個對象上之后,對于組件數據來說,總共有兩個視圖:
一個是模型視圖:從這個角度去看,數據表現為java對象的類型,如int ,long,Date等等
一個是呈現視圖:從這個角度去看,數據表現為一種可以被人讀取或修改的形式。比如一個Date類型,可能被展現為一個yyyy-MM-dd格式的字符串,或者是三個字符串,分別代表年、月、日。
可以定義自己的轉換器來轉換數據。
事件與監聽器模型
事件:值改變事件、動作事件、數據模型事件。
值改變:比如輸入框的值被更改、選中了checkbox等
動作事件:點擊按鈕或超鏈接
數據模型事件:UIData組件的一行被選中的時候觸發這個事件。
導航模型
Navigation-rule,可以包含一個from-view-id和多個navigation-case
每個navigation-case中,主要包括轉向的頁面。
From-view-id : 當前頁面
From-action:從哪個action方法
From-outcome:從哪個邏輯名稱
To-view-id:轉向哪個頁面
安裝JSF:下載http://java.sun.com/j2ee/javaserverfaces/download.html
1、在Eclipse中添加JSF的支持:

不要選擇Install JSF Jars and packaged TLDS和Install JSF TLDs,因為我們要安裝的版本跟Eclipse支持的版本不一樣,我們用的是新的版本。在MyEclipse中添加支持的目的,是為了可以使用MyEclipse的頁面導航設計器,避免我們手工編寫頁面導航的繁瑣性。
點擊完成即可。
myEclipse添加了JSF的配置文件和修改了web.xml文件!
為了跟新版本的myfaces配合,我們最好將web.xml中關于myfaces的配置全部按照下面的說明重新配置一遍:
我們的例子以myfaces的實現包以及Tomahawk的擴展包作為學習JSF的起點。
依賴包可以在tomahawk-examples-1.1.6-bin/myfaces-example-blank-1.1.6.war中找到。
2、添加依賴包:

將依賴包拷貝到WEB-INF/lib下面,如果已經有的包,可以選擇覆蓋或不覆蓋,然后解決其中版本有沖突的包,將低版本的包去掉!
沖突的包主要包括:commons-collections,commons-fileupload,commons-lang,commons-logging
3、修改web.xml文件,添加如下內容:
l 指定配置文件的位置
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
l Tomahawk的過濾器,用于解釋那些擴展的功能
<filter>
<filter-name>extensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/*</url-pattern>
</filter-mapping>
l Myfaces的Servlet
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
4、在WEB-INF目錄下,添加faces-config.xml配置文件
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd" >
<faces-config>
</faces-config>
下一篇將結合MyEclipse對JSF的支持來開發JSF的程序。

<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
<filter>
<filter-name>extensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd" >
<faces-config>
</faces-config>