서블릿 (Servlet) , 필터
서블릿이란
JSP 표준이 나오기 전 자바로 동적인 페이지를 만들기 위한 서버 프로그래밍.
개발 과정
- 서블릿 규약에 따라 자바 코드 작성
- 자바 코드를 컴파일해서 클래스 파일을 생성
- /WEB-INF/classes 폴더에 클래스 파일을 패키지에 알맞게 위치
- web.xml 파일에 서블릿 클래스를 설정
- 톰켓 실행
- 웹 브라우저 확인
서블릿 구현
java
public class NowServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>현재시간</title></head>");
out.println("<body>");
out.println("현재 시간은");
out.println(new Date());
out.println("입니다.");
out.println("</body></html>");
}
}
web.xml 매핑
<servlet>
<servlet-name>now</servlet-name>
<servlet-class>example.NowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>now</servlet-name>
<url-pattern>/now</url-pattern>
</servlet-mapping>
- 서블릿으로 사용할 클래스
- 서블릿과 URL 간의 매핑
어노테이션 매핑
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>인사</title></head>");
out.println("<body>");
out.println("안녕하세요, ");
out.println(request.getParameter("name"));
out.println("님");
out.println("</body></html>");
}
}
서블릿 2.5 버전까진 web.xml 파일에 등록해야 사용할 수 있었는데 서블릿 3.0 버전부터는 @WebServlet 어노테이션을 사용하면 web.xml을 사용하지 않아도 등록이 가능하게 되었다.
웹 컨테이너가 서블릿 객체를 생성하고 init()메서드를 호출하는 과정을 '서블릿 로딩' 과정이라고 한다.
서블릿은 이 init() 메서드를 이용해서 필요한 초기화 작업을 수행한다.
서블릿은 초기화를 위해 ServletConfig 파라미터를 갖는 init() 메서드를 실행시킨다.
인자값이 없는 init() 메서드를 실행. 따라서 초기화가 필요한 서블릿은 인자값이 없는 init() 메서드를 재정의하면 된다.
재정의 : 오버라이딩
보통 초기화 작업은 상대적으로 오래 걸리기 때문에, 처음 서블릿을 사용하는 시점보다는 웹 컨테이너를 처음 구동하는 시점에 초기화를 진행하는 것이 좋다.
web.xml 에서 설정. (load-on-startup)
<servlet>
<servlet-name>DBCPInit2</servlet-name>
<servlet-class>jdbc.DBCPInit2</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
값이 작은 Config 서블릿을 먼저 로딩한다.
초기화 파라미터
서블릿은 코드를 직접 변경하지 않고 사용할 값을 변경할 수 있는 방법을 제공하는데, 그 방법은 초기화 파라미터를 사용하는 것이다.
<servlet>
<servlet-name>DBCPInit2</servlet-name>
<servlet-class>jdbc.DBCPInit2</servlet-class>
<init-param>
<param-name>jdbcdriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>jdbcUrl</param-name>
<param-value>
jdbc:mysql://localhost:3306/chap14?characterEncoding=utf8
</param-value>
</init-param>
<init-param>
<param-name>dbUser</param-name>
<param-value>jspexam</param-value>
</init-param>
<init-param>
<param-name>dbPass</param-name>
<param-value>jsppw</param-value>
</init-param>
<init-param>
<param-name>poolName</param-name>
<param-value>chap14</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
getInitParameter("파라미터명");
: 지정한 초기화 파라미터가 존재하면 해당 값을 리턴하며, 존재하지 않으면 null을 리턴한다.
이유
: 클래스의 수정 없이 초기화 과정에서 필요한 값을 수정할 수 있기 떄문이다.'
WebInitParam 어노테이션을 사용하면 자바코드를 수정해야하기 때문에 변경의 유연함을 떨어뜨린다.
url 패턴 매핑 규칙
- '/'로 시작하고 '/*'로 끝나는 url-pattern은 경로 매핑을 위해서 사용한다.
- '*.'로 시작하는 url-pattern은 확장자에 대한 매핑을 할 때 사용한다.
- 오직 '/'만 포함하는 경우 어플리케이션의 기본 서블릿으로 매핑한다.
- 이 규칙 외, 나머지 다른 문자열은 정확한 매핑을 위해서 사용한다.
p.514 참고
필터
'Http 요청과 응답을 변경할 수 있는 재사용 가능한 클래스'
필터는 클라이언트와 자원 사이에 위치하고 있다.
클라와 자원 사이에 한 개의 필터만 조재할 수 있는 것은 아니며 여러 개의 필터가 모여 하나의 필터 체인을 형성하게 된다.
필터구현
web.xml을 이용하여 등록하는 방법과 @WebFilter 어노테이션을 이용하는 방법이 있다.
<filter>
<filter-name>NullParameter</filter-name>
<filter-class>filter.NullParameterFilter</filter-class>
<init-param>
<param-name>parameterNames</param-name>
<param-value>id,name</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>NullParameter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
@WebFilter(filterName = "xsltFilter", urlPatterns = { "/xml/*" })
public class XSLTFilter implements Filter {
}
요청 및 응답 래퍼 클래스
필터가 필터로서의 제 기능을 하려면 클라이언트의 요청을 변경하고 클라이언트로 가는 응답을 변경할 수 있어야 한다.
- 요청 정보를 변경하여 최종 자원인 서블릿/jsp/html/기타 자원에 전달한다.
- 최종 자원으로부터의 응답을 변경하여 새로운 응답 정보를 클라이언트에 보낸다.
파일 전송 방식
일반 파라미터를 전송할 때 사용하는 인코딩과 파일을 업로드할 때 사용하는 인코딩은 다르다.
POST 방식은 다음의 두 가지 인코딩 방식에 따라 전송하는 데이터 형식이 달라진다.
- application/x-www-from-urlencoded
- multipart/form-data
파일을 업로드 하려면 multipart/form-data 인코딩을 사용해야 한다.
<form action="multipart_data.jsp" method="post" enctype="multipart/form-data">