当我使用RequestDispatcher执行转发时...结果页面加载但URL不会更改。
我们开始并将数据提交到PostServlet的网址:http://localhost:4502/content/en/postformtestresult.html
最终结果网址应为:http://localhost:4502/services/processFormData
但是:{{3}}
我缺少什么?感谢任何想法。
代码段..
HTML表单:
upstream/shinynewbranch
POST Servlet
<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>
Wrapper 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);
}
}
答案 0 :(得分:1)
正如RequestDispatcher
的{{3}}所示,RequestDispatcher
和forward
方法关联作为资源的包装器,基本上允许委托进一步处理资源。这可以在幕后完成,因此请求的URL不会改变 - 它不是重定向。
根据您问题的内容,我假设您要完成的是传统表单POST到页面。这实际上是在AEM中实现的一种相当麻烦的模式,您最有可能通过异步提交表单然后根据响应重定向来提供更好的服务。
如果您只需要在表单处理后进行简单的重定向,则可以通过调用响应的sendRedirect
方法来实现。
但是,如果您确实需要POST到一个页面,然后该页面将处理表单处理和页面呈现,您可以使用类似于OOB表单组件的方法。 OOB com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet
实现为Servlet和请求级别Filter。作为一个过滤器,它在处理之前捕获到页面的POST请求,使用RequestDispatcher
将其转发到它的Servlet性质,然后Servlet又能够处理请求然后转发它,再次使用{{ 1}},将请求作为GET请求包装后的页面,类似于上面的操作。有点迂回,但如上所述,这是一个难以实现的模式。
答案 1 :(得分:0)
你看过ACS Commons Forms吗?他们确实支持PRG作为标准表格处理流程。请查看http://adobe-consulting-services.github.io/acs-aem-commons/features/forms.html
您最终可能会按原样使用该功能,或者会获得一些实施提示。
相同的git链接是https://github.com/Adobe-Consulting-Services/acs-aem-commons