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.

你可能感兴趣的:(object,service,HashMap,Integer,tapestry,Parameters)