Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServletContext_Java - Fatal编程技术网

Java ServletContext

Java ServletContext,java,Java,我有一个JSP网站,不是SpringMVC,它有一个配置文件web.xml 我想在web.xml文件中获得一些设置 但是,我想从我的SourcePackages文件夹中的类中访问这些设置 我知道我可以将ServletContect从JSP传递到类,但我希望避免这种情况,只需从我的类访问web.xml文件 这可能吗 编辑 我一直在看javax.servlet认为我想要的东西在里面,但如果是,我就看不到了。我认为这与您的描述非常接近: 基本上,您希望以编程方式从web.xml读取参数,对吗?我认为这

我有一个JSP网站,不是SpringMVC,它有一个配置文件web.xml

我想在web.xml文件中获得一些设置

但是,我想从我的SourcePackages文件夹中的类中访问这些设置

我知道我可以将ServletContect从JSP传递到类,但我希望避免这种情况,只需从我的类访问web.xml文件

这可能吗

编辑


我一直在看
javax.servlet
认为我想要的东西在里面,但如果是,我就看不到了。

我认为这与您的描述非常接近:


基本上,您希望以编程方式从web.xml读取参数,对吗?

我认为这与您的描述非常接近:


基本上,您希望以编程方式从web.xml读取参数,对吗?

Hmmm。。。我假设一旦您的web应用程序启动,您就不会对web.xml进行任何更改

现在您可以做的是创建一个servlet,它在启动时加载并初始化一个单例类。您可以在web.xml中使用以下设置

  <servlet>
    <description></description>
    <display-name>XMLStartUp</display-name>
    <servlet-name>XMLStartUp</servlet-name>
    <servlet-class>com.test.servlets.XMLStartUp</servlet-class>
    <init-param>
      <param-name>log4j-init-file</param-name>
      <param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>

嗯。。。我假设一旦您的web应用程序启动,您就不会对web.xml进行任何更改

现在您可以做的是创建一个servlet,它在启动时加载并初始化一个单例类。您可以在web.xml中使用以下设置

  <servlet>
    <description></description>
    <display-name>XMLStartUp</display-name>
    <servlet-name>XMLStartUp</servlet-name>
    <servlet-class>com.test.servlets.XMLStartUp</servlet-class>
    <init-param>
      <param-name>log4j-init-file</param-name>
      <param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>

这是不容易做到的,也可能不是一个简单的解决方案。我建议的唯一选项是将配置选项保存在xml或属性文件中,并将其放在WEB-INF/classes目录中,以便使用
ClassLoader.getResource
ClassLoader.getResourceAsStream


我知道这可能是配置的重复,但我认为这是elegent方法。

这不容易实现,也可能不是elegent解决方案。我建议的唯一选项是将配置选项保存在xml或属性文件中,并将其放在WEB-INF/classes目录中,以便使用
ClassLoader.getResource
ClassLoader.getResourceAsStream

我知道这可能是配置的重复,但我认为这是一种简单的方式。

使用一个实现,允许类似于单例的上下文访问:

package test.dummy;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

public  class ContextConfiguration implements ServletContextListener {

  private static ContextConfiguration _instance;

  private ServletContext context = null;

  //This method is invoked when the Web Application
  //is ready to service requests
  public void contextInitialized(ServletContextEvent event) {
    this.context = event.getServletContext();

    //initialize the static reference _instance
     _instance=this;
  }

  /*This method is invoked when the Web Application has been removed 
  and is no longer able to accept requests
  */
  public void contextDestroyed(ServletContextEvent event) {
    this.context = null;

  }

  /* Provide a method to get the context values */
  public String getContextParameter(String key) {
     return this.context.getInitParameter(key);
  }

  //now, provide an static method to allow access from anywere on the code:
  public static ContextConfiguration getInstance() {
     return _instance;
  }
}
在web.xml上进行设置:

<web-app>
<listener>
    <listener-class>
     test.dummy.ContextConfiguration
    </listener-class>
  </listener>
<servlet/>
<servlet-mapping/>
</web-app> 
使用允许类似于单例的上下文访问的实现:

package test.dummy;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

public  class ContextConfiguration implements ServletContextListener {

  private static ContextConfiguration _instance;

  private ServletContext context = null;

  //This method is invoked when the Web Application
  //is ready to service requests
  public void contextInitialized(ServletContextEvent event) {
    this.context = event.getServletContext();

    //initialize the static reference _instance
     _instance=this;
  }

  /*This method is invoked when the Web Application has been removed 
  and is no longer able to accept requests
  */
  public void contextDestroyed(ServletContextEvent event) {
    this.context = null;

  }

  /* Provide a method to get the context values */
  public String getContextParameter(String key) {
     return this.context.getInitParameter(key);
  }

  //now, provide an static method to allow access from anywere on the code:
  public static ContextConfiguration getInstance() {
     return _instance;
  }
}
在web.xml上进行设置:

<web-app>
<listener>
    <listener-class>
     test.dummy.ContextConfiguration
    </listener-class>
  </listener>
<servlet/>
<servlet-mapping/>
</web-app> 

我真的不喜欢从web.xml阅读的课程。。。你为什么需要这个?
我想,如果您准备了一个属性文件和一个从中读取的管理器类,那么它将更容易、更干净,而且更易于管理。

我真的不喜欢从web.xml读取类。。。你为什么需要这个?
我想,如果您准备了一个属性文件和一个从中读取的管理器类,那么它将更容易、更干净,并且更易于管理。

关闭但不完全关闭。我所在的类不是servlet,而是一个普通的旧类文件,它需要访问web.xml文件。我没有doPost等eventsWell,我相信ServletContext属于Servlet类,所以我会这样做:使用Servlet访问参数,然后将它们传递给任何其他libaray类以执行其他操作。此外,请考虑安全性,同时尝试从Web.java类中访问Web.xml:“OK,我明白了。您是否可以发布一些示例代码,向我展示如何从类中调用servlet并从中返回两个值?有点像Java新手,以防你错过它。:)接近但不完全。我所在的类不是servlet,而是一个普通的旧类文件,它需要访问web.xml文件。我没有doPost等eventsWell,我相信ServletContext属于Servlet类,所以我会这样做:使用Servlet访问参数,然后将它们传递给任何其他libaray类以执行其他操作。此外,请考虑安全性,同时尝试从Web.java类中访问Web.xml:“OK,我明白了。您是否可以发布一些示例代码,向我展示如何从类中调用servlet并从中返回两个值?有点像Java新手,以防你错过它。:)嗯,单身汉。不是我最喜欢的实现,而是一个肯定会工作的实现。完全同意,我想我可能会把它作为最后一个选项。“不是我最喜欢的实现”:好吧,正确的方法是将参数传递到类中,但您不希望这样。单例的替代方案可以是ThreadLocal(由过滤器设置),但这并没有太大区别,并且只有在从处理传入请求的线程调用类时才起作用。Hmmm,单例。不是我最喜欢的实现,而是一个肯定会工作的实现。完全同意,我想我可能会把它作为最后一个选项。“不是我最喜欢的实现”:好吧,正确的方法是将参数传递到类中,但您不希望这样。单例的替代方案可以是ThreadLocal(由过滤器设置),但这并没有太大区别,并且只有在处理传入请求的线程调用类时才起作用。