如何在JSF应用程序中创建会话?

时间:2012-05-19 17:18:26

标签: session jsf-2 managed-bean

我对JSF和/或一般的会话几乎没有怀疑。

首先,在AS / servlet容器中加载Web应用程序时是否创建了会话?这意味着,在我右键单击运行后 - 在服务器上运行并启动并同步应用程序?

或者在加载Web应用程序并显示定义的欢迎页面然后客户端发出请求后创建它?

第二:我在jsf中研究了“在提交响应后无法创建会话”的问题。

我试图通过在以下网站中执行此操作来重现此问题, http://java.net/jira/browse/JAVASERVERFACES-2215

但是,我没有得到任何错误,如上所述。我尝试了所有bean范围。 会话是否已创建?

这是代码。

  <h:body>
      <h:form id="test">
      <p:growl id="msg"></p:growl>
        <h:outputText value="#{myTestBean.exceedBuffer}" />

      </h:form>
   </h:body>

bean代码是。

   public String getExceedBuffer() {    
       int size = FacesContext.getCurrentInstance().getExternalContext().getResponseBufferSize();
      char[] chars = new char[size];
       Arrays.fill(chars, 'x');
       return new String(chars);
    }

我的理解如下,

首次加载应用程序时,servlet容器或AS会创建会话和sessionID(JSESSIONID)并将其放入服务器内存中。所以初始页面无论如何都会被加载,这意味着即使响应缓冲区溢出或者没有,但会话也不会被创建。现在,当客户端在此页面上发出请求时,由于未创建会话,因此会发生错误。但是,我甚至尝试过这样做

<p:commandButton actionListener="#{myTestBean.onSelect}" update=":test"></p:commandButton>   

并且在onSelect方法中输入了一个虚拟代码。即使现在页面照常显示。

嗯,那是我完全迷失的时候。有人可以帮我这个吗?提前谢谢。

1 个答案:

答案 0 :(得分:3)

  

首先,会在AS / servlet容器中加载Web应用程序时创建会话吗?这意味着,在我右键单击运行后 - 在服务器上运行并启动并同步应用程序?

     

或是在加载Web应用程序并显示定义的欢迎页面然后客户端发出请求后创建它?

它是在HTTP会话开始时创建的,而不是在webapp的启动时创建的(这是应用程序范围)。基本上,当第一次调用request.getSession()并且尚未创建HttpSession时。这一切都由JSF正在使用的Servlet API处理。因此,以下答案应有助于理解其工作原理:How do servlets work? Instantiation, sessions, shared variables and multithreading


  

第二:我正在调查jsf中“无法在提交响应后创建会话”的问题。

     

我试图通过在以下网站http://java.net/jira/browse/JAVASERVERFACES-2215

中执行此操作来重现此问题      

但是,我没有得到任何错误,如上所述。我尝试了所有bean范围。会话是否已创建?

在提交响应时尚未创建HttpSession时,您将收到此错误。你没有得到这个错误只能意味着事先已经创建了会话。您需要在刚刚启动的webapp上测试它,并且不应创建会话。请注意,默认情况下,某些服务器会在关闭/重启时存储会话。在此测试页上发送第一个请求之前,您需要禁用此功能或删除浏览器中的JSESSIONID cookie。重新启动web浏览器或使用另一个浏览器也应强制重新开始新会话。