我一直在研究一个组件,目前我正在尝试根据为组件选择的选择器做不同的事情。
所以基本上如果我有一个具有这种结构的组件
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一样。
答案 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的脚本解析 扩展。