1

我看到了一个奇怪的缺陷。这是一个简单的测试用例。

托管 bean 是:

@ManagedBean
public class Controller {
    private int counter = 0;
    //getter and setters...
    public String next() {
        ++counter;
        return null;
    }
    public String prev() {
        --counter;
        return null;
    }
}

观点是:

<h:form>
<p>Value: #{controller.counter}</p>
<h:inputHidden value="#{controller.counter}" />
<h:commandButton action="#{controller.prev()}" value="Previous" disabled="#{controller.counter == 0}"/>
<h:commandButton action="#{controller.next()}" value="Next"     disabled="#{controller.counter == 5}"/>
</h:form>

当视图首次显示时,Previous 按钮被禁用。当我单击下一步时,将启用上一个按钮。到目前为止,一切都很好。但是,当我单击上一个按钮时,操作处理程序方法 prev() 永远不会被调用。如果我删除按钮的禁用属性,那么一切正常。我做错了什么还是 Mojarra 有缺陷?我正在使用 JBoss 7.1 和 Mojarra。谢谢。

4

1 回答 1

0

如果您的 bean 是请求范围的,并且您没有counter在基于请求参数的(后)构造期间预初始化属性,则可能会发生这种情况。这样,当 JSF 即将应用请求值时,该按钮仍处于禁用状态。作为防止篡改/黑客请求的一部分,JSF 那时不会将操作事件排队。

将 bean 放置在视图范围内,或者确保您根据请求参数正确地预初始化(post)构造函数中的关联属性应该修复它。顺便说一句,你所<h:inputHidden>拥有的在这个结构中完全没有价值。如果您将 bean 视图设置为范围,只需摆脱它即可。如果您想坚持请求范围,请<f:param>在两个按钮中将其替换为并使用@ManagedProperty.

也可以看看:

于 2012-10-05T19:28:36.383 回答