1

私はHttpSessionをインスタンス変数として使用しています

@ManagedBean
@ViewScoped
public class CountryPages_Detail {

    private HttpSession session;

    public CountryPages_Detail() {
        session = ConnectionUtil.getCurrentSession();
    } //end of constructor

    public String preview() {
        session.setAttribute("countryDetailImageNames", imageNames);
        session.setAttribute("countryDetailImages", images);
        session.setAttribute("countrySummary", countrySummary);        
        return "countryPages_View?faces-redirect=true";

    } //end of preview()
} //end of  class CountryPages_Detail

ConnectionUtl クラス:

 public static HttpSession getCurrentSession() {
     FacesContext facesContext = FacesContext.getCurrentInstance();
     ExternalContext externalContext = facesContext.getExternalContext();
     HttpServletRequest httpServletRequest = (HttpServletRequest) externalContext.getRequest();

     HttpSession currentSession = (HttpSession) externalContext.getSession(false);

     if (currentSession != null) {         
         return currentSession;
     } else {         
         return null;
     }
} //end of getCurrentSession()

これは正しい方法ですか?実際、私はweb.xmlで使用していました

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>

しかし、私がそれを<param-value>client</param-value>に変更したとき、最初にクラスの1つがシリアライズ可能ではないという例外を受け取りました。

SEVERE: Error Rendering View[/index.xhtml]
java.io.NotSerializableException: org.apache.catalina.session.StandardSessionFacade
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
    ....

サーバーを使用すると、正常に動作していました。なんで?サーバーにいつサーバーをparam-value配置すると、viewScope(@ViewScoped) にあるすべてのマネージド Bean がサーバーに存在し、それをクライアントに変更すると、すべての @ViewScoped マネージド Bean がクライアントに存在しますか? また、Bean が @ViewScoped にない場合、javax.faces.STATE_SAVING_METHOD 要素は違いを生み出しますか? STATE_SAVING_METHOD オプションが @ViewScoped のみに関連することを意味しますか、それとも @RequestScope または @SessionScopr または他のスコープにも影響しますか? ありがとう

4

1 に答える 1

2

インスタンス変数などの外部コンテキスト リソースを絶対に取得しないでください。HttpSessionスレッドローカルスコープで取得するだけです。ExternalContext#sessionMap()JSFコードにインポートを必要とせずにセッション属性マップを管理するために使用できjavax.servletます(これは通常、間違った方法または不器用な方法で物事を行っていることを示しており、JSFのコードを利用せずにJSFを完全に操作していることを示しています権力)。

public String preview() {
    Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
    sessionMap.put("countryDetailImageNames", imageNames);
    sessionMap.put("countryDetailImages", images);
    sessionMap.put("countrySummary", countrySummary);        
    return "countryPages_View?faces-redirect=true";
}

ただし、セッション スコープのマネージド Bean を作成することをお勧めします。つまり、奇妙でかなり手続き型で非オブジェクト指向の設計があります。

@ManagedBean
@SessionScoped
public class Country {

     private List<Something> detailImageNames;
     private List<Something> images;
     private Something summary;

     // ...
}

内部で次のように使用しますCountryPagesDetail

@ManagedProperty("#{country}")
private Country country;

public String preview() {
    country.setDetailImageNames(imageNames);
    country.setDetailImages(images);
    country.setSummary(summary);        
    return "countryPages_View?faces-redirect=true";
}

などで入手可能です#{country.detailImageNames}

于 2012-05-22T14:01:43.383 に答える