为什么我们在CQ5中为单个组件提供多个jsp?

时间:2013-04-20 10:48:45

标签: cq5 sling

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

2 个答案:

答案 0 :(得分:6)

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

在我看来,在单个组件下有多个jsp有三个主要原因(无论什么级别),所有这些原因可以同时应用于同一个组件

  1. 以更小(更易维护)的部分分解组件
  2. 覆盖渲染
  3. 使用吊索选择器的力量
  4. 场景1:以更小(更易维护)的方式分解组件

    正如标题所述,我们可以在一个组件中使用多个jsp将该组件的渲染拆分为单独的部分,这些部分更易于维护,更易于覆盖或两者兼而有之。 “两个”案例是基础页面组件中发生的事情。但请查看方案2以获取详细信息。

    标准页面的呈现以具有模板的cq页面开始,该模板又指定用于呈现的组件。因此,跳过模板部分并直接转到实际的基础页面组件。在page.jsp中为页面开始渲染。通过包含“head.jsp”和“body.jsp”进一步细分。他们反过来又将它分开了。这允许您覆盖子组件中页面组件的特定部分(请参阅方案2)。

    场景2:覆盖渲染

    假设您创建了自己的基页组件(通用实践),它继承自基础页面组件(通过sling:resourceSuperType属性),并且您只对在主体中吐出特定html结构感兴趣。在这种情况下,您只需在“基页”组件中创建一个body.jsp文件(没有别的)。这实际上覆盖了正文的渲染(在基础页面组件中),但默认为其他所有内容(例如head,headlibs)等等,关于父链中某些文件的可用性。在我们的例子中,它将默认在基础页面组件中指定的文件。链将解析为您的基本组件,然后解析为基础页面组件(因为您只有body.jsp而没有base.jsp)。在基础页面组件中,找到了page.jsp,其中包括body.jsp(它将是基础组件中定义的body.jsp)。

    我们在这里所做的工作适用于所有级别。当继承自“page”组件之外的其他组件时,此概念也将起作用。例如,我用它来覆盖基础列表组件的渲染,其中我包含了一个jsp(sling.jsp),它依次使用带有特定选择器的sling包,而不是从该列表组件继承的组件和将吊索包括选择器覆盖到其他东西。

    场景3:使用吊索选择器的强大功能

    由于吊索具有“选择器”的概念,吊索将沿着吊索链找到正确的组件来渲染内容。 Sling将始终使用最具体的选择器进行渲染。

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

    title.jsp
    h2.jsp
    fancy.jsp
    

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

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

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

    然后我在这里描述了更多的选择器。但这只是问题的重要部分。

答案 1 :(得分:1)

通常,一个组件由一个匹配请求的脚本呈现,我们称之为GET.jsp

但是,在该脚本中,您只能找到对其他脚本的include调用,例如body.jsp,header.jsp。这样做是为了您可以在/apps中覆盖另一个header.jsp(例如),而不会覆盖完整的GET.jsp脚本。