gpt4 book ai didi

java - JSF渲染: condition of EL statement incorrect

转载 作者:行者123 更新时间:2023-12-02 11:20:50 24 4
gpt4 key购买 nike

我的 JSF 渲染出现问题。表达式语言中的给定条件将不会以正确的方式执行。例如:

示例 1

<f:param name="cat" value="#{product.category.uri}" rendered="#{product.category.parent.uri == null}" />
<f:param name="cat" value="#{product.category.parent.uri}" rendered="#{product.category.parent.uri != null}" />

示例 2

<c:if test="#{product.category.parent.uri == null}">
<f:param name="cat" value="#{product.category.uri}" />
</c:if>

<c:if test="#{product.category.parent.uri != null}">
<f:param name="cat" value="#{product.category.parent.uri}" />
</c:if>

问题

在这两个示例中,我的两个参数都将添加到周围的 h:outputLink 中。我不确定要添加哪些其他代码,所以如果你们需要其他任何东西来帮助我,我很乐意提供。

提前致谢。

示例 3(根据要求)

<?xml version='1.0' encoding='UTF-8' ?>

<ui:composition template="./WEB-INF/templates/base.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:define name="content">
<c:choose>
<c:when test="#{webshop.productlist.size() > 0}">
<div id="spacer">
<ui:repeat value="#{webshop.productlist}" var="product">
<div id="block">
<p>
<h:outputLink value="product.xhtml">
#{product.name}
<c:choose>
<c:when test="#{product.category.parent.uri == null}">
<f:param name="cat" value="#{product.category.uri}" rendered="" />
</c:when>
<c:otherwise>
<f:param name="cat" value="#{product.category.parent.uri}" />
</c:otherwise>
</c:choose>
<f:param name="product" value="#{product.uri}" />
</h:outputLink>
</p>
</div>
</ui:repeat>
</div>
</c:when>

<c:otherwise>
(...)
</c:otherwise>
</c:choose>
</ui:define>
</ui:composition>

我已经稍微整理了一下这个例子,但本质就在那里。我已将第一个示例替换为“when/otherwise”结构,无论我的product.category.parent.uri 是否为空,在这种情况下它都会给出第一个结果。

最佳答案

您的核心问题是您完全混淆了 View 构建时间标记和 View 渲染时间标记。

View 构建时间是指将 XHTML 文件转换为 JSF 组件树的时刻,如 FacesContext#getViewRoot() 提供的那样。 。 View 渲染时间是 JSF 组件树即将生成 HTML 代码的时刻,由 UIViewRoot#encodeAll() 启动。 .

所有JSTL <c:xxx>标签和所有 JSF <ui:xxx>没有 rendered 的标签属性在 View 构建期间运行。所有 JSF <ui:xxx> 确实具有 rendered 的标签属性和所有 JSF <h:xxx>标签在 View 渲染期间运行。因此,它们不会像您期望的编码那样同步运行。

回到你的具体问题,这有两个方面:

  1. <f:param>作为标签处理程序,不支持 rendered根本没有属性。

  2. #{product}在您的代码中由 <ui:repeat var> 定义,这是一个 View 渲染时间标签,但您却试图让 JSTL <c:xxx>查看构建时间标签取决于此。这当然行不通。 #{product}null在 View 构建期间,仅仅因为 <ui:repeat>那一刻还没有运行。

您的具体问题只能通过使用 View 构建时间标签 <c:forEach> 来解决而不是 View 渲染时间标签 <ui:repeat>迭代产品。

<c:forEach items="#{webshop.productlist}" var="product">

另请参阅

<小时/>

与具体问题无关,以下是笨拙的 block

<c:choose>
<c:when test="#{product.category.parent.uri == null}">
<f:param name="cat" value="#{product.category.uri}" rendered="" />
</c:when>
<c:otherwise>
<f:param name="cat" value="#{product.category.parent.uri}" />
</c:otherwise>
</c:choose>

借助 EL 中的条件运算符,可以用以下更简单的方法替换:

<f:param name="cat" value="#{empty product.category.parent.uri ? product.category.uri : product.category.parent.uri}" />

这样您就必须能够继续使用 <ui:repeat> .

关于java - JSF渲染: condition of EL statement incorrect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12323058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com