我在项目中看到了一个奇怪的问题.这是<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方法.否则,事实并非如此.为什么?
我将忽略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)
| 归档时间: |
|
| 查看次数: |
3789 次 |
| 最近记录: |