Ok, thanks for all this!
I'm new to Ajax, so I'll have to play around with this so I can better
appreciate the solution proposed below.
Cheers,
Dave
On Fri, 2007-04-20 at 00:26 -0700, Igor Vaynberg wrote:
> i dont really get what scriptaculous, etc has to do with it. and i
> dont get why you would have to redo anything? the solution is
> transparent.
>
> so if you have existing widgets that are panels, most likely they are,
> thats how you develop widgets in wicket, you just drop them into that
> container page and you are done
>
> -igor
>
>
> On 4/20/07, David Leangen <[EMAIL PROTECTED]> wrote:
>
> Ok, that's interesting.
>
> So, you guys are suggesting that a reasonable approach to the
> problem
> would be to find a lib that I like (such as scriptaculous),
> set them up
> on a widget server, then access them either as standalone
> javascript
> widgets or in wicket via ComponentAsWidgetContainer?
>
> The only unfortunate thing about this approach is that we'd
> have to redo
> all our existing wicket stuff... But hey, who said life was
> perfect? ;-)
>
>
> Cheers,
> Dave
>
>
>
> On Thu, 2007-04-19 at 23:59 -0700, Igor Vaynberg wrote:
> > just to add
> >
> > an important point is
> >
> > this is completely transparent to the widget panel. it is
> just a
> > panel. it doesnt know it is being inlined via javascript
> into another
> > page - this is the job of ComponentAsWidgetContainerPage
> >
> > one thing to consider is that you would need to rewrite urls
> so they
> > point back to the widget server.
> >
> > -igor
> >
> >
> > On 4/19/07, Igor Vaynberg <[EMAIL PROTECTED]> wrote:
> > afaict there is no servlet.
> >
> > what he does is have a bookmarkable page which he
> mounts. all
> > this page does is read some parameter off url and
> based on
> > that parameter add the right panel to itself. it
> then renders
> > this panel, and wraps the output in document.write()
> call.
> >
> > well this is almost accurate. i think what he does
> is create a
> > different page for different widget and mount each
> onto a
> > different url.
> >
> > so
> >
> > MyWidgetAPage extends ComponentAsWidgetContainerPage
> {
> > protected Panel getContent(String id) { return
> new
> > MyWidgetAPanel(id); }
> > }
> >
> > MyWidgetBPage extends ComponentAsWidgetContainerPage
> {
> > protected Panel getContent(String id) { return
> new
> > MyWidgetBPanel(id); }
> > }
> > mountPage("/widgeta", MyWidgetAPage.class);
> > mountPage("/widgetb", MyWidgetBPage.class);
> >
> > -igor
> >
> >
> > -igor
> >
> >
> >
> > On 4/19/07, David Leangen <[EMAIL PROTECTED]>
> wrote:
> >
> > 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
> > > >> [email protected]
> > > >>
> >
> 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
> > [email protected]
> >
> 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 [email protected]
> 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
> [email protected]
> 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
> [email protected]
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-user