Динамическое изображение Primefaces в таблице данных с использованием разбиения на страницы

Я успешно реализовал решение, предложенное BalusC для рендеринга динамических изображений внутри таблицы данных (код размещен ниже здесь). Проблема, с которой я сталкиваюсь, заключается в следующем:

Проблема

Я использую нумерацию страниц в datatable, и когда я перехожу на страницу, которую я никогда не посещал, изображения отображаются нормально. Но когда я возвращаюсь на страницу, которую я посетил ранее, изображения не отображаются, хотя для этого изображения возвращается StreamedContent.

Код

// ImageBean - SessionScoped        
// Get image for compound
public StreamedContent scaledImageById() {
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
        return new DefaultStreamedContent();
    } else {
        String idStr = context.getExternalContext().
                                       getRequestParameterMap().get("id");
        StreamedContent image = scaledCompoundImageMap.
                                              get(Integer.valueOf(idStr));
        return image;
    }
}


// Controller - ViewScoped
<p:dataTable id="cTable" value="#{controller.compoundList}" var="compound">
       <p:column headerText="Structure" style="text-align:center">
          <p:graphicImage id="scaledImage" 
                          value="#{imageBean.scaledImageById()}"     
                          cache="false">
                <f:param name="id" value="#{compound.id}" />
          </p:graphicImage>
       </p:column>   
  ...

Поэтому, когда я захожу на новую страницу в пагинаторе, изображения отображаются нормально. Но когда я возвращаюсь на уже посещенную страницу, изображения не отображаются (даже несмотря на то, что scaledImageById вызывается дважды, а StreamedContent возвращается нормально).

Пожалуйста, дайте мне знать, если вам нужен какой-либо другой код здесь, и любая помощь будет высоко оценена. Спасибо.

Абдул


person Basith    schedule 24.09.2013    source источник
comment
Какие запросы генерирует браузер? Вы должны отследить свою проблему под firebug на вкладке сети.   -  person Danubian Sailor    schedule 24.09.2013
comment
Спасибо Лукаш. Да, я проверил вкладку «Сеть» и вижу, что Primefaces генерирует динамический URL для каждого изображения. Что-то вроде этого: 'dynamiccontent.properties.jsf?ln=primefaces&pfdrid=xxxxx&id=13. И когда я нажимаю на нее при первом посещении пагинатора, он отлично открывает изображение, но когда я снова захожу на страницу и открываю такую ​​ссылку, изображения нет. Не знаю, почему эта динамическая ссылка не работает при следующем посещении той же страницы.   -  person Basith    schedule 24.09.2013


Ответы (1)


Со стороны HTML у вас есть элемент img:

<img src="some_url?id=xyz"/>

Если изображения хранятся в базе данных и никогда не изменяются (загрузка нового изображения создает новый идентификатор изображения в вашей сущности), вы можете добиться большей гибкости и производительности, создав собственный сервлет для изображений.

1) Создайте сервлет и привяжите его к 'some_url'

2) В сервлете прочитайте изображение из базы данных (или что-нибудь еще)

3) Установите заголовки, наиболее важные тип содержимого и длину содержимого, а также заголовки кэша.

4) Запишите содержимое в выходной поток

Плюс в том, что если у вас есть постоянный URL-адрес изображения и хорошая политика кэширования, браузер будет извлекать изображение из кеша - bean-компонент не нужно вызывать каждый раз.

person Danubian Sailor    schedule 24.09.2013
comment
Спасибо за это решение, Лукаш. Я попробую это сейчас. Иногда неприятно осознавать, что некоторые вещи не так просты. Очевидно, что Primefaces не является универсальным решением для всех. Имея опыт работы с Flex, я чувствую, что мне нужно использовать множество обходных путей (в основном связанных с пониманием этапов сборки/просмотра/рендеринга и жизненного цикла), чтобы достичь желаемого результата, что немного обременяет разработчика. Я буду продолжать искать новые пакеты в блоке и буду продолжать исследовать. Спасибо еще раз. - person Basith; 25.09.2013