如何通过RequestPathInfo正确检查选择器和扩展

时间:2014-05-07 23:33:55

标签: cq5 sling

我一直在研究一个组件,目前我正在尝试根据为组件选择的选择器做不同的事情。

所以基本上如果我有一个具有这种结构的组件

myComponent/
  dialog.xml
  myComponent.jsp
  altView.jsp

我知道如果我有一个带有resourceType myComponent的节点,我可以通过浏览器通过请求“path / to / component / content.altView.html”来请求alt视图,而且所有内容都是hunky dory。

同样地,我可以做一个cq include并做类似的事情:

# with cq include
<cq:include path="my/path.altView" resourceType="myComponent"/>

# or with sling include
<sling:include path="my/path" resourceType="myComponent"  replaceSelectors="altView"/>

然而,当我处理请求时,我在查看RequestPathInfo对象时看到了一些有趣的行为。

例如,如果我们查看上述所有3个案例,我可能会有这样的事情:

# http://path/to/component/content.altView.html
slingRequest.getRequestPathInfo().getSelectors(); // {altView}
slingRequest.getRequestPathInfo().getExtension(); // html

# <sling:include path="my/path" resourceType="myComponent"  replaceSelectors="altView"/>
slingRequest.getRequestPathInfo().getSelectors(); // {altView}
slingRequest.getRequestPathInfo().getExtension(); // html

# <cq:include path="my/path.altView" resourceType="myComponent"/>
slingRequest.getRequestPathInfo().getSelectors(); // []
slingRequest.getRequestPathInfo().getExtension(); // altView

我理解为什么cq:include会返回不同的结果(我们向/ path.altView发出请求,而.altView在这种情况下巧合地作为扩展名)。我很好奇是否有标准化为什么要拉“altView”(或选定的视图),无论它是否被用作扩展名或选择器。或者如果这是正常的,我只需要单独检查扩展和选择器。

selectors = get selectors();
if selectors
   do stuff
else check extensions
   do stuff

再次非常感谢您的见解,这个社区非常棒。

[编辑]

在回答答案时,我想我会更多地了解我正在做的事情。基本上我们的组件结构已经设置好,以便我们的每个组件都有一个关联的Java类来处理业务逻辑。 (IE apps / myapp / components / myComponent将映射到com.mypackage.components.MyComponent)也就是说,在我的组件的类中,我需要根据组件的调用方式(即选择器/扩展/等)来不同地处理控制流)。例如,如果我的组件被正常调用,我会执行基本行为,但如果使用选择器调用它(例如)“altView”我将需要以不同的方式处理备用视图,并且在此备用视图中,不同的数据将是可用,等等。

我的问题是基于似乎我可以给出“cq:include”标签的“path”属性我想要使用的选择器:

<cq:include path="my/path.altView" resourceType="myComponent"/>

但是,当我在组件类中检查我的RequestPathInfo来决定工作流时,“altView”作为扩展名返回,而不是在String []选择器中。注意,上面的编译很好,它选择正确的.jsp文件进行渲染,RequestPathInfo对象只是将数据存储在不同的地方。

我开始猜测将选择器放入path属性是否有效,因为选择器和扩展修饰符改变了行为的变化。 mycomponent.altView.html解析为altView.jsp,而如果我要执行mycomponent.altView,它也会尝试解析mycomponent / altView.jsp,就像mycomponent.xml对mycomponent / XML.jsp一样。

2 个答案:

答案 0 :(得分:2)

好像你正在解决Sling决议问题。最简单的方法是根据选择器&#34;做出不同的事情。在给定的组件中(让我们说我的/新/组件)是创建不同的渲染器。

例如,假设我正在请求/content/app/page.html,并且该页面上是my / new / component组件。或者,如果我请求/content/app/page.selector.html,我希望我/ new / component的体验略有不同。

在cq:组件中,我将创建两个JSP:component.jsp和component.selector.jsp。 Sling will automatically know,基于请求中的选择器,使用哪个渲染器。显然,每个渲染器都可以产生不同的体验。

扩展也是如此。在示例中,component.jsp和component.selector.jsp实际上等同于component.HTML.jsp和component.selector.HTML.jsp。 HTML就是暗示的。但是,您可以再次执行component.XML.jsp和component.selector.XML.jsp和Sling,根据请求的选择器和扩展名选择最相关的选择器。

现在,如果您不希望选择器显示在网页请求的网址中(我认为您不应该这样做),该怎么办...

您可以使用吊索包含您的组件:包括并添加选择器,就像您已经完成的那样。

警告:吊索:包含的工作方式与cq:include有点不同,所以只在需要时使用。相反,您也可以使用Sling映射来隐藏用户的选择器。大多数时候我会推荐这种方法。

我不确定你要将选择器添加到&#34;路径&#34;属性。我不认为这会做任何事情。 &#34;路径&#34;定义资源名称(如果资源不是synthetic,则定义节点名称)。包括选择器,除了使资源名称包括句点和选择器之外,不会做任何事情。

答案 1 :(得分:2)

  

我的问题是基于我似乎可以给予的基础   “cq:include”标签的“path”属性我想要使用的选择器:

<cq:include path="my/path.altView" resourceType="myComponent"/> However, when I check my RequestPathInfo in my component class to
     

决定工作流程,“altView”作为扩展名返回,而不是在内   String []选择器。

cq:include标记相反,您也可以使用sling:include标记,该标记提供修改选择器和属性的属性。请求后缀:

<sling:include resourceType="myComponent" path="my/path" addSelectors="altView"/>

<sling:include resourceType="myComponent" path="my/path" replaceSelectors="altView"/>

如果您已经在请求中选择了不希望应用于myComponent的选择器。


就Sling include&amp; amp;和Sling之间的差异而言。 CQ包括,似乎很少,除了后者还支持脚本包含。来自文档:

  

您应该使用<cq:include>还是<sling:include>

     
      
  • 开发AEM组件时,Adobe建议您使用   <cq:include>
  •   
  • <cq:include>允许您直接包含脚本文件   使用脚本属性时按名称。这需要组件   和资源类型继承考虑在内,并且通常比简单   使用选择器严格遵守Sling的脚本解析   扩展。
  •