AEM - URL 不会随着 RequestDispatcher 转发而更改

标签 aem sling

当我使用 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/

相关文章:

Java - 当前节点的空检查

jsp - 使用c :forEach over sling:listChildren

javascript - 根据页面属性上的路径移动 AEM Touch UI 页面

aem - 吊索网址中后缀的用途是什么

osgi - 是否可以在 CQ5 中获取节点或吊索资源的 CRC?

java - Apache Felix @Reference 注解问题

javascript - 如何显示未填写的字段

java - 视力 jSTL c :set analog

java - 使用JCR以编程方式访问CQ5内容

javascript - Javascript Use-API 可以用来设置属性吗