我是 Apache Sling 的新手,我在所有示例中都看到它使用 JSP scriptlet 来呈现页面。
严重地?有没有一种方法可以使用普通的 java 代码,而不是被认为过时的技术,并且由于它所呈现的所有缺点而在 10 多年前被 Sun 自己劝阻?
或者也许有一个模糊的原因,即使用 scriptlet 是实现的最佳选择,而我不知道这一点。
如果你不喜欢 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>
Sling 在如何处理请求和呈现页面方面留下了很大的自由。您可以仅使用 Java 代码,通过 OSGi 服务和请求处理 servlet,仅使用各种语言和模板系统的服务器端脚本,使用 Sling 的默认 JSON 呈现的完整客户端呈现,或这些技术的任意组合。
可能有许多“次优”的例子,但您可以选择适合您需要的请求处理和呈现方法。
好的 Sling 开发人员不再使用 JSP。它只是在文档和示例中,因为它是长期以来的标准。
JSP,您正确地视为犯罪(或反模式),包含两件事:
这些需要分成不同的文件。
演示文稿
使用“Sightly”,现在称为“HTL”。阅读这些:
Sightly 是一个现代的服务器端表示框架,它正确地将业务逻辑与表示声明分开,就像您熟悉的任何其他框架一样,例如 Handlebars 或 FreeMarker,甚至是 facelets。
诚然,它不是在 Sling 框架之外使用的语法,因此它不是可重用的知识,但你真的可以在大约一个小时内完全学会它,而且它优雅而流畅。
您可以使用任何其他您希望的演示逻辑,包括
但是 - 这些都不会“开箱即用”。您必须找到合适的“脚本引擎”并自己安装它们,或者自己编写脚本引擎以在 Sling 中启用这些。例如,流行的 Adobe AEM 产品Sling 附带了一个开箱即用的把手脚本引擎。如果您愿意做这项工作,那么您可以使用所有的演示框架。
对于业务逻辑
如果您使用 Sightly(又名 HTL)进行演示,您将使用“使用”api 来声明哪个脚本或类为该演示准备您的业务逻辑。在这里,您实际上只有 2 个“开箱即用”选项:
目标是让这些语言中的一种提供“支持 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>
这似乎是 Apache Sling 和 Adobe CQ 等衍生产品(或现在所称的任何产品)的方式。我同意这会导致编写糟糕的 JSP 和难以维护软件。
正如 Robert Munteanu 所述,使用 JSTL 是创建更简洁代码的第一步。
在我目前的工作中,我编写了一个框架,它使用 Servlet 过滤器根据资源类型将 Java 类作为“控制器”注入到 JSP 中。访问其中的数据或功能是微不足道的,并且可以生成更干净的 JSP。
然后是 Cognifide 的Slice 框架,看起来它解决了很多这样的问题,但我从来没有使用过它。
听起来您通常是 OSGi 的新手,因此您需要知道如何创建服务。如果你能做到这一点,你可以创建实现 javax.servlet.Servlet 的服务——
这个LINK很好地概述了您将如何塑造您的 servlet 组件。
正如 Bertrand 所提到的,Sling 为您提供了很多自由,因此您需要使用 Sling 来了解如何使用其资源和资源处理程序方法(在 OSGi 服务之上)来设计您的应用程序。