It looks at the sling:resourceType and then selects a script (either a JSP
in a component folder or a Sling Servlet where the resource type is
specified).  There is one other way of doing it which is the legacy way of
registering a Sling Servlet to a specific path.  All this is being done by
the SlingMainServlet which is in essence a dispatcher which selects a
script or servlet based on a combination of sling:resourceType, selectors,
and extensions (or the fixed path).  The other way would be to register
your own servlet with the http service in OSGi and then in that servlet
itself do a forward() or redirect() to a specific path.

In Sling, we tend not to do forwards or redirects to JSPs but rather to
paths to resources which then have a backing scripts which Sling selects.
 I take it you've seen the Sling Cheatsheet which shows the different ways
a script can be chosen (it doesn't include using a Sling Servlet though but
you can see examples of those in the Sling source code).  This way, you
never have to directly call a JSP yourself and this level of indirection
allows you to be able to do stuff like attaching ACLs to the node path
you're calling or change the backing implementation later on without
changing the outside URLs.

Hope this makes sense somewhat.

Sarwar

On Tue, Apr 17, 2012 at 10:55 PM, Jakob Külzer <[email protected]>wrote:

> Hello Sarwar,
>
> thank you for your response. I've considered using selectors, however
> that alters the URL for the page, which is undesirable.
>
> The other approach, using if-else statements in the JSP is something I
> have prototyped using a taglib, which works fine, but it requires that
> each JSP has to be wrapped into the tag.
>
> Ideally, i could handle this completely transparently. The key idea is
> to keep the actual JSPs clear of the actual switching behaviour. After
> all, the same behaviour will be used in many different JSPs, and I
> don't like the idea of having to rely on developers manually cutting
> and pasting code between JSPs.
>
> I was wondering how Sling selects which script actually to render.
> From my understanding that happens when Sling evaluates the
> sling:resourceType field. Is there a way to hook up to that decision
> process?
>
> Regards,
> Jakob
>
> On Tue, Apr 17, 2012 at 5:36 PM, Sarwar Bhuiyan
> <[email protected]> wrote:
> > You could use different scripts in the same component and call them based
> > on your condition.  So supposing your component is called
> >
> > mycomponent/
> >   mycomponent.jsp
> >   optiona.jsp
> >   optionb.jsp
> >
> > In your mycomponent.jsp, you can do something like:
> >
> >
> > <%if(condition){%>
> >   <cq:include script="optiona.jsp"/>
> > <%else {%}
> >   <cq:include script="optionb.jsp"/>
> > <%}%>
> >
> >
> >
> > Sarwar
> >
> >
> > On Tue, Apr 17, 2012 at 10:34 PM, Sarwar Bhuiyan
> > <[email protected]>wrote:
> >
> >> You could use a selector.  So supposing your component is called
> >>
> >> mycomponent/
> >>
> >>
> >> On Tue, Apr 17, 2012 at 10:05 PM, Jakob Külzer <[email protected]
> >wrote:
> >>
> >>> 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
> >>>
> >>
> >>
>
>
>
> --
> Cheers,
> Jakob
>

Reply via email to