如何从AEM中的吊索柱生成渲染输出?

如何从AEM中的吊索柱生成渲染输出?,aem,sling,Aem,Sling,似乎Sling希望每个表单帖子都修改JCR。因此,预期的/标准的行为将是一个后重定向GET,这对于大多数事情来说都很好。但是,我需要能够发布到AEM,然后使用该发布中的数据创建渲染结果。我们对AEM的使用是无状态的,因此我不想在会话中携带POST'd数据,以便在后续GET中使用它 有些人建议将发布的数据放在浏览器会话存储中,但这还没有足够广泛的支持 据我所知,AEM中的Sling无法发表文章并生成渲染结果 下面是一个屏幕截图,显示了一篇文章在页面/资源类型组件和任何包含在呈现中的jsp中生成的内

似乎Sling希望每个表单帖子都修改JCR。因此,预期的/标准的行为将是一个后重定向GET,这对于大多数事情来说都很好。但是,我需要能够发布到AEM,然后使用该发布中的数据创建渲染结果。我们对AEM的使用是无状态的,因此我不想在会话中携带POST'd数据,以便在后续GET中使用它

有些人建议将发布的数据放在浏览器会话存储中,但这还没有足够广泛的支持

据我所知,AEM中的Sling无法发表文章并生成渲染结果

下面是一个屏幕截图,显示了一篇文章在页面/资源类型组件和任何包含在呈现中的jsp中生成的内容

我曾经尝试过像使用手机这样的东西


但无论哪种方式,所有servlet都认为帖子正在发生,并且没有正确呈现

可以选择创建自定义servlet来处理POST,但是如何呈现模板化的输出并更改请求,以便所有组件都认为它们在为GET服务

更新: 下面是“nop”POST.jsp结果的屏幕截图。
创建一个自定义servlet来处理帖子可能是个好主意。成功写入后,可以重定向到修改后的资源-simple 302

我想到的另一个解决方案是一个自定义过滤器,它也可以做到这一点。然而,由于AEM希望得到200而不是302,所以最好通过属性或参数来判断这篇文章需要重定向。否则,一些AEM UI功能可能会停止。这是一个想法的快速示例。你可能需要写一些更复杂的东西。

@组件(立即=真)
@服务
@性质({
@属性(name=Constants.SERVICE_DESCRIPTION,value=“Desc”),
@属性(name=Constants.SERVICE\u供应商,value=“公司名称”),
@属性(name=Constants.SERVICE_RANKING,intValue=RedirectFilter.RANKING),
@属性(name=“filter.scope”,value=“request”)})
公共类重定向筛选器实现筛选器{
公共静态最终整数排名=-1000;//低排名
@凌驾
public void init(final FilterConfig FilterConfig)抛出ServletException{
}
@凌驾
公共空间销毁(){
}
@凌驾
公共筛选器(最终ServletRequest请求、最终ServletResponse响应、最终筛选器链)
抛出IOException、ServletException{
if(request.getParameter(“重定向”).equals(“true”)){
((SlingHttpServletResponse)response).sendRedirect(((SlingHttpServletRequest)request.getRequestURI());
}
}

}

您可以做的是在适当的resourceType中创建一个
POST.jsp
文件

如果您的POST请求转到
/content/yourapp/something
,其中包含
资源类型:your/app/example
。然后,您可以创建一个文件
/apps/your/app/example/POST.jsp
,使用您想要的任何渲染。如果需要将默认呈现脚本与GET请求呈现相同,甚至可以将其包含在
POST.jsp
文件中


另一个选项是使用为POST请求注册的servlet,并在内部使用该服务。该服务允许您通过Sling以编程方式处理请求。您可以使用包装请求并重写getMethod()以返回“GET”。这应该像处理GET请求一样处理请求。

这听起来像是一个有点古怪的用例,IIUC您正在使用一个大的请求参数p来驱动渲染

如果您使用类似于
slingRequest.getRequestDispatcher(resource).forward(request,response)
where request是实际请求的包装,where request.getMethod()返回GET。然后可以将P数据存储在请求属性中


SlingHttpServletRequestWrapper
类可用于创建此类包装。

在创建节点或向现有节点发送请求时是否需要自定义响应?POST不会修改或创建节点。它是对现有节点或servlet的一个POST-d负载,因为该负载对于GET来说太大了。有效负载不会持久化到JCR,而是用于形成显示内容的各个方面。重定向是否发生在服务器端?在这种情况下,POST redirect GET模型将不起作用,因为有效负载将在重定向中丢失。不,它是浏览器端。我不知道你实际上不想保存数据。JSP内部转发可能是一种方式,但您必须检查它。我有空的时候会检查的。据我所知,这不起作用。调用了我的POST.jsp页面,但该页面上的所有组件都呈现status方法,而不是所需的输出。在这一点上使用POST.jsp真的没有什么好处。@jedatu好的一点是,您需要在页面中包含的每个组件中添加一个POST.jsp。可能不会feasible@jedatu也许是滑冰机?我在回答中添加了另一个选项SlingHttpServletRequestWrapper似乎是关键。我重写了getMethod()以返回“GET”,然后调用slingRequest.getRequestDispatcher(resource.getParent().getPath()+“.html”).forward(包装器,响应);谢谢带“forward”的SlingHttpServletRequestWrapper是关键。Jedatu,你能分享一下对你有用的例子吗?我在努力找工作。
<input type="hidden" name=":operation" value="nop" />