aem - 为什么在CQ5中单个组件有多个jsp?

标签 aem sling

我是CQ5的新手。在学习其概念时,我知道CQ5使用Sling框架进行请求处理并根据最佳匹配来解析脚本。我在CQ5中看到很少的组件(大多数是页面或顶级组件)在单个组件下具有多个jsp(例如,页面组件具有page.jsp,body.jsp,header.jsp类似重定向组件具有重定向) .jsp,body.jsp,content.jsp)。因此,我想问一下在什么情况下,我们将有多个jsp,而通过吊索显示内容将解析哪个脚本?

最佳答案

在一个组件下拥有多个jsp的可能性与sling相比与CQ的关系更大(尽管cq还在框架上提供了一些扩展)。在顶级组件(例如,例如页面组件)中具有更多jsp的原因通常是为了捕获包含在较低级别某处发生的情况(因此,包含文件的定义在那里,但实际文件位于组件中不存在)。

我认为,在单个组件下(无论处于哪个级别)具有多个jsp的主要原因有3个,并且所有这些原因都可以一次应用于同一组件


将组件分解成更小(更易于维护)的零件
覆盖渲染
使用吊索选择器的力量


方案1:将组件分解成较小(更易于维护)的零件

如标题所示,我们可以在一个组件中使用多个jsp将该组件的呈现划分为多个单独的部分,这些部分更易于维护和覆盖,或者两者结合。 “两种”情况都是基础页面组件中正在发生的情况。但是,请查看方案2,以了解更多信息。

标准页面的呈现从具有模板的cq页面开始,而该模板又指定了用于呈现的组件。因此,跳过模板部分,直接进入实际的基础页面组件。页面开始的渲染位于page.jsp中。其中包含“ head.jsp”和“ body.jsp”进一步细分。他们进而将其进一步分割。这使您可以覆盖子组件中页面组件的特定部分(请参阅方案2)。

方案2:覆盖渲染

假设您制作了自己的基础页面组件(常见做法),该组件继承自基础页面组件(通过sling:resourceSuperType属性),并且只对在主体中吐出特定的html结构感兴趣。在这种情况下,您只需要在该“基础页面”组件内创建一个body.jsp文件即可。实际上,这会覆盖主体的呈现(在基础页面组件中),但是对于其他所有内容(例如head,headlibs)等等,则默认为默认设置,以此类推。在我们的情况下,它将默认为基础页面组件中指定的文件。链将解析为您的基础组件,然后解析为基础页面组件(因为其中只有body.jsp,而没有base.jsp)。在基础页面组件内部,找到了包括body.jsp的page.jsp(它将是在基本组件中定义的body.jsp)。

我们在这里所做的工作适用于所有级别。当从“页面”组件之外的其他组件继承时,此概念也将起作用。例如,我用它来覆盖基础列表组件的呈现,其中包括一个jsp(sling.jsp),而后者又使用了带有特定选择器的吊索包含,然后使组件从该列表组件继承而来。将吊索包含选择器覆盖到其他内容。

方案3:使用吊索选择器的功能

由于吊索具有“选择器”的概念,因此吊索将在吊索链中向上查找以呈现内容的正确组件。 Sling将始终使用最特定的选择器进行渲染。

例如,说我创建了一个从基础标题组件继承的标题组件。说我在标题组件中有这个结构。

title.jsp
h2.jsp
fancy.jsp


很明显,h2和fancy是标题组件的实际选择器

将多个jsp与选择器结合使用是一种常见的做法。这些用于以不同方式显示基本相同的组件。

您也可以将h2.jsp放入页面组件中。如果正确设置链条,吊索会找到它。

除了我在这里描述的内容之外,选择器还有更多内容。但这只是问题的一部分。

关于aem - 为什么在CQ5中单个组件有多个jsp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119456/

相关文章:

aem - AEM/CQ中的组件、模板和页面是什么

jquery - Ajax 调用在 sling 中移动文件

javascript - 如何在 CQ 5 中配置内置表单组件?

javascript - 有没有一种简单的方法来扩展 Coral UI js 对象以添加自定义元素?

jackrabbit - 是否可以通过 GUID 访问节点?

aem - CQ5 如何向不同的访问者展示不同的内容?

java - 连接到 AEM 6.0 JCR : Precondition Failed

java - 将多个 Assets 上传到 DAM 会扰乱工作流程步骤

aem - 如何创建系统用户 (rep :SystemUser) in AEM 6. 1?

java - Sling Rewriter 更改静态资源 URL