Hi, Barrett,

Thank you for this. Very interesting.

So, allow me to rephrase to make sure I'm understanding you on this.

The requirement is:

 - Continue to use Wicket as web framework
 - Be able to reuse javascript widgets outside of wicket
 - Reuse same javascript code for both usage patterns

IIUC, what you do below accomplishes that by using all javascript as
<script>ed widgets, even from Wicket. In other words, the javascript is
no longer served by Wicket, but by a servlet.


Is that correct?


If so, don't you find that a bit cumbersome to have to change the way
you write all your wicket apps? Or has it been relatively painless for
you?


Cheers,
Dave




On Thu, 2007-04-19 at 11:33 -0700, barrett wrote:
> Forgot to mention, to use this just create a page class that extends
> ComponentAsWidgetContainerPage and then implement the getComponent(id)
> method. This method should return the component(usually a panel) that you
> wish to make into a widget, with the id set to the id passed in to the
> getComponent call.
> 
> You then have a script tag whose src points at this page as seen in the
> javadoc comments.
> 
> -Barrett
> 
> 
> barrett wrote:
> > 
> > David,
> > We recently had a requirement where we wanted to include a panel from our
> > new Wicket app on one of our non-wicket legacy applications. To do this I
> > created a behavior and container page which will spit out any component
> > between a javascript document.write method. Then on your non-wicket page
> > you include a script tag whose src attribute is the address of the
> > container page. Below are the 3 files that make up the solution. If the
> > files don't show up properly let me know and I can find another way to
> > post them.
> > 
> > 
> > ComponentAsWidgetContainerPage.java:
> > 
> > package com.company.ui.wicket.page;
> > 
> > import wicket.Component;
> > 
> > import com.company.ui.wicket.behaviors.JavascriptDocumentWritingBehavior;
> > 
> > /**
> >  * A page which widgetizes a component so it can be used on any page
> > outside of
> >  * the containing wicket application.
> >  * 
> >  * @see [EMAIL PROTECTED] JavascriptDocumentWritingBehavior}
> >  * 
> >  */
> > public abstract class ComponentAsWidgetContainerPage extends WebPage
> > {
> > 
> >     private static final String WIDGET_ID = "componentAsWidget";
> > 
> >     public ComponentAsWidgetContainerPage()
> >     {
> >             super();
> >             Component widget = getComponent(WIDGET_ID);
> >             if (widget.getId() != WIDGET_ID)
> >             {
> >                     throw new IllegalArgumentException("ID for the widget 
> > component should
> > be set to "
> >                                     + WIDGET_ID);
> >             }
> >             widget.add(new JavascriptDocumentWritingBehavior());
> >             add(widget);
> >     }
> > 
> >     /**
> >      * Implementations should return the component that is to be widgetized.
> >      * 
> >      * @param id
> >      *          The id which should be set on the returned component.
> >      * 
> >      * @see [EMAIL PROTECTED] JavascriptDocumentWritingBehavior}
> >      * @return
> >      */
> >     public abstract Component getComponent(String id);
> > 
> > }
> > 
> > JavascriptDocumentWritingBehavior.java:
> > 
> > package com.company.ui.wicket.behaviors;
> > 
> > import wicket.Component;
> > import wicket.IRequestTarget;
> > import wicket.MarkupContainer;
> > import wicket.RequestCycle;
> > import wicket.Response;
> > import wicket.behavior.AbstractBehavior;
> > import wicket.markup.ComponentTag;
> > import wicket.markup.html.internal.HtmlHeaderContainer;
> > import wicket.markup.parser.filter.HtmlHeaderSectionHandler;
> > import wicket.protocol.http.servlet.ServletWebRequest;
> > import wicket.request.target.component.ComponentRequestTarget;
> > import wicket.response.StringResponse;
> > 
> > import com.company.ui.wicket.page.ComponentAsWidgetContainerPage;
> > 
> > /**
> >  * This behavior encapsulates any component in a
> >  * "document.write('[renderedComponent]');" javascript line. The main use
> > of
> >  * this is to be able to "widgetize" any component to be used on any page
> >  * outside of the containing application with a script tag in the form
> > of:<br/><br/>
> >  * 
> >  * &lt;script
> >  *
> > src="/mywebapp/app?wicket:bookmarkablePage=:com.company.app.pages.[ComponentContainerPage]"
> >  * type="text/javascript"&gt;&lt;/script&gt; <br/> <br/> To be used with
> >  * [EMAIL PROTECTED] ComponentAsWidgetContainerPage}
> >  */
> > public class JavascriptDocumentWritingBehavior extends AbstractBehavior
> > {
> >     private static final long serialVersionUID = 1L;
> >     private Response renderToResponse;
> >     private Response originalResponse;
> > 
> >     @Override
> >     public void bind(Component component)
> >     {
> >             IRequestTarget target = new ComponentRequestTarget(component);
> >             RequestCycle.get().setRequestTarget(target);
> >             super.bind(component);
> >     }
> > 
> >     @Override
> >     public void onComponentTag(Component component, ComponentTag tag)
> >     {
> >             renderToResponse = new StringResponse();
> >             originalResponse = 
> > RequestCycle.get().setResponse(renderToResponse);
> > 
> >             renderToResponse.reset();
> > 
> >             renderHeader(component);
> >             super.onComponentTag(component, tag);
> >     }
> > 
> >     @Override
> >     public void onRendered(Component component)
> >     {
> >             String renderedComponent = 
> > renderToResponse.toString().replaceAll("(
> > ?[\\r\\n] ?)+", "")
> >                             .replaceAll("'", "\\\\'");
> >             // Need to make sure any relative server paths get the server 
> > prepended
> >             String host = ((ServletWebRequest)
> > component.getRequest()).getHttpServletRequest().getHeader(
> >                             "host");
> >             renderedComponent = renderedComponent.replaceAll("href=\"/",
> > "href=\"http://"; + host + "/");
> >             renderedComponent = renderedComponent.replaceAll("src=\"/",
> > "src=\"http://"; + host + "/");
> > 
> >             originalResponse.write("document.write('");
> >             originalResponse.write(renderedComponent);
> >             originalResponse.write("');");
> >             RequestCycle.get().setResponse(originalResponse);
> >             super.onRendered(component);
> >     }
> > 
> >     /**
> >      * Renders the header contributed tags to the response.
> >      * 
> >      * @param response
> >      * @param component
> >      */
> >     private void renderHeader(final Component component)
> >     {
> >             final HtmlHeaderContainer header = new
> > HtmlHeaderContainer(HtmlHeaderSectionHandler.HEADER_ID);
> >             if (component.getPage().get(HtmlHeaderSectionHandler.HEADER_ID) 
> > != null)
> >             {
> >                     component.getPage().replace(header);
> >             }
> >             else
> >             {
> >                     component.getPage().add(header);
> >             }
> > 
> >             component.renderHead(header);
> >             component.detachBehaviors();
> >             if (component instanceof MarkupContainer)
> >             {
> >                     ((MarkupContainer) component).visitChildren(new 
> > Component.IVisitor()
> >                     {
> >                             public Object component(Component component)
> >                             {
> >                                     if (component.isVisible())
> >                                     {
> >                                             component.renderHead(header);
> >                                             component.detachBehaviors();
> >                                             return CONTINUE_TRAVERSAL;
> >                                     }
> >                                     else
> >                                     {
> >                                             return 
> > CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER;
> >                                     }
> >                             }
> >                     });
> >             }
> >     }
> > }
> > 
> > ComponentAsWidgetContainerPage.html:
> > 
> > <html xmlns:wicket="http://wicket.sourceforge.net";>
> > <body>
> >     <div wicket:id="componentAsWidget" />
> > </body>
> > </html>
> > 
> > 
> > David Leangen-8 wrote:
> >> 
> >> 
> >> Hello!
> >> 
> >> We are currently happily using Wicket to develop our web applications.
> >> Wicket rules!
> >> 
> >> 
> >> However, now we are required to make "embeddable Ajax components", you
> >> know, like Google Maps that anybody can embed in their own html.
> >> 
> >> 
> >> Can anybody suggest an approach that would allow us to keep as much
> >> overlap/reusability/cohabitation between our existing Wicket apps and
> >> these Ajax components that we now need to make?
> >> 
> >> 
> >> For instance, would a reasonable approach be to use only Sciptaclous
> >> components in Wicket so we can use the exact same lib for our embeddable
> >> components?
> >> 
> >> I guess ideally I'd like to be able to serve the XHRs from these
> >> components directly from Wicket (ultimate reusability/cohabitation), but
> >> this doesn't look like it would be an easy task...
> >> 
> >> 
> >> Any comments would be most welcome. I'm new to this. :-)
> >> 
> >> 
> >> Cheers,
> >> Dave
> >> 
> >> 
> >> 
> >> 
> >> -------------------------------------------------------------------------
> >> This SF.net email is sponsored by DB2 Express
> >> Download DB2 Express C - the FREE version of DB2 express and take
> >> control of your XML. No limits. Just data. Click to get it now.
> >> http://sourceforge.net/powerbar/db2/
> >> _______________________________________________
> >> Wicket-user mailing list
> >> Wicket-user@lists.sourceforge.net
> >> https://lists.sourceforge.net/lists/listinfo/wicket-user
> >> 
> >> 
> > 
> > 
> 


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Wicket-user mailing list
Wicket-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to