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() 是被贬低的方法,所以还有其他替代方法吗?getRealPath
在ServletContext
中不被弃用,但如果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应用程序中文件的相对路径的主要内容,如果未能解决你的问题,请参考以下文章