JSF中的绑定对象初始化

时间:2013-02-23 07:27:23

标签: java jsf

我在应用程序范围内有这个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输出),从而维护状态和绑定。但我得到了这个sysoutput。

//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对象!

1 个答案:

答案 0 :(得分:2)

不,每次构建/恢复组件树时,都会获得全新的UICommand实例。但是这些实例从JSF状态保存机制中恢复其状态。

但是你不应该密集使用绑定。几乎没有充分的理由这样做。如果这样做,请始终使用bean的请求范围,否则会遇到问题。