繁体   English   中英

JSF中的条件问题

[英]Problems with conditionals in 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时,仅显示第二个链接。 而且有效。 我可以访问服务器(我正在使用debug进行查看)。

当show = true时,两个链接都会出现。 但只有第二个链接有效。 条件内的链接不会触发服务器中的操作。

有人可以帮我吗?

注意:当我使用a4j:outputPanel rendering =“#{show}”时, 也会发生相同的情况

在处理表单提交期间,JSF将重新评估命令按钮/链接是否已呈现。 如果未呈现,则将仅跳过该动作。

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

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

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

也可以看看:


与具体问题无关,您应该尽可能地选择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,因为我位于混乱的服务器中,并且许多属性无法序列化。

无论如何,我发现了这个解决方法:

  1. 在请求中发送参数(例如show = true)
  2. 更改检查方法,添加一个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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM