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 정보