JSP 5일차
고급 기능
필터
- 서블릿이 수행되기 전이나 후에 추가 기능을 수행
- 서블릿과 별도의 객체로 분리, javax.servlet.Filter 상속
- 작업 순서
    - Filter 인터페이스 상속받아 필터 객체 구현 ⇒ <filter>태그로 web.xml에 필터 객체 등록 ⇒<filter-mmapping>태그로 web.xml에 필터 매핑 설정
 
- Filter 인터페이스 상속받아 필터 객체 구현 ⇒ 
구현 가능 기능
- 서블릿이 호출되기 전에 서블릿 요청 가로채는 기능
- 서블릿이 호출되기 전에 요청 내용을 점검하는 기능
- 요청 헤더의 수정과 조정 기능
- 서블릿이 호출된 후에 서블릿 응답을 가로채는 기능
- 응답 헤더의 수정과 조정 기능
필터를 서블릿과 분리해서 구현하는 이유
- 유지 보수성이 높은 시스템 개발
- 하나의 서블릿에 여러개의 필터, 여러개의 서블릿에 하나의 필터 수행
구현
public class SampleFilter implements Filter {
	public void init(FilterConfig config) {
		// 필터 객체 생성 시 한 번 수행되는 초기화 코드
	}
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		// 서블릿 수행 전에 수행할 코드
		chain.doFilter(req, res);
		// 서블릿 수행 후에 수행할 코드
	}
}
- java.servlet.Filter 인터페이스 상속 ⇒ 모든 메소드 재정의
- init()
    - 필터 객체가 생성될 때 호출. 서버가 시작될 때 한번만 호출되기 때문에 주로 초기화 기능 구현
 
- destroy()
    - 필터 객체가 삭제될 때 호출되는 메소드. 자원 해제 기능
 
- doFilter(ServletRequest, ServletResponse, FilterChain)
    - 필터링 설정한 서블릿을 실행할 때마다 호출되는 메소드. 실제 필터링 기능 구현
- doFilter 메소드에 chain.doFilter() 명령문이 없으면 실행 흐름은 더 이상 진행하지 못하고 현재 메소드에서 끝나게 됨
 
필터 등록
- 
    web.xml 파일에 <filter>태그 사용<filter> <filter-name>flow2</filter-name> <filter-class>com.edu.test.FlowFilterTwo</filter-class> <init-param> <param-name>en</param-name> <param-value>UTF-8</param-value> </init-param> </filter>- 
<filter>: javax.servlet.Filter 인터페이스를 상속받고 있는 객체 등록
- 
<filter-name>: 등록하는 필터의 논리적 이름 지정
- 
<filter-class>: 등록하는 필터의 클래스 이름 지정
- 
<init-param>: web.xml에서 필터 객체에 변수 전달
- 
<param-name>: 필터 객체에 전달하는 변수의 이름 지정
- 
<param-value>: 필터 객체에 전달하려는 변숫값 지정
 ### web.xml 작성 시 태그 순서 <display-name?> <description?> <distributeable?> <context-param*> <filter*> <filter-mapping*> <listener*> <servlet*> <servlet-mapping*> <welcome-file-list?> <error-page*> <!-- ? : 사용되지 않을 수도 있고 사용되면 한번만 사용 * : 사용되지 않을 수도 있고 여러번 사용될 수 있음 --!>
- 
필터 매핑
<filter-mapping>
	<filter-name></filter-name>
	<url-pattern>	</url-pattern>
