서블릿 클래스의 구조를 살펴본다.

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out=response.getWriter();
		out.print("<html><body><h1>");
		out.print("Hello Servlet");
		out.print("</h1></body></html>");
		out.close();
	}
}

 

⊙ @WebServlet 어노테이션으로 URL 매핑

@WebServlet은 서블릿 클래스의 요청을 위한 URL 매핑을 보다 쉽게 자바 클래스에서 설정할 수 있도록 제공되는 어노테이션이다.

 

URL Mapping : 서블릿을 동작시키기 위해서 실제 자바 클래스명(HelloServlet)을 사용하는 대신 서블릿을 요청하기 위한 문자열(Hello)을 서블릿 클래스와 매핑 시키는 것을 의미

 

URL 매핑을 하는 이유

실제 서블릿 클래스를 공개하지 않기 위해서이다. 실제 호출되는 서블릿 클래스는 HelloServlet이지만 외부에서 이 서블릿을 요청할 때에는 서블릿 클래스 이름이 아닌 서블릿 클래스와 매핑된 URL인 hello로 접근한다.

http://localhost:8181/web_2/hello
                              ↓
              @WebServlet("/hello") 
                              ↓
            public class HelloServlet extends HttpServlet {
            
            }

URL Mapping을 다시 말하면 서블릿 클래스를 요청하기 위해서 브라우저의 주소 입력란에 서블릿 클래스 이름 대신 URL 매핑으로 지정한 이름을 입력하여 호출하기 위한 설정이다.

 

⊙ 서블릿 클래스 정의

public class HelloServlet extends HttpServlet {

}
  • HelloServlet : 서블릿 클래스 이름
  • HttpServlet : javax.servlet.http 패키지에서 제공하는 HttpServlet 클래스를 상속받아 구현
  • public : 브라우저를 통해 외부에서 실행되기 때문에 접근제한자는 반드시 public 이어야 함

자바 클래스에서는 어떤 클래스의 상속을 받아도 되지만, 서블릿 클래스는 HttpServlet 클래스의 상속만을 받아야 하는 것으로 정해져 있기 때문에 서블릿이 정형화 되어 있다고도 말한다.

 

⊙ 요청메소드

요청 방식에 따라 doGet() 혹은 doPost()가 호출되기 때문에 요청 방식에 맞추어서 HttpServlet 클래스의 doGet() 혹은 doPost()를 오버라이딩 해야한다.

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
  • HttpServletRequest request : 클라이언트의 요청(request)을 처리
  • HttpServletResponse response : 요청 처리 결과를 클라이언트에게 되돌리기(응답하기, response)
  • throws ServletException, IOException : 예외 처리

하나의 서블릿이라도 get과 post 방식에 따라 서로 다른 기능을 제공해야 하는 경우가 있는 경우 doGet()과 doPost()를 모두 오버라이딩 해야한다.

 

⊙ 응답 객체에 콘텐트 타입 지정하기

response.setContentType("text/html");

HttpservletResponse 객체인 response로 setContentType()메소드를 호출하여 클라이언트에게 응답할 페이지에 대한 환경 설정을 해주어야 한다.

위 코드는 text나 html로 보여주겠다는 의미로 한글이 깨지지 않도록 하기 위해서는 인코딩을 UTF-8로 지정해야 한다.

response.setContentType("text/html; charset=UTF-8");
  • text/html : 이 문서의 콘텐트 타입은 HTML 문법으로 작성된 텍스트이다.
  • charset=UTF-8 : 인코딩을 UTF-8로 지정한다.

 

⊙ 출력 스트림 얻어오기

response.setContentType("text/html; charset=UTF-8"); 문장에 의해서 response 객체의 인코딩 형태를 바꿔준 후 결과 출력을 위해 출력 스트림을 얻어오는 response.getWriter() 메소드를 호출해야 한다.

PrintWriter out=response.getWriter();

출력 스트림인 PrintWriter 객체를 HttpServletResponse 객체의 getWriter() 메소드로부터 얻어낸다.

 

⊙ 클라이언트에게 HTML 문서 형태로 결과 출력하기

out.print("<html><body><h1>");
out.print("Hello Servlet");
out.print("</h1></body></html>");

PrintWriter 객체인 out의 출력 메소드인 println()을 통해 사용자에게 결과를 출력한다. 사용자에게 전송된 내용은 브라우저를 통해 출력되기 때문에 결과를 HTML 태그 형태로 만들어서 보내야 한다.

 

 

⊙ 출력 스트림 닫기

out.close();

모든 입출력 자원은 사용이 끝났으면 닫아준다.

+ Recent posts