Apache Sling и скриптлеты

Я новичок в Apache Sling и вижу во всех примерах, что он использует JSP скриптлеты для визуализации страниц.

Шутки в сторону? Есть ли способ использовать обычный Java-код вместо техники, которая считается устаревшей и не одобряется самой компанией Sun более 10 лет назад из-за всех недостатков, которые она представляет?

Или, может быть, есть неясная причина, по которой использование скриптлетов - лучший выбор для реализации, и я не знаю об этом.

5 ответов

Решение

Если вам не нравятся скриптлеты, вы также можете использовать taglibs и EL. Краткий обзор см. В последней версии файла TLD в репозитории Sling SVN. Конечно, вы можете использовать Javascript, Groovy, Ruby или любой другой язык сценариев, поддерживаемый Sling.

Что касается ярлыков, то процитировать SLING-2648: добавить теги доступа к ресурсам, вы можете использовать их для таких вещей, как

<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 Devs больше не используют JSP. Это просто в документации и примерах, потому что это было стандартом так долго.

JSP, которые вы по праву считаете преступлением (или анти-паттерном), содержат две вещи:

  • презентация
  • бизнес логика

Они должны быть разделены на разные файлы.

Для презентации

Используйте "Sightly", который теперь называется "HTL". Читайте на них:

Sightly - это современная инфраструктура представления на стороне сервера, которая должным образом отделяет бизнес-логику от объявления презентации, точно так же, как любая другая знакомая вам среда, такая как Handlebars или FreeMarker, или даже Facelets.

Правда, это не синтаксис, используемый за пределами Sling Framework, так что это не повторно используемое знание, но вы действительно можете изучить его полностью за час, и это элегантно и гладко.

Вы можете использовать любую другую логику представления, которую пожелаете, включая

  • рули
  • Groovy GSP
  • FreeMarker
  • ThymeLeaf

НО - ни один из них не будет работать "из коробки". Вам нужно будет найти подходящие "движки сценариев" и установить их самостоятельно, или написать сценарий самостоятельно, который включает их в Sling. Например, популярный продукт Adobe AEM, который является Sling, поставляется со скриптовым движком руля из коробки. Если вы готовы выполнять эту работу, вам доступны все рамки представления под солнцем.

Для бизнес-логики

Если вы использовали Sightly (он же HTL) для презентации, вы будете использовать API"use", чтобы объявить, какой сценарий или класс подготавливает вашу бизнес-логику для этой презентации. Здесь у вас есть практически только 2 варианта "из коробки":

  • JavaScript (Примечание: сторона сервера!)
  • Джава

Цель одного из этих языков - предоставить бизнес-логику типа "вспомогательного компонента", которая получает данные для вас и подготавливает их к представлению в вашей презентации. Чтобы ваша визуальная презентация объявила, какой "бин" или скрипт он использует, вы используете здесь "use API":

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

Пример:

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

Теперь вы можете использовать НАМНОГО больше языков, чем это, но вы должны написать некоторый пользовательский код, чтобы позволить Sling использовать эти альтернативные языки через API Использования. Например, я сейчас собираюсь попытаться выяснить, как выставить groovy или Kotlin через Use API, чтобы я мог сделать что-то вроде этого:

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

Слинг оставляет много свободы в том, как вы обрабатываете запросы и отображаете страницы. Вы можете использовать только Java-код, через сервисы OSGi и сервлеты обработки запросов, скрипты на стороне сервера, используя только различные языки и системы шаблонов, полный рендеринг на стороне клиента с использованием рендеринга JSON по умолчанию в Sling или любую комбинацию этих методов.

Вероятно, существует множество "неоптимальных" примеров, но вы можете выбрать метод обработки и рендеринга запросов, который соответствует вашим потребностям.

Похоже, вы новичок в OSGi в целом, поэтому вам нужно знать, как создавать сервисы. Если вы можете сделать это, вы можете создать сервисы, которые реализуют javax.servlet.Servlet -

Эта ССЫЛКА - хороший обзор того, как вы будете формировать компоненты вашего сервлета.

Как упоминал Бертран, Sling дает вам большую свободу, поэтому вам нужно поиграть со Sling, чтобы понять, как разрабатывать ваши приложения, используя его методологию ресурсов и обработчиков ресурсов (поверх сервисов OSGi).

Похоже, что так обстоит дело с Apache Sling и производными продуктами, такими как Adobe CQ (или как там это называется). Я согласен, что это делает плохо написанные JSP и трудным в обслуживании программного обеспечения.

Использование JSTL, как обрисовал в общих чертах Роберт Мунтяну, является первым шагом к созданию более чистого кода.

В моей текущей работе я написал каркас, который использует фильтры сервлетов для внедрения классов Java в качестве "контроллеров" в JSP на основе их типа ресурса. Доступ к данным или функциям в них тривиален и обеспечивает чистые JSP.

Кроме того, существует платформа Slice от Cognifide, которая, похоже, решает многие из этих проблем, но я так и не смог ее использовать.

Другие вопросы по тегам