Je viens juste de commencer à travailler avec Wicket moi-même, mais je voudrais simplement monter la ressource en tant que ressource partagée avec sa propre URL. Vous venez de passer outre init()
dans votre Application
et enregistrez la ressource avec
getSharedResources().add(resourceKey, dynamicImageResource);
Ensuite, vous montez comme une ressource partagée avec
mountSharedResource(path, resourceKey);
Pour une raison quelconque, que je ne saisis pas tout à fait encore, vous avez pour préfixer le nom de classe de l'application à la clé de ressource que vous transmettez à mountSharedResource()
.
Ajoutons un exemple complet pour certains votes bonus! Tout d'abord créer un modèle de Wicket vide avec
mvn archetype:create -DarchetypeGroupId=org.apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.4.0 -DgroupId=com.mycompany \
-DartifactId=myproject
Ensuite, remplacer la méthode init()
dans WicketApplication
en ajoutant:
@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);
}
La petite ressource PNG dynamique écrit simplement le paramètre de requête sur fond noir. Bien sûr, vous pouvez accéder à votre base de données ou faire ce que vous voulez pour produire les données d'image.
Enfin, exécutez mvn jetty:run
et vous pourrez accéder à la ressource au this URL.
Et pour compléter ceci: En utilisant une classe d'implémentation IInitializer et 'getSharedResources(). PutClassAlias (ListInitializer.class," list "); new ListInitializer() .init (this); 'vous devriez pouvoir contourner le chemin de classe entier pour votre URL d'image. – Tim
Pouvez-vous fournir plus d'informations, Tim? Je ne trouve pas la classe 'ListInitializer' dans Wicket et la documentation disponible sur' putClassAlias' n'est pas utile non plus. – janko
ListInitializer est juste ma mise en œuvre .. Je vais développer mon exemple dans une réponse propre .. – Tim