Hi Jakob, You might want to have a look at the
- getRequestDispatcher(Resource resource, RequestDispatcherOptions options) method of the SlingHttpServletRequest. In the options you can actually force a resource type, which will be used during dispatching instead of the value in your original resource. Cheers, Igor. pro!vision GmbH Telefon +49 (69) 8700328-21 Geschäftsführer: Karim Khan, Stefan Seifert Sitz der Gesellschaft: Berlin AG Charlottenburg, HRB78141, USt-IdNr. DE209954974 >-----Original Message----- >From: Jakob Külzer [mailto:[email protected]] >Sent: Tuesday, April 17, 2012 11:06 PM >To: [email protected] >Subject: Using Filter and RequestDispatcher to substitute responses > >Hello everybody, > >I'm just starting to get my head wrapped around Sling and Day CQ 5 and >I'm running against an issue that I don't really understand properly. >I'm still quite new to Sling, so if you see something where I've got >an incorrect understanding feel free to jump in and correct me. >Thanks! > >What I am trying to do is to replace certain request with output from >a different JSP. For example, a page contains an embedded component >which, as far as I understand, is referenced via a Sling resourceType. >When Sling renders this page, the JSP will be included; however, based >on certain conditions I'd like to render a different JSP. My naive >approach is to register a filter in the include chain, create a >RequestDispatcher for the new JSP and call the include() method. > >My first question is, am I using the appropriate approach for this? >Should I look at another mechanism in Sling to do something like this? > >Second, assuming a filter is the correct approach, why does it not >render my JSP? > >Here're the relevant lines of code: > >---->8-------------------------------------------------------------- >@org.apache.felix.scr.annotations.Component(immediate = true, metatype = >false) >@Service(Filter.class) >@Properties({ @Property(name = "sling.filter.scope", value = { >"include", "forward" }) }) >public class ComponentFilter implements Filter { > > public void doFilter(ServletRequest request, ServletResponse >response, FilterChain chain) throws IOException, ServletException { > final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) >request; > final Resource resource = ...; // Get resource for the JSP. > if (localResource != null) { > final RequestDispatcher requestDispatcher = >slingRequest.getRequestDispatcher(resource); > requestDispatcher.include(request, response); > } else { > chain.doFilter(request, response); > } > } > >} >---->8-------------------------------------------------------------- > >The resource is properly resolved: > >*DEBUG* script: JcrNodeResource, type=nt:file, superType=null, >path=/apps/myapp/components/demo/replacment.jsp > >However, I get this error: > >17.04.2012 16:13:53.136 *ERROR* [127.0.0.1 [1334693633099] GET >/content/geometrixx/en/test.html HTTP/1.1] >org.apache.sling.servlets.get.impl.DefaultGetServlet No renderer for >extension html, cannot render resource JcrNodeResource, type=nt:file, >superType=null, path=/apps/myapp/components/demo/replacment.jsp > >I'm not sure what to make of this. Any ideas? > >Any help is appreciated! Thank you. > > >-- >Cheers, >Jakob
