[英]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,因为我位于混乱的服务器中,并且许多属性无法序列化。
无论如何,我发现了这个解决方法:
管理的豆:
之前:
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.