p:graphicImage не меняет значение
Я пытался показать некоторые изображения в зависимости от параметра String.
Я использую Java, Jboss, JSF и простые символы. Изображения здесь: ... Рабочий стол \wildfly-10.0.0\bin\img\ и я использую маршрут: Для сохранения изображений при загрузке новых ресторанов в приложение. Для загрузки изображений, когда клиент показывает рестораны.
Код, который я использую:
ManagedBean
package com.activity.presentation;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.UploadedFile;
public class ImageLoaderBean implements Serializable {
private static final long serialVersionUID = 1L;
// Cargador de imagenes de un restaurante
private UploadedFile image;
private DefaultStreamedContent imageLoad;
private Map<String, DefaultStreamedContent> images;
public ImageLoaderBean(){
images = new HashMap<>();
}
////////////////////////////////////////////////////////////////////////////
// Getters and setters
////////////////////////////////////////////////////////////////////////////
public UploadedFile getImage() {
return image;
}
public void setImage(UploadedFile image) {
this.image = image;
}
public DefaultStreamedContent getImageLoad() {
return imageLoad;
}
public void setImageLoad(DefaultStreamedContent imageLoad) {
this.imageLoad = imageLoad;
}
public void saveImage() throws IOException {
String imageName = image.getFileName();
InputStream input = image.getInputstream();
String path = new File("").getAbsolutePath() + "//img";
OutputStream output = new FileOutputStream(new File(path, imageName));
try {
IOUtils.copy(input, output);
} finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(output);
}
}
public DefaultStreamedContent loadImage(String name) throws FileNotFoundException {
if(images.containsKey(name))
return images.get(name);
else{
String path = new File("").getAbsolutePath() + "//img//" + name + ".jpg";
FileInputStream fs = new FileInputStream(path);
imageLoad = new DefaultStreamedContent(fs, "image/jpeg");
images.put(name, imageLoad);
return imageLoad;
}
}
}
Страница xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="/templates/template-user.xhtml">
<ui:define name="body">
<div class="container_24">
<p:dataScroller value="#{actividades.restaurantes}" var="restaurante"
chunkSize="6">
<f:facet name="header">
Use scroll to show more restaurants
</f:facet>
<h:panelGrid columns="2">
<p:outputPanel>
<p:graphicImage value="#{imageLoader.loadImage(restaurante.name)}"
styleClass="imagen" />
</p:outputPanel>
<p:outputPanel>
<h:panelGrid columns="2" cellpadding="5">
<h:outputText value="Id:" />
<h:outputText value="#{restaurante.id}" styleClass="negrita" />
<h:outputText value="Nombre:" />
<h:outputText value="#{restaurante.name}" styleClass="negrita" />
<h:outputText value="Teléfono:" />
<h:outputText value="#{restaurante.telephone}"
styleClass="negrita" />
<h:outputText value="Dirección:" />
<h:outputText value="#{restaurante.address}" styleClass="negrita" />
</h:panelGrid>
</p:outputPanel>
</h:panelGrid>
</p:dataScroller>
</div>
</ui:define>
</ui:composition>
Метод loadImage работает нормально, когда я отлаживаю его (добавляя различные изображения с правильным именем и путем к карте изображений), но когда я вижу страницу в веб-браузере, я всегда вижу одно и то же изображение. Я использую опцию "осмотреть элемент", чтобы увидеть детали и изображения всегда имеют одинаковый src в веб-браузере:
img id="j_idt23:j_idt25:0:j_idt29" src="/recomendador/javax.faces.resource/dynamiccontent.properties.xhtml? ln=primefaces&v=5.3&pfdrid=D6DixI6zLgdnWFwfifCqRCLll30J5oCGmp92SYOEGh1piAq3Q75ekynDCGWApZML&pfdrt=sc&pfdrid_c=true" alt="" class="imagen"
Я не знаю, почему это происходит, когда метод bean возвращает правильное значение.
ManagedBeans, используемые в коде, имеют область действия сеанса. Я использовал все области и некоторые атрибуты: cache="false"
, меняя value
за name
атрибут, и я не мог решить проблему. большое спасибо