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

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

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

  

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

 public String getImageFilename() { // decide which image to display and return the filename } 

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

  

 public String getImageURL() { // build URL somehow like "context:" + "filePath" in template } 

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

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

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

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

 @Inject private AssetSource assetSource; @Inject private Locale locale; public String getImageURL() { URL assetUrl = assetSource.getContextAsset("img/score/overall/" + getImageFilename(), locale).toURL(); return assetUrl.toString(); } 

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