BoostCourse | Servlet, Request, Response

judyzero·2025년 1월 31일

BoostCourse

목록 보기
2/7

Servlet이란?

동적인 처리를 하는 프로그램의 역할을 맡고 있다.

  • WAS에서 동작하는 Java 클래스이다.
  • 서블릿은 HttpServlet 클래스를 상속 받아야 한다.
  • 서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두가지를 같이 사용해야 한다.

http://localhost:8080/{projectName}/{URL Mapping 값} 위 규칙에 따라 servlet이 실행된다.

web이 get method로 요청을 보낼 때doGet() method를 사용한다.

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {

    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html;charset=URF-8");

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

response.setContentType("text/html;charset=URF-8"); 응답 결과를 보내는데, html의 형식으로 utf-8을 사용해서 보낼 것이라고 정의해주는 코드이다.

Servlet 생명주기

Servlet은 서버에 객체를 여러개 만들지 않는다. 요청된 객체가 메모리에 존재한다면, 서비스만 호출한다.
동일한 Servlet은 항상 1개의 객체만 존재한다.

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다.
  • 만약 메모리에 없으면, 해당 서블릿 클래스를 메모리에 올린다.
    - init() 메소드를 실행한다.
  • service() 메소드를 실행한다.
    - 요청이 들어왔을 때, 응답해야하는 메소드는 모두 service()에 작성해야한다.
  • WAS가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행된다.

service(request, response) 메소드

특정 Servlet(ex. helloServlet)에 service메소드가 작성되지 않았다면, HttpServlet의 service메소드가 오버라이딩된다.
HttpServlet의 service 메소드는 템플릿 메소드 패턴으로 구현된다.

  • 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet 메소드를 호출한다.
  • 클라이언트의 요청이 POST일 경우에는 자신이 가지고 있는 doPost 메소드를 호출한다.

Request, Response 객체 이해

WAS는 웹 브라우저로부터 Servlet요청을 받으면,
- 요청할 때 가지고 있는 정보를 HttpServletRequest 객체를 생성하여 저장
- 웹 브라우저에게 응답을 보낼 때 사용하기 위하여 HttpServletResponse 객체를 생성
- 생성된 HttpServletRequest, HttpServletResponse를 서버에 전달한다.

HttpServletRequest

  • HTTP 프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용한다.
  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어들이는 메소드를 가지고 있다.
  • Body의 Stream을 읽어 들이는 메소드를 가지고 있다.
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		Enumeration<String> headerNames = request.getHeaderNames();
		while(headerNames.hasMoreElements()) {
			String headerName = headerNames.nextElement();
			String headerValue = request.getHeader(headerName);
			out.println(headerName + " : " + headerValue + " <br> ");
		}		
		
		out.println("</body>");
		out.println("</html>");
	}

request 객체로 어떤 요청을 보냈는지 request.getHeaderNames()으로 헤더 이름을 알 수 있고, request.getHeader(headerName) 로 헤더의 value를 알 수 있다.

파라미터 읽어 들이기

URL 주소의 파라미터를 읽어 보자.

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title></head>");
		out.println("<body>");

		String name = request.getParameter("name");
		String age = request.getParameter("age");
		
		out.println("name : " + name + "<br>");
		out.println("age : " +age + "<br>");
		
		out.println("</body>");
		out.println("</html>");
	}

request.getParameter("name") 를 사용하면 name param의 value값을 가져올 수 있다.
이때, 파라미터는 항상 String 형태로 받아야 한다.

uri, url, path, remoteAddr 정보 가져오기

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>info</title></head>");
		out.println("<body>");

		String uri = request.getRequestURI();
		StringBuffer url = request.getRequestURL();
		String contentPath = request.getContextPath();
		String remoteAddr = request.getRemoteAddr();
		
		
		out.println("uri : " + uri + "<br>");
		out.println("url : " + url + "<br>");
		out.println("contentPath : " + contentPath + "<br>");
		out.println("remoteAddr : " + remoteAddr + "<br>");
		
		out.println("</body>");
		out.println("</html>");
	}

HttpServletResponse

  • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서브릿에게 전달한다.
  • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지 등을 전송한다.

0개의 댓글