我正在使用 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>
,首先我得到了我的一个类不可序列化的异常,现在使其可序列化之后,我得到了异常
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 或其他范围?谢谢