Я не пытался использовать схему 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>
и запрос два просто вернет поток байтов данных изображения.
Давайте начнем со второго запроса, потому что так он имеет больше смысла.
В гобелене отдельный запрос обрабатывается путем создания класса страницы и, возможно, шаблона 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}" />
Очевидно, вам нужно подключить свой параметр и поиск.
person
pstanton
schedule
04.11.2012