我的代码如下:
<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}”
答案 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服务器,许多属性不可序列化。
无论如何,我发现了这个问题:
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>