Apache Sling和scriptlets

时间:2013-04-02 16:31:10

标签: jsp sling

我是Apache Sling的新手,我在所有示例中都看到它使用JSP scriptlet来呈现页面。

真的?有没有办法使用普通的java代码而不是被认为过时的技术,并且由于它所带来的所有缺点,Sun在10多年前就不鼓励这样做?

或许有一个模糊的原因,使用scriptlet是实现的最佳选择,我不知道。

5 个答案:

答案 0 :(得分:3)

如果你不喜欢scriptlet,你也可以使用taglibs和EL。有关快速概述,请参阅Sling SVN存储库中的the latest version of the TLD file。您当然可以使用Javascript,Groovy,Ruby或Sling支持的任何其他脚本语言。

至于taglibs,引用SLING-2648: Add Resource Access Tags,您可以使用它们来执行

之类的操作
<c:set var="currentResource" value="${sling:getResource(resourceResolver,'/etc')}" />
<c:forEach var="child" items="${sling:listChildResources(currentResource)}">
    <c:if test="${child.name != 'jcr:content'}">
        <sling:getResource var="pageContent" path="${child.path}/jcr:content" />
        <sling:adapt adaptable="${pageContent}" adaptTo="org.apache.sling.api.resource.ValueMap" var="childProperties" />
        <sling:getProperty key="jcr:title" defaultValue="${child.name}" var="title" properties="${childProperties}" />
        <li><a href="${child.path}.html">Title: ${title}</a></li>
    </c:if>
</c:forEach> 

答案 1 :(得分:1)

Sling为您处理请求和呈现页面的方式留下了很多自由。您可以仅使用Java代码,通过OSGi服务和请求处理servlet,仅使用各种语言和模板系统的服务器端脚本,使用Sling默认JSON渲染的完整客户端渲染,或这些技术的任意组合。

可能存在许多“次优”的例子,但您可以选择适合您需求的请求处理和呈现方法。

答案 2 :(得分:1)

Good Sling Devs不再使用JSP了。它只是在文档和示例中,因为它是这么长时间的标准。

您正确地将其视为犯罪(或反模式)的JSP包含两件事:

  • 介绍
  • 业务逻辑

这些需要分成不同的文件。

演示文稿

使用&#34; Sightly,&#34;现在被称为&#34; HTL。&#34;阅读以下内容:

Sightly是一个现代服务器端表示框架,正确将业务逻辑与表示声明分开,与您熟悉的任何其他框架(如Handlebars或FreeMarker)相同,甚至是小脸。

没错,它不是在Sling框架之外使用的语法,所以它不是可重复使用的知识,但你真的可以在大约一个小时内完全学习它,它是优雅和光滑的

您可以使用您希望的任何其他演示逻辑,包括

  • 把手
  • Groovy GSP
  • FreeMarker的
  • ThymeLeaf

但是 - 这些都不会起作用#34;开箱即用。&#34;你必须找到合适的脚本引擎&#34;并自己安装,或自己编写一个脚本引擎,在Sling中启用它们。例如,流行的Adobe AEM产品,其中 Sling,附带一个开箱即用的把手scriptengine。如果您愿意做这项工作,那么您可以使用阳光下的每个演示框架。

适用于商业逻辑

如果您选择使用Sightly(又名HTL)进行演示,您将使用&#34;使用&#34; api声明什么脚本或类为该演示文稿准备业务逻辑。在这里你几乎只有2个选项&#34;开箱即用&#34;:

  • JavaScript(注意:服务器端!)
  • 爪哇

目标是让其中一种语言提供&#34;支持bean&#34;键入业务逻辑,为您获取数据并准备由您的演示文稿呈现。为了让你的演示文稿能够宣告哪个&#34; bean&#34;或者它使用的脚本,你使用&#34;使用API​​&#34;这里:

https://docs.adobe.com/docs/en/htl/docs/use-api.html

示例:

<div data-sly-use.bean="myscript.js">${bean.valueFromJavascript}</div>

现在,您可以使用更多语言,但您必须编写一些自定义代码,以允许Sling通过Use API使用这些替代语言。例如,我现在正试图弄清楚如何通过Use API公开groovy或Kotlin,这样我就可以这样做:

<div data-sly-use.bean="myscript.groovy">${bean.valueFromGroovy}</div>

答案 3 :(得分:0)

这似乎是Apache Sling和派生产品(如Adobe CQ(或现在称之为))的方式。我同意这会导致编写错误的JSP并且难以维护软件。

使用JSTL,如Robert Munteanu所述,是创建更清洁代码的第一步。

在我目前的工作中,我编写了一个框架,该框架使用Servlet过滤器根据资源类型将Java类作为“控制器”注入到JSP中。访问其中的数据或功能是微不足道的,并且可以生成干净的(JSP)。

然后是Cognifide的Slice framework看起来它解决了很多这些问题,但我从来没有使用它。

答案 4 :(得分:0)

听起来你一般都是OSGi的新手,所以你需要知道如何创建服务。如果可以这样做,则可以创建实现javax.servlet.Servlet -

的服务

这个LINK很好地概述了如何塑造servlet组件。

正如Bertrand所说,Sling为您提供了很大的自由,因此您需要使用Sling来了解如何使用其资源和资源处理程序(在OSGi服务之上)设计应用程序。