All of My Records

[Server] Servlet(서블릿)

by 캐떠린

Servlet 이란?

  • 자바 진영에서 웹 애플리케이션을 지원하기 위한 기술
  • 자바로 웹 사이트를 만드는 기술
  • 첫번째 웹 서버 기술 ~ 현재 모든 기술의 기반
  • 순수 자바 + 서블릿 규격
  • 자바 프로그램으로 웹 페이지를 생산하는 기술 ⇒ 동적 페이지
  • 동적 페이지의 경우, “서버에 페이지 주세요” 하면 프로그램이 대신 페이지를 제작하여 제공해준다. 이때 서버 측에 페이지를 만드는 웹 서버 프로그램이 존재하는데, 바로 이 웹 서버 프로그램을 만드는 기술이 servlet이다.(like 손님에게 커피를 제공할 바리스타를 만드는 기술)

 

 

💡 정적 페이지와 동적 페이지는 어떤 차이가 있을까?

  1. 정적 페이지
      : 누가, 언제 방문하든 간에 항상 동일한 콘텐츠를 제공
        like 캔커피를 판매하는 것 ⇒ 완성된 제품을 별도 가공 없이 제공
  2. 동적 페이지
      : 누가, 언제 방문하냐에 따라 상이한 콘텐츠를 제공 → 주소는 동일하나 사용자에 따라 페이지의 내용이 바뀐다.
        like 바리스타에게 커피를 주문하여 제공받는 것 ⇒ 미리 준비된 상품 없이 내가 주문(URL 요청)할 때 제작하여 제공

 

 

Servlet Class

  • 손님(클라이언트)에게 커피를 제공하는 바리스타(직원)
  • 클라이언트(브라우저)의 요청에 따라, 동적으로 웹 페이지를 생산하는 클래스
  • 서블릿 기술을 사용해 구현한 실제 클래스

 

 

Servlet Class 작성 규칙

1. 서블릿 클래스 선언
  (일반 클래스를 서블릿 클래스로 만들기 위해서 아래 2가지 중 하나를 선택하면 된다.)

   a. javax.servlet.Servlet 인터페이스를 구현한다.(인터페이스를 상속받아 추상메서드 구현)

   b. javax.servlet.http.HttpServlet 클래스를 상속받는다.(단순히 클래스를 상속받는다.)

❓ 위의 2가지 방법 중 어떤것을 사용하는게 나을까?

방법 a: 복잡함, 고비용 But 구현이 자유롭다.

방법 b: 단순함, 저비용(우리가 해야할 구현을 미리 다 해놓아서 클래스로 제공하기 때문에) But a에 비해 구현이 덜 자유롭다.

HttpServlet 추천!!!

 

2. doGet/doPost 메서드 선언 → 예약된 이름의 메서드 ⇒ 요청 메서드
  (반드시 1번에서 만든 클래스 안에 두 메서드를 생성해야 한다.)

  • 필요에 따라 둘 중 하나 선언 or 둘 다 선언 하기도 한다.
  • 클라이언트(브라우저)의 요청이 들어오면 자동으로 호출되는 메서드
  • 카페에서 커피를 주문하는 역할을 하는 ‘주문하기’ 메서드
  • 커피 만드는 메서드 → 사용자가 보게될 HTML 페이지를 만드는 메서드
  • 메서드 작성 규칙
    1. 매개변수(2개)
      1. java.servlet.http.HttpServletRequest
      2. java.servlet.http.HttpServletResponse
    2. 예외 미루기(2개 모두 필요)
      1. java.io.IOException
      2. java.servlet.ServletException

 

3. 동적 HTML 페이지 작성 구현

  • doGet/doPost 메서드의 구현부 → HTML 페이지를 만들기 위한 자바 코드 작성
  • HttpServletResponse 객체의 getWriter() 메서드 호출 → PrintWriter 객체 반환
  • PrintWriter 객체의 printXXX("태그") 메서드를 사용해서 HTML 페이지를 작성한다. ⇒ 동적으로 웹페이지 생산
  • 페이지 완성 → 브라우저에게 반환 → 웹 페이지 출력

 

 


 

 

Servlet 작업

: web.xml에 Servlet을 등록하고 mapping 해주기

  • Servlet 설정
    • 등록할 servlet의 이름과 구현 클래스 지정
    • 가상 주소 mapping = 가상 URL + servlet
      이때문에 자바 클래스를 호출할 수 있는 가상 URL 생성이 필요하다.
  • 형식
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<display-name>ServletTest</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>매핑과 동일한 이름 설정</servlet-name>
		<servlet-class>클래스 경로</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>서블릿과 동일한 이름 설정</servlet-name>
		<url-pattern>가상 URL</url-pattern>
	</servlet-mapping>

</web-app>

 

💡 web.xml에서 Servlet 설정 시 가상 URL의 '/'의 의미
  ex) <url-pattern>/ex01.do</url-pattern>
  : 앞에 있는 ‘슬래시(/)’는 http://localhost:포트번호/servlet을 의미한다. 외부인들이 페이지에 접속하여 주소창을 볼 때는 http://localhost:포트번호/servlet/ex01.do로 표출된다.

 

 


 

 

실전 적용 :: Servlet Class 작성 규칙에 따라 작성해보기

   → 위 사진의 src/main/java 위치에 자바 파일을 생성한다!

 

1. package 생성하기: com.test.servlet

 

2. 자바 파일 생성하기: Ex01.java
   ★이제 본격적으로 이 평범한 자바 프로젝트를 커피를 만드는 바리스타로 만들어보자!★

 

3. 서블릿 클래스 선언 → 기존의 클래스에 extends 추가 후 HttpServlet 클래스 import

 

4. doGet메서드 만들고 매개변수 넣기

 

5. 예외 처리하기

 

6. 클라이언트가 보게될 소스 만들기 → 동적 HTML 페이지 작성 구현
  ⚠️ 주의사항: 오타나면 답이 없다. ⇒ 문자열로 태그가 다 들어가기 때문에!!!

 

7. web.xml에 servlet 작업해주기

<servlet>
	<servlet-name>ex01</servlet-name>
	<servlet-class>com.test.servlet.Ex01</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>ex01</servlet-name>
	<url-pattern><!-- 가상URL -->/ex01.do</url-pattern>
</servlet-mapping>

Procedure: 톰캣이 ex01으로 가서 자동으로 do메서드를 호출해준다. → do메서드의 구현부에서 페이지를 완성해주고 → 그렇게 만든 홈페이지는 톰캣이 가져가고 → 톰캣에게 요청했던 브라우저에게 돌려준다.

 

✳ web.xml 파일의 버그

이건 에러가 아니라 버그입니다.

Solution: 해당 밑줄 부분에 아무거나 입력 후 지우면 사라짐. But 파일 실행할 때마다 버그 발생..!

✳ web.xml 파일 들여쓰기
    : 기본 들여쓰기가 스페이스 2칸 처리 되어있기 때문에 전체 선택 후,
     Ctrl + Shift + F 로 들여쓰기 자동 재배치 실행!

💡 모든 마크업 언어는 루트 태그를 벗어나면 안된다.

  ⇒ 따라서 <web-app> 태그 안에 Servlet 설정을 해줘야 한다!

블로그의 정보

All of My Records

캐떠린

활동하기