当前位置: 首页 > 面试题库 >

将JSF标签与JSTL标签混合会产生奇怪的结果

晋涛
2023-03-14
问题内容

我有这段代码:

 <c:if test="#{utils.getCounterOfCharOccurence(hideTypes, ';') != 0}">
   <ui:repeat value="#{document.instanceList}" var="instance">
    <c:set var="columnRendered" value="true"></c:set>
    <c:forEach items="${hideTypes.split(';')}"
               var="hideType">
     <h:outputText value="#{hideType eq instance.documentInstanceType.mimeType}"/>
     <c:if test="#{hideType eq instance.documentInstanceType.mimeType}">
      <c:set var="columnRendered" value="false"></c:set>
      <h:outputText value="#{columnRendered}|"/>
     </c:if>
    </c:forEach>
    <a:outputPanel rendered="#{columnRendered == 'true'}">
     <up:mimeTypeIcon type="#{instance.documentInstanceType.mimeType}"
                      icon="#{instance.documentInstanceType.iconPath}"
                      key="#{instance.instanceKey}" referenced="false"/>
    </a:outputPanel>
   </ui:repeat>

  </c:if>

如您所见,我仅在columnRendered为true时才渲染该outputPanel。

好吧,在某些情况下(仅用于测试以批准其应做的事情):

<h:outputText value="#{hideType eq instance.documentInstanceType.mimeType}"/>

为true,因此应在c:if中输入,并将columnRendered切换为false。但是事实并非如此,因此columnRendered永远是正确的…

你知道为什么吗?


问题答案:

JSF和JSTL不会像您期望的那样同步运行。JSTL在视图的构建期间(要填充JSF组件树)运行,而JSF在视图的组件树的呈现期间(要生成HTML输出)运行。您可以将其可视化如下:JSTL首先从上到下运行,然后将结果交给JSF,后者又从上到下运行。

在您的特定情况下,该对象instance永远不会出现在JSTL中。

代替c:forEach,应该使用ui:repeat,而不是c:if使用JSF组件的rendered属性。我想重写代码,但是的用法hideTypes很乱。而是将其转换List<String>为模型中的,使用纯JSF会更加容易。这是一个假设hideTypes为的启动示例List<String>

<h:panelGroup rendered="#{not empty hideTypes}">
    <ui:repeat value="#{document.instanceList}" var="instance">
        <a:outputPanel rendered="#{!hideTypes.contains(instance.documentInstanceType.mimeType)}">
            <up:mimeTypeIcon type="#{instance.documentInstanceType.mimeType}"
                icon="#{instance.documentInstanceType.iconPath}"
                key="#{instance.instanceKey}" referenced="false"/>
        </a:outputPanel>
     </ui:repeat>
<h:panelGroup>


 类似资料:
  • JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。 根据JSTL标签所提供的功能,可以将其分为5个类别。 核心标签 格式化标签 SQL 标签 XML 标签 JSTL 函数 JSTL 库安装 Apache To

  • 主要内容:标签属性,实例,运行测试标签用于将字符串值转换为所需格式的数量。以下代码显示如何使用标签 标签属性 属性 描述 type 数字(默认),货币或百分比 pattern 格式化模式,如在中定义的 maxFractionDigits 小数部分中的最大位数 minFractionDigits 小数部分中的最小位数 maxIntegerDigits 整数部分的最大位数 minIntegerDigits 整数部分的最小位数 inte

  • 主要内容:实例,运行测试标签向一个将属性设置为给定值的组件添加了一个。 以下代码显示如何使用标签。 实例 以下是文件:UserBean.java 中的代码。 以下是文件:index.xhtml 中的代码 - 以下是文件:result.xhtml 中的代码 - 运行测试 打开 NetBeans 创建一个名称为: setPropertyActionListener 的Web工程,并使用上面文件代码。运行项目,打开浏览器访问以

  • 主要内容:实例,运行测试可以使用标签通过动作侦听器将属性值传递给组件,或将参数传递给组件。 以下代码显示如何使用标签。 实例 以下是文件:UserBean.java 中的代码。 以下是文件:index.xhtml 中的代码 - 以下是文件:result.xhtml 中的代码 - 运行测试 打开 NetBeans 创建一个名称为: Attribute 的Web工程,并使用上面文件代码。运行项目,打开浏览器访问以下网址: 如

  • 主要内容:标签属性,示例,运行项目AJAX代表异步JavaScript和Xml。 这是一种使用JavaScript的HTTPXMLObject技术来将数据发送到服务器并从服务器异步接收数据。 在Ajax中,Javascript代码与服务器交换数据,更新网页的部分,而无需重新加载整个页面。 JSF支持使用标签进行Ajax调用。 下面显示了一个简单的JSF标签。 标签属性 属性 说明 disabled 如果为,则Ajax行为将应用于任

  • 主要内容:实例,运行项目它用于显示特定组件的单个消息。您可以通过将该组件的传递给属性来显示您的自定义消息。 以下JSF标签 - 如果输入超过20个字符时提示 - 如果输入小于个字符时提示 - 如果输入字段未输入时提示 - JSF 标签的属性 标签 描述 for 它是用于分配组件ID的强制性标签,因为该消息是组成的。 errorClass 它用于将CSS样式类应用于严重性类为“”的任何消息。 errorStyle 它用于将