和JSF一起使用JSTL和其它的JSP定制标记

2008-02-23 09:20:18来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

所有谈到的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.) 让我们从简单的例子开始 (显示在清单1) JSTL 标记和 JSF 标记混合和配合使用。代码引入了两个 JSF 标记库和核心 JSTL 标记库。

清单 1. 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>标记重复输出一个字符串。 代码在清单2列出。
清单2. 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>
...

警告: 如果你用 JSP 或 JSTL 表达式访问 managed beans, 你必须确保 beans 已经被创建,这是因为这些旧的表达式语言不知道JSF中的Managed Bean如何创建。这个例子中定义了一个叫exampleBean的JavaBean, 它有一个int类型的 number 属性。使用HtmlInputText 组件基于用户的输入更新bean的属性值。当用户点击Go! 按钮时 (一个 HtmlCommandButton 组件), 更新number属性的值并重新显示页面。 当这一切发生时, JSTL <c:forEach> 标记通过 JSTL <c:out> 标记重复显示文本 exampleBean.number 次。当exampleBean.number的值大于0时,<c:forEach> 标记才执行,这通过JSTL <c:if>进行测试。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:IBM实验室对SWT, Swing 和 AWT 的特征比较

下一篇:在Eclipse中使用Hibernate