[JAVA] 웹 프로그래밍(Servlet)

Servlet(서블릿)

Posted by iheese on January 27, 2022 · 8 mins read

*모든 실습은 eclipse에서 진행되고 있습니다.

자바 웹 어플리케이션의 폴더 구조

자바 웹 어플리케이션의 구조

Servlet(서블릿)

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램
  • 웹 서버의 성능을 향상하기 위해 사용된다.
  • JSP(Java Server Page)와 비슷하지만 JSP는 HTML 문서 안에 Java 코드를 포함, 서블릿은 Java 코드 안에 HTML 문서를 포함하는 것이 큰 차이이다.


Servlet 작성 방법

1 . Servlet 3.0 spec 이상에서 사용하는 방법

  • web.xml 파일 사용 안함
  • 자바 어노테이션(annontation)

    *어노테이션(annontation): 자바에서 사용될 때의 어노테이션은 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터(meta data: 데이터를 위한 데이터)라고 볼 수 있다.

@WebServlet("/ten")
public class TenServlet extends HttpServlet {
...
}

2 . Servlet 3.0 spec 미만에서 사용하는 방법

  • Servlet을 등록할 때 web.xml 파일에 등록한다.
  <servlet>
    <description></description>
    <display-name>TenServlet</display-name>
    <servlet-name>TenServlet</servlet-name>
    <servlet-class>exam.TenServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TenServlet</servlet-name>
    <url-pattern>/ten</url-pattern>
  </servlet-mapping>
  • url-pattern으로 접속하면 servlet-name이 일치하는지 확인(틀리면 404페이지)
  • 그 후 <servlet> 에서 servlet-name이 일치하는지 확인, servlet-clas 실행


서블릿의 생명주기


@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
    public LifecycleServlet() {
        System.out.println("LifecycleServlet 생성!!");
    }

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 호출!!");
	}
    
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
       {
		System.out.println("get 메소드 호출!!");		
	}
    @Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
       {
		System.out.println("post 메소드 호출!!");		
	}
	
	public void destroy() { //서블릿 소멸
		System.out.println("destroy 호출!!");
	}


	
}
  1. 요청이 오면, Servlet 클래스가 로딩되어 Servlet 객체 생성
  2. init() 메소드를 호출하여 Servlet 멤버변수 초기화
  3. service() 메소드를 호출해서 Servlet이 브라우저 요청 처리하게 함
    • service() 메소드는 특정 HTTP 요청을 처리하는 메소드(doGet(), doPost() 등)를 호출함
    • 어떤 요청이 올지 모르겠다 하면 service()를 사용할 수 있고, 들어올 요청에 따라 doGet(), doPost()을 오버라이딩하면 된다.
  4. WAS가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드 실행
 if (메모리에 없음){
   해당 서블릿 클래스를 메모리에 올림
   init() 메소드로 초기화
   }else{
    service() 메소드를 실행 
    }
  • 재갱신, 종료시 destroy() 메소드 실행
  • Servlet 객체를 생성하고 초기화하는 작업은 비용이 많은 작업임, 다음 요청을 대비해 Servlet 객체를 메모리에 남겨둠


Request, Response 객체

Request, Response 객체

  1. 서블릿은 클라이언트로부터 동적 페이지 처리 요청을 받는다.
  2. HttpServletRequest(요청할 때 가지고 있는 정보, request), HttpServletResponse(웹 브라우저에게 응답을 보낼 정보, response)를 바탕으로 로직을 처리한다.
  3. 로직에 관한 응답을 클라이언트에게 보낸다.
  • HttpServletRequest
    • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어들이는 메소드 포함
    • Body의 Stream을 읽어 들이는 메소드들을 가지고 있다.

      대표적인 메소드

      • getParameter(“String”) : 사용자가 입력한 String 타입 파라미터를 리턴한다.
      • getParameterValues(“String”) : 사용자가 입력한 String 타입 파라미터를 통해 전달된 여러 개의 값을 리턴한다.
  • HttpServletResponse
    • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위해 HttpServletResponse 객체를 생성하여 서블릿에게 전달한다.
    • 해당 응답 객체는 content type, 응답코드, 응답 메시지 등을 전송한다.

      대표적인 메소드

      • getWriter() : html 파일을 생성하여 응답할 수 있다.
      • setContentType(“text/html”) : 응답 파일 타입 설정할 수 있다.


  • 사용 예시
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>");
	}
    
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>");
	}
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(); //URI 요청
		StringBuffer url = request.getRequestURL(); //URL 요청
		String contentPath = request.getContextPath();  //ContextPath 요청
		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>");
	}


Reference: