Sam zacząłem pracować z Wicketem, ale po prostu zamontowałem zasób jako zasób udostępniony z własnym adresem URL. Wystarczy zastąpić init()
w swoim Application
i zarejestrować zasób
getSharedResources().add(resourceKey, dynamicImageResource);
Następnie należy zamontować go jako zasobu udostępnionego z
mountSharedResource(path, resourceKey);
z jakiegoś powodu, że wciąż nie w pełni zrozumieć, trzeba aby dodać nazwę klasy aplikacji do klucza zasobów, który przekazano do mountSharedResource()
.
Dodajmy w pełni działający przykład na niektóre bonusowe głosy! Najpierw utworzyć pusty szablon przejściowe bez
mvn archetype:create -DarchetypeGroupId=org.apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.4.0 -DgroupId=com.mycompany \
-DartifactId=myproject
Następnie zastąpić metodę w WicketApplication
init()
dodając:
@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);
}
Mała dynamiczny zasób PNG właśnie pisze parametru zapytania na czarnym tle. Oczywiście, możesz uzyskać dostęp do bazy danych lub zrobić, co chcesz, aby uzyskać dane obrazu.
Na koniec wykonaj mvn jetty:run
, aby uzyskać dostęp do zasobu pod numerem this URL.
I uzupełnienie tego: Używanie klasy implementującej IInitializer i 'getSharedResources(). PutClassAlias (ListInitializer.class," list "); new ListInitializer(). init (this); 'powinieneś być w stanie obejść, przygotowując całą ścieżkę classpath dla twojego adresu URL obrazu. – Tim
Czy możesz podać więcej informacji, Tim? Nie mogę znaleźć klasy 'ListInitializer' w Wicket i dostępna dokumentacja na' putClassAlias' też nie jest przydatna. – janko
ListInitializer to tylko moja implementacja. Rozwinę mój przykład na własną odpowiedź. – Tim