본문 바로가기
👨‍💻 2. 웹개발_Back end/2-4 JSP & Servlet

[JSP & Servlet] 3장 서블릿 프로그래밍

by 달님🌙 2021. 10. 12.
반응형

 

1. 웹 애플리케이션과 CGI 규칙

 

- CGI 프로그램 : 오른쪽 끝에 있는 애플리케이션을 CGI 프로그램이라고 한다.

- CGI 규칙 : 웹서버와 CGI 프로그램이 데이터를 주고 받는 규칙이다.

 

2. CGI 프로그램 유형 (컴파일 방식과 인터프리터 방식)

- CGI 프로그램 유형에는 컴파일 방식과 인터프리터 방식. 이렇게 2가지 방식이 존재한다.

 

1) 컴파일 방식

- 특징 : 자바, C++ 등의 기계어에서 바로 실행된다.

- 장점 : 엔진이 필요하지않아서 실행이 빠르다.

- 단점 : 다시 컴파일해서 배포해야되는 불편함이 있다.

 

1) 인터프리터 방식

- 특징 : 자바스크립트와 같은 스크립트 엔진을 통해 실행된다.

- 장점 : 수정 후 바로 배포가 가능하다.

- 단점 : 해석되는 구간이 존재하기 때문에 컴파일 방식보다는 느리다.

 

3. 자바 웹 애플리케이션 실행 방식

 

- 웹서버에서 바로 자바 프로그램을 실행하는 것은 불가능하다.

- 웹 애플리케이션 실행 방식도 CGI 프로그램 방식처럼 만들어진 것임

 

- 자바에서는 JVM(가상머신)을 바로 실행하는 것이 불가능하다.

 

- 그래서 관리 서버로 WAS(웹 애플리케이션 서버)가 필요한 것이다.

- WAS에서 서블릿 컨테이너를 만들고 거기에서 서블릿을 호출해서 만드는 원리

 

- 웹 서버와 서블릿 컨테이너 사이에는 CGI 규칙이 있음

- 서블릿 컨테이너와 서블릿 사이에서는 Servlet 규칙을 통해 데이터를 주고받음

- 서블릿 컨테이너에는 Tomcat, Jetty, JEUS 등이 있다. (우리가 사용하는 서버는 Tomcat)

- 서블릿에 대한 생애주기, 실행, 소멸, 생성 등을 WAS에서 관리해준다.

 

4. WAS 실습해보기

 

1. 다이나믹 웹 프로젝트(4장) 생성

 

* web.xml  파일 생성 체크

* web.xml 역할 : 서블릿 컨테이너를 관리한다.

 

2. 서블릿 파일 생성 - HelloWorld.java (수퍼클래스 지정)

package lesson03.servlets;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

/**
 * Servlet implementation class HelloWorld
 */
