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

不要選擇Install JSF Jars and packaged TLDS和Install JSF TLDs,因?yàn)槲覀円惭b的版本跟Eclipse支持的版本不一樣,我們用的是新的版本。在MyEclipse中添加支持的目的,是為了可以使用MyEclipse的頁面導(dǎo)航設(shè)計(jì)器,避免我們手工編寫頁面導(dǎo)航的繁瑣性。
點(diǎn)擊完成即可。
myEclipse添加了JSF的配置文件和修改了web.xml文件!
為了跟新版本的myfaces配合,我們最好將web.xml中關(guān)于myfaces的配置全部按照下面的說明重新配置一遍:
我們的例子以myfaces的實(shí)現(xiàn)包以及Tomahawk的擴(kuò)展包作為學(xué)習(xí)JSF的起點(diǎn)。
依賴包可以在tomahawk-examples-1.1.6-bin/myfaces-example-blank-1.1.6.war中找到。
2、添加依賴包:

將依賴包拷貝到WEB-INF/lib下面,如果已經(jīng)有的包,可以選擇覆蓋或不覆蓋,然后解決其中版本有沖突的包,將低版本的包去掉!
沖突的包主要包括:commons-collections,commons-fileupload,commons-lang,commons-logging
3、修改web.xml文件,添加如下內(nèi)容:
l 指定配置文件的位置
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
l Tomahawk的過濾器,用于解釋那些擴(kuò)展的功能
<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>
下一篇將結(jié)合MyEclipse對(duì)JSF的支持來開發(fā)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>