gpt4 book ai didi

jsf - 使用 inside Facelets tags 的 EL 变量

转载 作者:行者123 更新时间:2023-12-04 18:37:24 25 4
gpt4 key购买 nike

我有一个 Home .每个Home有一个列表 Room s。每个Room有零个或多个 Person s。

我想计算每个家庭的总人数。但是我无法添加新变量来记录任何支持 bean 或实体中的人数。所以我只想通过 <c:set> 在 View 中计算它.

我的第一次尝试看起来像:

<c:set var="personCount" value="${0}" />
<ui:repeat var="home" value="#{mybackingBean.homes}">
<ui:repeat var="room" value="#{home.rooms}">
${personCount += room.persons.size()}
</ui:repeat>
<h:panelGrid columns="2">
<h:outputLabel value="#{home.id}" />
<h:outputLabel value="#{personCount}" />
</h:panelGrid>
</ui:repeat>

我怎样才能实现它?

最佳答案

有几个错误。

第一的,

${personCount += room.persons.size()}

在EL中, +=string concatenation operator .所以,这基本上会给你 String.valueOf(personCount) + String.valueOf(size) 的结果.如果计数初始化为 0还有 3人,那么这将打印 03 .

你基本上想重新分配 personCount + size 的结果回到变量 personCount .您需要使用 <c:set> 重新设置变量如下。
<c:set var="personCount" value="${personCount + room.persons.size()}" />

第二,
<c:set var="personCount" value="${0}" />
<[for each home]>
<[for each room]>
<c:set var="personCount" value="${personCount + room.persons.size()}" />
personCount0 初始化在两次迭代之外。因此,对于每个家庭,您也将以此方式计算所有先前家庭的人数。您想在第一次迭代中声明它。
<[for each home]>
<c:set var="personCount" value="${0}" />
<[for each room]>
<c:set var="personCount" value="${personCount + room.persons.size()}" />

这与 EL 无关。这只是一个逻辑错误,它也会在“普通的”Java 中导致同样的问题。

第三,

JSTL 标签如 <c:set>在 View 构建期间运行(在从 XHTML 模板到 JSF 组件树的转换期间)。 JSF 组件如 <ui:repeat>在 View 呈现期间运行(在从 JSF 组件树转换为 HTML 输出期间)。所以, <c:set><ui:repeat> 期间不运行迭代。因此,它看不到迭代变量 var .您基本上还需要在 View 构建期间进行迭代。您可以使用 JSTL <c:forEach>为了这。

因此,总而言之,您的意图解决方案如下所示:
<c:forEach items="#{bean.homes}" var="home">
<c:set var="personCount" value="${0}" />
<c:forEach items="#{home.rooms}" var="room">
<c:set var="personCount" value="${personCount + room.persons.size()}" />
</c:forEach>

<h:panelGrid columns="2">
<h:outputLabel value="#{home.id}" />
<h:outputLabel value="#{personCount}" />
</h:panelGrid>
</c:forEach>

更深入的解释,另见 JSTL in JSF2 Facelets... makes sense?

然而,作为 +=运算符显然不会在您的情况下导致 EL 异常,这意味着您已经在使用 EL 3.0。这反过来意味着您可以使用新的 EL 3.0 lambda and stream features .
<ui:repeat value="#{bean.homes}" var="home">
<h:panelGrid columns="2">
<h:outputLabel value="#{home.id}" />
<h:outputLabel value="#{home.rooms.stream().map(room -> room.persons.size()).sum()}" />
</h:panelGrid>
</ui:repeat>

不再需要计数循环。不,这不需要 Java 8,它在 Java 7 上也能正常工作。

关于jsf - 使用 <c :set> inside Facelets <ui:repeat> tags 的 EL 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32390021/

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