2

我想访问位于我的 Web 应用程序之外的已知目录中的静态文件。我已经阅读了很多关于 www 的选项,但我对此仍有一些疑问。

基本上我想为我的应用程序服务器的 defaultservlet 声明一个上下文。就我而言,我正在尝试使用 Tapestry 教程,这是一个基于 Maven 的项目并导入到 eclipse。

这个想法是创建一个 httpservlet,它从该位置获取文件。你们中有人知道我在哪里可以获取这样一个 servlet 的示例以及我如何称呼他吗?我知道 servlet 可能必须声明为服务,因为应用程序的所有页面都需要访问文件,但我也可能会弄错,并且在布局页面中导入它就足够了(所有页面使用layout.tml 文件)。我基本上不知道如何使用 servlet。有人可以给我看灯吗?

非常坦克你。

4

2 回答 2

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 响应。

于 2013-06-04T13:21:21.630 回答
2

这样做的挂毯方式是提供一个AssetRequestHandler和一个AssetFactory

应用模块.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 以获得灵感。

注意不要打开一个安全漏洞,黑客可以通过传递前缀为的文件路径来访问您服务器上的任何文件../../

于 2013-06-04T12:38:01.353 回答