在servlet之外访问ServletContext

4
我想知道是否有人能够就Java网络应用程序的问题提供建议?
我有一个标准的Java类,其中包含设置和获取属性文件值的方法。这些方法被系统广泛使用,并被Servlet和非Servlet类方法调用。
但是,我想使用ServletContextListener全局设置属性文件路径,而不是硬编码或将其存储在数据库中。
可以使用ServletContextListener为Servlet设置“全局变量”,例如context.setAttribute(“PROP_FILE_PATH”,“C:\ ...”)。但是,是否有办法在Servlet之外访问这些变量或者可以在Servlet之外访问ServletContext?
我认为,由于调用次数的原因,将ServletContext作为参数传递给我用来获取和设置属性文件值的类方法可能不是可行的选择。
谢谢
马丁
4个回答

8

你可以将设置存储在与Servlet上下文不同的地方,比如配置类的一组静态变量中。然后ServletContextListener可以在启动时设置这些变量,任何其他代码都可以访问这些静态变量,无论它们是否有权限访问ServletContext本身。


1

ServletContext 可以通过 ServletContextListener 来使用,正如上面有人所说,可以用来加载配置类中的静态变量。如果需要,还可以触发重新加载这些变量。此外,您只需要访问 HttpServletRequest 对象即可访问上下文。如果将请求传递给中介对象,则可以轻松访问上下文。

ServletContext application = req.getSession().getServletContext();

如果需要,您可以将数据放入临时变量中,然后将其传递给其他函数,并在其超出范围时释放其资源,从而访问数据。


1
如果您使用Spring,则不需要实现自己的ServletContextListener。您可以使用Spring的ContextLoaderListener来实现它,并且如果注册,则会存储servletContext并通过静态方法使其可供以后使用。
在web.xml中进行注册:
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

在Servlet之外访问servletContext很容易:

import javax.servlet.ServletContext;
import org.springframework.web.context.ContextLoaderListener;

ServletContext servletContext = 
  ContextLoaderListener.getCurrentWebApplicationContext().getServletContext();

1

ServletContext可以在servlet的上下文或范围内使用。

您可以将变量存储在随应用程序服务器一起提供的jndi服务器中,并可以使用初始上下文从那里获取变量。

此外,加载属性文件的类可以打包到一个jar文件中,并将该jar文件放置在服务器的类路径中(您可以参考服务器启动脚本并将其放置在那里的类路径中)。因此,当您的服务器被加载时,加载一个带有静态{}块的类并引用这些属性文件。然后,您可以直接引用此类,因为它在服务器类路径中。关于硬编码属性文件路径的问题,您可以将其存储在jndi服务器中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接