Servlets 在启动时设置数据库应用程序常量

Servlets 在启动时设置数据库应用程序常量,servlets,constants,servlet-listeners,Servlets,Constants,Servlet Listeners,我的应用程序中有很多下拉菜单。从数据库中读取这些下拉菜单的内容 目前,为了避免每次我想使用这些值时都将它们拉回来,我在第一次需要它们时将它们拉回来一次,然后将它们存储在会话中 这不好。我确实希望将它们存储在会话中,因为有很多,我认为这有点笨重。我希望理想情况下(假设您不反对),将这些“常量”(它们不是传统常量,但在部署期间不会更改)存储在应用程序范围中,因此每次部署只需要从数据库中提取一次 我想知道的是,启动时在应用程序上下文中存储这些下拉值的方法是什么?有一个接口,它的名称为servlet上下

我的应用程序中有很多下拉菜单。从数据库中读取这些下拉菜单的内容

目前,为了避免每次我想使用这些值时都将它们拉回来,我在第一次需要它们时将它们拉回来一次,然后将它们存储在会话中

这不好。我确实希望将它们存储在会话中,因为有很多,我认为这有点笨重。我希望理想情况下(假设您不反对),将这些“常量”(它们不是传统常量,但在部署期间不会更改)存储在应用程序范围中,因此每次部署只需要从数据库中提取一次


我想知道的是,启动时在应用程序上下文中存储这些下拉值的方法是什么?

有一个接口,它的名称为servlet上下文的初始化提供了一个钩子。
ServletContext
是应用程序的上下文,即其配置

实现您所描述的一种方法是实现此接口,并在
web.xml
中注册
ServletContextListener
,或者使用
@WebListener
注释该类

contextInitialized()
方法中,您可以提取常量,以任何需要的方式设置它们,然后将它们作为属性放入
ServletContext

@WebListener
public static class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        int someConstant = 42;
        context.setAttribute("myConstant", someConstant);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ...
    }
}
然后,您可以在任何有权访问
ServletContext
的地方访问这些常量

Servlet
Filter
中,您可以从
ServletRequest

HttpServletRequest request = ....;
request.getServletContext();

如果您想在其中添加更多属性,还可以通过
Servlet
Filter
init()
方法访问它。

有一个接口,其名称为Servlet上下文的初始化提供了一个钩子。
ServletContext
是应用程序的上下文,即其配置

实现您所描述的一种方法是实现此接口,并在
web.xml
中注册
ServletContextListener
,或者使用
@WebListener
注释该类

contextInitialized()
方法中,您可以提取常量,以任何需要的方式设置它们,然后将它们作为属性放入
ServletContext

@WebListener
public static class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        int someConstant = 42;
        context.setAttribute("myConstant", someConstant);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ...
    }
}
然后,您可以在任何有权访问
ServletContext
的地方访问这些常量

Servlet
Filter
中,您可以从
ServletRequest

HttpServletRequest request = ....;
request.getServletContext();

如果您想在那里添加更多属性,还可以从
Servlet
Filter
init()
方法访问它。

A.如果使用spring,可以使用缓存抽象:缓存是最好的方法,特别是如果它们在整个应用程序中都是固定的,那么每个用户都会建议将范围保持为应用程序级别。从使用HashMap到一致性缓存,有几种缓存方式,这取决于您的数据有多大。谢谢大家。我将使用ServletContextListener@SotiriosDelimanolis如果你把它作为一个更详细的答案,我会接受它并投票。a.如果你使用spring,你可以使用缓存抽象:缓存是最好的方法,特别是如果它们在整个应用程序中都是固定的,那么每个用户都建议将范围保持为应用程序级别。从使用HashMap到一致性缓存,有几种缓存方式,这取决于您的数据有多大。谢谢大家。我将使用ServletContextListener@SotiriosDelimanolis如果你把它作为一个更详细的回答,我会接受并投票。@MasNotsram欢迎你!还有一个选项是
ServletContainerInitializer
,但我会让您查看它。
ServletContainerInitializer
的用途完全不同。
ServletContextListener
对于具体问题中当前形式所述的目的来说是非常好的。@BalusC您不建议使用
ServletContainerInitializer
在进行容器初始化的同时添加servlet上下文属性?@MasNotsram欢迎您!还有一个选项是
ServletContainerInitializer
,但我会让您查看它。
ServletContainerInitializer
的用途完全不同。
ServletContextListener
对于具体问题中所述的当前形式的目的来说是非常好的。@BalusC您不建议使用
ServletContainerInitializer
在进行容器初始化的同时添加servlet上下文属性吗?