我在项目中看到了一个奇怪的问题。 <h:commandButton/>
没有执行操作方法。
<c:choose>
<c:when test="#{empty param.t}">
// HTML
</c:when>
<c:when test="#{param.t eq 'normal'}">
// HTML
<h:form>
<h:commandButton value="ADD" action="#{addBean.doSomething}" />
</h:form>
<c:when>
</c:choose>
当我将<h:form>
移动到第一个c:when
时,会调用操作方法。否则,它不是。为什么呢?
答案 0 :(得分:5)
我会忽略EL中的语法错误(缺少}
)。
当#{param.t eq 'normal'}
在处理表单提交请求时评估为false
时,将不会执行命令按钮。您需要为后续请求维护相同的参数,以便呈现该按钮,以便JSF可以确认允许最终用户调用该操作。您可以通过添加<f:param>
:
<h:form>
<h:commandButton value="ADD" action="#{addBean.doSomething}">
<f:param name="t" value="#{param.t}" />
</h:commandButton>
</h:form>
请注意,仅从JSF 2.0开始支持此功能。在JSF 1.x上,如果您需要h:commandButton
支持,则需要将h:commandLink
替换为f:param
。
无关,您应该尽量避免在JSF视图中使用JSTL。如果目的是有条件地呈现视图部分(不是有条件地构建视图部分),那么您应该使用JSF组件的rendered
属性而不是JSTL <c:choose>
或<c:if>
:< / p>
<h:panelGroup rendered="#{empty param.t}">
// HTML
</h:panelGroup>
<h:panelGroup rendered="#{param.t eq 'normal'}">
// HTML
<h:form>
<h:commandButton value="ADD" action="#{addBean.doSomething}" />
</h:form>
</h:panelGroup>