본문 바로가기

웹/JAVA

[JAVA] Listener와 Filter

Listener와 Filter

  • 향상된 클래스이다.
  • 서블릿을 상속받아서 만들어진 클래스이다.
  • Servlet보다는 우선 실행된다.

Filter

  • 서블릿 실행 전, 먼저 동작하여 서블릿의 사전 처리 작업을 수행한다.
  • 서블릿 실행 후, 응답 메시지가 브라우저에 전송되기 전에 사후 처리 작업을 수행한다.
  • 서블릿 컨테이너가 구동되는 시점에 생성된다.

생성

  • 클래스명 지정
    • ~Filter
  • url맵핑 지정
    • ex)*.do, *.jsp

효과

  • 공통 부분을 분리함으로써 경합도를 낮추고 응집도를 높일 수 있다.

WebFilter어노테이션 

  • {}는 맵핑을 복수 지정 해서 생긴다.
  • new역할을 한다.
    • 서블릿 컨테이너(톰캣)가 싱글톤 유지 + 제때에 메서드를 수행
    • 컨테이너의 역할은 객체를 생성(new) 및 관리(싱글톤 유지) 및 수행(.메서드()를 수행)

destroy

  • disconnect()....

doFilter

  • chain.doFilter(request, response)
    • 다음 필터가 존재한다면, 그곳으로 이동한다.
    • 더 이상 수행할 필터가 없다면, 원래 수행하던 요청으로 돌아간다.

init

  • 최초에 단 한번 실행되는 메서드 : 유사 생성자
  • 생성자와 달리 외부에서 설정을 가져올 수 있다.
  • init의 값이 변할 경우 반영하기 위해서는 컴파일을 다시 해야한다. == 서버를 껏다 켜야한다.
    • 그러므로 값 설정을 xml파일에서 해준다.

예제

@WebFilter({ "*.do", "*.jsp" })
// new 가 미리 작성되어있음
// 서블릿 컨테이너(톰캣)가 싱글톤 유지 + 제때에 메서드를 수행시켜줌
// ★ 컨테이너의 역할 == 객체를 생성(new 를 대신해줌) 및 관리(싱글톤 유지) 및 수행(.메서드() 를 해줌) ★
public class EncFilter extends HttpFilter implements Filter {
       
	private String encoding; // 로직부분에 하드코딩을 없애기위해 존재하는 멤버변수
	
    public EncFilter() {
        super();
   }

	public void destroy() {	
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		if(request.getCharacterEncoding() == null) {
			request.setCharacterEncoding(encoding); // 하드코딩 : 유지보수 용이성을 망가뜨리는 주범ㅠ
		}
		System.out.println(" [로그] 필터 서블릿 클래스에서 작성한 로그");
		
		chain.doFilter(request, response);
		// 다음 필터가 존재한다면, 그곳으로 이동해라.
		// 더이상 수행할 필터가 없다면, 원래 수행하던 요청으로 돌아가라.
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// 최초에 단한번 실행되는 메서드 : 유사 생성자
		this.encoding=fConfig.getServletContext().getInitParameter("encoding");
		// 컴파일을 다시해야함 == 서버를 OFF->ON 해야함
		// 결국 이 모습도 하드코딩...
	}

}
// 인코딩 설정을 분리함으로써
// 1) 결합도를 낮추고
// 2) 응집도를 높일수있음
// => 유지보수 용이해짐

Listener

  • 외부의 요청, 자극, 수행, 액션 등을 항상 모니터링하는 것을 말한다.
  • 해당 리스너가 언제 반응할지 설정하며 생성한다.

생성

  • 클래스명 지정
    • ~Filter
  • url맵핑 지정
    • ex)*.do, *.jsp
  • Servlet context events
    • Lifecycle
      • 서블릿 컨테이너가 시작될 때 반응한다. == 톰캣이 시작될 때 반응한다.
    • Changes to attribute
      • 서블릿 컨테이너 에 변화가 생겼을 때 반응한다.

CrawlingListener


contextDestroyed

  • 종료되기 직전에 자동으로 호출된다.

contextInitialized

  • 서블릿 컨테이너가 생성되는 순간 호출된다.
  • 여기에 크롤링 관련 코드를 작성하면 처음에 단 한번 실행된다.

예제

@WebListener
public class CrawlingListener implements ServletContextListener {

    public CrawlingListener() {
    }

	public void contextDestroyed(ServletContextEvent sce)  { 
    }

	public void contextInitialized(ServletContextEvent sce)  { 
		///// 여기에 크롤링 관련 코드를 작성
		ServletContext sc=sce.getServletContext();
		sc.setAttribute("teemo","작은 티모");
		// sc == application
		System.out.println(" [로그] 리스너 서블릿 클래스에서 작성한 로그");
		// "서블릿 컨테이너의 시작"에 반응한다는것을 확인!!!
    }
	
}

 

' > JAVA' 카테고리의 다른 글

[JAVA] HandlerMapping  (1) 2024.01.19
[JAVA] web.xml  (0) 2024.01.18
[JAVA] 동적 크롤링  (0) 2024.01.15
[JAVA] <Servlet> sendRedirect와 forward  (0) 2024.01.08
[웹] 파비콘  (0) 2023.12.27