只是不要使用视图/会话范围的 bean(所以只使用请求或应用范围的 bean)并将状态保存设置为 client 而不是(默认)server,方法是在 web.xml 中设置以下上下文参数。
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
然后 JSF 不会创建会话,并将视图状态存储在隐藏的输入字段中,并在必要时在表单中使用名称 javax.faces.ViewState。
但是,创建和管理会话的成本可以忽略不计。此外,在使用客户端视图状态保存时,您仍然需要权衡(反)序列化视图状态的成本和网络带宽。
更新根据您的评论:
@BalusC 是的,这可能是一个全球解决方案。但我只在这个公共页面中需要这种方法。在其他页面中,我想要服务器端状态保存方法。
啊,对。抱歉,我在 JSF/Facelets 中没有看到任何好的方法来禁用会话或基于每个请求更改视图状态保存。我会考虑使用纯 HTML <form> 而不是 JSF <h:form>,让它提交到另一个 JSF 页面并在与 JSF 页面关联的 bean 中使用 @ManagedProperty。例如
<form action="register.jsf" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" />
</form>
与
@ManagedBean
@RequestScoped
public class Register {
@ManagedProperty(value="#{param.username}")
private String username;
@ManagedProperty(value="#{param.password}")
private String password;
@PostConstruct
public void init() {
// Do your thing here.
System.out.println("Submitted username/password: " + username + "/" + password);
}
// ...
}