гобелен отображает большой двоичный объект с помощью разметки

Я сохранил изображение большого двоичного объекта в базе данных, используя этот компонент. чтобы вставить блоб из mysql в тег в гобелене. Я нашел это в сети. Не понимаю, как работает write.element

Я думаю, что-то вроде этого должно работать

    @SupportsInformalParameters
    public class DBImage {

      @Parameter(required = true)
      private Image image;
      @Inject
      private ComponentResources resources;


      boolean beginRender(MarkupWriter writer,byte[] array){
            writer.element("img", "src", "data:image/png;base64,"+array,);

            resources.renderInformalParameters(writer);

            writer.end();

            return false;
      }
    }

чем вызывать компонент каждый класс страницы

@Property 
private DBImage image.beginRedner(entity.getBlobImage);

person nkvnkv    schedule 03.11.2012    source источник
comment
wiki.apache.org/tapestry/ ссылка на документацию   -  person user1516873    schedule 30.09.2015


Ответы (1)


Я не пытался использовать схему URI данных с изображениями в гобелене - я уверен, что это 'может' работать, но для вызова вы просто включите это в свой tml:

<t:DBImage image="${entity.BlobImage}" />

и в вашем компоненте DBImage вам понадобится способ преобразовать параметр image в массив байтов.

Я не хочу тратить время на создание рабочего примера этой техники, но я расскажу вам, как я решаю проблемы такого типа:

Как и в случае любого рендеринга изображения в html-документе, ДОЛЖНЫ быть два отдельных запроса (если не используется схема data uri):

  1. HTML-код страницы для отображения тега изображения (например, http://host/context/app/mypage)
  2. данные изображения (т.е. 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