1. 簡介
- JSF技術是Sun公司在2004年發布的用于開發Web應用的框架。當前版本是2.2,由JSR344規范定義。它是Java EE 7推薦的Web標準框架。Mojarra(https://javaserverfaces.java.net/)是Oracle官方采用的JSF的參考實現,其他的參考實現還有Apache基金的MyFaces(http://http://myfaces.apache.org/)。
- 受到Sturts、Tapestry等開源框架的影響,JSF是采用了MVC架構。
- 受到Swing組件模型的啟發,JSF使得開發人員從組件、事件、模型的角度開發web應用,而不用再管http請求和響應等背后的事情。
2. Hello JSF
- 環境:JDK7 or JDK8 + Netbeans 8 + Glassfish 4
- 開發過程:
- 新建Java Web項目,選擇Web應用程序
- 輸入項目名稱hello-jsf
- 修改上下文路徑為hellojsf
- 選擇JavaServer Faces框架,然后點擊下面的配置標簽,確認使用的頁面語言為Facelets
- 點擊完成
- 右擊hello-jsf項目,選擇運行,Netbeans會自動啟動Glassfish服務器并部署項目,啟動完畢后會自動打開瀏覽器,并顯示Hello from Facelets,該頁面的地址為localhost:8080/hellojsf
- 添加功能
- 將index.xhtml中的Hello from Facelets修改為Hello #{user.name}
- 創建User類,代碼如下:
-
package teaching.jsf;import javax.annotation.PreDestroy; import javax.enterprise.context.RequestScoped; import javax.inject.Named;@Named //等價于@Named("user") @RequestScoped public class User {private String name = "JSF";public String getName() {return name;} }
?
-
?保存代碼后,Glassfish會對項目進行增量部署,或者你也可以再次運行項目。
- 打開瀏覽器,輸入localhost:8080/hellojsf,你將可以看到:Hello JSF
- 代碼解釋
- #{user.name}是一個EL表達式,用于或取user bean的name屬性。
- User類是一個CDI bean,它具備了CDI bean的一些特征:
- Name為user,用來匹配頁面中出現的EL表達式,如#{user.name}。默認情況下,Name為bean類的首字母小寫后對應的名字,也可以通過@Named("myUser")來指定,這樣頁面中的EL表達式就要寫成#{myUser.name}。
- Scope為RequestScoped,表示服務器端的Web容器會在接收到http請求后,根據#{user.name}創建一個User實例,獲取其name屬性的值,生成html頁面并發出http響應,然后銷毀該user實例。
- 項目配置文件
- web.xml: 此項目的部署文件。為了使用JSF,必須聲明一個類型為javax.faces.webapp.FacesServlet的Servlet,具體代碼請參見web.xml。
- 注意Faces Servlet的url-pattern為/faces/*,這樣FacesServlet只接收來自匹配/faces/*的頁面請求,也可以替換為*.xhtml、*.jsf或其他模式,但不能為/*或*。另外,faces只是個前綴,并不是物理文件夾。例如,在訪問根據目錄下的index.xhtml頁面時,其對應的url為http://.../hellojsf/faces/index.xhtml,而不是http://.../hellojsf/index.xhtml。
- 在web.xml中,還可以指定一個PROJECT_STAGE參數,表示你當前項目的狀態。如果為Development,當出現錯誤時,JSF為顯示更加詳細的調試信息。當項目真正部署時,可以將此參數改為Production。
- glassfish-web.xml: 定義與應用服務器相關的一些參數。在本例中,我們通過<context-root>指定項目根目錄的名稱。此文件由Netbeans自動生成,一般情況下不用修改。
- web.xml: 此項目的部署文件。為了使用JSF,必須聲明一個類型為javax.faces.webapp.FacesServlet的Servlet,具體代碼請參見web.xml。
3. 總結
- 通過例1,我們可以知道JSF的工作原理:
- 在服務器啟動時,會啟動一個Faces Servlet用來攔截用戶請求。
- 當我們請求index.xhtml頁面時,相應的Http請求就會被FacesServlet所攔截,它會對此請求進行若干處理,其中一步就是創建一個User實例,并獲取其name屬性的值。處理結束后,生成對應的html頁面,返回給客戶端。然后銷毀此User實例,因為其Scope為RequestScoped。當收到Http請求時被創建,當發送Http響應后被銷毀,這就是User對象的生命周期。
- 客戶端(瀏覽器)接受由服務器端返回的Http響應并顯示。
- JSF是一個采用MVC架構的框架。在例1中,index.xhtml充當V的角色,FacesServlet充當C的角色,而User則充當M的角色。這三種角色劃分得非常清楚,沒有一點耦合。
?