In CQ, we need to process jsp within servlet then combine the result with other results we get from the server before writing back to the browser.
The following code is almost what we need, except that it writes the result back to the browser after processing jsp.
RequestDispatcher dispatcher = request.getRequestDispatcher(resource);
dispatcher.forward(request, response);
We tried using mock response as follows:
RequestData requestData = new RequestData(slingRequestProcessor, request, mockResponse);
SlingHttpServletRequest slingRequest = requestData.getSlingRequest();
SlingHttpServletResponse slingResponse = requestData.getSlingResponse();
RequestDispatcher dispatcher = request.getRequestDispatcher(resource);
dispatcher.forward(slingRequest, slingResponse);
but we get issues.
Best How To:
First off - based on your description it sounds like you want to use requestDispatcher.include and not requestDispatcher.forward.
Concerning the inclusion of the response content, the response which you pass into a requestDispatcher.include call could be an object of your own creation which would write its output to a string instead of returning it to the browser. Something along the lines of the following might be appropriate:
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();
}
};
After the inclusion outputStream.toString() should provide the result of the resource request's execution.
The following code is almost what we need, except that it writes the result back to the browser after processing jsp.
RequestDispatcher dispatcher = request.getRequestDispatcher(resource);
dispatcher.forward(request, response);
We tried using mock response as follows:
RequestData requestData = new RequestData(slingRequestProcessor, request, mockResponse);
SlingHttpServletRequest slingRequest = requestData.getSlingRequest();
SlingHttpServletResponse slingResponse = requestData.getSlingResponse();
RequestDispatcher dispatcher = request.getRequestDispatcher(resource);
dispatcher.forward(slingRequest, slingResponse);
but we get issues.
Best How To:
First off - based on your description it sounds like you want to use requestDispatcher.include and not requestDispatcher.forward.
Concerning the inclusion of the response content, the response which you pass into a requestDispatcher.include call could be an object of your own creation which would write its output to a string instead of returning it to the browser. Something along the lines of the following might be appropriate:
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();
}
};
After the inclusion outputStream.toString() should provide the result of the resource request's execution.
No comments:
Post a Comment
If you have any doubts or questions, please let us know.