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/> > > * > > * <script > > * > > src="/mywebapp/app?wicket:bookmarkablePage=:com.company.app.pages.[ComponentContainerPage]" > > * type="text/javascript"></script> <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