在AEM的Servlet中获取JSP输出

在CQ中,我们需要在servlet中处理jsp,然后将结果与我们从服务器获得的其他结果相结合,然后再写回浏览器。

以下代码几乎是我们需要的,除了它在处理jsp后将结果写回浏览器。

RequestDispatcher dispatcher = request.getRequestDispatcher(resource); dispatcher.forward(request, response); 

我们尝试使用模拟响应如下:

 RequestData requestData = new RequestData(slingRequestProcessor, request, mockResponse); SlingHttpServletRequest slingRequest = requestData.getSlingRequest(); SlingHttpServletResponse slingResponse = requestData.getSlingResponse(); RequestDispatcher dispatcher = request.getRequestDispatcher(resource); dispatcher.forward(slingRequest, slingResponse); 

但我们遇到问题。

首先 – 基于您的描述,听起来您想要使用requestDispatcher.include而不是requestDispatcher.forward

关于包含响应内容,您传递给requestDispatcher.include调用的响应可能是您自己创建的对象,它会将其输出写入字符串而不是将其返回到浏览器。 以下内容可能是恰当的:

 final ServletOutputStream outputStream = new ServletOutputStream() { public void write(int b) throws IOException { outputBuffer.append((char) b); } }; SlingHttpServletResponseWrapper responseWrapper = new SlingHttpServletResponseWrapper(response) { public ServletOutputStream getOutputStream() { return outputStream; } public PrintWriter getWriter() throws IOException { return new PrintWriter(outputBuffer); } public SlingHttpServletResponse getSlingResponse() { return super.getSlingResponse(); } }; 

包含outputStream.toString()应该提供资源请求执行的结果。

结合所有反馈,这就是我们提出的:

  //Map jstlValues, final Map propertyValues, String resourceType, SlingHttpServletRequest request, SlingHttpServletResponse response final StringWriter outputBuffer = new StringWriter(); SlingHttpServletResponseWrapper responseWrapper = new SlingHttpServletResponseWrapper(response) { public PrintWriter getWriter() throws IOException { return new PrintWriter(outputBuffer); } public SlingHttpServletResponse getSlingResponse() { return super.getSlingResponse(); } }; ResourceMetadata resourceMetaData = new ResourceMetadata(); resourceMetaData.setResolutionPath("/dummy"); for (Map.Entry entry: jstlValues.entrySet()) { request.setAttribute(entry.getKey(), entry.getValue()); } SyntheticResource resource = new SyntheticResource(request.getResourceResolver(), resourceMetaData, resourceType) { public  T adaptTo(Class type) { if (type == ValueMap.class) { ValueMap m = new ValueMapDecorator(propertyValues); return (T) m; } return super.adaptTo(type); } }; RequestDispatcher dispatcher = request.getRequestDispatcher(resource); dispatcher.include(request, responseWrapper); return outputBuffer.toString();