如何在Tomcat启动时初始化web-app常量(来自文本文件)?

时间:2013-07-09 07:03:11

标签: java tomcat web-applications configuration

我已经在我的本地Tomcat 7上部署了一个Web应用程序。这个web-app需要知道三个文件夹的位置。

以下是该代码的内容:

public class Constants {

    public enum Folder {

        InboundFolder("C:\\inbound\\"),
        StagingFolder("C:\\staging\\"),
        OutboundFolder("C:\\outbound\\");

        private String location;

        private Folder(String location) {
            this.location = location;
        }

        public String locate() {
            return location;
        }
    }

    // ...and so on...

我不想对这些值进行硬编码;相反,我想在启动Tomcat 7时从文本源加载这些常量的值。我已经阅读了ServletConfigServletContext,但我不确定它们是否是我想要的解决方案。

我该怎么做呢?

3 个答案:

答案 0 :(得分:3)

在这种情况下,您可以选择如何初始化常量。有两种常见方式

1)初始参数。

的web.xml

<servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>my.package.MyServlet</servlet-class>

    <init-param>
        <param-name>myParam</param-name>
        <param-value>paramValue</param-value>
    </init-param>
</servlet>

MyServlet.java

public class MyServlet extends HttpServlet {

    protected String s;

    @Override 
    public void init(ServletConfig servletConfig) throws ServletException{
        super(servletConfig);
        this.s = servletConfig.getInitParameter("myParam");
    }

    ....

}   

2)配置文件

您应该在app中的src文件夹中创建属性文件,例如config.properties

myParam=paramValue

Config.java

public class Config {

    private Properties config;

    public Config() {
        config = new Properties();
        reloadConfig();
    }

    public Properties getConfig(){
        reloadConfig();
        return config;
    }

    public String getProperty(String key){
        return getConfig().getProperty(key);
    }

    public void reloadConfig() {

            try {
                config.load(getClass().getResourceAsStream("/config.properties"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

MyServlet.java

public class MyServlet extends HttpServlet {

    protected Config config = new Config();

    @Override 
    public void doGet(request, response) throws ServletException{

        Strign s = config.getProperty("myParam");

    }

}

答案 1 :(得分:1)

使用此:

public static Object myDataStaticObject=null;

...

if (myDataStaticObject==null) {
    File file= new File("C:\\inbound\\", "myCfg.properties");
    InputStream stream = new FileInputStream(file);
    Properties p = new Properties();
    p.load(stream);
    //set your data to myDataStaticObject
}

将数据加载到静态对象&amp;检查第一次加载是否为空。

考虑生产服务器中的目录权限!

答案 2 :(得分:0)

有几种方法可以解决您的问题。

1。使用serveltContext
  web.xml条目

  <context-param>
         <param-name>file1</param-name>
         <param-value>file1-location</param-value>
      </context-param>
      <context-param>
         <param-name>file2</param-name>
         <param-value>file2-location</param-value>
      </context-param>

并在需要时在运行时获取这些值。

2。使用属性文件并加载该属性文件,并使用访问器方法访问这些属性。

3。使用XML基本配置并解析并将其保留在内存中。 (您也可以使用WatchServices,以便在文件发生变化时重新加载文件)

4。在启动应用程序服务器(最少优先)时将文件位置作为运行时参数提供

  

-Dfile1 = FILE1-LOCATION -Dfile2 = FILE2-LOCATION