Ich habe gerade erst begonnen, mit Wicket selbst zu arbeiten, aber ich würde einfach die Ressource als freigegebene Ressource mit einer eigenen URL bereitstellen. Sie überschreiben nur init()
in Ihrem Application
und registrieren die Ressource mit
getSharedResources().add(resourceKey, dynamicImageResource);
Dann montieren Sie es als gemeinsame Ressource mit
mountSharedResource(path, resourceKey);
Aus irgendeinem Grund, dass ich immer noch nicht ganz fassen, Sie haben den Klassennamen der Anwendung dem Ressourcenschlüssel voranstellen, den Sie an mountSharedResource()
übergeben.
Lassen Sie uns ein voll funktionierendes Beispiel für einige Bonus-Stimmen hinzufügen! Erstellen Sie zunächst eine leere Wicket-Vorlage mit
mvn archetype:create -DarchetypeGroupId=org.apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.4.0 -DgroupId=com.mycompany \
-DartifactId=myproject
Dann überschreiben die init()
Methode in WicketApplication
durch Zugabe:
@Override
protected void init() {
final String resourceKey = "DYN_IMG_KEY";
final String queryParm = "id";
getSharedResources().add(resourceKey, new Resource() {
@Override
public IResourceStream getResourceStream() {
final String query = getParameters().getString(queryParm);
// generate an image containing the query argument
final BufferedImage img = new BufferedImage(100, 100,
BufferedImage.TYPE_INT_RGB);
final Graphics2D g2 = img.createGraphics();
g2.setColor(Color.WHITE);
g2.drawString(query, img.getWidth()/2, img.getHeight()/2);
// return the image as a PNG stream
return new AbstractResourceStreamWriter() {
public String getContentType() {
return "image/png";
}
public void write(OutputStream output) {
try { ImageIO.write(img, "png", output); }
catch (IOException ex) { /* never swallow exceptions! */ }
}
};
}
});
mountSharedResource("/resource", Application.class.getName() + "/" +
resourceKey);
}
Der kleine dynamische PNG Ressource nur schreibt die Abfrage-Parameter auf schwarzem Hintergrund. Natürlich können Sie auf Ihre Datenbank zugreifen oder alles machen, was Sie möchten, um die Bilddaten zu erzeugen.
Schließlich ausführen mvn jetty:run
, und Sie können auf die Ressource unter this URL zugreifen.
Und um dies zu ergänzen: Verwenden eines IInitializer implementierende Klasse und 'getSharedResources(). PutClassAlias (ListInitializer.class," list "); new ListInitializer(). init (this); 'Sie sollten in der Lage sein, den gesamten Klassenpfad für Ihre Bild-URL vorwegzunehmen. – Tim
Können Sie mehr Informationen geben, Tim? Ich kann die Klasse "ListInitializer" in Wicket nicht finden und die verfügbare Dokumentation zu 'putClassAlias' ist ebenfalls nicht hilfreich. – janko
ListInitializer ist nur meine Implementierung .. Ich werde mein Beispiel in eine eigene Antwort erweitern .. – Tim