Как произвести рендеринг вывода из Sling POST в AEM?

Похоже, что Слинг ожидает, что каждая форма POST изменяет JCR. Таким образом, ожидаемым / стандартным поведением будет POST-redirect-GET, который подходит для большинства вещей. Однако мне нужно иметь возможность выполнить POST в AEM, а затем использовать данные в этом POST для создания визуализированного результата. Мы используем AEM без сохранения состояния, поэтому я не хочу переносить данные POST в сеансе, чтобы использовать их в последующем GET.

Некоторые рекомендуют помещать данные POST в Browser sessionStorage, но этого недостаточно для достаточной поддержки.

Насколько я могу судить, Sling в AEM не может выполнить POST и выдать результат рендеринга.

Вот скриншот того, что POST производит в компоненте page / resourceType и во всех включенных Sling jsp, которые участвуют в рендеринге.

введите описание изображения здесь

Я пробовал использовать такие вещи, как операция "nop".

<input type="hidden" name=":operation" value="nop" />

Но в любом случае все сервлеты думают, что происходит POST, и не обрабатываются должным образом.

Существует возможность создания настраиваемого сервлета для обработки POST, но тогда как вы визуализируете шаблонный вывод и изменяете запрос, чтобы все компоненты думали, что они обслуживают GET?

ОБНОВЛЕНО: вот скриншот результата "nop" POST.jsp. введите описание изображения здесь


person jedatu    schedule 22.04.2014    source источник
comment
Вам нужен индивидуальный ответ при создании узлов или для запросов POST к существующим узлам?   -  person santiagozky    schedule 23.04.2014
comment
POST не изменяет и не создает узлы. Это полезная нагрузка POST для существующих узлов или сервлета, потому что полезная нагрузка слишком велика для GET. Полезная нагрузка не сохраняется в JCR, но используется для формирования аспектов отображаемого.   -  person jedatu    schedule 23.04.2014


Ответы (3)


Что вы можете сделать, так это создать POST.jsp файл в соответствующем resourceType.

Если ваш запрос POST, перейдите к /content/yourapp/something, у которого есть resourceType: your/app/example. Затем вы можете создать файл /apps/your/app/example/POST.jsp с любым желаемым рендером. Вы даже можете включить свой сценарий рендеринга по умолчанию в файл POST.jsp, если вам нужно, чтобы он отображался так же, как запросы GET.

Другой вариант - использовать сервлет, зарегистрированный для запросов POST, и внутренне использовать SlingRequestProcessor. Эта служба позволяет программно обрабатывать запрос через Sling. Для упаковки можно использовать SlingRequestWrapper ваш запрос и переопределите getMethod (), чтобы вернуть "GET". Это должно обработать запрос, как если бы это был запрос GET.

person santiagozky    schedule 23.04.2014
comment
Насколько я могу судить, это не работает. Моя страница POST.jsp вызывается, но все компоненты на этой странице отображают метод статуса, а не желаемый результат. На данный момент нет никаких преимуществ в использовании POST.jsp. - person jedatu; 23.04.2014
comment
@jedatu хороший момент, вам нужно будет добавить POST.jsp к каждому компоненту, который вы включаете на страницу. вероятно неосуществимо - person santiagozky; 24.04.2014
comment
@jedatu, может быть, процессор slingrequest? Я добавил альтернативу своему ответу - person santiagozky; 24.04.2014
comment
SlingHttpServletRequestWrapper действительно кажется ключевым. Я перезаписал getMethod (), чтобы вернуть GET, а затем вызвал slingRequest.getRequestDispatcher (resource.getParent (). GetPath () +. Html) .forward (оболочка, ответ); - person jedatu; 24.04.2014

Это звучит как несколько забавный вариант использования, IIUC, вы используете большой параметр запроса P для управления рендерингом?

Использование настраиваемого сервлета POST должно работать, если вы используете что-то вроде slingRequest.getRequestDispatcher(resource).forward(request, response), где запрос является оболочкой вокруг фактического запроса, а request.getMethod () возвращает GET. Затем вы можете сохранить свои P-данные в атрибутах запроса.

Для создания таких оболочек можно использовать класс SlingHttpServletRequestWrapper.

person Bertrand Delacretaz    schedule 24.04.2014
comment
Спасибо! SlingHttpServletRequestWrapper с форвардом был ключевым. - person jedatu; 24.04.2014
comment
Джедату, можешь поделиться примером, который сработал для тебя? Я изо всех сил пытаюсь получить почтовую работу. - person Suren Konathala; 17.07.2015

Идеей может быть создание настраиваемого сервлета для обработки публикации. После успешной записи вы можете перенаправить на измененный ресурс - простой 302.

Другое решение, которое приходит мне на ум, - это настраиваемый фильтр, который будет делать то же самое. Однако, поскольку AEM ожидает получить 200 вместо 302, было бы хорошо указать с помощью атрибута или параметра, что этот POST необходимо перенаправить. В противном случае некоторые функции пользовательского интерфейса AEM могут нарушиться. Это быстрый пример идеи. Возможно, вам понадобится написать что-нибудь более сложное.

@Component(immediate = true)
@Service
@Properties({
    @Property(name = Constants.SERVICE_DESCRIPTION, value = "Desc"),
    @Property(name = Constants.SERVICE_VENDOR, value = "Company name"),
    @Property(name = Constants.SERVICE_RANKING, intValue = RedirectFilter.RANKING),
    @Property(name = "filter.scope", value = "request") })
public class RedirectFilter implements Filter {

public static final int RANKING = -1000; // low ranking

@Override
public void init(final FilterConfig filterConfig) throws ServletException {
}

@Override
public void destroy() {
}

@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
        throws IOException, ServletException {
    if (request.getParameter("redirect").equals("true")) {
        ((SlingHttpServletResponse) response).sendRedirect(((SlingHttpServletRequest)request).getRequestURI());
    }
}

}

person Michal Chudy    schedule 22.04.2014
comment
Перенаправление происходит на стороне сервера? Модель POST-redirect-GET не будет работать в этом случае, потому что полезная нагрузка будет потеряна при перенаправлении. - person jedatu; 23.04.2014
comment
Нет, это браузер. Я не понял, что вы на самом деле не хотите сохранять данные. Внутренняя пересылка JSP может быть подходящим вариантом, но вам придется это проверить. Я проверю, когда у меня будет время. - person Michal Chudy; 23.04.2014