지금까지는 서블릿 클래스를 만들 때 Servlet 인터페이스를 구현했다. 서블릿을 만들 때마다 Servlet 인터페이스에 선언된 다섯 개의 메서드를 모두 구현했다. 사실 이 메서드 중에서 반드시 구현해야 하는 메서드는 service()이다. 나머지 메서드들은 상황에 따라 구현하지 않아도 된다.
그럼에도 '인터페이스를 구현하는 클래스는 반드시 인터페이스에 선언된 모든 메서드를 구현해야 한다.'라는 것이 자바의 법이기 때문에 빈 메서드라도 구현해야 한다. 이런 불편한 점을 해소하기 위해 등장한 것이 GenericServlet 추상 클래스이다.
GenericServlet은 추상 클래스로 하위 클래스에게 공통의 필드와 메서드를 상속해 주고자 존재한다. 즉 서블릿 클래스가 필요로 하는 init(), destroy(), getServletConfig(), getServletInfo()를 미리 구현하여 상속해 준다.
상속 방법은 다음과 같다.
public class CalculatorServlet extends GenericServlet{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
}
}
src/servlets/CalculatorServlet
public class CalculatorServlet extends GenericServlet{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
int a = Integer.parseInt(servletRequest.getParameter("a"));
int b = Integer.parseInt(servletRequest.getParameter("b"));
servletResponse.setContentType("text/plain");
servletResponse.setCharacterEncoding("UTF-8");
PrintWriter writer = servletResponse.getWriter();
writer.println("a=" + a + "," + "b=" + b + "의 계산결과 입니다.");
writer.println("a + b = " + (a + b));
writer.println("a - b = " + (a - b));
writer.println("a * b = " + (a * b));
writer.println("a / b = " + ((float)a / (float)b));
writer.println("a % b = " + (a % b));
}
}
web/WEB-INF/web.xml
<!-- 서블릿 선언-->
<servlet>
<servlet-name>Calculator</servlet-name>
<servlet-class>servlets.CalculatorServlet</servlet-class>
</servlet>
<!-- 서블릿을 URL과 연결 -->
<servlet-mapping>
<servlet-name>Calculator</servlet-name>
<url-pattern>/calc</url-pattern>
</servlet-mapping>
실행결과
service()의 매개변수 중에서 ServletRequest 객체는 클라이언트의 요청 정보를 다룰 때 사용한다. 예제 소스에서 사용한 getParameter()는 GET이나 POST 요청으로 들어온 매개변수 값을 꺼낼 때 사용한다.
다음 표는 ServletRequert 객체의 주요 메서드를 정리한 것이다.
메서드 | 설명 |
---|---|
getRemoteAddr() | 서비스를 요청한 클라이언트의 IP 주소를 반환 |
getScheme() | 클라이언트가 요청한 URI 형식 Scheme를 반환. 즉 URL에서 ':' 문자 전에 오는 값을 반환 |
getProtocol() | 요청 프로토콜의 이름과 버전을 반환 |
getParameterNames() | 요청 정보에서 매개변수 이름만 추출하여 반환 |
getParameterValues() | 요청 정보에서 매개변수 값만 추출하여 반환 |
getParameterMap() | 요청 정보에서 매개변수들을 Map 객체에 담아서 반환 |
setCharacterEncoding() | POST 요청의 매개변수에 대해 문자 집합을 설정. 기본값은 ISO-8859-1로 설정되어 있음 |
응답과 관련된 기능을 제공한다. 클라이언트에게 출력하는 데이터의 인코딩 타입을 설정하고, 문자집합을 지정하며, 출력 데이터를 임시 보관하는 버퍼의 크기를 조정하거나, 데이터를 출력하기 위해 출력 스트림을 준비할 때 이 객체를 사용한다.
다음 표는 ServletResponse 객체의 주요 기능을 정리한 것이다.
메서드 | 설명 |
---|---|
setContentType() | 출력할 데이터의 인코딩 형식과 문자 집합을 지정 |
setCharacterEncoding() | 출력할 데이터의 문자 집합을 지정. 기본값은 ISO-8859-1로 설정되어 있음 |
getWriter() | 클라이언트로 출력할 수 있는 출력 스트림 객체를 반환. 이미지나 동영상과 같은 바이너리 데이터를 출력하고 싶을 때는 getOutputStream()을 사용한다. |