2012-05-19 75 views
1

我對JSF和/或一般的會話沒有太多懷疑。如何在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創建一個會話和會話ID(JSESSIONID),並把它在服務器內存中。因此,無論如何,初始頁面都會被加載,即使響應緩衝區溢出或不會創建會話。現在,當客戶端在此頁面上發出請求時,由於未創建會話,因此會發生錯誤。但是,我甚至試圖通過

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

並在onSelect方法剛剛輸入一個虛擬代碼。即使現在,頁面也如常顯示。

那麼,那是當我完全失去了。有人可以幫助我嗎?提前致謝。

回答

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。重新啓動網頁瀏覽器或使用其他瀏覽器也應強制新的會話。

+0

@BalusC ..我嘗試了兩個,創建一個新的Web應用程序,也在新的瀏覽器中運行舊的..仍然是一樣的。沒有錯誤。另外,JSF是否根據會話託管bean的請求自行創建會話? –

+1

您正在使用哪個JSF版本?自Mojarra 2.1.8以來,這個問題已經得到解決。 JSF不創建會話,servletcontainer創建它。會話範圍的bean實際上會隱含地需要一個會話,所以servlet容器應該創建一個,如果它還不存在的話。 – BalusC

+0

jsf-api-2.1.0-b03.jar和jsf-impl-2.1.0-b03.jar –

相關問題