我在应用程序范围中有这个bean。
public class User {
private UICommand link;
private String name;
public User(){
System.out.println("User.User()");
name = "Test Link";
}
public UICommand getLink() {
System.out.println("User.getLink()");
System.out.println(link==null?"link is null":"link is not null");
return link;
}
public void setLink(UICommand link) {
System.out.println("User.setLink()");
this.link = link;
System.out.println("link: "+link.toString());
}
public void change(){
System.out.println("User.change()");
}
//setter and getter for name
}
我在jsp页面上有这个jsf。
<f:view>
<h:form>
<h:commandLink binding="#{user.link}" action="#{user.change}" value="#{user.name}"/>
</h:form>
</f:view>
我认为UICommand对象将被重用(通过将对象的序列化状态与HTML输出一起发送),从而维护状态和绑定。但我得到了这个系统输出。
//When page loads
User.User()
User.getLink()
link is null
User.setLink()
link: javax.faces.component.html.HtmlCommandLink@14e4ce7
//when user clicks the link
User.setLink()
link: javax.faces.component.html.HtmlCommandLink@6fcc9c
User.change()
每次用户单击链接时,UICommand
对象都不同!!!此外,我相信getLink()
在该对象第一次加载到页面上时只运行一次,但如果是这种情况,则页面不会反映最新的UICommand对象!
不,每次构建/恢复组件树时,都会得到全新的UICommand实例。但是这些实例从JSF状态保存机制中恢复它们的状态。
但是您不应该大量使用绑定。这样做几乎没有什么好的理由。如果这样做,请始终使用bean的请求范围,否则会遇到问题。