一尘不染

在AEM中的Servlet中获取JSP输出

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);

但是我们遇到了问题。


阅读 235

收藏
2020-06-08

共1个答案

一尘不染

首先,根据您的描述,听起来好像您想使用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()应提供资源请求执行的结果。

2020-06-08