在 Weblogic 12c 中以编程方式包括 JSP 的 RequestDispatcher 问题

2023-12-27

我正在努力应对以下情况:

在我们当前在 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 文件中。


我这样做了:

@Override
public ServletOutputStream getOutputStream() throws IOException {
    // this is called ONLY in WebLogic
    // created a custom outputstream that wraps your charArray
    return new CustomOutputStream(this.charArray);
}

// custom outputstream to wrap charArray writer
class CustomOutputStream extends ServletOutputStream {

    private WriterOutputStream out;

    public CustomOutputStream(CharArrayWriter writer) {
        // WriterOutputStream has a constructor without charset but it's deprecated, so change the UTF-8 charset to the one you use, if needed
        this.out = new WriterOutputStream(writer, "UTF-8");
    }

    @Override
    public boolean isReady() {
        return true;
    }

    @Override
    public void setWriteListener(WriteListener writeListener) {
    }

    @Override
    public void write(int b) throws IOException {
        this.out.write(b);
        this.out.flush(); // it doesn't work without flushing
    }
}

I used WriterOutputStream来自 apache commons-io,所以我必须包含在我的 pom.xml 中:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.5</version>
</dependency>

我不知道你的 jsp 文件中有什么,但我已经用一个简单的文件进行了测试,我相信它是有效的。 我的jsp文件:

<b>Hello world</b>

<p>testing</p>

<ul>test
<li>item</li>
<li>item2</li>
</ul>

输出(在浏览器中访问 servlet 时):

{"results":"<b>Hello world</b>\n\n<p>testing</p>\n\n<ul>test\n<li>item</li>\n<li>item2</li>\n</ul>"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Weblogic 12c 中以编程方式包括 JSP 的 RequestDispatcher 问题 的相关文章

随机推荐