struts2 Web应用程序中文件的相对路径

时间:2013-10-17 11:41:24

标签: java eclipse struts2 hashmap freemarker

我有一个问题。我正在使用Struts(Struts 2 Framework)开发Web应用程序。

我为每个用户创建了一个Freemarker模板文件,并将其保存在

webapps/mail/mailEn/customer.ftl

现在,当调用页面时,我必须查看customer.ftl所以我尝试在我的java类中照看它,如下所示: (当我使用当地的直接路径C:// ......它有效)

 MimeBodyPart textBodyPart = null;
 try {
 textBodyPart = new MimeBodyPart();
 Configuration cfg = new Configuration();

//FileTemplateLoader ftl1 = new FileTemplateLoader(new File ("D:/Workspace//Projectname///web///styles/");

 FileTemplateLoader ftl1 = new FileTemplateLoader (new File("\\mail\\mailEn"));       TemplateLoader[] loaders = new TemplateLoader[] { ftl1 };

 MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
 cfg.setTemplateLoader(mtl);
 cfg.setObjectWrapper(new DefaultObjectWrapper());
 Template template = cfg.getTemplate("customerInfo.ftl");
 Map<String, String> rootMap = new HashMap<String, String>();
 rootMap.put("image1", "images/LOGO.jpg");
 rootMap.put("recipient", "aaaa");
 rootMap.put("address", "xxxx");
 rootMap.put("contact", "yyyy");
 rootMap.put("country", "uuuu");
 rootMap.put("sender", "rrrrr");

 Writer out = new StringWriter();
 template.process(rootMap, out);
 textBodyPart.setContent(out.toString(),Constants.TEXT_HTML);
}

使用绝对路径(D:/....),它可以正常工作。但这不可能是 解决方案,因为当我完成这个网络应用程序,我将有一个战争文件,将放在服务器上,绝对路径将是错误的。所以我需要一条始终有效的相对路径!

此刻我正在使用Eclipse。当我尝试使用上面的路径(/../ .. ....)时, 我找不到的文件永远都找不到。 (我试着走到家里的路上 项目,然后到文件夹邮件,文件是)

我试过很多不同的路径,比如./web/mail/,../../../../../web/styles等等, 但我从来没有找到我要找的文件。

如果有人能给我一个暗示该怎么做,我将非常感激!

谢谢!

3 个答案:

答案 0 :(得分:0)

你的文件被临时存储在临时文件夹(应用程序服务器/操作系统)中,所以我建议你“

request.getRequestedURI() + "/" + FILE_PATH`

说:你在“URL:PORT / file / file.txt”中保存了“file.txt”,它实际上引用了tmp文件夹,一旦服务器重新启动或取消部署应用程序,它就会被删除。确保您用于保存的文件夹位于web-inf

之外

答案 1 :(得分:0)

您应该使用WebappTemplateLoader(或者ClassTemplateLoader)。 FileTemplateLoader不适合这个,因为在理论上你甚至不知道是否会在服务器上提取war文件,如果它没有被提取,你肯定不会有目录指向。

答案 2 :(得分:0)

解决方案(调整)

我使用了request.getSession().getServletContext().getRealPath()

在一个类中,例如MessageUtility我使用

final private static String MAIL = ResourceBundle.getBundle("cfg_webapp").getString("mails.folder");

String mailpath = request.getSession().getServletContext().getRealPath(MAIL);

FileTemplateLoader ftl1 = new FileTemplateLoader(new File(mailpath));

在我定义的cfg_webapp.properties中

## Mails
mails.folder=mails

它从----- src / main / webapps / mails / customer.ftl获取路径

谢谢大家。