0

sessionScopedマネージド Bean を別のマネージド Bean から開く際に問題があります。オブジェクトのリストを含むテーブルを持つページがあります。行をクリックすると、別のページに移動してその内容を表示しています。sessionMapクリックした行をobject または byで送信していますFlash。オブジェクトが送信され、別のページで読み込まれ、データが表示されます。他のページでは、メソッドでsessionMaporを受け取っています。Flash@PostConstruct

戻って別のオブジェクトを開くと、最初のオブジェクトが開きます。問題は、それがsessionScopedBean であるため、2 番目に開いたオブジェクトでは@PostConstruct. sessionScopedでは、新しい値を読み取って別のセッションを開くように強制するための解決策は何ですか? または、リスナーではなくオブジェクトをどのように読み取ることができます@PostConstructか?

page1.java

@ManagedBean
@SessionScoped
class pageBean{

    MyObject myObj;
    public String save(){FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(myObj,"obj");
    }
}

@ManagedBean
@SessionScoped
class pageBean{
@PostConstruct
public void init()
MyObject = (MyObject)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}
4

1 に答える 1

2

マネージド Bean は@ViewScoped. それ以外の場合は、次のような (アクション) リスナー メソッドで取得する必要があります<f:event>

<f:event type="preRenderView" listener="#{bean.init}" />

メソッドでセッションオブジェクトを取得しますinit()

public void init() {
    obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
}

または、ELでアクセスすることが唯一の目的である場合は、ゲッターに遅延ロードされる可能性があります。

public Obj getObj() {
    if (obj == null) {
        obj = (Obj) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("obj");
    }

    return obj;
}

しかし、これは意味がありません。なぜなら、セッション スコープのオブジェクトは EL で直接利用できる#{obj}ため、#{bean.obj}.

少なくとも、全体のデザインには意味がありません。そういうわけで、私は彼らが実際にそうすべきだったと提案しまし@ViewScopedた。

以下も参照してください。

于 2013-01-11T13:35:36.657 に答える