If you have your page template check for the user agent, you can redirect the URL to currentPage.getPath()+".mobile.html" and that should be handled by your mobile.jsp in that page component.
That being said, for mobile, the example given by cq5 shows a completely separate site tree where page components inherited wcm/components/mobile/page which has further device detecting API to then redirect to other selectors like ".smart.html" or ".touch.html". If you choose to go down this path you can either redirect to the mobile site from the desktop site or be redirected from the web server via some mod_rewrite which can inspect the user agent string and redirect to the mobile site if it matches some mobile specific strings. Sarwar On Apr 18, 2012 3:26 AM, "Jakob Külzer" <[email protected]> wrote: > Hello Sarwar, > > Thank you for your explanations. I didn't know about the cheat sheet. > Now it's bookmarked, thank you. > > From the cheatsheet i understand that the only way to influence the > script selection for a given node is through the HTTP method, selector > and extension, correct? > > Just out of curiosity, how could I influence the script selection > outside of these parameters, if possible? While selector and extension > provide a lot of flexibility, they are insufficient for what I have in > mind. > > Maybe an example will make clear what i am trying to accomplish. The > original idea was born as i implemented a custom solution on Day CQ 4. > In order to support, for example, mobile versions of components, i > introduced the concept of a rendition. At the beginning of the request > the template would determine the rendition and store it in the > request. Then I added a custom component loader that would check if > there was a rendition specific script. For example, if rendition was > set to "mobile", it would look for a mobile.jsp and render it instead > of the actual component JSP. This way the implemented site > transparently switches to mobile (or whatever rendition has been > selected) markup while maintaining the same URL structure. This turned > out to be a quite flexible and useful model and now I would like to > implement similar functionality for Sling based systems. Any > suggestions how I could go about this? > > Regards, > Jakob > > > On Tue, Apr 17, 2012 at 6:28 PM, Sarwar Bhuiyan > <[email protected]> wrote: > > 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 > >> > > > > -- > Cheers, > Jakob >
