В поисках захвата HttpServletResponseWrapper - PullRequest
4 голосов
/ 20 июля 2009

JavaEE API поставляется с HttpServletResponseWrapper, который, цитируя javadoc, «обеспечивает удобную реализацию интерфейса HttpServletResponse, который может быть разделен на подклассы разработчиками, желающими адаптировать ответ от сервлета». Без подклассов этот класс просто передает все вызовы обернутому объекту ответа. Для запросов есть похожая оболочка.

Может кто-нибудь указать мне на какие-нибудь служебные библиотеки, которые предоставляют полезные реализации подклассов этих классов? В частности, я ищу подкласс обертки ответа, который фиксирует письменный ответ (в виде строки, байта [], что угодно) и предоставляет его с помощью метода API.

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

Ответы [ 2 ]

4 голосов
/ 21 июля 2009

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

Оригинальный ответ:

В JavaWorld есть классическая статья Фильтр кода с моделью Servlet 2.3 . Вы можете найти примеры для упакованного запроса и ответа:

  • Сжатие ответа

    public class CompressionResponseWrapper extends HttpServletResponseWrapper {
      protected ServletOutputStream stream = null;
      protected PrintWriter writer = null;
      protected int threshold = 0;
      protected HttpServletResponse origResponse = null;
      public CompressionResponseWrapper(HttpServletResponse response) {
    super(response);
    origResponse = response;
      }
      public void setCompressionThreshold(int threshold) {
    this.threshold = threshold;
      }
      public ServletOutputStream createOutputStream() throws IOException {
    return (new CompressionResponseStream(origResponse));
      }
      public ServletOutputStream getOutputStream() throws IOException {
    if (writer != null) {
      throw new IllegalStateException("getWriter() has already been " +
                                      "called for this response");
    }
    if (stream == null) {
      stream = createOutputStream();
    }
    ((CompressionResponseStream) stream).setCommit(true);
    ((CompressionResponseStream) stream).setBuffer(threshold);
    return stream;
      }
      public PrintWriter getWriter() throws IOException {
    if (writer != null) {
      return writer;
    }
    if (stream != null) {
      throw new IllegalStateException("getOutputStream() has already " +
                                      "been called for this response");
    }
    stream = createOutputStream();
    ((CompressionResponseStream) stream).setCommit(true);
    ((CompressionResponseStream) stream).setBuffer(threshold);
    writer = new PrintWriter(stream);
    return writer;
      }
    }
    
  • Обработка загрузки файлов

    public class MultipartWrapper extends HttpServletRequestWrapper {
      MultipartRequest mreq = null;
      public MultipartWrapper(HttpServletRequest req, String dir)
                                     throws IOException {
    super(req);
    mreq = new MultipartRequest(req, dir);
      }
      // Methods to replace HSR methods
      public Enumeration getParameterNames() {
    return mreq.getParameterNames();
      }
      public String getParameter(String name) {
    return mreq.getParameter(name);
      }
      public String[] getParameterValues(String name) {
    return mreq.getParameterValues(name);
      }
      public Map getParameterMap() {
    Map map = new HashMap();
    Enumeration enum = getParameterNames();
    while (enum.hasMoreElements()) {
      String name = (String) enum.nextElement();
      map.put(name, mreq.getParameterValues(name));
    }
    return map;
      }
      // Methods only in MultipartRequest
      public Enumeration getFileNames() {
    return mreq.getFileNames();
      }
      public String getFilesystemName(String name) {
    return mreq.getFilesystemName(name);
      }
      public String getContentType(String name) {
    return mreq.getContentType(name);
      }
      public File getFile(String name) {
    return mreq.getFile(name);
      }
    }
    

Код немного стар (июнь 2001 г.!), Но он хорошо демонстрирует использование.

1 голос
/ 20 июля 2009

В прошлом я использовал объекты, предоставляемые в рамках Spring. В частности, это должно работать: http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/mock/web/MockHttpServletRequest.html

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