我是Apache Sling的新手,我在所有示例中都看到它使用JSP scriptlet来呈现页面。
真的?有没有办法使用普通的java代码而不是被认为过时的技术,并且由于它所带来的所有缺点,Sun在10多年前就不鼓励这样做?
或许有一个模糊的原因,使用scriptlet是实现的最佳选择,我不知道。
答案 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框架之外使用的语法,所以它不是可重复使用的知识,但你真的可以在大约一个小时内完全学习它,它是优雅和光滑的
您可以使用您希望的任何其他演示逻辑,包括
但是 - 这些都不会起作用#34;开箱即用。&#34;你必须找到合适的脚本引擎&#34;并自己安装,或自己编写一个脚本引擎,在Sling中启用它们。例如,流行的Adobe AEM产品,其中是 Sling,附带一个开箱即用的把手scriptengine。如果您愿意做这项工作,那么您可以使用阳光下的每个演示框架。
适用于商业逻辑
如果您选择使用Sightly(又名HTL)进行演示,您将使用&#34;使用&#34; api声明什么脚本或类为该演示文稿准备业务逻辑。在这里你几乎只有2个选项&#34;开箱即用&#34;:
目标是让其中一种语言提供&#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服务之上)设计应用程序。