Tapestry 5 - 在Java代码中动态生成Web应用程序上下文文件夹中的文件URL

dav*_*wil 3 java tapestry

我在组件中显示静态图像资源,直到运行时我才知道该图像应该是什么,所以我需要动态生成URL.这些图像都存在于中webapp/images/

我发现的文档并不是很清楚如何处理这个用例,但在玩完之后我发现我可以在组件模板中动态构造URL,如下所示:

<img src="${context:img/score/overall}/${imageFilename}" />
Run Code Online (Sandbox Code Playgroud)

然后将要在其中显示的图像的逻辑放在组件类文件中:

public String getImageFilename() {
    // decide which image to display and return the filename
}
Run Code Online (Sandbox Code Playgroud)

所以这可行,但它不是最干净的解决方案.我真的不想将URL基础连接到模板内的文件名 - 我更愿意在组件类中构造整个URL,如下所示:

<img src="${imageUrl}" />
Run Code Online (Sandbox Code Playgroud)

public String getImageURL() {
    // build URL somehow like "context:" + "filePath" in template
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:context: ...模板中是否有一个Java代码,只是为web appl上下文文件夹生成一个String基本URL,我可以将其文件路径附加到?

我可以通过阅读文档看到一些明显的hacky方法,比如使用所描述的方案手动构建基本URL,或者Asset从Web应用程序上下文文件夹中注入一个已知的静态图像并调用toClientURL()以提取基本URL.但似乎在Java中必须有一个很好的内置方法来实现这一点,特别是因为它可以在模板扩展中自由使用.

但谷歌,因为我可能,我似乎无法找到如何在任何地方做到这一点!

joo*_*ten 6

我认为这应该适合你.(免责声明:我还没有测试过)

@Inject
private AssetSource assetSource;

@Inject
private Locale locale;

public String getImageURL() {
    URL assetUrl = assetSource.getContextAsset("img/score/overall/" + getImageFilename(), locale).toURL();
    return assetUrl.toString();
}
Run Code Online (Sandbox Code Playgroud)

编辑:已更新以反映霍华德的评论

  • 关; 正确的方法是AssetSource.getContextAsset(String path,Locale locale). (2认同)