GenericServlet의 사용

지금까지는 서블릿 클래스를 만들 때 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>

실행결과

Chapter03(2)-1

ServletRequest

service()의 매개변수 중에서 ServletRequest 객체는 클라이언트의 요청 정보를 다룰 때 사용한다. 예제 소스에서 사용한 getParameter()는 GET이나 POST 요청으로 들어온 매개변수 값을 꺼낼 때 사용한다.

다음 표는 ServletRequert 객체의 주요 메서드를 정리한 것이다.

메서드 설명
getRemoteAddr() 서비스를 요청한 클라이언트의 IP 주소를 반환
getScheme() 클라이언트가 요청한 URI 형식 Scheme를 반환. 즉 URL에서 ':' 문자 전에 오는 값을 반환
getProtocol() 요청 프로토콜의 이름과 버전을 반환
getParameterNames() 요청 정보에서 매개변수 이름만 추출하여 반환
getParameterValues() 요청 정보에서 매개변수 값만 추출하여 반환
getParameterMap() 요청 정보에서 매개변수들을 Map 객체에 담아서 반환
setCharacterEncoding() POST 요청의 매개변수에 대해 문자 집합을 설정. 기본값은 ISO-8859-1로 설정되어 있음

ServletResponse

응답과 관련된 기능을 제공한다. 클라이언트에게 출력하는 데이터의 인코딩 타입을 설정하고, 문자집합을 지정하며, 출력 데이터를 임시 보관하는 버퍼의 크기를 조정하거나, 데이터를 출력하기 위해 출력 스트림을 준비할 때 이 객체를 사용한다.

다음 표는 ServletResponse 객체의 주요 기능을 정리한 것이다.

메서드 설명
setContentType() 출력할 데이터의 인코딩 형식과 문자 집합을 지정
setCharacterEncoding() 출력할 데이터의 문자 집합을 지정. 기본값은 ISO-8859-1로 설정되어 있음
getWriter() 클라이언트로 출력할 수 있는 출력 스트림 객체를 반환. 이미지나 동영상과 같은 바이너리 데이터를 출력하고 싶을 때는 getOutputStream()을 사용한다.