2014-03-13 2 views
0

이 클래스는 추상 클래스가 아니어야합니까? 만약 내가 직접 사용한다면 어쨌든 나에게 기본 객체를 줄 것이므로 서브 클래 싱을해야하고 내 관심사를 재정의해야한다.HttpServletRequestWrapper 클래스가 추상이 아닌 이유

public class HttpRequestWrapper extends HttpServletRequestWrapper { 
    private static final Logger logger = LoggerFactory 
      .getLogger(HttpRequestWrapper.class); 
    private final byte[] body; 
    private static Gson gson = new Gson(); 

    public HttpRequestWrapper(HttpServletRequest request) throws IOException { 
     super(request); 
     // Read the request body and save it as a byte array 
     InputStream is = super.getInputStream(); 
     body = IOUtils.toByteArray(is); 
    } 

    @Override 
    public ServletInputStream getInputStream() throws IOException { 
     return new ServletInputStreamImpl(new ByteArrayInputStream(body)); 
    } 

    @Override 
    public BufferedReader getReader() throws IOException { 
     String encBody = getCharacterEncoding(); 
     if (encBody != null && encBody != enc) { 
      enc = encBody; 
     } 
     return new BufferedReader(new InputStreamReader(getInputStream(), enc)); 
    } 
     xxxxxxxx more code xxxxxx 
} 

내가 직접 따라서 왜 추상적하지 HttpServletRequestWrapper의 객체를 생성하는 이점을 이해하지 못하고 다음과 같이 내가 사용하고있는 방법은? 핵심 통찰력을 놓치고 있습니까? 래퍼 주위 래퍼 (내가 뭘하는지) 중복인가?

업데이트 1 : 동일한 기능을 수행하는 데 사용할 수있는 다른 라이브러리가 있습니까?

답변

0

이 클래스는 Decorator 디자인 패턴을 사용했으며 유효한 HttpServletRequest를 래핑하는 데 사용되며, 이러한 인터페이스의 동작을 재정의 할 수있는 가능성을 제공합니다. 그것은 원하는 동작으로 클래스를 꾸미는 것을 의미합니다. 즉,이 클래스가 추상이 될 수없는 이유입니다.

요청이 서버에 도달하면 컨테이너가 HttpServletRequest의 객체 구현을 작성한다는 것을 기억하십시오.이 시점에서 메소드의 구현과 같은 객체 내에서 아무 것도 이동할 수 없습니다. 즉, 구체적인 클래스 HttpServletRequestWrapper를 사용합니다.

이 클래스는 일반적으로 서블릿 내부에서 코드를 이동하지 않고 일부 기본 기능을 추가하기 위해 필터와 함께 사용되며, 차단 필터 디자인 패턴을 사용하는 것을 고려하십시오. 원래 요청을 감싸서 doFilter 메서드로 서블릿에 보내십시오.

+0

실제로이 클래스의 기본 동작은 기본 구현으로 되돌아 가고 추상 동작으로도 동일한 동작을 얻을 수 있습니다. 하나는 추상 클래스를 정의하고 모든 메소드의 구현을 제공 할 수 있습니다. 추상적이라는 이점은 개발자의 마음에 이것이 래퍼 클래스로 직접 사용될 수 있다는 의심을 일으키지 않는다는 것입니다. – Richeek

관련 문제