私は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 または他のスコープにも影響しますか? ありがとう