我没有尝试将数据 uri 方案与挂毯中的图像一起使用 - 我确信它“可以”工作,但要调用你只需将其包含在你的 tml 中:
<t:DBImage image="${entity.BlobImage}" />
在您的 DBImage 组件中,您需要一种将image
参数转换为字节数组的方法。
我不想花时间创建这种技术的工作示例,但我将带您了解如何解决此类问题:
就像 html 文档中的任何图像渲染一样,必须有两个单独的请求(除非使用 data uri 方案):
- 页面的 html 来呈现图像标签(即
http://host/context/app/mypage
)
- 图像数据(即
http://host/context/app/myimage
)
所以对于请求一,您要构建图像 url 并将其放在 img 标签中:
<html>
...
<img src="/context/app/myimage/params" />
...
</html>
请求二将只返回图像数据的字节流。
让我们从第二个请求开始,因为这样更有意义。
在 Tapestry 中,通过创建页面类和可选的tml
模板来处理单个请求。要提供字节流,您只需要页面类。要将参数或上下文传递给页面,请使用上下文参数。
package myproject.pages;
public class MyImage
{
public StreamResponse onActivate(String parameter)
{
// retrieve your image using the context parameter(s)
final InputStream imageStream = getImage(parameter);
return new StreamResponse()
{
@Override
public InputStream getStream() throws IOException
{
return imageStream;
}
@Override
String getContentType()
{
return "image/png";
}
@Override
void prepareResponse(Response response)
{}
};
}
}
此时,您可以使用 URL“http://host/context/app/myimage/parameter”请求/渲染您的图像。现在你只需要将它包含在你的 img 标签中,即请求 1。
因此,您需要先生成链接,这需要在您的页面类中完成:
包 myproject.pages;
public class MyPage
{
@Inject
private PageRenderLinkSource pageLink;
public Link getImageLink()
{
return pageLink.createPageRenderLinkWithContext(MyImage.class, parameter);
}
}
剩下的就是在你的 tml 中使用这个链接:
<img src="${imageLink}" />
显然,您需要连接您的参数和检索。