我看到了一个奇怪的缺陷。这是一个简单的测试用例。
托管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。感谢。
答案 0 :(得分:0)
如果您的bean是请求作用域,并且您在构造期间(post)构建时没有基于请求参数预初始化counter
属性,则会发生这种情况。这样,当JSF即将应用请求值时,该按钮仍处于禁用状态。作为防范篡改/被黑客入侵请求的一部分,JSF将不会对动作事件进行排队。
将bean放在视图范围中,或者确保根据请求参数正确预先初始化(post)构造函数中的关联属性应该修复它。你所拥有的<h:inputHidden>
在这个结构中完全没有任何价值。如果你将bean视图作为范围,只需摆脱它。如果您想坚持请求范围,请在两个按钮中将其替换为<f:param>
,然后使用@ManagedProperty
进行设置。