所有談到的JSF定制標記庫都是不錯的,但是,如果我有自己的定制標記,或有第三方的標記庫應該怎麼辦?或者我要使用JSP標准標記庫 (JSTL)?它是一組能做我們剛提到的所有事情的標記庫。在極大程度上,這些標記能與JSF標記混合使用。 Faces標記能在其它標記的內部嵌套使用,反之亦然。 一些產品,象IBM的 WebSphere Application Developer, 鼓勵這種方法。其它的如 Sun的 Java Creator Studio則選擇純的JSF標記,另一方面,Oracle的 JDeveloper 讓你混合和配合使用,但也鼓勵使用純JSF標記。
注意: 無論何時,你將JSF 標記嵌套在非JSF定制標記內時,你必須分派一個組件標識符到JSF 標記。 因為JSTL 是標准的並且許多人熟悉它,我們將用它示范如何將它與 JSF定制標記一起使用。 (如果你想全面了解JSTL, 請看 Shawn Bayern寫的一本極好的書, JSTL in Action.) 讓我們從簡單的例子開始 JSTL 標記和 JSF 標記混合和配合使用。代碼引入了兩個 JSF 標記庫和核心 JSTL 標記庫。
JSTL 標記與 JSF 標記混合使用
代碼內容
- <%@ taglib uri="http://Java.sun.com/JSf/core" prefix="f" %>
- <%@ taglib uri="http://Java.sun.com/JSf/Html" prefix="h" %>
- <%@ taglib uri="http://Java.sun.com/JStl/core" prefix="c" %>
- <Html>
- <head>
- <title>JSF in Action: JSTL Example 1 - Mixing JSF with other custom tags</title>
- </head>
- <body bgcolor="#FFFFFF">
- <f:vIEw>
- <h1>
- <h:outputText value="Example of using JSF tags with other custom tags"/>
- </h1>
- <p>
- <b>
- <c:out value="Here’s the value of your web.XML (don’t do this at home):"/>
- </b>
- <blockquote>
- <f:verbatim>
- <c:import url="WEB-INF/web.XML"/>
- </f:verbatim>
- </blockquote>
- </p>
- </f:vIEw>
- </body>
- </Html></code>
在這個例子裡, JSTL 和JSF 標記嵌套在 JSF標記 <f:view>內, <f:vIEw>定義了JSF組件樹的開始。這個例子使用了 JSF 的h標記 (<h:outputText>) 和JSTL <c:out> 標記顯示文本。 在這個頁面內,JSTL <c:import> 標記包含系統的 web.xml 文件 (這不是你想與其它人共享文件的正確方法,所以,不要在一台真實的服務器上這樣做). 因為 web.xml 是一個XML 文件, <c:import>標記要嵌套在<f:verbatim> 內, <f:verbatim>是一個 JSF UIOutput組件並且繪制時轉義XML元素,所以能在HTML頁內正確顯示。這個例子沒有太多的內容,但它示范了在同一頁面內不同的標記能一起使用。注意我們把JSTL 標記嵌套在 JSF <f:verbatim> 標記內,一般而言,它比將 JSF 標記嵌套在其它標記內容易。事實上,任何有子組件的組件如 HtmlDataTable和 HtmlPanelGrid需要將模板文本嵌套在一個<f:verbatim> 標記內。 JSTL 標記與 JSF 標記一起使用使JSF變得更強大,這兩者都使用類似的表達式語言。 (對 JSP 2.0’s 表達式也是如此l). 這允許你以一種直觀的方式在JSTL 和 JSF 標記間共享數據。 這裡舉例說明這一點,讓我們看另一個例子, 它允許用戶在 HtmlInputText 控件中輸入一個值,然後利用這個值用 JSTL <c:forEach>標記重復輸出一個字符串。
JSF 、JSTL 標記和同一個 backing bean
代碼內容
- <f:vIEw>
- <JSP:useBean class="org.jia.examples.TestForm" id="exampleBean" scope="session"/>
- <h1>
- <h:outputText value="Example of using JSF and JSTL expression languages"/>
- </h1>
- <h:form>
- <h:outputLabel for="inputInt">
- <h:outputText value="How many times do you want to repeat the Oracle’s prophecy?"/>
- </h:outputLabel>
- <h:inputText id="inputInt" value="#{sessionScope.exampleBean.number}"/>
- <h:commandButton value="Go!"/>
- <p>
- <c:if test="${sessionScope.exampleBean.number > 0}">
- <c:forEach begin="0" end="${sessionScope.exampleBean.number - 1}" var="count">
- Queen Tracey will achIEve world domination.<br>
- </c:forEach>
- </c:if>
- </p>
- </h:form>
- ...
- </f:vIEw>
- ...