포스트

7. requestdispatcher, servlet filter

7. requestdispatcher, servlet filter

RequestDispatcher, Servlet Filter (23. 11. 04)

RequestDispatcher

  • RequestDispatcher는 다른 페이지나 서블릿으로 현재 요청을 보내거나 다른 페이지나 서블릿의 출력을 현재 페이지에 포함시키는 데 사용
  • 클라이언트로부터 들어온 요청을 Servlet내에서 원하는 자원으로 요청을 보내는 역할 수행
  • a에서 들어온 요청을 RequestDispathcer를 사용해 b로 전송
  • 웹 애플리케이션에서 유연한 처리가 가능해지며, 코드의 재사용성 증가

sendRedirect()와의 차이점

  • 기존의 sendRedirect는 클라이언트에 redirect()한 뒤 응답을 받는 형태

    Untitled

    Untitled

  • 상태 또한 지속적으로 유지될 수 없음 (쿠키나 세션을 통해 공유는 가능)
  • 자원의 낭비

RequestDispathcer 사용방법

  • Servlet name으로 생성

    1
    
      RequestDispatcher rd = getServletContext().getNamedDispatcher("loginServlet");
    
  • URL로 설정

    1
    
      RequestDispatcher rd = getServletContext().getRequestDispatcher("/login");
    

forward() 메서드

  • 대상 자원으로 제어를 넘긴다.
  • a 에서 요청했을때 aforward() 를 실행 하여 b 로 제어를 넘기고 브라우저에 출력은 b 가 한다.
  • 브라우저 입장에서는 a 에게 요청했지만 결과는 b 에게 받는다.
  • redircet 와는 달리 하나의 HTTP 요청에 의해 동작이 이루어졌다.

Untitled

login 실패시 sendRedirect를 forwad로 변경

1
resp.sendRedirect("/login.html");

아래와 같이 변경한다.

1
2
RequestDispatcher dispatcher = req.getRequestDispatcher("/login.html");
            dispatcher.forward(req, resp);

Servlet Filter

  • 지정한 URL 패턴에 해당하는 요청에 대해
    • 서블릿 실행 전 후에
    • 해당 요청이나 응답에 공통적으로 적용할 작업을 수행하는 객체
  • 필터 체인 형태로 제공

Untitled

  • 서블릿에 전달하기 전 뿐만 아니라 후에도 필터 적용이 가능하다.

Interface

1
2
3
4
5
6
7
public interface Filter {
    default public void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) /* .. */;

    default public void destroy() {}
}

책임 연쇄 패턴

  • 객체 지향 디자인에서 chain-of-responsibility pattern은 명령 객체와 일련의 처리 객체를 포함하는 디자인 패턴이다.
  • 각각의 처리 객체는 명령 객체를 처리할 수 있는 연산의 집합이고, 체인 안의 처리 객체가 핸들할 수 없는 명령은 다음 처리 객체로 넘겨진다.
  • 이 작동방식은 새로운 처리 객체부터 체인의 끝까지 다시 반복된다.

Listener

  • Servlet Container가 수행한 특정한 타입의 동작(이벤트)을 감지하여
  • 해당 이벤트에 대해 별도의 작업을 수행하는 객체

Listener 종류

Event SourceEventEvent Listener 
ServletContextServletContextEventServletContextListener웹 애플리케이션 시작, 종료
ServletContextServletContextAttributeEventServletContextAttributeListenerServletContext 속성 변경
HttpSessionHttpSessionEventHttpSessionListener세션 시작, 종료
HttpSessionHttpSessionBindingEventHttpSessionAttributeListener세션 속성 변경
ServletRequestServletRequestEventServletRequestListenerServletRequest 생성, 종료
ServletRequestServletRequestAttributeEventServletRequestAttributeListenerServletRequest 속성 변경
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.