代码之家  ›  专栏  ›  技术社区  ›  angelcervera

jsf中没有会话生成

  •  9
  • angelcervera  · 技术社区  · 14 年前

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

    <%@page contentType="text/html" pageEncoding="UTF-8" session="false" %>
    

    谢谢

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

    2 回复  |  直到 14 年前
        1
  •  8
  •   BalusC    14 年前

    只是不要使用视图/会话范围的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 在任何必要的时候。

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


    根据你的评论:

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

    啊,对。抱歉,我在JSF/Facelets中看不到任何好的方法来禁用会话或根据每个请求更改视图状态保存。我会考虑使用纯HTML <form> <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>
    

    @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);
        }
    
        // ...
    }
    
        2
  •  3
  •   dmaidaniuk    8 年前

    实际上,BalusC的回答是不正确的,因为Mojarra 2.1.19/2.2.0。你可以在他的博客上看到 here .

    <f:view transient="true">
       Your regular content
    </f:view>
    

    正如上面提到的:

    视图状态尚未创建,因此会话也不会在尚未创建时创建。[…]记住将相关联的托管bean放在请求作用域而不是视图/会话作用域中,否则您只会破坏“无状态”一词的含义。

    中存在的下一个代码段 com.sun.faces.application.view.FaceletViewHandlingStrategy

            /*
             * Make sure we have a session here if we are using server state
             * saving. The WriteBehindStateWriter needs an active session when
             * it writes out state to a server session.
             * 
             * Note if you flag a view as transient then we won't acquire the
             * session as you are stating it does not need one.
             */
            if (isServerStateSaving() && !viewToRender.isTransient()) {
                getSession(ctx);
            }      
    

    还要注意,一些第三方组件库,例如ICEfaces或其他框架,例如Apache Shiro,可以自己创建会话,用于某些目的。