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
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/wicket-user
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Wicket-and-embeddable-Ajax-components-tf3604793.html#a10084198
Sent from the Wicket - User mailing list archive at Nabble.com.


-------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user

Reply via email to