我正在努力应对以下情况:
在我们当前在 Tomcat 7.0.64 上运行的 Web 应用程序中,我们设法在自己的类的帮助下通过 Java 包含一个 JSP 页面CharArrayWriterResponse implementing HttpServletResponseWrapper
.
这样做的原因是我们将生成的 HTML 包装成 AJAX 响应所需的 JSON。
依赖项:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
代码示例:
// somewhere in servlet doPost()/doGet()
try (PrintWriter out = response.getWriter()) {
out.println(getJspAsJson(request, response));
}
private static String getJspAsJson(HttpServletRequest request, HttpServletResponse response) {
String html = getHtmlByJSP(request, response, "WEB-INF/path/to/existing.jsp");
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
return "{\"results\":" + gson.toJson(html) + "}";
}
public static String getHtmlByJSP(HttpServletRequest request, HttpServletResponse response, String jsp) {
CharArrayWriterResponse customResponse = new CharArrayWriterResponse(response);
request.getRequestDispatcher(jsp).include(request, customResponse);
return customResponse.getOutput();
}
public class CharArrayWriterResponse extends HttpServletResponseWrapper {
private final CharArrayWriter charArray = new CharArrayWriter();
public CharArrayWriterResponse(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
// this is called ONLY in tomcat
return new PrintWriter(charArray);
}
public String getOutput() {
return charArray.toString();
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
// this is called ONLY in WebLogic
return null; // don't know how to handle it
}
}
提示:我没有考虑上述代码示例中的异常处理。
我必须将此应用程序迁移到 WebLogic (12.2.1),但此解决方案不再有效。
到目前为止我发现了什么:
在Tomcat中调用后request.getRequestDispatcher(jsp).include()
上面例子的getWriter()
of my CharArrayWriterResponse
类被称为。
在WebLogic中getWriter()
不再被调用,这就是它不再起作用的原因。
经过一番调试,我发现在WebLogic中而不是getWriter()
only getOutputStream()
如果我覆盖它,就会被调用。getWriter()
在Weblogic上不会被调用一次,因此Tomcat和WebLogic的底层实现一定存在差异。
问题在于getOutputStream()
我认为不可能得到答复include()
调用单独的流或其他内容并将其转换为字符串以用于构建包含 HTML 的最终 JSON。
有人已经解决了这个问题,并且可以提供一个可行的解决方案,以编程方式结合 WebLogic 包含 JSP 吗?
有谁知道另一种解决方案来实现我的目标?
感谢您的建议。
Solution
请参阅工作示例here https://stackoverflow.com/a/42556442/7617251
Hint
我发现 Tomcat 和新的 Weblogic 解决方案之间的区别:
对于后一种情况,不可能再直接包含 JSPF,而对于 TomcatgetWriter()
it is.
解决方案是将 JSPF 包装在 JSP 文件中。