2015-08-18 2 views
1

Когда я делаю переадресацию с помощью RequestDispatcher .. загружается страница результатов, но URL-адрес не изменяется.AEM - URL-адрес не изменяется с помощью RequestDispatcher forward

URL, где мы начинаем и отправить данные в PostServlet: http://localhost:4502/content/en/postformtest.html

Конечный результат URL должен быть: http://localhost:4502/content/en/postformtestresult.html

Но: http://localhost:4502/services/processFormData

Что мне не хватает? Цените любые мысли.

Фрагменты кода ..

HTML-форма:

<form name="userRegistrationForm" method="post" action="/services/processFormData"> 
<input type="submit" title="Submit" class="btn submit btn-success" value="Submit" tabindex="25" name="bttnAction"> 
</form> 

POST-Servlet

@SlingServlet(
label = "Common POST Servlet", 
metatype = true, 
methods = { "POST" }, 
name="com.commons.service.servlets.TPostServlet", 
paths = { "/services/processFormData" } 
) 
public class TPostServlet extends SlingAllMethodsServlet{ 
@Override 
protected void doPost(SlingHttpServletRequest request,SlingHttpServletResponse response) throws ServletException,IOException { 

    final SlingHttpServletRequest syntheticRequest = new SyntheticSlingHttpServletGetRequest(request); 
    final RequestDispatcherOptions options = new RequestDispatcherOptions(); 
    options.setReplaceSelectors(""); 
    options.setForceResourceType("cq/Page"); 

    request.getRequestDispatcher("/content/en/postformtestresult.html", options).forward(syntheticRequest, response);  
}  
} 

обертка Servlet:

public class SyntheticSlingHttpServletGetRequest extends  
SlingHttpServletRequestWrapper { 
private static final String METHOD_GET = "GET"; 

public SyntheticSlingHttpServletGetRequest(final SlingHttpServletRequest request) { 
    super(request); 
} 

@Override 
public String getMethod() { 
    return METHOD_GET; 
} 
} 

ответ

1

Как javadocs для RequestDispatcher указывают, что RequestDispatcher и ассоциацией метод forward выступают в качестве оберток вокруг ресурса, по существу позволяя делегировать дальнейшую обработку ресурсу. Это делается за кулисами, так сказать, и поэтому запрашиваемый URL-адрес не изменится - это не перенаправление.

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

Если вам нужна простая переадресация после обработки формы, это может быть достигнуто путем вызова метода ответа sendRedirect.

Если вам требуется POST на страницу, которая будет обрабатывать как обработку формы, так и рендеринг страниц, вы можете использовать метод, аналогичный компонентам формы OOB. OOB com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet реализован как как Servlet, так и фильтр уровня запросов. В качестве фильтра он улавливает запрос POST на странице перед обработкой, пересылает его с помощью RequestDispatcher в свой сервлет, а сервлет, в свою очередь, может обрабатывать запрос, а затем пересылать его снова с помощью RequestDispatcher на страницу после завершая запрос как запрос GET, аналогичный тому, что вы делаете выше. Немного обходное, но, как уже отмечалось, это громоздкий образец для реализации.

+0

Спасибо за подробное объяснение. Модели, которые я пытаюсь достичь, это POST-REDIRECT-GET, которые, я думаю, редки и противоречат концепциям REST/Stateless. Но я хотел бы попробовать, если есть способ, и если компоненты OOB Adobe будут использоваться, то точно. Можете ли вы отправить пример реализации или указать мне на любой URL? Я нашел пример класса в GitHub здесь https: // github.ком/Ooyala/Ooyala-AdobeCQ/BLOB/23d3a18066cd64ea6bdd19d70fef63041d2fe35a/щ/ЦСИ/содержание/jcr_root/ЛИЭС/основа/SRC/осущ/SRC/основные/Java/COM/день/сд/WCM/фундаментные/формы/осущ/FormsHandlingServlet. Ява –

0

Вы посмотрели формы ACS Commons? Они поддерживают PRG как стандартный процесс обработки формы. Проверьте это на http://adobe-consulting-services.github.io/acs-aem-commons/features/forms.html

Вы можете использовать эту функцию как есть или получить некоторый намек на реализацию.

Ссылка мерзавец для тех же https://github.com/Adobe-Consulting-Services/acs-aem-commons

Смежные вопросы