在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
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()应提供资源请求执行的结果。
outputStream.toString()