Tapestry 显示图片

what you're doing is trying to use a @Insert component to insert a blob
in your page. It will never work like that since Tapestry will actually try
to display the string representation of your blob (if you call
personImage.toString() you'll get exactly that "oracle.sql.BLOB@1176e8a").
You need something a bit more sophisticated. I've done exactly what you're
trying to do so I'll explain it to you. I won't past all my code since it's
very application-specific.

First you need to create a service that will produce the image contents, so
create a class for that. Something like this:

public class ImageService implements IEngineService {

public ILink getLink(boolean isPost, Object parameters) {
Object personId = parameterArray[0];

Map serviceParameters = new HashMap();
serviceParameters.put(ServiceConstants.SERVICE, getName());
serviceParameters.put(ServiceConstants.PARAMETER, new Object[] {
personId });

return linkFactory.constructLink(this, isPost, serviceParameters,
true);
}

public String getName() {
return "personImage";
}

public void service(IRequestCycle cycle) throws IOException {
// here you have to set the appropriate content type
// I'm assuming it's a jpeg image.
ContentType contentType = new ContentType("image/jpeg");
OutputStream outputStream = webResponse.getOutputStream(contentType);

Object[] parameters = linkFactory.extractListenerParameters(cycle);
Integer personId = (Integer) parameters[0];

// you have the ID, so here you do whatever you have to do
// to fetch the person object
Person person = whatever...

// then you have to write the image contents to the output stream.
int length = person.personImage.length();
outputStream.write(person.personImage.getBytes(0,length));
outputStream.close();
}
}

On the html page you'll have to use an img tag with the source being the
service you just created:

<img jwcid="@Any" src="ognl:imageLink"/>

On the component's java class you'll need something like:

// This is the hivemind service being injected
@InjectObject("service:ImageService")
public abstract IEngineService getProductImageService();

public String getImageLink() {
Object[] parameters = new Object[1];

// I'm assuming there is a "person" variable in page
// with the person object you want to display.
parameters[0] = person.personID;

return getProductImageService().getLink(false,
parameters).getAbsoluteURL();
}

... next you'll also have to tell hivemind about the service in your
hivemodule.xml

<service-point id="ImageService"
interface="org.apache.tapestry.engine.IEngineService">
<invoke-factory>
<construct class="my.package.ImageService">
<set-object property="linkFactory"
value="infrastructure:linkFactory"/>
</construct>
</invoke-factory>
</service-point>

<contribution configuration-id="tapestry.services.FactoryServices">
<service name="personImage" object="service:ImageService"/>
</contribution>


That's more or less how I did it. I think that's about it, but if I forgot
anything I guess the docs can fill in.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值