Servlet
Servlet Lifecycle
Tomcat 컨테이너는 서블릿 인스턴스를 관리하기 위해 다음의 Lifecycle을 사용한다.
init()
웹 컨테이너에 의해 서블릿 인스턴스 처음 생성
service()
클라이언트 요청을 받을 때 마다 호출 (doGet, doPost)
destroy()
웹 컨테이너에서 제거될 때 호출
web.xml
서블릿을 실행하기 위해 관련된 설정 정보가 필요하다.
web.xml 파일에는 이에 대한 정보가 있다.
맵핑 방법은 여러 개이지만
web.xml 파일을 생성하여 등록하는 방법에 대해 정리하려고 한다.
다음은 예시 파일이다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 공통적으로 설정할 데이터 선언 -->
<context-param> // 1)
<param-name>파라미터명</param-name>
<param-value>파라미터 값</param-value>
</context-param>
<listener> 2)
<listener-class>실행될 파일 절대 경로</listener-class>
</listener>
<!-- 서블릿을 등록하는 부분 -->
<servlet> 3)
<servlet-name>서블릿명</servlet-name>
<servlet-class>서블릿이 실행될 class 명 (패키지명까지 포함된 절대 경로)</servlet-class>
</servlet>
<servlet>
<servlet-name>ServletWithParam</servlet-name>
<servlet-class> com.xxx.xxx.ServletWithParamServlet </servlet-class>
<!-- ServletWithParam 서블릿에 접근한 경우 사용할 파라미터 -->
<init-param>// 3-1)
<param-name>파라미터명</param-name>
<param-value>default 값</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>song</param-value>
</init-param>
</servlet>
<!-- 서블릿 인스턴스를 맵핑할 url에 대한 정의 -->
<servlet-mapping> // 4)
<servlet-name>서블릿명</servlet-name>
<url-pattern>서블릿이 실행된 url pattern</url-pattern>
</servlet-mapping>
<filter> // 5)
<filter-name>필터이름<filter-name>
<filter-class>필터를 처리할 클래스</filter-class>
</filter>
<filter-mapping>
<filter-name>필터 이름</filter-name>
<url-pattern>/filter</url-pattern>
</filter-mapping>
</web-app>
1) context-param
서블릿 실행을 위해 공통적으로 사용되는 컨텍스트 파라미터 선언 (모든 서블릿에 공유되어 사용)
- servlet 선언 전에 선언해줘야 한다.
- 읽기만 가능
- 선언된 값을 java 단에서 가져오기 위해선 다음과 같이 사용하면 된다.
public class ContextParamServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception) {
String driver = getServletContext().getInitParameter("driver");
}
}
2) listener
웹 애플리케이션의 초기화/삭제를 감지하여 처리
- <listener-class>에 선언된 경로의 파일에서 관련 로직 처리가 가능하다.
- context-param 태그 이후에 선언
- listener-class 에서 선언된 파일은 다음의 예시 참고
public class ContextListener extends ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event ) {
System.out.print(""생성");
}
@Override
public void contextDestroyed(ServletContextEvent event ) {
System.out.print(""제거");
}
}
3) servlet
서블릿을 등록하는 부분
- <servlet-name>에는 서블릿 이름을 선언
- <servlet-class>에는 서블릿이 실행될 파일을 선언해준다. (파일은 패키지명 부터 적는다.)
3-1) init-param
특정 서블릿에서 필요한 parameter를 등록하는 부분 (초기화 파라미터)
- 다른 서블릿과 공유할 수는 없으며 ServletConfig 를 통해 접근이 가능하다.
- java 단에서는 다음과 같인 접근이 가능
public class ContextParamServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception) {
System.out.print(getInitParameter("name")); // song
}
}
4) servlet-mapping
url과 맵핑해주는 부분
5) filter
서블릿 요청 처리 전과 응답 값을 보내기 전에 처리하기 위한 로직을 선언
- filter-mapping 을 사용하여 url-pattern 을 정의 -> 특정 서블릿에 대한 필터 가능
- 실제 처리하는 로직은 다음의 예시 참고
public class CountryFilter implements Filter{
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws Exception) {
request.setCharacterEncoding("euc-kr");
chain.doFilter(request, response);
}
}