所有谈到的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>
- ...
【编辑推荐】