>From: "Steve Olson" <[EMAIL PROTECTED]> > > I'm new to Clay, and just slightly less new to JSF. I'm experimenting with a > JSF custom component that renders an eclipse BIRT report. I'm using Clay HTML > views in a webapp that among other things needs to render various reports. > I'm > not using any JSP, so didn't bother with a JSP tag for this component. > > BIRT reports can either be rendered as embedded HTML, or as a PDF. I think I > understand how everything works rendering HTML. My question is with rendering > a > report to PDF - the content is no longer HTML and the response content type > has > to be application/pdf. So my custom component based on UIComponentBase that > works fine with embeded HTML won't work for PDF. If an attribute on this > component indicates a PDF rendering is desired, what's a good strategy for > implementing this? One thought that comes to mind is rendering javascript > back > in the HTML response, that would pop up a separate window, and have that > served > by a separate URL handled outside of Clay/JSF. Are there better alternatives > for handling this? I know very little about custom RenderKits or other > options, > and would appreciate it if anyone is interested in pointing me in other > directions. > > Thanks in advance for any tips...
If you are using full clay views (no-jsp), the clay view handler assumes the content type of the response to be "text/html". That's if a content type has not already been set. This is one of those todo items. Although, I think you could set the response's content type to "application/pdf" in a view controllers prerender event. Or, create a JSP page that sets the content type, has a f:view tag and a single clay component. You can change the render kit per view using the f:view tag's "renderKitId" attribute, but it applies to the entire page - all components in the view. Clay allows you to do this using the "f:view". It just needs to be some place in the page - unlike the jsp tag that has to be a root. <span view="f:view" renderKitId="org.acme.mypdfkit"/> If you created a html markup renderer for your component and also a PDF renderer, you would need to register them in the faces config under different render kits. <render-kit> <render-kit-id>org.acme.mypdfkit</render-kit-id> <renderer> <component-family>org.acme.mycomponent</component-family> <renderer-type>org.acme.mycomponent</renderer-type> <renderer-class>org.acme.mycomponentPdfRenderer</renderer-class> </renderer> <render-kit> <render-kit> <!-- default --> <renderer> <component-family>org.acme.mycomponent</component-family> <renderer-type>org.acme.mycomponent</renderer-type> <renderer-class>org.acme.mycomponentRenderer</renderer-class> </renderer> <render-kit> I've always liked to see the PDF documents embeded in html. If you are able to embed the document, you could make a component attribute for documentType (html or pdf). The renderer could generate an html embed tag with a src that pointed to a servlet. The render could save the document to a map in session scope. The key used to store the document in the session map could be added as a query parameter to the src of the embed tag. So, the servlet only needs to look for the query parameter and use it as the key into the document's cache. Next, push the cached document to the response and set the content type. <EMBED width="672" height="500" border="2" src="/contextRoot/embedDoc;jsessionid=xxx?token=123" type=application/pdf > Another approach would be to use the Trinidad internal view handler versus a servlet. With the internal view handler, you can map a custom view hander to a view id. So, if your view id was "/embedDoc", you could delegate to an internal view handler that could create a component tree specifically addressing your needs. They use this to complement some of the trinidad components that need popup dialogs. I have an example of this in the shale sandbox. Properties file to register the mapping between viewId and internal view handler: http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad/src/main/resources/META-INF/org.apache.myfaces.trinidad.render.InternalView.properties?view=log View handler: http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad/src/main/java/org/apache/shale/clay/PageHandler.java?view=log Your popup idea would also work nicely with this library. They make it very easy to attach script files. Here's an example of sending script to the browser (@ "loadHtmlFragment" method): http://svn.apache.org/viewvc/shale/sandbox/shale-clay-trinidad/src/main/java/org/apache/myfaces/trinidad/blank/CatalogBacking.java?view=markup Sounds like a fun project. Hope that gives you some ideas. Gary