0

この 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 オブジェクトを反映しません!

4

1 に答える 1

2

いいえ、コンポーネント ツリーが構築/復元されるたびに、UICommand の完全に新しいインスタンスが取得されます。ただし、これらのインスタンスは、JSF 状態保存メカニズムから状態を復元します。

ただし、バインディングを集中的に使用するべきではありません。そうする正当な理由はほとんどありません。そうしないと、問題が発生するため、常に Bean のリクエスト スコープを使用してください。

于 2013-02-23T08:22:14.043 に答える