Jsf 2 为什么禁用的按钮不工作?

Jsf 2 为什么禁用的按钮不工作?,jsf-2,Jsf 2,我看到一个奇怪的缺陷。下面是一个简单的测试用例 托管bean是: @ManagedBean public class Controller { private int counter = 0; //getter and setters... public String next() { ++counter; return null; } public String prev() { --counter;

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

托管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>

首次显示视图时,“上一步”按钮被禁用。单击“下一步”时,“上一步”按钮将启用。到现在为止,一直都还不错。但是,当我单击“上一步”按钮时,永远不会调用操作处理程序方法prev。如果删除按钮的disabled属性,则一切正常。我是做错了什么,还是Mojarra有缺陷?我正在使用JBoss7.1和Mojarra。谢谢。

如果您的bean是请求范围的,并且您在基于请求参数的后期构造过程中不预先初始化计数器属性,则可能会发生这种情况。这样,当JSF即将应用请求值时,按钮仍然被禁用。作为防止篡改/黑客请求的一部分,JSF不会将操作事件排队

将bean放在视图范围中,或者确保根据请求参数在postconstructor中正确预初始化关联属性,应该可以解决这个问题。顺便说一句,在这个结构中,你所看到的,完全没有价值。如果将bean视图的作用域设置为限定范围,只需将其删除即可。如果您想继续使用请求范围,请在两个按钮中将其替换为,并使用@ManagedProperty进行设置

另见: 第5点适用于你的情况
谢谢我看到在我当前的代码中,在应用值阶段,计数将始终为0。因此,在该阶段,“上一步”按钮将始终被评估为禁用。我将代码改为使用@ViewScoped并删除了,现在一切正常。