我在 JSF 中遇到以下基本(也许是愚蠢的)理解问题:
有一个 JSF 页面“testPage.xhtml”:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view>
<h:body>
<h:form>
<h:commandLink id="B1" value="B1" action="#{testBean.ctrl}"/>
<h:commandLink id="B2" value="B2" action="#{testBean.ctrl}"
rendered="#{testBean.renderB2}"/>
</h:form>
</h:body>
</f:view>
</html>
还有一个支持 bean“TestBean.java”:
package test;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name="testBean")
@RequestScoped
public class TestBean implements Serializable {
public static final long serialVersionUID = 1L;
private boolean renderB2 = false;
public String ctrl() {
setRenderB2(true);
System.out.println("ctrl() is called.");
return null;
}
public boolean getRenderB2() {
return renderB2;
}
public void setRenderB2(boolean renderB2) {
this.renderB2 = renderB2;
}
}
所以两个链接都有TestBean.ctrl()
作为行动。
仅第一B1
被渲染。点击B1
导致执行TestBean.ctrl()
and B2
也被渲染了。
然而,点击B2
那么not执行TestBean.ctrl()
.
这是我的问题:为什么单击时不执行操作方法B2
?
大概是因为B2
不会再次渲染。但是为什么这会阻止操作方法的执行(由先前渲染的调用)B2
link)?
那是因为rendered
在表单提交的应用请求值阶段再次重新评估属性。如果UIInput
or UICommand
此时组件尚未呈现,那么 JSF 将不会应用该组件的请求值。 IE。这UIInput
组件的模型值不会更新,并且UICommand
组件的操作将不会被调用。
因为您的 bean 是请求范围的,所以它在显示表单的响应结束时已被丢弃,并且在表单提交请求开始时创建了一个全新的 bean。
您必须保留负责的任何请求范围的属性rendered
属性。最简单的方法是通过标记将 bean 放置在视图范围中@ViewScoped
并确保您返回null
or void
来自应该回发到同一视图的操作方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)