在jsf中没有生成会话

ang*_*era 9 jsf jsf-2

在JSP中,有一个属性会话用于请求中的禁用自动生成会话.

<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %>
Run Code Online (Sandbox Code Playgroud)

有没有办法在JSF2中做同样的事情?

谢谢

为什么?因为我们将公共注册表单页面作为应用程序中的默认页面.这是一个非常简单的表单,每次人(或机器人等)请求主页时都会创建会话.ManagedBean是RequestScope,但JSF在第一个navegation请求中创建一个会话.

Bal*_*usC 7

只是不要使用视图/会话作用域bean(因此只使用请求或应用程序作用域bean)并通过在中设置以下上下文参数来设置状态保存client而不是(默认).serverweb.xml

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

然后,JSF将不会创建会话,并且会javax.faces.ViewState在必要时将视图状态存储在隐藏的输入字段中,并在表单中包含名称.

然而,创建和管理会话的成本几乎可以忽略不计.此外,在使用客户端视图状态保存时,您仍需要权衡(反)序列化视图状态和网络带宽的成本.


根据您的评论更新:

@BalusC是的,这可能是一个全球性的解决方案.但我只需要在这个公共页面中使用此方法.在其他页面我想要服务器端状态保存方法.

啊对.抱歉,我没有在JSF/Facelets中看到任何方法来禁用会话或更改基于每个请求的视图状态保存.我考虑使用纯HTML <form>而不是JSF <h:form>,让它提交到另一个JSF页面并使用@ManagedProperty与JSF页面关联的bean.例如

<form action="register.jsf" method="post">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

@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);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)