BLOB-Bilder werden nur beim Aktualisieren einer Seite nach einem Update über p angezeigt: dataTable wird in PrimeFaces erstellt
Ich zeige Bilder, die in Form von BLOB in MySQL gespeichert sind, auf einem an<p:graphicImage>
wie folgt.
<p:dataTable var="row" value="#{testManagedBean}" lazy="true" editable="true" rows="10">
<p:column headerText="id">
<h:outputText value="#{row.brandId}"/>
</p:column>
<p:column headerText="Image">
<p:cellEditor>
<f:facet name="output">
<p:graphicImage value="#{brandBean.image}" height="100" width="100">
<f:param name="id" value="#{row.brandId}"/>
</p:graphicImage>
</f:facet>
<f:facet name="input">
<p:graphicImage id="image" value="#{brandBean.image}" height="100" width="100">
<f:param name="id" value="#{row.brandId}"/>
</p:graphicImage>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit" width="50">
<p:rowEditor/>
</p:column>
</p:dataTable>
Während der Bearbeitung einer Zeile wird a<p:fileUpload>
wird auf a angezeigt<p:overlayPanel>
. Dies und viele andere Dinge sind in diesem Beispiel der Einfachheit halber weggelassen, da sie nicht mit dem konkreten Problem zusammenhängen.
Die zugehörige verwaltete JSF-Bean:
@ManagedBean
@ViewScoped
public final class TestManagedBean extends LazyDataModel<Brand> implements Serializable
{
@EJB
private final TestBeanLocal service=null;
private static final long serialVersionUID = 1L;
@Override
public List<Brand> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
setRowCount(3);
return service.getList();
}
}
Das Bean, das Bilder basierend auf einer eindeutigen Zeilenkennung aus der Datenbank abruft.BrandBean
.
@ManagedBean
@ApplicationScoped
public final class BrandBean
{
@EJB
private final BrandBeanLocal service=null;
public BrandBean() {}
public StreamedContent getImage() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
return new DefaultStreamedContent();
}
else {
String id = context.getExternalContext().getRequestParameterMap().get("id");
System.out.println("id = "+id);
byte[] bytes = service.findImageById(Long.parseLong(id));
return bytes==null? new DefaultStreamedContent(new ByteArrayInputStream(new byte[0])):new DefaultStreamedContent(new ByteArrayInputStream(bytes));
}
}
}
Wenn eine Zeile aktualisiert wird (nachdem sie bearbeitet wurde), klicken Sie auf ein Häkchen (angezeigt durch)<p:rowEditor>
) in der letzten Spalte der Datentabelle diegetImage()
Methode in derBrandBean
wird aufgerufen, wie es sollte.
Dies geschieht ordnungsgemäß in einer Anwendung, die auf GlassFish Server 4.0 mit PrimeFaces 5.0 und JSF 2.2.6 ausgeführt wird.
Ein neues Bild wird sofort in der Datentabelle angezeigt, nachdem eine Zeile in der Datentabelle (und folglich in der Datenbank) aktualisiert wurde.
Auf Tomcat Server 8.0.5 wird eine andere Anwendung mit Spring 4.0.0 GA ausgeführt, in derdasgetImage()
Methode wird nicht aufgerufen Nachdem eine von der Datentabelle gehaltene Zeile aktualisiert wurde, wird weiterhin das Symbol angezeigtaltes Bild (nicht die neu aktualisierte) in der Datentabelle (obwohl die Änderungen korrekt in die Datenbank übernommen wurden).
Das neu aktualisierte Bild wird nur angezeigt, wenn die Seite durch Drücken von aktualisiert wurdeF5 (In den meisten Browsern). Es wird sogar nicht beim Laden der Seite angezeigt (geben Sie eine URL in die Adressleiste ein und drücken Sie dann die Tasteeingeben Schlüssel).
Mit anderen Worten, wenn eine Zeile in einer Datentabelle aktualisiert wird, indem Sie auf das Häkchen klicken, das durch gekennzeichnet ist<p:rowEditor>
, dasgetImage()
Methode wird nicht aufgerufen (daher wird das neue Bild nicht aus der Datenbank abgerufen, auf der es angezeigt werden soll)<p:graphicImage>
). Diese Methode wird nur aufgerufen, wenn die Seite durch Drücken von aktualisiert / neu geladen wirdF5 Tastenkürzel.
Warum passiert das? Wie zeige ich ein neu aktualisiertes Bild unmittelbar nach der Aktualisierung einer Zeile an?
Oberflächlich gesehen sollte dies weder mit Spring noch mit JPA zusammenhängen (der Aktualisierungsvorgang wird nach dem Klicken auf das Häkchen korrekt in die Datenbank übertragen). Dies sollte eher mit dem Tomcat-Server zusammenhängen.