AEM-URL不随RequestDispatcher forward更改

AEM-URL不随RequestDispatcher forward更改,aem,sling,Aem,Sling,当我使用RequestDispatcher执行转发时。。将加载结果页,但URL不会更改 我们开始并向PostServlet提交数据的URL: 最终结果URL应为: 但是: 我错过了什么?感谢你的任何想法 代码片段 HTML表单: <form name="userRegistrationForm" method="post" action="/services/processFormData"> <input type="submit" title="Submit" cl

当我使用RequestDispatcher执行转发时。。将加载结果页,但URL不会更改

我们开始并向PostServlet提交数据的URL:

最终结果URL应为:

但是:

我错过了什么?感谢你的任何想法

代码片段

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>
包装器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;
}
}
正如for
RequestDispatcher
所指出的那样,
RequestDispatcher
forward
方法作为资源的包装器,基本上允许将进一步的处理委托给资源。可以说,这是在幕后完成的,因此请求的URL不会更改-它不是重定向

根据你问题的内容,我想你想要完成的是一个传统形式的页面帖子。这实际上是在AEM中实现的一种相当麻烦的模式,通过异步提交表单,然后根据响应重定向,您可能会得到更好的服务

如果在表单处理之后只需要一个简单的重定向,那么可以通过调用响应的
sendRedirect
方法来实现


但是,如果您确实需要发布到一个页面,该页面将同时处理表单处理和页面呈现,那么您可以使用类似于OOB表单组件的方法。OOB<代码> COM.NET.CQ.WCM.Fun.Fiels.IMP.FrimShandLunservlet < /C> >既实现为servlet,又实现了请求级别过滤器。作为一个过滤器,它捕捉到在处理之前将请求发布到页面,使用
RequestDispatcher
将其转发到其Servlet性质,Servlet反过来能够处理请求,然后再次使用
RequestDispatcher
转发请求,将请求包装为GET请求后返回页面,类似于上面所做的操作。有点迂回,但如前所述,这是一个难以实现的模式

你看过ACS公共表格了吗?他们确实支持PRG作为标准表单处理流程。查看

您可能会按原样使用该功能,或者会得到一些实现提示


同样的git链接是

,感谢您的详细解释。我试图实现的模式是POST-REDIRECT-GET,我认为这是罕见的,并且与REST/无状态概念背道而驰。但我想试试是否有办法,如果Adobe的OOB组件使用的话。您可以发送一个示例实现或指向任何url吗?我确实在GitHub中找到了这个类的示例
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;
}
}