Компиляция JSP для строкового представления или в памяти bytearray с Tomcat/Websphere

Я часто использую станд.:: представьте в виде строки для содержания utf-8 символов без любых проблем вообще. Я сердечно рекомендую делать это при взаимодействии через интерфейс с API, которые используют utf-8 в качестве собственного строкового типа также.

, Например, я использую utf-8 при взаимодействии через интерфейс с моим кодом с интерпретатором Tcl.

главный протест является длиной станд.:: представьте в виде строки, больше не количество символов в строке.

6
задан Berlin Brown 27 July 2009 в 16:11
поделиться

1 ответ

Это совершенно раздражающая проблема, с которой мне приходилось решать несколько раз, и с которой я так и не нашел удовлетворительного решения.

Основная проблема в том, что API сервлетов здесь не поможет, так что вам придется его обмануть. Мое решение - написать подкласс HttpServletResponseWrapper, который переопределяет методы getWriter () и getOutput () и записывает данные в буфер. Затем вы отправляете () свой запрос на URI JSP, который хотите захватить, заменяя исходный ответ своим ответом оболочки. Затем вы извлекаете данные из буфера, управляете ими и записываете конечный результат обратно в исходный ответ.

Вот мой код, который делает это:

public class CapturingResponseWrapper extends HttpServletResponseWrapper {

    private final OutputStream buffer;

    private PrintWriter writer;
    private ServletOutputStream outputStream;

    public CapturingResponseWrapper(HttpServletResponse response, OutputStream buffer) {
        super(response);
        this.buffer = buffer;
    }

    @Override
    public ServletOutputStream getOutputStream() {
        if (outputStream == null) {
            outputStream = new DelegatingServletOutputStream(buffer);
        }
        return outputStream;
    }

    @Override
    public PrintWriter getWriter() {
        if (writer == null) {
            writer = new PrintWriter(buffer);
        }
        return writer;
    }

    @Override
    public void flushBuffer() throws IOException {
        if (writer != null) {
            writer.flush();
        }
        if (outputStream != null) {
            outputStream.flush();
        }
    }

}

Код для его использования может быть примерно таким:

HttpServletRequest originalRequest = ...
HttpServletResponse originalResponse = ...

ByteArrayOutputStream bufferStream = new ByteArrayOutputStream();
CapturingResponseWrapper responseWrapper = new CapturingResponseWrapper(originalResponse, bufferStream);

originalRequest.getRequestDispatcher("/my.jsp").forward(originalRequest, responseWrapper);

responseWrapper.flushBuffer();
byte[] buffer = bufferStream.toByteArray();
// now use the data

Это очень некрасиво, но это лучшее решение, которое я нашел.

7
ответ дан 17 December 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: