Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 有条件地设置ui:param_Jsf 2_Primefaces_Facelets - Fatal编程技术网

Jsf 2 有条件地设置ui:param

Jsf 2 有条件地设置ui:param,jsf-2,primefaces,facelets,Jsf 2,Primefaces,Facelets,我想根据bean值设置ui:param,我认为使用c:if是个好主意。因此,我在页面中输入了以下代码: <ui:composition 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" xmln

我想根据bean值设置ui:param,我认为使用c:if是个好主意。因此,我在页面中输入了以下代码:

<ui:composition 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"
    xmlns:wai="http://www.id.ethz.ch/wai/jsf"
    template="/view/listView.xhtml">

        <c:if test="#{subscriptionListController.model.listViewName eq 'mySubscriptions'}">
         <ui:param name="title" value="#{msg.subscriptionTitleMySubscriptions}"/>
        </c:if>
        <c:if test="#{subscriptionListController.model.listViewName eq 'paidSubscriptions'}">
         <ui:param name="title" value="#{msg.subscriptionTitlePaidSubscriptions}"/>
        </c:if>
        <c:if test="#{subscriptionListController.model.listViewName eq 'allSubscriptions'}">
         <ui:param name="title" value="#{msg.subscriptionTitleAllSubscriptions}"/>
        </c:if>
        ....
它成功了。但现在我有了更多的可能性


我做错了什么?

您正在将JSTL与Facelets一起使用。JSTL在视图构建期间执行,而不是在渲染阶段。此外,在JSF2库中处理它们也存在一些问题——比如在旧的Mojarra版本中,它们不能在视图范围的bean上使用部分状态保存(请参阅)。这就是为什么你的EL表达式有效

解决方案是避免JSTL-使用ui:repeat代替c:forEach和EL表达式,使用条件呈现代替c:if。

所示,此页面表示模板客户端

任何
之外的
都应用于主模板(您在
模板
属性中声明的文件),并且在模板客户端内部被忽略。如果要在模板客户端内部准备变量,则应将
放入
内部

但是还有另一件事:
的最初目的是将变量传递给
引用的文件,而不是在当前facelet上下文中准备/设置变量。对于在当前EL上下文中准备/设置变量的唯一功能需求,您最好使用JSTL
进行作业。您可以使用
来实现这一点,但这并不是它的初衷,在较旧的MyFaces版本中也不适用

因此,因此:

<ui:define>
    <c:if test="#{subscriptionListController.model.listViewName eq 'mySubscriptions'}">
        <c:set var="title" value="#{msg.subscriptionTitleMySubscriptions}"/>
    </c:if>
    <c:if test="#{subscriptionListController.model.listViewName eq 'paidSubscriptions'}">
        <c:set var="title" value="#{msg.subscriptionTitlePaidSubscriptions}"/>
    </c:if>
    <c:if test="#{subscriptionListController.model.listViewName eq 'allSubscriptions'}">
        <c:set var="title" value="#{msg.subscriptionTitleAllSubscriptions}"/>
    </c:if>
    ...
</ui:define>

谢谢您的解释,但是我如何使用ui:param的条件呈现?@Francesco primefaces组件,以及ui:fragment具有“呈现”属性,它采用EL表达式。好的,我看到ui:param也具有呈现属性(我没想到…)嗯,现在我有了
(三次用于不同的可能性),但它不起作用。现在,这三个选项中的最后一个总是被选择的……我还尝试指定true、false、false而不是检查EL,但是尽管最后一个选项是false,但它是“呈现”的选项,您不清楚它究竟何时工作/失败。
看起来不错,但是
完全放错地方了。它属于一个
。此外,代码似乎不完整,这似乎是一个模板客户端,但我没有看到
。您知道Facelets会忽略
之外的任何内容吗?因为
在那里(请参见代码的第一行),所以不应该忽略它。我删除了
并添加了
c:if
。但它仍然不起作用。。。如前所述,使用三元运算符并没有问题,但使用
c:if
nope。。。(我编辑了我的代码,因为标题的值是错误的)@BalusC Ok,下面定义了
。我把
c:if
代码移到了那里,现在它工作了!但你现在能解释一下为什么要用燕鸥吗。尽管在
之外,操作仍然有效?除此之外,我还有其他的
ui:param
定义在它的外部(就在
c:if
的下方),它们可以工作…@BalusC你能把你的评论放到一个答案中,这样我就可以接受它吗?“…反过来在技术上是错误的,只适用于莫哈拉,但不适用于MyFaces…”这不是真的。相反,情况恰恰相反。这是一个关于Loooonnnggg的故事,但我已经把原因写进了。最近,它在2.2.x分支中添加了一个标志来启用旧的行为。ui:param仅当是ui:include、ui:decoration或ui:composition的直接子级时有效,但这些参数在目标模板的上下文中可用。在c:if中使用它们是个坏主意。@lu:顺便说一下,我也同意我们应该真正保留
。它在固定范围(请求/视图/会话/应用程序)中存储评估值的能力非常值得赞赏。
不支持它(每次访问时都会重新计算表达式),而且标记名“param”本身并不是真正的自我记录“在EL上下文中设置变量”的功能要求。c:set确实非常有用。我们在MyFaces中所做的是修复c:set,使其在没有像JSP中那样设置范围时使用页面范围,并创建一个“模板上下文”来存储ui:param变量。c:set和ui:param仍然依赖于EL-VariableMapper工具,并被视为构建视图时间标记。如果没有此修复,一些优化(如EL缓存)将无法正确完成。真的ui:param是一个标记,用于将参数作为EL表达式传递给模板。
<ui:define>
    <c:if test="#{subscriptionListController.model.listViewName eq 'mySubscriptions'}">
        <c:set var="title" value="#{msg.subscriptionTitleMySubscriptions}"/>
    </c:if>
    <c:if test="#{subscriptionListController.model.listViewName eq 'paidSubscriptions'}">
        <c:set var="title" value="#{msg.subscriptionTitlePaidSubscriptions}"/>
    </c:if>
    <c:if test="#{subscriptionListController.model.listViewName eq 'allSubscriptions'}">
        <c:set var="title" value="#{msg.subscriptionTitleAllSubscriptions}"/>
    </c:if>
    ...
</ui:define>
<ui:define>
    <c:set var="subscriptionTitleKey" value="subscriptionTitle.#{subscriptionListController.model.listViewName}">
    <c:set var="title" value="#{msg[subscriptionTitleKey]}"/>
    ...
</ui:define>