为什么不h:commandButton与c结合使用时执行动作方法:选择?

时间:2011-08-29 07:57:31

标签: jsf

我在项目中看到了一个奇怪的问题。 <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时,会调用操作方法。否则,它不是。为什么呢?

1 个答案:

答案 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>