摘 要: JavaServer Faces的工作原理及運用JSF開發Web應用程序的一個簡單實例。
關鍵詞: JSF技術 MVC模式 JSP技術 Web應用程序
JSF(Java Server Faces)是SUN公司為了方便Web應用程序的設計,使應用程序邏輯設計和界面設計脫耦而提出的一種用戶界面程序框架(UI Framework)。它包括一組API和二個自定義標記庫,用于UI組件的表示、組件狀態的管理、客戶端事件的處理、輸入的驗證以及頁面導航的管理等。與傳統的Servlet和JSP技術相比,JSF能使Web應用程序在UI的開發上更具擴充性和維護性,它有助于Web應用程序的開發人員角色分離。JSF1.0已經被SUN公司納入到最新的J2EE1.4 SDK中。
1 JSF出現的背景和技術優勢
使用Java開發Web應用程序經歷了幾個發展階段。一開始是使用Servlet,直接利用request和response對象接收和響應客戶端的請求。Servlet的一個顯著缺點是需要在Java代碼中嵌入大量的標記語言(如HTML),處理邏輯和顯示邏輯嚴重耦合,非常不利于程序的維護和界面的設計。基于這種情況,SUN又發展了JSP技術。與Servlet正好相反,JSP是在標記語言中嵌入Java代碼,但它仍沒有實現Web開發角色的分離,美工設計人員仍然要在一堆混雜腳本、標記和Java程序的代碼中工作,不利于程序的維護。后來,JSP加入了Tab library機制,鼓勵開發人員使用自定義標簽封裝業務邏輯,JSP頁面盡可能只出現各種標簽。大量自定義JSP標簽的出現,并經過SUN公司的標準化后,形成了JSTL(Java Standard Tab Library)。JSTL技術基本實現了頁面邏輯和顯示邏輯的脫耦,方便了Web的各種開發人員。隨著Web應用程序規模的不斷擴大,MVC-Model2體系的概念越來越適用于Web應用程序的開發。經過大量實踐的檢驗,它已經成為最適合開發Web應用程序的模板。
遵循MVC-Model2架構開發的應用程序框架(Framework)已有不少,例如當今比較流行的Struts、Tapestry、Turbine等。JSF的出現并不是要代替這些框架,相反,由于技術的著重點不同,JSF可以和這些Framework很好地協同工作。JSF基于JSTL技術,著力于解決現有框架不能完成的難題,例如View和Model無法實現完全脫耦、客戶端種類繁多等。JSF是真正徹底的MVC(Model View Controller),圖1為JSF的MVC架構。
JSF的技術重點在View部分,它實現了Web應用程序設計角色的完全分離。JSF網頁設計者只需要專注于頁面的設計;應用程序開發者主要關心Model部分的JavaBean的開發,例如連接JNDI、進行數據持久化或調用EJB等;程序的流程控制則由faces-config.xml專門配置。
JSF還可以根據不同的客戶端標記語言做相應的調整,例如HTML、XUL、XMLForm、Xforms和WML等,使Web應用程序能在最小的改動下適應不同的客戶端類型,如圖2所示。
其中JSF Core Library負責基本程序的運行,包括程序運行生命期控制、事件處理等。RenderKit把服務器端的UI組件轉化成任何一種使用者界面標準,支持眾多的標記語言。
圖3為一個JSF網頁的生命周期。只有送給java.faces.webap.FacesServlet控制器的HTTP請求才進入這個生命周期。在階段1,系統根據JSF網頁的內容建立一個組件樹,根據組件樹中每個組件的設定將對應的轉換器(Converter)、驗證器(Validator)以及事件處理函數(Event Handler)與特定組件關聯,在階段2中系統根據HTTP request的參數一一調用這些組件;然后分別在階段3、4和5中執行參數驗證、模型更新和事件處理;最后系統調用組件相應的方法將它們轉化成適當的標簽(HTML或者WML等)送到客戶端。
2 JSF應用的一個簡單實例
本例展現了使用JSF框架設計Web應用程序的步驟。程序功能是讓用戶在瀏覽器中輸入用戶名和密碼登錄,系統執行驗證后返回登錄結果。關于基于JSF的詳細開發,可以參考文獻[3]和文獻[4]。
2.1 視圖設計
視圖(View)部分包括login.jsp和response.jsp文件。前者是一個可以讓用戶輸入登錄名、密碼進行登錄的頁面,后者用于返回用戶的登錄結果。所有的JSP文件都要加入以下二行,以引入JSF的自定義標記庫:
<%@ taglib uri=″http://java.sun.com/jsf/html″prefix=″h″%>
<%@ taglib uri=″http://java.sun.com/jsf/core″prefix=″f″%>
其中login.jsp文件的主要代碼如下:
<f:view>
<h:form id=″loginform″>
<h2>Please enter your username and password</h2>
username:
<h:inputText id=″input_username″value=″#{userBean.username}″required=″true″/></br><!--把輸入的信息放入模型(javabean)--!>
<h:message for=″input_username″/></br>
password:
<h:inputSecret id=″input_password″value=″#{userBean.password}″required=″true″>
<f:validateLength minimum=″6″/> <!--這是一個JSF內置的驗證器,用于校驗輸入的合法性,這里不允許用戶輸入低于6位長度的密碼--!>
</h:inputSecret></br>
<h:message for=″input_password″/></br><!--在這里顯示校驗出錯信息--!>
<h:commandButton id=″submit″action=″go″value=″Submit″/><!--在faces-config.xml文件中定義go行為的處理--!>
</h:form>
</f:view>
注釋部分說明了View是如何與Model和Controller關聯的。
2.2 模型設計
JSF的模型主要用JavaBean來實現,這里定義了一個ValUser.java作為JavaBean,用于存儲和處理頁面傳送的信息。
package myjsf;
public class ValUser{
public ValUser( ) { }
String username=null;
String password=null;
//此處省略bean屬性username和password的getter
//和setter方法
// ……
String resultMessage=null;
public String getResultMessage( )//返回登錄結果
{
if (isValid( ))
this.resultMessage=″valid user,welcome″;
else
this.resultMessage=″invalid user,please login again″;
return this.resultMessage;
}
public void setResultMessage(String resultMessage)
{ }
private boolean isValid( )//檢驗用戶名密碼是否合法
{
if (this.password.trim( ).equals(″123456″))
return true;
else
return false;
}
}
為了方便說明,這里簡單地定義用戶輸入123456就是合法登錄。實際應用中,應該使用JDBC或其他技術從數據持久層獲取該用戶的密碼進行驗證。這個JavaBean定義了三個屬性,其中username和password從login.jsp中獲取值,resultMessage用于向response.jsp頁面反饋登錄結果。
2.3 控制器設計和配置文件
JSF的控制器設計是在配置文件中完成的。首先需要配置Web應用程序的web.xml文件,加入以下內容:
<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>/login/*</url-pattern>
</servlet-mapping>
以上內容表示只有對相對路徑在login下的頁面請求才交給JSF控制器處理,其他請求則不經過該控制器(圖3)。JSF本身的控制文件是faces-config.xml,其中的navigation-rule節點定義了頁面跳轉流程控制,managed-bean節點定義了JavaBean的信息等,這里不再詳述。
3 結 論
JSF框架較好地貫徹了MVC-Model2設計體系的思想,使頁面表示和商業邏輯脫耦,讓各類Web應用程序開發角色實現真正的各司其職。同時,JSF支持不同的客戶端應用,使Web應用程序可以很容易地適應不同的客戶端訪問協議。JSF比較適合開發大型的Web應用程序。由于配置過程比較繁瑣,待支持JSF的集成開發工具或插件發展成熟時,開發基于JSF的Web應用程序將會變得十分輕松和自然。
參考文獻
1 Sun Microsystems.JavaServer Faces Technology Overview. http://java.sun.com/j2ee/javaserverfaces/
2 Gamma E,Helm R,Johnson R et al.Design Patterns:Elements of Reusable Object-Oriented Software.Addison Wesley,1995
3 Sun Microsystems.JavaServer Faces in The J2EE 1.4 Tutorial.http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSFIntro. html
4 Bergsten H.JavaServer Faces.O′Reilly&Associates,2004