Sure, go ahead. But just to be clear, this code probably won't work "as is".
That's just the basics I put together based on an implementation I had made
so there might be some details that may need filling in or fixing.

For instance, below is an e-mail I sent Calvin answering some questions
about this implementation. I did a reply-to-all but I don't think it made it
to this list. Anyway, here it is.


>1.  public class ImageService implements IEngineService {
>
>   public ILink getLink(boolean isPost, Object parameters) {
>      Object personId = parameterArray[0];  Where does the 
> parameterArray  come from?

That's my mistake. You can cast "parameters" into an Object array and use
that.

>2. OutputStream outputStream = webResponse.getOutputStream(contentType);
>   I get a  Cannot make a static reference to the non-static method 
>>getOutputStream(ContentType) from the type WebResponse

That's because you're actually calling WebResponse.getOutputStream... you
need to get an instance of webResponse, you can do that with:
WebResponse webResponse = cycle.getInfrastructure().getResponse();

As I said, I sent you the basic structure... you might have to fill in some
things to get it 100% working.


>3. Where does the following code go:
>// This is the hivemind service being injected
>@InjectObject("service:ImageService")
>
> public String getImageLink() {
>    Object[] parameters = new Object[1]; ...

This code goes on you page/component class. Whatever page or component in
which you wish to display the image.

Denis

-----Original Message-----
From: Sven Homburg [mailto:[EMAIL PROTECTED] 
Sent: quinta-feira, 9 de março de 2006 16:16
To: Tapestry users
Subject: Re: Database Images

hi denis,

do you feel ok, if i insert this howto into the tapestry wiki ?

best regards

homburg Softwaretechnik
S.Homburg
21220 Seevetal / GERMANY
Fon: +49-4105-669746
Fax: +49-4105-668947





Denis Souza wrote:
> Hi, 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 "[EMAIL PROTECTED]").
> 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.
>
> Denis
>
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] 
> Sent: segunda-feira, 6 de março de 2006 17:22
> To: tapestry-user@jakarta.apache.org
> Subject: Database Images
>
> I am still trying to figure out how to display jpg's stored in our oracle
> database.  I have a person class that has the following fields:
>       private String personID;
>       private String personName;
>       private Blob personImage;
>
> I create a list of these perons as I return data from the database.
> My HOME.page contains
>       <component id="personImage" type="Insert">
>               <binding name="value" value="currentPerson.personImage"/>
>       </component>
>
> and my HOME.html has
> <td><span img jwcid="personImage">Test image 3</span></td>
>
> The page works though the browser but I get [EMAIL PROTECTED]
retuned
> in the html table(with different data after the @ )
> I looked at the examples but, since I am new to this, they did not help.
>
> Any suggestions.
> Thanks
> Calvin
>
> --
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to