4

基本上我的项目模型是这样设置的:

ModelFolder
----- src
----- bin 等
----- PropertiesFolder1
-------- File1.properties
-------- File2.properties 等
--- -- PropertiesFolder2
-------- File1.properties
-------- File2.properties 等
----- MainPropertiesFile1.properties
----- MainPropertiesFile2.properties

我正在尝试将它与我的 View 一起使用,这是一个动态 Web 项目,并且在更改后我得到了属性文件以最终加载到我的 Web 项目中

foo.load(new FileInputStream("foo.properties"));  

foo.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("foo.properties"));

并将项目导出到 JAR 文件中,然后我将其包含在 WEB-INF/lib 中。但是,我不得不向模型添加另一个方法,当我尝试测试该方法时,模型无法读取我的属性文件。我知道我可以使用带有完整路径的 FileInputStream 来让属性文件在模型和视图中工作,但是还有其他选择吗?

我不想在每次切换计算机时都更改完整路径(我在工作中使用 H:\username\...\Java\Workspace,而在家里它只是 C:\Java\Workspace)
我也不想将我的属性文件移动到不同的文件夹;最后,我不想更改每次测试模型或视图时加载属性文件的方式。
有没有办法做到这一点?

这让我发疯,我尝试了以下所有方法:

try 
    {
         foo.load(this.getClass().getResourceAsStream("foo.properties"));
        //foo.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("foo.properties"));
        //foo.getClass().getResourceAsStream("foo.properties");
        //foo.load(new FileInputStream("foo.properties"));

    } catch (IOException ex)
      {
          al.logIntoProgrammerLog(ex);
      }  

所有这些行要么在模型中工作,要么在视图中工作。有什么方法可以通过模型中的相对路径调用这些属性文件,然后以某种方式正确地将模型与视图连接起来,以便找到并加载所有文件?
任何帮助将不胜感激; 我是 Java 新手,所以我可能会遗漏一些非常简单的东西。谢谢你。

编辑:
很抱歉没有澄清这一点,模型是一个 Java 项目,而视图是一个在本地 Tomcat 服务器 v6.0 上运行的动态 Web 项目。

更好的(我希望)解释:

我的视图有一个带有以下 doPost 方法的 LoginServlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
   String username = request.getParameter("usernameField");
   String password = request.getParameter("passwordField");
   ActivityLogger al = new ActivityLogger();

   LoginController l_c = new LoginController();

   //loginUser method will call my UserStorage class and 
   //will return true if UserStorage finds the User with those credentials in the db
   //UserStorage is using a prepared sql statement stored in a properties file to find the User
   //That properties file is not being read unless I specify the full path to it.
   //Both Login and UserStorage are in the Model
   if(l_c.loginUser(username, password))
   {
      //take user to welcome page
   }
   else
      //display error
}

再次感谢

4

2 回答 2

2

查看此线程以获取共享 .properties 文件的可能解决方案。但我建议您查看这种方法,看看它是否真的是您想要的。更具体地说,如果您的 .properties 文件包含 SQL 查询,那么您确定在您的视图中需要它吗?听起来你可能想在那里做一个干净的分离。

于 2013-05-01T22:11:59.997 回答
1

如果您在 Web 应用程序中,您应该能够通过使用 ServletContext 的getResourceAsStream(). 例如,如果您想从 servlet 的doGet()方法中获取路径:

public void doGet(HttpServletRequest request, HttpServletResponse response) {
  InputStream in = getServletContext().getResourceAsStream(<path>);
}
  • .properties 文件的相对路径在哪里<path>(即 /WEB-INF/foo.properties,或该属性文件所在的任何位置...查看部署文件夹以确定是否确定)

但是在重新阅读您的帖子时,您的“模型”似乎不是网络应用程序,而您的“视图”是网络应用程序?也许您可以澄清这是否是两个不同的应用程序——可能一个是在 servlet 容器中运行的 webapp(即 Tomcat、Glassfish 等),另一个是独立的应用程序?如果是这种情况,那么这更像是一个共享文件问题,而不是“找不到资源”问题。对您的应用程序的性质进行一些澄清将有助于引导正确的响应......

于 2013-05-01T21:50:40.623 回答