我想访问静态文件,这些文件位于我的Web应用程序之外的已知目录中。我已经在www上阅读了很多选项,但我仍然有一些问题。
基本上我想为我的应用服务器的defaultservlet声明一个上下文。在我的情况下,我正在尝试Tapestry教程,这是一个基于Maven的项目并导入到eclipse。
想法是创建一个httpservlet,从该位置获取文件。有人知道我在哪里可以找到这样一个servlet的例子,我怎么能打电话给他?我知道servlet可能必须被声明为一个服务,因为应用程序的所有页面都需要访问这些文件,但我也可能会弄错,只需在布局页面中导入它(所有页面都使用) layout.tml文件)。我基本上没有任何线索如何使用servlet。有人能告诉我光明吗?
非常坦克。
答案 0 :(得分:3)
另一个更简单的解决方案是创建一个返回流响应的页面
public class StaticFile {
StreamResponse onActivate(String fileName) {
return new StaticFileStreamResponse(fileName);
}
}
然后在另一个组件/页面
@Inject ComponentResources resources;
public Link getStaticFileLink() {
return resources.createPageRenderLinkWithContext("StaticFile", "path/to/myFile.jpg");
}
TML
<img src="${StaticFileLink}" />
但是你不会在我的其他解决方案中利用tapestry的304 NOT_MODIFIED响应。
答案 1 :(得分:2)
这种做法的挂毯方式是提供AssetRequestHandler和AssetFactory。
AppModule.java
public static void contributeAssetDispatcher(
MappedConfiguration<String, AssetRequestHandler> config,
ResourceStreamer streamer)
{
config.add("staticfile", new StaticFileAssetRequestHandler(streamer));
}
public void contributeAssetSource(
MappedConfiguration<String, AssetFactory> config)
{
config.add("staticfile", new StaticFileAssetFactory());
}
然后在你的tml中你可以使用
<img src="${asset:staticfile:path/to/myFile.jpg}" />
查看ContextAssetRequestHandler,ClasspathAssetRequestHandler,ContextAssetFactory和ClasspathAssetFactory以获取灵感。
小心不要打开一个安全漏洞,黑客可以通过传递前缀为../../