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

use*_*383 1 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>
Run Code Online (Sandbox Code Playgroud)

当我<h:form>进入第一个c:when,然后调用action方法.否则,事实并非如此.为什么?

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

请注意,仅从JSF 2.0开始支持此功能.在JSF 1.x上h:commandButton,h:commandLink如果需要f:param支持,则需要替换为a .


具体问题无关,您应该尽量避免在JSF视图中使用JSTL.如果目的是有条件地呈现视图部分(不是有条件地构建视图部分),那么您应该使用JSF组件的rendered属性而不是JSTL <c:choose><c:if>:

<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>
Run Code Online (Sandbox Code Playgroud)