Servlet에 대한 이해

자바 웹 어플리케이션(Java Web Application)

  • WAS에 설치되어 동작하는 어플리케이션
  • 자바 웹 어플리케이션에는 HTML, CSS, 이미지, 자바로 작성된 클래스(JSP, Servlet도 포함됨, package, 인터페이스 등), 각종 설정 파일 등이 포함된다.
  • 예 : 쇼핑몰, 블로그, 카페

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

  • 자바 웹 어플리케이션은 혼자서 동작하는 게 아니라 WAS, 미들웨어 같은 거의 도움을 받는다. 그렇게 때문에 정해진 약속(이런 폴더 구조)을 반드시 지켜야한다.

  • WEB-INF폴더 :
    • web.xml파일 : 배포 기술자(DeploymentDescriptor). 웹 어플리케이션에 대한 정보들을 다 가지고 있는 파일. Servlet 3.0 미만에서는 필수, 3.0 이상에서는 어노테이션을 사용
    • lib폴더 : library의 약자, 각종 자료 파일들을 넣는 곳
    • classes 폴더 : java 패키지들, 실제 class들이 있는 곳, 내가 작성한 서블릿 파일들
  • 내가 원하는 각종 폴더 : 프론트엔드에서 작성했던 파일들, 이미지 등 다양한 리소스 들
  • 구조
    • 도스 창으로 확인하는 방법
    • 나의 workspace위치 > .metadata > .plugins > org.eclipse.wst.server.core > tmp0 : 톰캣이 설치 되어있는 디렉토리와 유사한 구조, 이클립스가 내부적으로 톰캣을 사용하니깐 비슷하게 만들어 놓고 이 안에서 요소들을 찾아서 사용한다.
    • 나의 workspace위치 > .metadata > .plugins > org.eclipse.wst.server.core > tmp0 > wtpwebapps : 실습하면서 만들었던 웹 어플리케이션이 만들어져있는 것을 볼 수 있음. 이 안으로 들어가면 classes, 패키지명을 볼 수 있다.


Servlet이란?

  • 자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할
  • 서블릿을 정의해보면
    • 서블릿은 WAS에서 동작하는 Java클래스이다.
    • 서블릿은 HttpServlet클래스를 상속받아야 한다.
    • 서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두가지(JSP, Servlet)을 조화롭게 사용해야한다.


Servlet 작성 방법

버전확인 및 설정

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

  • web.xml 파일을 사용하지 않습니다.
  • 자바 어노테이션(annotation)을 사용합니다.
  • 앞에서 실습했던 first web에서 사용합니다.

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

  • servlet을 등록할 때 web.xml 파일에 등록합니다.
  1. 버전확인하기 ​
  2. 3.0이상이면 체크 안해줘도 됨(3.0이상이면 web.xml파일이 필요없음)​

  3. 결과 ​

소스코드(1부터 10까지 출력)

1.

1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  • HttpServletRequest : 브라우저한테 요청
  • HttpServletResponse : 브라우저한테 응답

2.

1-10까지 출력이니 응답 객체를 이용해야한다.

1
response.setContentType("text/html;charset=utf-8");
  • 응답 결과에다가 이런 타입으로 보내줄께요라는 약속을 여기다가 넣어준다.
  • text/html : text는 html이다.

3.

보낼 내용을 넣어줄 통로를 얻어야 한다.
response 객체에 getWriter()라고 하는 메서드가 있다.
이 메서드를 수행하면 PrintWriter라는 객체가 return 되는 것을 알 수 있다.

1
PrintWriter out = response.getWriter();
  • 변수명은 out인데 아무거나 줘도 상관없다.

4.

1
out.print("<h1>1부터 10까지 출력합니다.<h1>");
  • println을 쓸지 print를 쓸지 고민하지 말기
    • 둘 다 똑같음 : HTML파일에다가 아무리 Enter을 쳐봐도 줄 안 바뀜 (줄은 반드시 br태그를 써야한다.)
  • System.out.println();out.print();는 목적지가 다르다.
    • System.out하면 콘솔을 의미한다.

5.

1
2
3
for(int i = 1; i<=10; i++) {
	out.print(i+"<br>");
}
  • println을 써도 줄을 안 바뀌니깐 <br>태그 사용해주기

6.

out객체를 다 사용했으니 close()해주기

1
out.close();

7.

실행하면 Java Resources에 src에 exam이라는 폴더가 만들어짐


전체소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TenServlet
 */
@WebServlet("/ten")
public class TenServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.print("<h1>1부터 10까지 출력합니다.<h1>");
		for(int i = 1; i<=10; i++) {
			out.print(i+"<br>");
		}
		out.close();
	}

}


Servlet 생명주기

WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다.
if (메모리에 없음) {

  • 해당 서블릿 클래스를 메모리에 올림
  • init() 메소드를 실행

}

  • service()메소드를 실행
    • was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행된다.

LifecycleServlet을 구현

HttpServlet의 3가지 메소드를 오버라이딩

  • init()
  • service(request, response)
  • destroy()

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

    public LifecyleServlet() {
        System.out.println("LifecyleServlet 생성");
    }

	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 호출");
	}

	public void destroy() {
		System.out.println("destroy 호출");
	}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("service 호출");
	}
}

결과


JSP에 대한 힌트

  • 서블릿에서 응답결과를 만들어낼 때 out.println에다가 HTML태그들을 막 넣었다.
  • 그런 내용들을 다 서블릿에 out.print에다 넣으려면 너무 힘들다.
  • 이런 부분을 해결하기 위해 만들어진 것이 JSP이다.