Session中的下拉选项

时间:2011-06-21 02:06:49

标签: java session java-ee

美好的一天!

我正在修改现有程序中的一些代码。 在程序开始之前,他们会初始化所有下拉列表并将其存储在会话中。

可以在会话中存储我的下拉菜单列表吗? 注意:列表来自数据库。

示例代码:

           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 个答案:

答案 0 :(得分:2)

  

还有其他方法吗?

是的,但这取决于您希望存储多长时间。在Servlet容器中,您通常可以访问应用程序范围,会话范围,请求范围和页面范围。前三个可以在servlet和JSP中访问,而最后一个只在JSP的上下文中有用。

如果菜单的内容可以跨会话重复使用,最好通过the ServletContext interface将它们存储在应用程序作用域对象中。

如果您不需要超出当前请求的菜单数据,那么您应该将其设置为请求范围,而不是会话范围。

但是,如果下拉菜单的范围仅限于会话,那么只要对象不占用大量空间,最好将其存储在会话中。请记住,存储在内存中的对象的大小将影响站点的性能,尤其是在群集和会话复制策略到位时 - 这主要是因为会话的内容必须被序列化并存储以备不时之需在故障转移时创建不同的会话。

此外,即使您没有采用群集和会话迁移策略,性能也会受到影响,因为每个会话将消耗仅在会话失效后的下一个GC周期才会释放的内存。

如果您希望避免使用会话来存储会话范围的对象,则可以根据需要从数据库中查询数据。甚至将内容存储在文件中(只要它们不是机密/敏感数据),这会使您的会话迁移策略更加痛苦。

  

如果这是最常用的方法,那么我们如何避免会话丢失?

我不明白这部分问题。在任何情况下,会话都由容器代表应用程序开发人员进行管理。最多,开发人员可以指定会话超时值,该值将指示会话到期的滚动窗口的范围。开发人员还可能在应用程序导航流程中的某个重要位置使会话无效 - 例如,单击注销按钮。除了使用HttpSession API或部署描述符中的条目需要完成的操作之外,开发人员通常不需要担心管理会话。

答案 1 :(得分:1)

您可以在Session中存储,但目的是什么?数据是否仅限会话用户?如果是这样,你可以存储。 如果这些值对所有用户都是通用的,则可以使用应用程序而不是会话。

优点是,使用会话(如果数据是用户特定的)是快速与数据库提取相比,缺点是将在服务器中为每个用户分配内存。