public class HelloWorld implements Servlet {
	ServletConfig config;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init() 호출됨");
		this.config = config;
	}

	/**
	 * @see Servlet#destroy()
	 */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy() 호출됨");
	}

	/**
	 * @see Servlet#getServletConfig()
	 */
	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		System.out.println("getServletConfig() 호출됨");
		return this.config;
	}

	/**
	 * @see Servlet#getServletInfo()
	 */
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		System.out.println("getServletInfo() 호출됨");
		return ""; 
	}

	/**
	 * @see Servlet#service(ServletRequest request, ServletResponse response)
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service() 호출됨");
	}
}

 

* 서블릿 클래스 내에 있는 각 메소드들 역할 정리

* 위에서 공부한 5개의 메소드가 다 나옴

 

3. web.xml 파일 수정 (프로젝트 만들때 자동으로 생성되도록 체크했었음)

<?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_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>_04_ServletLifeCycle</display-name>
  <!-- 서블릿 선언(객체로 만들어서 컨테이너에 주입한다) -->
  <!-- WAS가 구동되면서 서블릿 컨테이너를 생성하고 web.xml파일을 읽어서
  		servlet객체를 자동 생성 -->
  <servlet>
  	<servlet-name>Hello</servlet-name>
  	<servlet-class>lesson03.servlets.HelloWorld</servlet-class> <!-- was가 구동되면서 서블릿 컨테이너가 생성, 서블릿이 자동으로 구동되게 해주는 역할-->
  </servlet>
  
  <!-- 서블릿을 url과 연결 -->
  <servlet-mapping>
  	<servlet-name>Hello</servlet-name>
  	<url-pattern>/Hello</url-pattern> <!-- 어떤 URL로 접근할건지 설정 -->
  </servlet-mapping>
  
  <!--컨텍스트 루트경로로 접속했을 때 보여지는 페이지 -->
  <!-- http://localhost:9999/ -->
  <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>
</web-app>

 

4. 실행 결과

- 웹 페이지 : 빈 화면 나오면 성공

- 콘솔창 

* 서블릿이 생성되고 나서는 동작만 하는 것을 알 수 있음

* 톰캣을 종료하면 desroy() 메소드가 호출되고 WAS가 종료되는 시점에 서블릿도 같이 종료하게 됨

* init 메소드와 destroy 메소드는 각각 한번씩만 호출됨

 

5. index.html 파일과 default.html 파일 생성 (동작 순서 확인하기위해)

index.html 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>환영합니다.</title>
</head>
<body>
	<h1>환영합니다.</h1>
	<p>index.html</p>
	<p>web.xml의 welcome file list에 먼저 선언된 파일을 표출</p>
</body>
</html>

 

default.html 파일 추가

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>환영합니다.</title>
</head>
<body>
	<h1>환영합니다.</h1>
	<p>default.html</p>
</body>
</html>

 

* 먼저 생성된 html파일이 먼저 나오게되므로 default 파일만 있을때는 default 파일이 뜨지만

* index 파일이 추가된 후에는 index파일이 default 파일보다 앞에 선언되어 있으므로 index파일이 열린다.

 

 

5. Servlet 인터페이스 개념

 

1) 인터페이스란?

 

2) Servlet 인터페이스란?

3) 서블릿 인터페이스 메소드 종류

 

- init() : 서블릿의 생애주기를 알 수 있는 메소드로서 인스턴스 생성 후 딱 한 번 호출된다. (서비스 준비 코드)

- service() : 클라이언트 요청 때 마다 호출 -> 새로고침 할 때마다 호출됨 (자바프로그램이 해야할 일을 작성해준다.)

- distroy() : 서버 또는 웹 애플리케이션 종료 직전에 호출된다. 메모리 할당 해제 등 서비스를 마무리하는 코드 작성.

- getServletConfig()와 getServletInfo() : 기타 정보들을 받을 수 있다

 

4) 서블릿 클래스 구현

 

6. Generic Servlet 인터페이스 

 

- 그냥 Servlet 인터페이스 : 다섯 개의 메소드를 각각 다 상속받아서 오버라이딩 해주었음

- Generic Servlet 인터페이스 : service() 메소드만 오버라이딩해도 init() 메소드와 destroy() 메소드는 자동으로 사용가능

- 따라서 service() 메소드만 반드시 구현하면 됨 (서블릿 컨테이너에서 자동으로 생성과 소멸을 관리하게됨)

- Generic Servlet 인터페이스로 클래스를 구현하게 되면 훨씬 더 편하게 구현이 가능하다!

- 구조를 보면 알 수 있듯이 Generic Servlet도 Servlet을 상속 받은 것이다. 

 

7. 서블릿 구동 절차

 


1. 클라이언트의 요청이 들어오면 서블릿 컨테이너는 서블릿을 찾는다.

2. 서블릿이 없다면, 서블릿 클래스를 로딩하고 인스턴스를 준비한 후 생성자를 호출한 후 초기화 메서드인 init()을 호출

3. 클라이언트 요청을 처리하는 service() 메서드를 호출함. 클라이언트의 요청에 대해 서비스를 제공함

4. service() 메서드에서 만든 결과를 HTTP 프로토콜에 맞추어 클라이언트에 응답하고 요청처리를 완료

5. 서블릿 컨테이너를 종료하거나 웹 애플리케이션을 종료하는 경우

6. 서블릿 컨테이너는 종료되기전에 서블릿이 마무리 작업을 수행할 수 있도록 생성된 서블릿에 destroy() 메서드를 호출

 

8. Generic Servlet을 활용하여 계산기 프로그램 만들기 (_05_GenericServlet)

 

Calculator.java 서블릿 파일

package lesson03.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

/**
 * Servlet implementation class Calculator
 */
@WebServlet("/calc") // 우선 anotation은 주석처리할 것
public class Calculator extends GenericServlet {
	/**
	 * @see Servlet#service(ServletRequest request, ServletResponse response)
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		int a = Integer.parseInt(request.getParameter("a"));
		int b = Integer.parseInt(request.getParameter("b"));
		
		response.setContentType("text/plain");
		response.setCharacterEncoding("UTF-8");
		
		PrintWriter out = response.getWriter();
		
		out.println("a = " + a + ", b = " + b + "의 계산결과");
		out.println("a + b = " + (a + b));
		out.println("a - b = " + (a - b));
		out.println("a * b = " + (a * b));
		out.println("a / b = " + (a / b));
		out.println("a % b = " + (a % b));
	}

}

 

web.xml

<?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_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>_05_GenericServlet</display-name>
  <!-- 서블릿 선언 -->
 <!-- Calculator.java anotation (15번째 줄) 주석 풀고 이부분 주석 처리-->
 <!--  <servlet>
  	<servlet-name>Calculator</servlet-name>
  	<servlet-class>lesson03.servlets.Calculator</servlet-class>
  </servlet> -->
  
  <!-- 서블릿 url 매핑 -->
  <!--  <servlet-mapping>
  	<servlet-name>Calculator</servlet-name>
  	<url-pattern>/calc</url-pattern>
  </servlet-mapping> -->
  
  <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>
</web-app>

 

실행 결과

 

 

웹 서버 경로 변경하는 또다른 방법

 

- 기존에 사용하던 'server.xml 파일 직접 수정하기' 방법 말고 다른 새로운 방법임

순서 :

톰캣 서버 더블 클릭  -> 기존의 3번 프로젝트 클릭  -> Remove  -> Add Web Module... ->  4번 프로젝트 클릭  -> Path를 /로 변경  ->  OK  ->  Ctrl + S (파일저장)

* 404 에러 뜨는 경우 -> Path가 /로 잘 바뀌었는지 확인하기

 

반응형

댓글