JSF中的条件问题

时间:2011-03-17 16:11:33

标签: jsf conditional ajax4jsf commandlink

我的代码如下:

<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 rendered =“#{show}”

3 个答案:

答案 0 :(得分:2)

在处理表单提交期间,JSF将重新评估是否已呈现命令按钮/链接。如果它没有渲染,那么它将简单地跳过该动作。

当JSF处理表单提交时,您需要确保表达式#{cartBean.itemsAdded}也返回true。一个简单的测试是将bean放在会话范围内(我假设isItemsAdded()是一个纯粹的getter,即它只包含return itemsAdded;)。

如果这确实解决了问题,并且您希望将bean保留在请求范围内,则添加<a4j:keepAlive>以在后续请求中保留bean属性。

<a4j:keepAlive beanName="#{cartBean}" />

另见:


与具体问题无关,您应该尽可能多地选择JSTL上的JSF标记/属性。在这种特殊情况下,您应该删除两个JSTL <c:>标记并使用JSF提供的rendered属性:

<h:form id="test1" rendered="#{cartBean.itemsAdded}">
    <h:commandLink action="#{cartBean.foo}">this doesn't work</h:commandLink>           
</h:form>

答案 1 :(得分:1)

<强> WORKARROUND

我不想使用sessionScope,因为在一个庞大的系统(我的情况)中使用它的危险。我不喜欢使用keepAlive更新,因为我在一个clutered服务器,许多属性不可序列化。

无论如何,我发现了这个问题:

  1. 在请求中发送参数(如show = true)
  2. 更改检查方法,添加 OR 作为回报以查看此新参数。

  3. MANAGED BEAN:

    <强>之前:

    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>
    

答案 2 :(得分:0)

改进(和微小)WORKARROUND:

仅更改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>