Have you tried with org.apache.wicket.markup.html.include.Include ? It does exactly what you need.
On Tue, Feb 21, 2012 at 3:20 PM, Johan Isaksson <[email protected]> wrote: > Hi! > Seven days ago I posted a question on the users mailing list (see below), > but I have got no responses so far. I thought I'll give it a try with the > developers list as well. Since my question to the users list I also found > that our 1.4 approach is very much alike what's described on the Wicket > wiki > https://cwiki.apache.org/WICKET/including-jsp-files-in-html-templates.html. > So there might be more projects bumping into this issue soon. > > I also posted this question on SO, > http://stackoverflow.com/questions/9257706/wicket-1-5-and-jsp-servlet-wrapping > > Thanks, > > Johan > ---------- Forwarded message ---------- > From: Johan Isaksson <[email protected]> > Date: 2012/2/14 > Subject: Wicket 1.5 and JSP/servlet wrapping > To: [email protected] > > Hi! > > In the project I'm on we want to upgrade from Wicket 1.4 to 1.5 (1.5.4) and > one major thing is not working yet. > There's a need to wrap old JSP/servlets into the new Wicket based > application and the old 1.4-approach is not working anymore. > > Simplified html output in 1.4 > <body> > <div id="container"> > wrappedContentFromJsp > </div> > <body> > > Simplified html output in 1.5 > <body> > wrappedContentFromJsp > <div id="container"> > </div> > <body> > > So, all the JSP content renders outside the tag that we like to wrap it in. > The wrapping magic happens in our internal AbstractServletWrapperPanel and > the WebMarkupContainer.onRender(MarkupStream markupStream) override. > However, in Wicket 1.5 we can't invoke markupStream.next() since it's no > longer provided. I have not found a way around this yet. > > Working code for 1.4 with a sample panel implementation as reference: > public abstract class AbstractServletWrapperPanel extends Panel { > > public AbstractServletWrapperPanel(String id, final String > servletName, String tagId) { > super(id); > add(new WebMarkupContainer(tagId) { > > @Override > protected void onRender(MarkupStream markupStream) { > markupStream.next(); > try { > WebRequestCycle cycle = (WebRequestCycle) RequestCycle.get(); > ServletRequest request = > cycle.getWebRequest().getHttpServletRequest(); > ServletResponse response = > cycle.getWebResponse().getHttpServletResponse(); > ServletContext context = ((WebApplication) > Application.get()).getServletContext(); > RequestDispatcher rd = context.getNamedDispatcher(servletName); > if (rd != null) { > rd.include(request, response); > } else { > // handling... > } > } catch (Exception e) { > // handling... > } > } > }); > } > } > > //Impl > public class WrapperPanel extends AbstractServletWrapperPanel { > private static final long serialVersionUID = 1L; > > public WrapperPanel(String id, final String servletName) { > super(id, servletName, "wrappedContentId"); > } > } > > //WrapperPanel html > <body> > <wicket:panel> > <wicket:container wicket:id="wrappedContentId"/> > </wicket:panel> > </body> > > In the 1.5 version I'm getting the request and response via > * (HttpServletRequest)RequestCycle.get().getRequest().getContainerRequest() > * > (HttpServletResponse)RequestCycle.get().getResponse().getContainerResponse() > > Then I've tried to: > > * use the onRender()-magic without markupStream.next() that's no longer > provided in 1.5 > * move it to onComponentTagBody(MarkupStream markupStream, ComponentTag > tag) > * Note: To invoke onComponentTagBody() I had to open up the container tag > "<wicket:container></wicket:container>". > * I also tried without invoking markupStream.next() as that step is > performed in Component.internalRenderComponent() just before > onComponentTagBody is invoked at all. > * move it to onComponentTag(ComponentTag tag) > * combined above with setting setRenderBodyOnly(true) in the > WebMarkupContatiner.onInitialize() > * use a <div> tag instead of a wicket:container > * use debug mode to track down the rendering process of 1.5. But still, I > guess I'm missing out some key part of the new 1.5 way of rendering > components. > * invoke getAssociatedMarkupStream() from onRender() but that raises the > following error > * org.apache.wicket.markup.MarkupNotFoundException: Markup of type 'html' > for component '... AbstractServletWrapperPanel$1' not found. > > Since it's not an option to migrate all that JSP functionality to Wicket > anytime soon this is kind of a showstopper for us at the moment. > > For reference, the 1.4 way of doing this is much similar to the approach I > found in the article > http://herebebeasties.com/2007-03-01/jsp-and-wicket-sitting-in-a-tree/ > > I also posted this question on SO, > http://stackoverflow.com/questions/9257706/wicket-1-5-and-jsp-servlet-wrapping > > Any help solving this issue would be very appreciated! > > Thanks, > > Johan -- Martin Grigorov jWeekend Training, Consulting, Development http://jWeekend.com
