我对JSF和/或一般的会话几乎没有疑问。
首先,会话是否在 AS/servlet 容器中的 Web 应用程序加载时创建?意思是,在我右键单击 - 运行方式 - 在服务器上运行并且应用程序启动并同步后?
还是在加载 Web 应用并显示定义的欢迎页面,然后客户端发出请求后创建它?
第二:我正在研究 jsf 中的"提交响应后无法创建会话"的问题。
我试图通过以下站点中给出的执行此操作来重现该问题,http://java.net/jira/browse/JAVASERVERFACES-2215
但是,如上所述,我没有收到任何错误。我尝试了所有豆类范围。会话是否已创建?
这是代码。
<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 会创建一个会话和一个会话 ID(JSESSIONID(,并将其放入服务器内存中。因此,无论如何都会加载初始页面,这意味着即使响应缓冲区是否溢出,也不会创建会话。现在,当客户端在此页面上发出请求时,由于未创建会话,因此会发生错误。但是,我甚至尝试这样做
<p:commandButton actionListener="#{myTestBean.onSelect}" update=":test"></p:commandButton>
在onSelect方法中,刚刚输入了一个虚拟代码。即使现在页面也照常显示。
嗯,那是我完全迷路的时候。有人可以帮我吗?提前谢谢。
首先,会话是否在 AS/servlet 容器中的 Web 应用程序加载时创建?意思是,在我右键单击 - 运行方式 - 在服务器上运行并且应用程序启动并同步后?
还是在加载 Web 应用并显示定义的欢迎页面,然后客户端发出请求后创建它?
它是在 HTTP 会话启动时创建的,而不是在 Web 应用的启动时创建的(这是应用程序范围(。基本上,当第一次调用request.getSession()
并且尚未创建HttpSession
时。这一切都由JSF在幕后使用的Servlet API处理。因此,以下答案应该有助于理解它是如何工作的:servlets是如何工作的?实例化、会话、共享变量和多线程
第二:我正在研究 jsf 中的"提交响应后无法创建会话"的问题。
我试图通过以下站点中给出的方法来重现该问题,http://java.net/jira/browse/JAVASERVERFACES-2215
但是,如上所述,我没有收到任何错误。我尝试了所有豆类范围。会话是否已创建?
如果在提交响应时尚未创建HttpSession
,则会收到此错误。您没有收到此错误只能意味着会话已经事先创建。您需要在新启动的 Web 应用程序上对其进行测试,并且不应创建会话。请注意,默认情况下,某些服务器将会话存储在 shutown/restart 上。在此测试页面上发送第一个请求之前,您需要禁用此功能或删除浏览器中的JSESSIONID
cookie。重新启动 Web 浏览器或使用其他浏览器也应该强制使用新的会话。