Различия между ServletResponse и HttpServletResponseWrapper? - PullRequest
13 голосов
/ 11 августа 2011

Я новичок в сервлете и читаю текст о фильтрах и оболочках.Я могу понять фильтры, но запутался в обертках.В книге автор приводит пример:

Если нет обертки:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        String name = request.getParameter("name").trim();

        try {
            chain.doFilter(request, response);
            PrintWriter out = response.getWriter();
            if (name.length() == 0) {
                out.println("Some message");
                out.println("</body>");
                out.println("</html>");
                out.close();
            }
        } catch (Throwable t) {
        }
    }

В случае обертки:

 public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        String name = request.getParameter("name").trim();

        HttpServletResponse httpRes = (HttpServletResponse) response;
        HttpServletResponseWrapper resWrapper = new HttpServletResponseWrapper(httpRes);
        try {
            chain.doFilter(request, response);

            PrintWriter out = resWrapper.getWriter(); // why dont we just use response.getWriter();
            if (name.length() == 0) {
                out.println("<h3>Some message");
                out.println("</body>");
                out.println("</html>");
                out.close();
            }
        } catch (Throwable t) {
        }
    }

Зачем нам нужно HttpServletResponseWrapperв то время как мы можем сделать то же самое с ServletResponse в случае 1?Кто-нибудь может дать мне четкий пример того, что мы ДОЛЖНЫ использовать HttpServletResponseWrapper вместо ServletResponse?Я пытался гуглить, но безуспешно.

Ответы [ 2 ]

18 голосов
/ 13 августа 2011

Ответ BalusC хороший, но он может быть немного ошеломляющим, если вы только начинаете.

Проще говоря: SerlvetResponse и его расширение HttpServletResponse - это интерфейсы, сообщающие вам, какие методы доступны для вызова, чтобы выполнить то, что вам нужно. В ходе обычной работы с Filters, Servlets и др. Вы будете часто использовать HttpServletResponse, чтобы сообщить своему приложению, как реагировать на запросы.

HttpServletResponseWrapper - это одна конкретная реализация HttpServletResponse, которая дает вам удобный способ обернуть существующий ответ некоторой собственной логикой без необходимости написания совершенно новой реализации интерфейса. У него есть много методов, так что это действительно хорошо. В качестве тривиального примера предположим, что вы хотите запретить вызовы response.flushBuffer () . Этот код, используя HttpServletResponseWrapper, сделает это:

class DisallowFlushResponseWrapper extends HttpServletResponseWrapper {
    public DisallowFlushResponseWrapper(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void flushBuffer() {
        throw new UnsupportedOperationException("Don't call this!");
    }
}

Типичный способ использования такой оболочки - создать фильтр, подобный этому:

class DisallowFlushFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) {
        if (response instanceof HttpServletResponse) {
            HttpServletResponse newResponse =
                new DisallowFlushResponseWrapper((HttpServletResponse) response);
            chain.doFilter(request, newResponse);
        }
        ...
    }
    ...
}

Обратите внимание, что мы оборачиваем ответ, поступающий в фильтр, экземпляром нашей собственной оболочки. Затем мы передаем упаковщик следующему элементу в цепочке фильтров. Таким образом, все, что идет после этого фильтра, получит исключение, если вызовет flushBuffer (), потому что он вызовет его в нашей оболочке. Оболочка из-за своего поведения по умолчанию делегирует любой другой вызов обернутого ответа, который является реальным, поэтому все, кроме вызовов этого одного метода, будет работать нормально.

10 голосов
/ 13 августа 2011

Это действительно глупый пример, который не показывает преимущества оболочки запроса / ответа.На самом деле, весь пример фильтра оставляет желать лучшего.Передача HTML должна выполняться JSP или, по крайней мере, сервлетом (но это также плохо).Просмотрите нашу вики-страницу фильтров , чтобы получить представление о том, для чего можно использовать фильтр.

Оболочка ответа полезна, если вы хотите изменить поведение ответа или просто хотите собрать информацию.об ответе , в то время как он используется в цепочке запрос-ответ.Измененное поведение имеет место тогда, когда какой-либо сервлет или JSP вызывает определенный ответ в ответе.Если вы переопределили его в своем классе-обёртке, тогда будет вызываться этот.Вы можете изменить поведение или собрать информацию там.

Здесь, в Stackoverflow, вы можете найти некоторые конкретные примеры полезных HttpServletResponseWrapper реализаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...