2011-06-21 23 views
0

美好的一天!會話中的下拉選項

我正在修改現有程序的一些代碼。 在程序開始之前,它們初始化所有下拉列表並將其存儲在會話中。

可以將我的下拉菜單的列表存儲在會話中嗎? 注意:列表來自數據庫。

示例代碼:

  HttpSession session = request.getSession(); 

     session.setAttribute("accountList", accountList); 
     session.setAttribute("contractorAgencyList", contractorAgencyList); 
     session.setAttribute("employeeStatusList", employeeStatusList); 
     session.setAttribute("movementTypeList", movementTypeList); 
     session.setAttribute("positionLevelList", positionLevelList); 
     session.setAttribute("positionRoleList", positionRoleList); 
     session.setAttribute("practiceCodeList", practiceCodeList); 
     session.setAttribute("projectUtilizationList", projectUtilizationList); 
     session.setAttribute("siteLocationList", siteLocationList); 
     session.setAttribute("taxStatusList",taxStatusList); 
     session.setAttribute("turnoverTypeList",turnoverTypeList); 
     session.setAttribute("projectList",projectList); 

是否有其他方法可以做到這一點?如果這是最常見的方式,那麼我們如何避免會話丟失?

謝謝。

回答

2

是否有其他方法可以做到這一點?

是的,但這取決於你想要存儲多長時間。在Servlet容器中,您通常可以訪問應用程序範圍,會話範圍,請求範圍和Page範圍。前三個可以在servlet和JSP中訪問,而最後一個僅在JSP上下文中有用。

如果菜單的內容,可以在會話中重複使用,這是更好地保存它們在應用範圍內的對象,通過the ServletContext interface

如果您不需要超越當前請求的菜單數據,那麼你就應該讓它請求範圍,而不是會話範圍。

如果下拉菜單的範圍然而,受限於一個會話,那麼它是一個更好的主意,將其存儲在一個會話只要對象不會佔用很大的空間。請記住,存儲在內存中的對象的大小會影響站點的性能,尤其是在集羣和會話複製策略已到位時 - 這主要是因爲會話的內容必須被序列化並存儲在故障轉移中創建不同的會話。

此外,性能甚至會,如果你不採用集羣和會話遷移策略,因爲每個會話將消耗更多的內存,將只在會話失效之後的下一個GC週期產生影響。

如果您希望避免使用會話來存儲會話範圍對象,則可以根據需要從數據庫中查詢數據。甚至將內容存儲在文件中(只要它們不是機密/敏感數據),這會使您的會話遷移策略更加痛苦。

如果這是最常見的方法,那麼我們如何避免會話丟失?

我不明白這部分的問題。在任何情況下,會話都由容器代表應用程序開發人員進行管理。最多的情況是,開發人員可以指定會話超時值,該值將決定會話過期的滾動窗口範圍。開發人員也可能在應用程序的導航流程的某個重要點使會話無效 - 例如,單擊註銷按鈕。開發人員通常不需要擔心管理會話,除了需要使用HttpSession API或部署描述符中的條目來完成。

1

你可以存儲在Session中,但是目的是什麼?數據是否僅限於會話用戶?如果是這樣你可以存儲。 如果該值對於所有用戶都是通用的,則可以使用應用程序而不是會話。

的好處是,使用會話(如果數據是特定的用戶)是它比較快數據庫抓取,缺點是存儲將在服務器上爲每個用戶分配。

+0

那你通常做什麼?總是從數據庫中獲取數據? – newbie

+1

,這取決於,如果你經常使用這些值的用戶是明智的存儲他們的會話,否則我們會在需要時從數據庫加載它們(如果不確定用戶將始終需要該數據) – AjayR