简短的问题:我需要把从数据库中抽取到一个URL动态图像,而无需使用检票添加组件的显示页面(如使用NonCachingImage)。
完美的解决方案(我在其他框架已经实现)是简单地创建一个网页,采用图片ID作为URL参数并呈现图像响应流。 不幸的是Wicket的网页类扩展MarkupContainer,围绕MarkupStreams旋转。 MarkupStreams不是非常有利于直接渲染字节数据。
长的问题:我使用的Wicket 1.4.0,在Tomcat中运行6.0.18。 该图像被存储在一个Postgres数据库,通过检索JDBC。 该图像需要由第三方API只接受图像的URL进行渲染。 我有一个包含字节数据,MIME类型,以及对象的资源可以从数据库中拉模型并将其添加到响应流中的模型对象。
有任何想法吗?
我刚开始检票自己的工作,但我只想挂载资源与自身的URL共享资源。 你只需要重写init()
在你的Application
并注册与资源
getSharedResources().add(resourceKey, dynamicImageResource);
然后,你安装它作为一个共享资源
mountSharedResource(path, resourceKey);
出于某种原因,我还没有完全掌握,你必须在应用程序的类名称前面加上你传递给资源键mountSharedResource()
让我们添加一些奖金票完全工作的例子! 首先创建一个空的Wicket模板
mvn archetype:create -DarchetypeGroupId=org.apache.wicket \
-DarchetypeArtifactId=wicket-archetype-quickstart \
-DarchetypeVersion=1.4.0 -DgroupId=com.mycompany \
-DartifactId=myproject
然后,重写init()
在方法WicketApplication
通过添加:
@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);
}
小动态PNG资源只是写在黑色背景上的查询参数。 当然,你可以访问你的数据库或做任何你喜欢以产生图像数据。
最后,执行mvn jetty:run
,你将能够访问资源此URL 。
我将添加另一个答案说马丁在格里戈罗夫写wicketinaction.com一个非常好的博文在细节如何就可以提供从检票1.5数据库加载图片:
http://wicketinaction.com/2011/07/wicket-1-5-mounting-resources/
这正好与@迈克尔的问题相匹配。
这里是我的示例,它所做的标识符的动态编译列表一样,担任了与静态URL共享资源..
public class WicketApplication extends WebApplication {
...snip...
@Override
protected void init() {
//Spring
addComponentInstantiationListener(new SpringComponentInjector(this));
//Register export lists as shared resources
getSharedResources().putClassAlias(ListInitializer.class, "list");
new ListInitializer().init(this);
}
而我认为ListInitializer注册资源DBNAME_SUBSELECTION1(2/3 / ..)
public class ListInitializer implements IInitializer {
public ListInitializer() {
InjectorHolder.getInjector().inject(this);
}
@SpringBean
private DatabankDAO dbdao;
@Override
public void init(Application application) {
//For each databank
for (Databank db : dbdao.getAll()) {
String dbname = db.getName();
//and all collection types
for (CollectionType ct : CollectionType.values()) {
//create a resource
Resource resource = getResource(dbname, ct);
//and register it with shared resources
application.getSharedResources().add(this.getClass(), dbname + '_' + ct, null, null, resource);
}
}
}
@SpringBean
private MyApp MyApp;
public Resource getResource(final String db, final CollectionType collectionType) {
return new WebResource() {
@Override
public IResourceStream getResourceStream() {
List<String> entries = MyApp.getEntries(db, collectionType.toString());
StringBuilder sb = new StringBuilder();
for (String entry : entries) {
sb.append(entry.toString());
sb.append('\n');
}
return new StringResourceStream(sb, "text/plain");
}
@Override
protected void setHeaders(WebResponse response) {
super.setHeaders(response);
response.setAttachmentHeader(db + '_' + collectionType);
}
}.setCacheable(false);
}
}
我很抱歉,但我似乎无法找到我用了此设置的教程,但如何这涉及到上面的例子,可以进行调整,以做影像同样应该是显而易见的。(对不起,稀疏的解释,如果目前还不清楚我能回来和编辑我的答案)