当我使用 RequestDispatcher 进行转发时......结果页面会加载,但 URL 不会更改。
我们启动并向 PostServlet 提交数据的 URL:http://localhost:4502/content/en/postformtest.html
最终结果网址应为: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;
}
}
最佳答案
作为javadocs for RequestDispatcher
表明,RequestDispatcher
和关联的 forward
方法充当资源的包装器,本质上允许将进一步处理委托(delegate)给资源。可以说,这是在幕后完成的,因此请求的 URL 不会改变 - 它不是重定向。
根据您问题的内容,我认为您想要完成的是传统形式的 POST 到页面。这实际上是在 AEM 中实现的一种相当麻烦的模式,通过异步提交表单,然后根据响应进行重定向,您很可能会得到更好的服务。
如果您需要的只是在表单处理后进行简单的重定向,则可以通过调用响应的 sendRedirect
方法来实现。
但是,如果您确实需要 POST 到随后要处理表单处理和页面呈现的页面,则可以采用类似于 OOB 表单组件的方法。 OOB com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet
被实现为 Servlet 和请求级 Filter。作为过滤器,它在处理之前捕获对页面的 POST 请求,使用 RequestDispatcher
将其转发到其 Servlet 性质,而 Servlet 又能够处理该请求,然后转发它,再次使用RequestDispatcher
,将请求包装为 GET 请求后的页面,类似于您上面所做的操作。有点迂回,但正如所指出的,这是一个实现起来很麻烦的模式。
关于AEM - URL 不会随着 RequestDispatcher 转发而更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082720/