【问题标题】:RequestDispatcher.include() from custom tags and IllegalStateExceptionsRequestDispatcher.include() 来自自定义标签和 IllegalStateExceptions
【发布时间】:2013-04-15 11:21:34
【问题描述】:

在自定义标记中,我想通过 RequestDispatcher 包含其他内容:

RequestDispatcher rd = request.getRequestDispatcher(url);
rd.include(request, response);

但我不知道响应输出流的状态。我目前正在通过将响应和可用于标记的 JspWriter 包装在另一个实现 HttpServletRequest 的对象中来解决此问题。当内部调用 getWriter() 时,这工作正常。但是,如果处理请求的代码实际上想要获取原始 OutputStream(我也无法安全地在标签内获取),我会得到 IllegalStateException(因为 getOutputStream() 已经被调用)。

现在我还可以创建一个新的 OutputStream 并将其包装在我的请求包装器中,缓冲它直到 include() 返回,然后将写入其中的字节写入 JspWriter。

然而,我的问题是:我应该尝试维护字符编码吗?如:我是否应该“模拟”更多的响应对象,以便我至少可以尝试从我传递到包含和底层输出流的请求包装器中的字符编码集进行转换?这会“足够干净”吗?我应该研究任何实用程序类吗?

【问题讨论】:

    标签: java jakarta-ee servlets character-encoding


    【解决方案1】:

    您不能在同一响应中同时使用 getServletOutputStream() 和 getWriter()。

    我认为在您的代码中某处您正在使用 getServletOutputStream() 并且包括 JSP 的使用 getWriter()。这导致您出现异常。

    请查看重复的问题。

    java.lang.IllegalStateException: Already using output stream

    【讨论】:

    • 是的,我知道。我的问题实际上是我不知道当我包含其他资源时会使用哪一个。
    • 并且接收方无法知道它是否“允许”getWriter 或 getOutputStream ...它必须假设响应是新的并且它可以用它做任何它想做的事情。
    猜你喜欢
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-07-26
    • 2011-06-10
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多