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

Posted

技术标签:

【中文标题】struts 2 Web应用程序中文件的相对路径【英文标题】:relative Path for file in struts 2 Webapplication 【发布时间】:2013-10-25 21:15:23 【问题描述】:

我有一个问题。我正在使用 Struts(Struts 2 框架)开发一个 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。当我尝试使用上面的路径(/../.. ....)时, 我要找的文件永远找不到。 (我试图走上 项目然后到文件夹mail,文件所在的位置)

我尝试了许多不同的路径,例如 ./web/mail/ 、 ../../../../../web/styles 等等, 但我从来没有找到我要找的文件。

如果有人能给我一个提示,我将非常感激!

谢谢!

【问题讨论】:

将它们放入resources文件夹并使用getResourceAsStream方法。 他可以使用ClassTemplateLoader 而不是getResourceAsStream。否则,如果 FreeMarker 无法加载模板本身,它就无法为您缓存 Template 我尝试使用 ClassTemplateLoader 但它不起作用。它说找不到文件错误。 【参考方案1】:

解决方案(调整)

我用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 获取路径

谢谢大家。

【讨论】:

【参考方案2】:

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

【讨论】:

ClassTemplateLoader 通过指定类名和路径来做什么?现在我也在使用 FileTemplateLoader ftl1 = new FileTemplateLoader(new File(request.getRealPath(\mail\mailEn )));并且它工作正常,但 request.getRealPath() 是被贬低的方法,所以还有其他替代方法吗? getRealPathServletContext 中不被弃用,但如果war 未解包,它仍然可以返回null。从 ClassTemplateLoader 开始,请参阅 JavaDoc:freemarker.org/docs/api/freemarker/cache/… 如果我在我的项目中使用 request.getRealPath(\mail\mailEn) 即 request.getRealPath 不推荐使用的方法,它会在将来引起问题 正如我所说,是的,因为war-s 并不总是在服务器上提取,然后getRealPath 将返回null,因为没有文件指向。但通常它们会被提取出来。 ***.com/questions/19406118/…(详细问题)【参考方案3】:

实际上您的文件存储在临时文件夹(应用程序服务器/操作系统)中,所以我建议您`

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

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

【讨论】:

我做了 FileTemplateLoader ftl1 = new FileTemplateLoader (new File(request.getRequestedURI()+"\\mail\\mailEn"));它在控制台中给了我正确的路径“/Web/mail/mailEn”,但仍然给我找不到错误文件。我的目录是 ProjectWeb >> src >> main >> webapp >> mail >>mailEn >> customer.ftl 它给出 java.io.FileNotFoundException: \ProjectWeb\mail\mailEn 不存在。 现在我正在使用 FileTemplateLoader ftl1 = new FileTemplateLoader(new File(request.getRealPath(\mail\mailEn )));并且它工作正常,但 request.getRealPath() 是被贬低的方法,所以还有其他替代方法吗?

以上是关于struts 2 Web应用程序中文件的相对路径的主要内容,如果未能解决你的问题,请参考以下文章

在Java web中相对路径和绝对路径区别及应用方法

文件操作

Struts2环境搭建和运用

Web应用中相对路径与绝对路径

java中的绝对路径和相对路径

在Java web中相对路径和绝对路径区别及应用方法