Захват сгенерированного динамического содержимого на стороне сервера - программирование
Подтвердить что ты не робот

Захват сгенерированного динамического содержимого на стороне сервера

Есть ли способ, с помощью которого я могу захватить сгенерированный динамический контент на стороне сервера и получить этот файл или строковый объект с этим сервлетом.

Мы можем генерировать динамический контент с помощью JSP, но у нас нет доступа к созданному динамическому контенту на стороне сервера. Как только мы делаем, контейнер пересылки создает динамический контент и отправляет его в ответ.

Мне нужен доступ к созданному динамическому контенту на стороне сервера.

Любая помощь будет оценена.

4b9b3361

Ответ 1

Если запрос является идемпотентным (например, GET request are)), просто используйте java.net.URL, чтобы получить InputStream JSP вывод. Например.

InputStream input = new URL("http://localhost/context/page.jsp").openStream();

Если запрос не является идемпотентным (например, POST запросы), вам необходимо создать Filter, который обертывает ServletResponse с помощью специальной реализации PrintWriter с пятью методами write() были отменены, когда вы копируете вывод в некоторый буфер/построитель, который вы храните в сеансе или временную папку в локальной файловой системе на диске, чтобы впоследствии ее можно было получить в последующих запросах. Например.

package mypackage;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class CopyResponseFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {
        // NOOP.
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException
    {
        // Set character encoding for better world domination.
        response.setCharacterEncoding("UTF-8");

        // Create copy writer.
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        CopyWriter copyWriter = new CopyWriter(new OutputStreamWriter(
            httpResponse.getOutputStream(), httpResponse.getCharacterEncoding()));

        // Filter request with response which is wrapped with new writer.
        chain.doFilter(request, wrapResponse(httpResponse, copyWriter));

        // Store the copy writer afterwards in session so that it available in next request.
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        httpRequest.getSession().setAttribute("copyWriter", copyWriter);
    }

    public void destroy() {
        // NOOP.
    }

    private static HttpServletResponse wrapResponse
        (final HttpServletResponse response, final PrintWriter writer)
    {
        return new HttpServletResponseWrapper(response) {
            public PrintWriter getWriter() throws IOException {
                return writer;
            }
        };
    }

}

class CopyWriter extends PrintWriter {

    StringBuilder copy = new StringBuilder();

    public CopyWriter(Writer out) {
        super(out);
    }

    public void write(int c) {
        copy.append((char) c); // It is actually a char, not an int.
        super.write(c);
        super.flush();
    }

    public void write(char[] chars) {
        copy.append(chars);
        super.write(chars);
        super.flush();
    }

    public void write(char[] chars, int offset, int length) {
        copy.append(chars, offset, length);
        super.write(chars, offset, length);
        super.flush();
    }

    public void write(String string) {
        copy.append(string);
        super.write(string);
        super.flush();
    }

    public void write(String string, int offset, int length) {
        copy.append(string, offset, length);
        super.write(string, offset, length);
        super.flush();
    }

    public String getCopy() {
        return copy.toString();
    }

}

Вы можете получить доступ к окончательному выводу в любом сервлете последующего запроса (обратите внимание, что вы не можете получить доступ к нему в любом сервлете текущего запроса, потому что уже слишком поздно что-то с ним делать) просто доступ к CopyWriter в сеансе:

CopyWriter copyWriter = (CopyWriter) request.getSession().getAttribute("copyWriter");
String outputOfPreviousRequest = copyWriter.getCopy();

Обратите внимание, что вы должны сопоставить этот фильтр с url-pattern, охватывающим интересующие страницы JSP, и, следовательно, не на /* или так, иначе он будет работать на статических файлах (css, js, images и т.д.), которые включены в том же JSP.

Также обратите внимание, что несколько запросов внутри одного и того же сеанса будут переопределять друг друга, вам нужно различать эти запросы с помощью правильного url-pattern или другого способа его сохранения в сеансе, например. в аромате Map<URL, CopyWriter> или так.

Надеюсь, что это поможет.

Ответ 2

Насколько я понимаю вашу цель, вы хотите сохранить сгенерированный контент. Хотя я не могу придумать никаких оснований для этого, это возможно.

Вы можете использовать Filter и создать обертку вашего HttpServletResponse, переопределить некоторые методы write и захватить все содержимое, которое будет выведено в браузер.

Изменить: ответ BalusC - точное расширение, которое вам нужно, поэтому я не буду вдаваться в подробности.

Ответ 3

У вас должен быть доступ к соответствующим сервлетам на стороне сервера или вы можете написать свой сервлет.

Здесь - небольшое руководство по использованию сервлетов.

Ответ 4

Важно отметить, что JSPs скомпилированы в сервлеты через JSP-компилятор (который может генерировать код Java-кода наполовину), поэтому все, что вы можете сделать в JSP, которое вы можете делать с сервлетами.

Односторонняя заметка по этому вопросу: вы должны знать MVC, вообще говоря, сервлеты действуют как контроллеры, JSP в виде View и любые структуры данных (java beans и т.д.) действуют как Модель.

Для вашей проблемы вы должны сгенерировать контент/данные в сервлет - это ваш динамический контент, представленный объектами, выполнить любую обработку, которую вам нужно выполнить, установить эти данные, чтобы JSP могли получить к ней доступ (в атрибут запроса), получить доступ и форматировать его для клиента в JSP.

Чтобы узнать, вы должны проверить История сервлета: Мгновенное учебное пособие, Учебник Java ™ EE 5 на веб-уровне.