程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 在Java EE 6中使用JSF 2.0簡化頁面制作(1)

在Java EE 6中使用JSF 2.0簡化頁面制作(1)

編輯:J2EE

【51CTO精選譯文】過去幾個星期,51CTO對Java EE 6的新特性進行了一系列介紹。除了Servlet 3.0的特性,Java EE 6也使用了新的JSF 2.0標准。下面我們來看一看JSF 2.0是如何簡化頁面制作並提供AJax支持的。最後,我們對Servlet 3.0和JSF 2.0的新特性進行了總結。

簡化JSF 2.0頁面制作

JavaServer Faces技術提供了一個服務端組件框架,簡化了Java EE應用程序用戶界面的開發,其中最顯著的改進是頁面制作,通過使用標准的JavaServer Faces視圖聲明語言(JavaServer Faces VIEw Declaration Language,俗稱Facelets)創建一個JSF頁面更加容易。

Facelets

Facelets是一個強大的輕量級聲明語言,可以使用它展示一個JSF頁面,使用Facelets時,你可以使用Html風格的模板展示一個JSF頁面,也可以構建一個組件樹,JSF應用程序中的用戶界面通常是由JSF組件構成的JSF頁面,Facelets在JSP之上提供了更多優點。

在JSP中,Web頁面中的元素是按照漸進順序處理和渲染的,而JSF提供了它自己的處理和渲染順序,這可能會導致不可預測的行為發生,Facelets解決了這個問題,通過模板,Facelets也允許代碼復用,可以大大減少開發UI的時間,現在Facelets已經成為構建JSF應用程序的首選技術。

Facelets通常是使用XHtml標記語言編寫的,因此Facelets是可以跨不同開發平台的,下面是Java EE 6教材中提供的JSF頁面的Facelets XHtml代碼部分:

  1. <XML version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHtml 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
  4. <Html XMLns="http://www.w3.org/1999/xHtml" XML:lang="en" lang="en"
  5. XMLns:f="http://Java.sun.com/JSf/core"
  6. XMLns:h="http://Java.sun.com/JSf/Html"
  7. XMLns:ui="http://Java.sun.com/JSf/facelets">
  8. <head>
  9. <title>Guess Number JSF Application</title>
  10. </head>
  11. <body>
  12. <h:form>
  13. <h2>
  14. Hi. My name is Duke. I am thinking of a number from <b>
  15. <h:outputText value="#{UserNumberBean.minimum}"/> to
  16. &nbsp;&nbsp;<b>
  17. <h:outputText value="#{UserNumberBean.maximum}"/>.
  18. <p>
  19. Can you guess it ?
  20. </p>
  21. <h:graphicImage id="waveImg" url="/wave.med.gif" />
  22. <h:inputText id="userNo"
  23. value="#{UserNumberBean.userNumber}">
  24. converterMessage="#{ErrMsg.userNoConvert}">
  25. <f:validateLongRange
  26. minimum="#{UserNumberBean.minimum}"
  27. maximum="#{UserNumberBean.maximum}"/>
  28. </h:inputText>
  29. <h:commandButton id="submit"
  30. action="success" value="submit" />
  31. <h:message showSummary="true" showDetail="false"
  32. style="color: red;
  33. font-family: 'New Century Schoolbook', serif;
  34. font-style: oblique;
  35. text-decoration: overline"
  36. id="errors1"
  37. for="userNo"/>
  38. </h2>
  39. </h:form>
  40. </body>
  41. </Html>

頁面渲染效果如圖1所示。

使用Facelets創建的用戶界面
圖 1 使用Facelets創建的用戶界面

這個Facelets XHtml頁面和普通JSP頁面並沒有多大不同,Facelets支持JSF和JSTL標簽庫,它也包括一個Facelets標簽庫,支持功能豐富的頁面模板。命名空間聲明XMLns:ui="http://Java.sun.com/JSf/facelets"就是針對facelets標簽庫的,但這裡沒有使用facelets標簽庫的標簽,facelets也支持統一的表達式語言。

模板

使用模板,你可以創建一個頁面作為應用程序中其它頁面的模板,這樣可以避免多次創建結構類似的頁面,同時也可以統一應用程序中多個頁面的視覺風格。

Facelets標簽庫包括一個模板標簽<ui:insert>,為了實施模板化,首先創建一個包括<ui:insert>標簽的模板頁面,然後創建一個使用這個模板的客戶端頁面,在客戶端頁面中,使用<ui:composition>標簽指定模板,使用<ui:define>標簽指定插入到模板中的內容。

下面是一個模板頁面的內容:

  1. <XML version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHtml 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
  4. <Html XMLns="http://www.w3.org/1999/xHtml"
  5. XMLns:ui="http://Java.sun.com/JSf/facelets"
  6. XMLns:h="http://Java.sun.com/JSf/Html"
  7. <head>
  8. <title><ui:insert name="title">Page Title</ui:insert</title><body>
  9. </head>
  10. <body>
  11. <div>
  12. <ui:insert name="Links"/>
  13. </div>
  14. <div>
  15. <ui:insert name="Data"/>
  16. </div>
  17. </body>
  18. </Html>

下面是使用這個模板的客戶端頁面代碼:

  1. <XML version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHtml 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
  4. <Html XMLns="http://www.w3.org/1999/xHtml"
  5. XMLns:ui="http://Java.sun.com/JSf/facelets"
  6. XMLns:h="http://Java.sun.com/JSf/Html"
  7. <body>
  8. <ui:composition template="/template.xHtml">
  9. This text will not be displayed.
  10. <ui:define name="title">
  11. Welcome page
  12. </ui:define>
  13. <ui:define name="Links">
  14. ... [Links should be here]
  15. </ui:define>
  16. <ui:define name="Links">
  17. ... [Data should be here]
  18. </ui:define>
  19. </ui:composition>
  20. This text also will not be displayed.
  21. </body>
  22. </Html>

當客戶端調用這個模板時,它使用標題Welcome Page渲染這個頁面,這個頁面顯示了兩部分內容,一個顯示客戶端中指定的鏈接列表,另一個顯示客戶端中指定的數據。

混合組件

混合組件時JSF中的一個新特性,通過它創建自定義JSF組件會更加容易。你可以使用JSF頁面標記和其它JSF組件創建混合組件。在Facelets的標注下,任何XHtml頁面都可以變成一個混合組件。此外,混合組件可以有驗證器,轉換器和監聽器。

創建好混合組件後,你可以將它保存到庫中,以後有需要時就可以調用了。

讓我們創建一個渲染為登錄面板的混合組件,用戶登錄時,組件反饋一個登錄事件,如圖2所示。

登錄面板混合組件
圖 2 登錄面板混合組件

下面是混合組件的源代碼:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHtml 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
  3. <Html XMLns="http://www.w3.org/1999/xHtml"
  4. XMLns:h="http://Java.sun.com/JSf/Html"
  5. XMLns:f="http://Java.sun.com/JSf/core">
  6. XMLns:f="http://Java.sun.com/JSf/facelets">
  7. XMLns:composite="http://Java.sun.com/JSf/composite">
  8. <h:head>
  9. <title>This content will not be displayed in the rendered output</title>
  10. </h:head>
  11. <h:body>
  12. <composite:interface>
  13. <composite:actionSource name="loginEvent"/>
  14. </composite:interface>
  15. <composite:implementation>
  16. <table>
  17. <tr>
  18. <td>Username: <h:inputText id="username" /> </td>
  19. </tr>
  20. <tr>
  21. <td>PassWord: <h:inputSecret id="passWord" /></td>
  22. </tr>
  23. <tr>
  24. <td><h:commandButton value="Login" id="loginEvent" /></td>
  25. </tr>
  26. </table>
  27. </composite:implementation>
  28. </h:body>
  29. </Html>

XMLns:composite="http://Java.sun.com/JSf/composite"聲明了混合UI組件的命名空間,<composite:interface>標簽聲明混合組件的使用契約,<composite:attribute>標簽在使用契約中指定<composite:actionSource>標簽,這個表示組件可以暴露一個事件,讓使用這個混合組件的頁面可以輕松訪問它。
<composite:implementation>標簽定義了混合組件的實現,這裡的實現是一個簡單的表,它包括用戶名、密碼和登錄按鈕JSF組件。

為了讓混合組件可用,將代碼保存為XHTML文件,將文件放到應用程序根目錄下resources目錄的子目錄中即可。子目錄的名字可以采用包含混合組件的資源庫名字,JSF運行時通過向混合組件的標簽名後追加.xhtml後綴查找混合組件。例如,如果你將標簽命名為loginPanel,那麼保存為混合組件的文件名就是loginPanel.xHtml。然後你就可以在Web頁面中使用混合組件了,下面就是一個使用混合組件的Web頁面代碼示例:

  1. <!DOCTYPE Html
  2. PUBLIC "-//W3C//DTD XHtml 1.0 Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
  4. <Html XMLns="http://www.w3.org/1999/xHtml"
  5. XMLns:h="http://Java.sun.com/JSf/Html"
  6. XMLns:f="http://Java.sun.com/JSf/core"
  7. XMLns:ui="http://Java.sun.com/JSf/facelets"
  8. XMLns:ez="http://Java.sun.com/JSf/composite/ezcomp">
  9. <head>
  10. <title>Example 01>/title>
  11. <style type="text/CSS">
  12. .grayBox { padding: 8px; margin: 10px 0; border: 1px solid #CCC; background-color: #f9f9f9; }
  13. </style>
  14. </h:head>
  15. <h:body>
  16. <p>Usage of Login Panel Component</p>
  17. <ui:debug hotkey="p" rendered="true"/>
  18. <h:form>
  19. <div id="compositeComponent" class="grayBox" style="border: 1px solid #090;">
  20. <ez:loginPanel>
  21. <f:actionListener for="loginEvent" type="example01.LoginActionListener" />
  22. </ez:loginPanel>
  23. </div>
  24. <p><h:commandButton value="reload" /></p>
  25. <p><h:outputText value="#{loginActionMessage}" /></p>
  26. </h:form>
  27. </h:body>
  28. </Html>

注意聲明XMLns:ez="http://java.sun.com/jsf/composite/ezcomp",它指定了混合組件的命名空間和前綴,這裡的ezcomp是資源目錄的子目錄名,JSF使用下面的約定:所有命名空間URI都以http://Java.sun.com/JSf/composite/開頭,使用資源庫的名稱結束。

<f:actionListener>

標簽關聯混合組件的行為監聽器,標簽中的for屬性表示這個監聽器是為混合組件上名為loginEvent行為事件准備的,你需要編寫代碼來處理事件,例如:

  1. import Javax.faces.component.UIComponent;
  2. import Javax.faces.component.ValueHolder;
  3. import Javax.faces.context.FacesContext;
  4. import Javax.faces.event.AbortProcessingException;
  5. import Javax.faces.event.ActionEvent;
  6. import Javax.faces.event.ActionListener;
  7. public class LoginActionListener implements ActionListener {
  8. public void processAction(ActionEvent event) throws AbortProcessingException {
  9. FacesContext context = FacesContext.getCurrentInstance();
  10. context.getExternalContext().getRequestMap().put("loginActionMessage",
  11. "Login event happened");
  12. }
  13. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved