3

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

严重地?有没有一种方法可以使用普通的 java 代码,而不是被认为过时的技术,并且由于它所呈现的所有缺点而在 10 多年前被 Sun 自己劝阻?

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

4

5 回答 5

3

如果你不喜欢 scriptlet,你也可以使用 taglibs 和 EL。如需快速概览,请参阅Sling SVN 存储库中最新版本的 TLD 文件。您当然可以使用 Javascript、Groovy、Ruby 或 Sling 支持的任何其他脚本语言。

至于标签库,引用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> 
于 2013-04-02T18:04:05.003 回答
1

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

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

于 2013-04-03T06:56:27.017 回答
1

好的 Sling 开发人员不再使用 JSP。它只是在文档和示例中,因为它是长期以来的标准。

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

  • 介绍
  • 商业逻辑

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

演示文稿

使用“Sightly”,现在称为“HTL”。阅读这些:

Sightly 是一个现代的服务器端表示框架,它正确地将业务逻辑与表示声明分开,就像您熟悉的任何其他框架一样,例如 Handlebars 或 FreeMarker,甚至是 facelets。

诚然,它不是在 Sling 框架之外使用的语法,因此它不是可重用的知识,但你真的可以在大约一个小时内完全学会它,而且它优雅而流畅。

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

  • 车把
  • Groovy GSP
  • 自由标记
  • 百里香叶

但是 - 这些都不会“开箱即用”。您必须找到合适的“脚本引擎”并自己安装它们,或者自己编写脚本引擎以在 Sling 中启用这些。例如,流行的 Adob​​e AEM 产品Sling 附带了一个开箱即用的把手脚本引擎如果您愿意做这项工作,那么您可以使用所有的演示框架。

对于业务逻辑

如果您使用 Sightly(又名 HTL)进行演示,您将使用“使用”api 来声明哪个脚本或类为该演示准备您的业务逻辑。在这里,您实际上只有 2 个“开箱即用”选项:

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

目标是让这些语言中的一种提供“支持 bean”类型的业务逻辑,为您获取数据并准备好由您的演示文稿呈现。为了让您的直观演示声明它使用哪个“bean”或脚本,您在此处使用“使用 API”:

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>
于 2017-01-17T18:53:22.517 回答
0

这似乎是 Apache Sling 和 Adob​​e CQ 等衍生产品(或现在所称的任何产品)的方式。我同意这会导致编写糟糕的 JSP 和难以维护软件。

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

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

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

于 2013-04-02T18:21:08.050 回答
0

听起来您通常是 OSGi 的新手,因此您需要知道如何创建服务。如果你能做到这一点,你可以创建实现 javax.servlet.Servlet 的服务——

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

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

于 2013-08-20T04:04:09.940 回答