</filter-mapping>
- 
<filter-mapping>:<filter>태그가 어떤 서블릿을 필터링할 것인지 설정
- 
<filter-name>: 실행할 필터 지정. 필터의 클래스 이름이 아닌<filter-name>태그에 저장한 이름
- 
<url-pattern>: 필터링할 서블릿 지정. 클라이언트가 요청하는 URL 지정
- 
<servlet-name>:<servlet-name>태그에서 지정된 값만 사용 가능
- FilterChain
    - void doFilter(ServletRequest request, ServletResponse, FilterChain chain
- 필터가 실행될 때 doFilter() 메소드의 세 번째 인자로 전달
- 하나의 요청에 필터들이 실행되고, 서블릿이 실행될 때 처리 흐름을 제어할 수 있는 객체
 
- FilterConfig
    - 필터 객체의 init() 메소드의 인자값으로 전달되는 객체
- 필터에 대한 정보값 추출하는 메소드 갖고 있음
- 필터에 대한 정보는 web.xml <filter>태그로 지정 ⇒<filter>태그에 대한 정보값 추출할 목적
 
@WebFilter 어노테이션
- 작업 순서
    - Filter 인터페이스 상속받아 필터 객체 구현 ⇒ 필터 객체에 @WebFilter 어노테이션 선언 ⇒ @WebFilter()에 filterName 속성 추가⇒ @WebFilter()에 urlParams 속성 추가
 
- WebFilter
    - urlPatterns, value : 필터링할 페이지의 실행요청 URL 지정. 반드시 지정해야 할 속성으로 둘 중 어느 것을 사용해도 상관없음
- servletNames : 필터링 할 서블릿 이름 지정
- filterName : 등록하는 필터의 이름
- initParams : 필터에 전달하는 초기 파라미터 값
 
- 필터 매핑 설정 방법
    - @WebFilter(”/login”)
        - 클라리언트가 요청하는 페이지의 실행 요청 url 설정
 
- @WebFilter(”/*”)
        - 와일드 카드 사용해서 설정
 
- @WebFilter(value=”/hello”)
        - value 속성으로 지정
 
- @WebFilter(”/hello”)
        - urlPatterns 속성으로 지정
 
 
- @WebFilter(”/login”)
        
리스너
- 어떤 일이 발생하기를 기다렸다가 그 일이 발생했을 때 수행되는 메소드를 가지고 있는 자바 객체 ⇒ 이벤트 핸들러
리스너 종류
- 객체 생성, 삭제 이벤트
- 속성의 추가, 삭제, 대체 이벤트
등록
- 
    원하는 내용을 해당 이벤트 핸들러 객체를 상속받아 구현 ⇒ 컨테이너가 인식하도록 web.xml에 등록 <listener> <listener-class></listener-class> </listener>- 
<listener>: 리스너 객체를 등록할 때 사용하는 태그
- 
<listener-class>:<listener>태그를 사용할 때 반드시 지정해야 하는 태그. 실제 리스너 객체의 클래스 이름을 패키지 이름과 함께 정확하게 지정
 
- 
구현
- HttpServletRequest 객체
    - 클라이언트에게 서블릿 요청을 받았을 때 생성되었다가 요청이 끝나고 응답할 때 삭제
- HttpServletRequest 객체가 초기화되거나 해제되는 시점에 발생하는 이벤트는 ServletRequestEvent, 객체에 속성을 등록, 추출 대체하는 시점에 발생하는 이벤트는 ServletRequestAttributeEvent.
 
- HttpSession 객체
    - HttpSession 객체가 생성되거나 해제되는 시점에 발생하는 이벤트 HttpSessionEvent, 객체에 속성을 등록, 추출, 대체하는 시점에 발생하는 이벤트 HttpSessionBindingEvent
 
- ServletContext 객체
    - 웹 애플리케이션 서비스가 준비되는 시점에 생성, 중지될 때 삭제
- 객체가 초기화되거나 삭제되는 시점에 발생하는 이벤트 ServletContextEvent, 객체에 정보 등록, 삭제, 대체하는 시점에 발생하는 이벤트 ServletContextAttributeEvent
 
@WebListener 어노테이션
- 작업 순서
    - 원하는 이벤트를 가지고 있는 리스너 객체 상속하여 메소드 구현
- 구현된 리스너 클래스 선언부 앞에 @WebListener 어노테이션 선언
 
오류 처리
- try-catch 블록 사용
- 메소드 선언부에 throws 절 선언
- web.xml에 오류 처리 설정
자바 오류 객체
- 자바는 모든 내용을 객체로 표현 ⇒ 오류도 객체로 표현, java.lang 패키지에서 기본으로 제공
- Throwable 객체는 모든 오류들의 최상위 객체 ⇒ Throwable 객체를 상속하고 있는 겍체 Error, Exception
    - Error : 물리적 오류
- Exception : 프로그램적인 오류
 
- Exception 하위 객체
    - RuntimeException : 실행 중 발생하는 오류
        - NullPointerException ⇒ 프로그램 개발 시 가장 많이 발생하는 오류
 
- IOException : 외부 데이터와 입출력 작업 중 발생하는 오류
 
- RuntimeException : 실행 중 발생하는 오류
        
프로그램 내에서 오류 처리
- try-catch 처리
    - 오류가 발생했을 때 프로그램 실행이 강제로 중단되지 않도록 프로그램 내에서 발생한 오류를 적절하게 처리하기 위해 사용
- 오류가 발생할 수 있는 잠재적 위험이 있는 명령문 try { } 안에 작성 ⇒ catch() 문 안에 처리할 오류 타입의 변수 선언 ⇒ catch { } 안에 오류 발생 시 실행할 오류 처리 구문 구현
 
- throws 선언
    - 메소드 선언부에 나오며 throws 다음에 발생할 수 있는 오류들 나열
- 오류를 메소드 내에서 처리하지 않고 호출한 곳에서 처리하라고 선언 ⇒ 메소드를 호출하는 곳의 상황에 맞게 동적으로 처리하기 위함
 
- web.xml
    - 오류가 발생했을 때 처리할 페이지를 web.xml 파일에 지정
- 동일한 오류에 try-catch 구문, web.xml 중복 설정되면 try-catch가 항상 우선 처리
- web.xml 오류 처리는 현재 웹 애플리케이션 전체가 대상, try-catch 구문은 try 블록만 대상
- 
        web.xml 파일에 설정하는 <error-page>태그 사용법 두가지<error-page> <error-code></error-code> <location></location> </error-page> <error-page> <exception-type></exception-type> <location></location> </error-page>- 
<error-page>: 웹 애플리케이션에서 발생하는 오류를 처리할 때 사용하는 태그. 처리할 오류와 페이지가 무엇인지 값으로 지정
- 
<error-code>: 처리할 오류 지정하는 태그. 오류 코드로 값 지정
- 
<exception-type>: 처리할 오류를 지정하는 또 다른 태그. 오류가 정의된 객체 이름으로 지정(패키지 이름과 함께 정확하게 지정)
- 
<location>: 오류가 발생했을 때 실행할 페이지 경로 지정(정확하게)
 
- 
- 서버는 오류 처리 페이지로 넘어가기 전 오류 정보를 HttpServletRequest 객체에 등록한 다음 오류 처리 페이지로 이동 ⇒ 오류 처리 페이지에서 전달받은 HttpServletRequest객체에 발생한 오류에 대한 정보 등록되어 있음 ⇒ 이 정보를 기반으로 발생한 오류에 적절한 오류 처리
        - javax.servlet.error.status_code : 발생된 오류 코드 정보
- javax.servlet.error.exception_type : 발생된 오류 객체의 타입 정보를 가지고 있는 Class형 객체
- javax.servlet.error.message : 발생된 오류의 메세지 정보
- javax.servlet.error.exception : 발생된 오류 객체
- javax.servlet.error.request_uri : 오류가 발생된 페이지의 URI 정보