1

我对 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>

豆码是。

   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 方法中输入了一个虚拟代码。即使现在页面照常显示。

好吧,那是我完全迷路的时候。有人可以帮我吗?提前致谢。

4

1 回答 1

3

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

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

它是在 HTTP 会话开始时创建的,而不是在 webapp 的启动时创建的(这是应用程序范围)。基本上,request.getSession()第一次调用 when 并且HttpSession尚未创建。这一切都由 JSF 在后台使用的 Servlet API 处理。所以下面的答案应该有助于理解它是如何工作的:servlet 是如何工作的?实例化、会话、共享变量和多线程


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

我试图通过在以下站点http://java.net/jira/browse/JAVASERVERFACES-2215中给出的这样做来重现该问题

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

HttpSession当响应提交时尚未创建时,您将收到此错误。您没有收到此错误仅表示会话已事先创建。您需要在新启动的 web 应用程序上对其进行测试,并且不应该创建会话。请注意,默认情况下,某些服务器会在关闭/重启时存储会话。在此测试页面上发送第一个请求之前,您需要禁用此功能或删除JSESSIONID浏览器中的 cookie。重新启动网络浏览器或使用不同的浏览器也应该强制一个新的会话。

于 2012-05-19T17:24:54.027 回答