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上下文属性吗?