Re: [Wicket-user] Wicket and embeddable Ajax components
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 > >
Re: [Wicket-user] Wicket and embeddable Ajax components
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 >
Re: [Wicket-user] Wicket and embeddable Ajax components
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 >
Re: [Wicket-user] Wicket and embeddable Ajax components
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
Re: [Wicket-user] Wicket and embeddable Ajax components
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
Re: [Wicket-user] Wicket and embeddable Ajax components
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: > * > * 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")
Re: [Wicket-user] Wicket and embeddable Ajax components
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: * * 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.
[Wicket-user] Wicket and embeddable Ajax components
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