JSF中的条件问题

| 我有下面的代码:
<c:set var=\"show\" value=\"#{cartBean.itemsAdded}\" />

<c:if test=\"${show}\">
    <h:form id=\"test1\">
        <h:commandLink action=\"#{cartBean.foo}\">this doesn\'t work</h:commandLink>           
    </h:form>
</c:if>

<h:form id=\"test2\">
    <h:commandLink action=\"#{cartBean.foo}\">this works!</h:commandLink>         
</h:form>
当show = false时,仅显示第二个链接。 而且有效。我可以访问服务器(我正在使用调试来查看此内容)。 当show = true时,两个链接都会出现。但只有第二个链接有效。条件内的链接不会触发服务器中的操作。 有人可以帮我吗? 注意:当我使用a4j:outputPanel rendering = \“#{show} \”时,也会发生相同的情况     
已邀请:
在处理表单提交期间,JSF将重新评估命令按钮/链接是否已呈现。如果未呈现,则将仅跳过该动作。 当JSF处理表单提交时,您需要确保表达式
#{cartBean.itemsAdded}
也返回
true
。一个简单的测试是将bean放入会话范围(并且我假设
isItemsAdded()
是纯获取器,即,它仅包含
return itemsAdded;
)。 如果这样做确实可以解决问题,并且您希望将Bean保留在请求范围内,则添加“ 5”以在后续请求中保留Bean属性。
<a4j:keepAlive beanName=\"#{cartBean}\" />
也可以看看: 未调用Commandlink 与具体问题无关,您应该尽可能地选择JSF标签/属性而不是JSTL标签/属性。在这种特殊情况下,您应该摆脱两个JSTL
<c:>
标记,而应使用JSF提供的
rendered
属性:
<h:form id=\"test1\" rendered=\"#{cartBean.itemsAdded}\">
    <h:commandLink action=\"#{cartBean.foo}\">this doesn\'t work</h:commandLink>           
</h:form>
    
解决方法: 我不想使用sessionScope,因为在大型系统(我的情况)中使用它的危险。我不喜欢使用keepAlive neighter,因为我位于混乱的服务器中,并且许多属性无法序列化。 无论如何,我找到了这个解决方法: 在请求中发送参数(例如show = true) 更改检查方法,添加一个OR作为返回以查看此新参数。 管理的豆: 之前:
public boolean itemsAdded() {
    return foo; // my initial check
}
后:
public HttpServletRequest getRequest() {
        return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
}

public boolean itemsAdded() {
    return foo || getRequest().getParameter(\"show\") != null;
}
XHTML: 之前:
<c:set var=\"show\" value=\"#{cartBean.itemsAdded}\" />
<c:if test=\"${show}\">
    <h:form id=\"test1\">
        <h:commandLink action=\"#{cartBean.foo}\">link</h:commandLink>           
    </h:form>
</c:if>
后:
<c:set var=\"show\" value=\"#{cartBean.itemsAdded}\" />
<c:if test=\"${show}\">
    <h:form id=\"test1\">
       <h:commandLink action=\"#{cartBean.foo}\">link
          <f:param name=\"show\" value=\"true\"/>
       </h:commandLink> 
    </h:form>
</c:if>
    
改进(且很小)的替代方法: 仅更改XHTML: 之前:
<c:if test=\"#{cartBean.itemsAdded}\">
    <h:form id=\"test1\">
        <h:commandLink action=\"#{cartBean.foo}\">link</h:commandLink>           
    </h:form>
</c:if>
后:
<c:if test=\"#{cartBean.itemsAdded || params[\'show\']}\">
    <h:form id=\"test1\">
       <h:commandLink action=\"#{cartBean.foo}\">link
          <f:param name=\"show\" value=\"true\"/>
       </h:commandLink> 
    </h:form>
</c:if>
    

要回复问题请先登录注册