在servlet之外访问ServletContext

时间:2009-09-16 15:34:26

标签: file properties servlets

我想知道是否有人可以就Java webapp问题提出建议?

我有一个标准的Java类,它有设置和获取属性文件值的方法。这些方法在系统范围内使用,并且由servlet和非servlet类方法调用。

但我想要做的是使用ServletContextListener来全局设置属性文件的路径,而不是对它们进行硬编码或将它们存储在数据库中。

ServletContextListener可用于使用context.setAttribute(“PROP_FILE_PATH”,“C:\ ...”)为servlet设置“全局变量”。但有没有办法在servlet外部访问这些变量,或者可以在servlet外部访问ServletContext?

我不认为将ServletContext作为参数传递给我必须获取的类方法,并且由于调用次数,设置属性文件值将是一个可行的选项。

由于

马丁

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

ServletContext可以在servlet的上下文或边界内使用。

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

同样是加载属性文件的类,你可以在jar中捆绑并将该jar放在服务器的类路径中(你可以参考服务器启动脚本并将其放在类路径中)。所以当你的服务器是load加载一个带有静态{}块的类,并引用那些属性文件。 然后,您可以直接引用此类,因为它在服务器类路径中。有关硬编码属性文件的路径,您可以将其存储在jndi服务器中。

答案 2 :(得分:1)

ServletContext通过ServletContextListener,如上所述,可用于在配置类中加载静态变量。如果需要,也可以触发它来重新加载这些变量。此外,您只需访问HttpServletRequest对象即可访问上下文。如果将请求传递给中间对象,则可以很容易地访问上下文。

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

然后,您可以根据需要将数据放入临时变量中来访问数据,然后将其传递给其他函数,并在超出范围时最终释放它。

答案 3 :(得分:0)

如果碰巧使用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();