手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>Java技术>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

你不能在叠代主体的循环标记内部使用 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 标记。

上一篇: 你还在用if else吗
下一篇: 全世界所有程序员都会犯的错误-蔡学镛

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!