2011-02-17 56 views
2

在ASP.NET中,有可以保存应用程序范围设置的web.config。 Java EE Servlet中是否存在相应的文件(位于warjar存档之外)?在Java(Servlet)中应用范围设置的位置?

我需要的是指出一个配置文件的位置,该配置文件当前拥有四个属性,这些属性反过来一起导致数据库存储其余数据和配置。 (服务器,数据库,用户名和密码)。这些值需要很容易更改,不需要重新打包和重新部署整个应用程序,因此是配置文件,但硬编码应用程序中配置文件的路径(即使它是一个常量)看起来很不理想。

任何提示?我尝试过谷歌,但发现很少有那么相似 - 而我发现的东西似乎是为了我的需要而过度设计的。

回答

3

如果这是一个Web应用程序,那么最好将数据库连接配置为服务器上的资源,然后让应用程序使用JNDI检索它。你的应用服务器将有如何做到这一点的文档,这是一个基本的任务。

99%的严重的网络应用程序做到这一点,另1%应该。

1

只需将路径作为命令行参数(传递给servlet容器启动脚本),就可以让应用程序加载任意外部文件。然后将值存储在ServletContext

+0

这引发了一个问题,你如何将一个命令行参数传递给一个servlet?最好以独立于主机的方式。该servlet类只公开'void doPost(HttpServletRequest请求,HttpServletResponse响应)'。没有我可以看到的命令行参数,或者我又错过了什么? –

+0

这取决于你说的命令行参数。如果它们是每个请求参数,则使用请求参数或属性。您还可以使用所有servlet在会话之间共享的会话属性。 @Bozho说,“全局”参数可以从外部文件中获取。这个文件的路径可以通过系统属性发送。 – AlexR

+0

@MichaelKjörling在您的servlet容器上配置它。对于tomcat它是catalina.sh – Bozho

6

在ASP.NET中,有web.config可以保存应用程序范围的设置。 Java EE Servlet中是否存在相应的文件(位于war或jar归档之外)?

这就是web.xml。您可以将设置定义为<context-param>条目。

<context-param> 
    <param-name>foo</param-name> 
    <param-value>bar</param-value> 
</context-param> 

它可以通过ServletContext#getInitParameter()ServletContext反过来在任何地方。

String foo = getServletContext().getInitParameter("foo"); // Contains "bar" 

您也可以通过EL访问它。

#{initParam.foo} <!-- prints "bar" --> 

我需要的是一些地方指出一个配置文件,它目前持有这反过来,一起四个属性,导致了数据的其余部分和配置存储在数据库中。 (服务器,数据库,用户名和密码)这些值需要易于更改,无需重新打包和重新部署整个应用程序,因此是配置文件,但硬编码应用程序中配置文件的路径(即使它是一个常数)看起来很不理想。

按强调,我会使用一个properties文件中查找该特定目的,然后将其放置在WAR之外的路径。您只需将此路径添加到Java运行时类路径。然后你就可以得到它的classpath资源:

Properties properties = new Properties(); 
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties")); 
// ... 

然而,与特定的唯一宗旨,以服务一个数据库连接,你确实更好用servletcontainer管理数据源作为回答Qwerky。你可能需要配置的只是数据源名称。