【问题标题】:Accessing ServletContext outside of a servlet在 servlet 之外访问 ServletContext
【发布时间】:2009-09-16 15:34:25
【问题描述】:

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

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

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

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

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

谢谢

马丁

【问题讨论】:

    标签: file properties servlets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2011-01-21
            • 2017-02-11
            • 1970-01-01
            • 2016-02-09
            • 2015-03-10
            • 1970-01-01
            • 2013-11-08
            • 2018-12-22
            • 1970-01-01
            相关资源
            最近更新 更多