2011-08-29 36 views
1

我在项目中看到了一个奇怪的问题。这是<h:commandButton/>不执行操作方法。为什么h:commandButton在与c:选择组合时执行操作方法?

<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,则动作方法被调用。否则,它不是。为什么?

回答

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上,如果你想支持f:param,你需要用h:commandLink代替h:commandButton


无关的具体问题,您应该尽量避免JSTL尽可能在JSF的观点。如果目的是渲染视图部分有条件(不建有条件视图部分),那么你应该宁可使用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> 
相关问题