分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-27
窄屏简体版  字體: |||超大  

所有谈到的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>进行测试。

你不能在叠代主体的循环标记内部使用 JSF 组件标记,象JSTL 的 <c:forEach>标记。 推荐的方法是使用 HtmlDataTable 组件或其它的组件叠代一个数据集或集合,在这个例子中,没有 JSF 组件 嵌套在 JSTL <c:if>标记内。 但是如果组件显示一次然后当页面再次显示时被条件标记(如 <c:if>)隐藏会发生什么呢? 第一次显示组件时,组件被添加到视图,第二次如果<c:if> 标记不显示组件, JSF 将从视图中删除它。意思就是任何输入控件会丢失他们的本地值,你不能再引用这些组件,举一个例子,看清单3, 它来自清单2的同一页.

清单 3. 用JSTL标记条件显示JSF 组件

代码内容

代码内容

...

<h:form>

<h:outputText value="If you entered a number greater than 10,

two input controls will display below."/>

<p>

<c:if test="${sessionScope.exampleBean.number > 10}">

<h:outputLabel id="inputStringLabel"for="inputString">

<h:outputText id="outputStringLabel" value="Enter in your string.

JSF will remember the value unless this control is hidden."/>

</h:outputLabel>

<h:inputText id="inputString"/>

<h:commandButton value="Go!"/>

</c:if>

</p>

</h:form>

...

如果

exampleBean.number的值比10大, JSTL <c:if> 标记将会执行它的主体。如果主体被执行,那么所有嵌套其中的组件将增加到视图并显示。 如果没有执行,组件将会删除 (如果先前已增加). 这显示在图1. 如果你用JSTL 条件标记(或其它的定制标记)控制组件的可见性。如果它们没有显示,组件将被从视图中移走。这意思是说组件会忘记他们的本地值。

Figure 1. The JSTL <c:if> tag will execute its body if the value of exampleBean.number is greater than 10. Click on thumbnail to view full-sized image.

图 2 显示了清单2和清单3的输出。顶部输入域(一个 HtmlInputText 组件)的值关联到了 exampleBean.number的属性, JSTL <c:forEach>使用它显示一个字符串exampleBean.number次,在页面底部,如果exampleBean.number的值大于10, JSTL <c:if>标记显示一个带有JSF组件的表格。 否由,组件将不会显示, 并从视图中移出 (输入控件将丢失它的值).

Figure 2. The output of the JSP page shown in Listings 2 and 3. Click on thumbnail to view full-sized image.

你能达到清单3中代码同样的效果,通过把组件放入一个 HtmlPanelGroup 并设置它的 rendered 属性等于同样的表达式。 HtmlPanelGroup 可以作为多个组件的容器,下面是例子: 代码内容

代码内容

<h:panelGroup rendered="#{sessionScope.exampleBean.number > 10}">

<h:outputLabel id="inputStringLabel2" for="inputString">

<h:outputText id="outputStringLabel2" value="Enter in your string. JSF

will remember the value."/>

</h:outputLabel>

<h:inputText id="inputString2"/>

<h:commandButton value="Go!"/>

</h:panelGroup>

如果exampleBean.number 大于10,这个面板变得可见。在这种情况下,如果组件没有显示也不会删除。这是一个使用纯JSF而不用JSTL的好例子。

Tip: 即使你使用JSTL提供一个有很多功能的定制标记,如果你从零开始开发 (或重做), 你应当首先看看用标准的JSF组件能否实现你想要的行为。使用好的组件和设计良好的backing beans, 在页面中能消除很多JSTL标记。使用标准的JSF,你能显示或隐藏面板和做各种各样的有强大功能的事情。 下面是几个可以让JSF标记和JSTL国际化、格式化标记协同工作的条件:

不推荐使用<fmt:parseDate>和<fmt:parseNumber> . 你应该使用一个带有的日期或数字转换器的HtmlInputText 组件。

不应该使用<fmt:requestEncoding>标记指定页面的字符编码,通常, JSF自动处理。如果你要强迫用特殊的字符编码, 你应该用JSP页面指示:

代码内容

<%page contentType="[contenttype];[charset]"%>.

也不应该使用<fmt:setLocale> 标记,因为它不知道, 它可能引起你的JSTL标记使用一个地区而你的JSF组件使用另一个, 代替这种灾难发生的处方是,你应该使用JSF的国际化特性。为了控制特殊页面的场所,使用UIViewRoot 组件的locale 属性。 JSF的国际化特性能在JSF和JSTL两者中工作。

结合JSF和JSTL能变得十分强大。 在这里我们示范了你的定制标记或从第三方获取的标记与JSF、JSTL一起工作。 通常,当可能时,你应该尽可能地使用JSF 标记。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有