반응형
1) 서블릿(Servlet)의 개념
- Java Web Server Program
- Server + let 합성어로 웹서버에서 실행되는 간단한 프로그램
- (Web Application를 만들어 주는 Java 프로그램)
- 웹프로그램은 클라이언트 요청에 의해 WAS(Web Application Server)로 실행되며 ,
- 실행결과를 동적으로 생성하여 웹문서로 응답하거나 일반적인 text data로 응답함
- Servlet 프로그램은 WAS에 의해 관리됨 ( 생성 - WAS에 의해 메모리에 로드됨 , 사용 , 소멸 )
- WAS(Web Application Server)
: Web Server( 요청과 응답 ) + Web Container( 서블릿 관리 )
2. 웹프로그램 동작 원리
step1
- 이제부터 클라이언트는 html문서 요청이 아닌, 웹프로그램을 요청할 것임
- 클라어인트가 요청한 웹프로그램 = 자바로 만든 프로그램 (Servlet)
- 클라이언트의 요청이 없다면 웹프로그램 실행이 안됨!!!
step2
- 클라이언트가 웹프로그램을 WAS에게 요청할 때 필요한 정보들을 request메세지에 담아 보낼 것임
- request 메세지의 head : 클라이언트의 일반적인 정보들 저장(클라이언트가 가진 쿠키, 브라우저 정보, ..)
- request 메세지의 body : 기본적으로 사용하지 않음, post방식의 웹프로그램 요청 시 이용(form태그)
step3
- WAS(서버)는 클라이언트의 요청에 의해
1. 등록된 웹프로그램에 대한 클래스를 찾아서 해당 프로그램을 객체로 만들고,
2. 객체의 메소드를 호출해
3. 결과(html문서)를 response메세지로 클라이언트에게 응답함 - 만약 똑같은 웹프로그램을 요청한다면? 다시 객체로 만들지 않고, 필요한 메소드만 호출함
- WAS가 start 하면 web.xml을 읽어들임
- web.xml (어떤 Servlet이 어떤 URL 주소로 매핑되었다는 정보) : 이 URL 주소로 요청하면 Servlet이 실행될 거에요~~
3. 서블릿 객체의 LifeCycle(생명주기) 관리
1) 서블릿 객체의 생성
- 서블릿(웹프로그램)은 클라이언트 요청에 의해 WAS에 등록된 서블릿 클래스를 읽어 메모리에 저장하고
- 서블릿 객체로 생성하여 요청 처리 메소드를 호출
- 클라이언트 요청에 의한 서블릿 객체가 이미 생성되어 있는 경우 새로운 서블릿 객체를 생성하지 않고 기존 서블릿 객체를 사용하여 요청 처리 메소드 호출
- 웹은 프로그래머가 직접 객체를 만드는 것이 아닌, 웹컨테이너(WAS)가 객체를 만들어줌
2) 서블릿 객체의 소멸
- WAS 프로그램이 종료되면 WAS 프로그램에 의해 관리되는 모든 서블릿 객체 소멸
- WAS 프로그램의 주요 기능 중 하나는 서블릿 객체를 관리하는 웹컨테이너(Web Container) 기능 제공
- 컨테이너(Container) : 프로그램 관련 객체(Component)의 생명주기(LifeCycle)를 관리(생성,사용,소멸)하는 프로그램
3) 서블릿 객체의 생명주기 관리(생성,사용,소멸) 예시
- "[servlet] 2. 서블릿 클래스 작성하는 법" 참고
LifeCycleServlet.java
package xyz.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
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;
//💝6.
@WebServlet("/life.itwill")
//💝1.
public class LifeCycleServlet extends HttpServlet {
//1.객체 직렬화 클래스의 serialVersionUID 필드 선언
private static final long serialVersionUID = 1L;
//2.필드 선언
private String name;
//🐱생성자
//3.생성자(Constructor)선언 : 클래스 자료형으로 객체를 생성하기 위한 특별한 메소드
// => 초기화 작업 관련 명령 작성 - 객체 생성시 필드에 필요한 초기값 저장
// => 클라이언트 요청에 의해 WAS 프로그램이 서블릿 클래스로 서블릿 객체를 생성하기 위해 딱 한번만 호출됨
public LifeCycleServlet() {
System.out.println("### LifeCycleServlet 클래스의 생성자 호출 - 서블릿 객체 생성 ###");
//name="홍길동";
}
//🐱init() 메소드 - 초기화 작업 메소드
//=> 서블릿 객체 생성 시 호출 (1번만 호출)
//=> 서블릿에 대한 초기화 작업을 위한 메소드, 서블릿 클래스의 생성자는 서블릿 관련 초기화 작업에 부적절
//💝2.
//init()메소드
//WAS 프로그램에 의해 서블릿 객체가 생성되자 마자 "가장 먼저 한번만" 자동 호출되는 메소드
// => 초기화 작업 관련 명령 작성
// => 서블릿은 생성자 대신 "init() 메소드"를 이용하여 "초기화 작업 명령"을 작성하는 것을 권장
//생성자 대신 init() 메소드로 초기화 작업 명령을 작성하는 이유?
//=> init() 메소드의 매개변수로 [ServletConfig 객체]를 전달받아 메소드에서 사용 가능
//=> [ServletConfig 객체] : 웹자원(WebContext)을 생성하기 위한 환경설정 관련 정보를 저장한 객체
//=> [web.xml] 파일에서 제공되는 값을 얻어와 서블릿 클래스에서 사용 가능 - 유지보수의 효율성 증가
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("### LifeCycleServlet 클래스의 init() 메소드 호출 ###");
//name="홍길동";
//ServletConfig.getServletContext() : ServletContext 객체를 반환하는 메소드
//=>ServletContext 객체 : 웹자원 관련 정보를 저장한 객체
//ServletContext.getInitParameter(String name) : [web.xml] 파일에서 context-param
//엘리먼트로 제공되는 값을 얻어와 반환하는 메소드
name=config.getServletContext().getInitParameter("name");
}
//🐱destroy() 메소드 - 마무리 작업 메소드
//=> 서블릿 객체 소멸 시 호출 (1번만 호출)
//=> 서블릿에 대한 마무리 작업을 위한 메소드
//💝2.
//destroy()메소드
//WAS 프로그램에 의해 서블릿 객체가 "소멸되기 전 마지막으로 한번만" 자동 호출되는 메소드
// => 마무리 작업 관련 명령 작성
// => WAS 프로그램이 종료될 경우 WAS 프로그램에 의해 관리된 모든 서블릿 객체 소멸
@Override
public void destroy() {
System.out.println("### LifeCycleServlet 클래스의 destroy() 메소드 호출 ###");
}
//🐱service() 메소드[ (doGet() 또는 doPost() ]
//=> 서블릿 객체를 이용(클라이언트 요청)시 호출되는 메소드 (요청할때마다 호출)
//=> 요청에 대한 응답처리를 하기 위한 메소드
//💝2.
//service()메소드
//클라이언트 요청에 대한 처리와 처리 결과를 파일로 응답하기 위한 명령을 작성하는 메소드
// => 클라이언트 요청마다 WAS 프로그램에 의해 서블릿 객체로 반복 호출되는 메소드
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("### LifeCycleServlet 클래스의 service() 메소드 호출 ###");
//💝3.
//🍋HTML파일로 응답
response.setContentType("text/html;charset=utf-8");
//💝4.
PrintWriter out = response.getWriter();
//💝5.
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>서블릿의 생성 주기(LifeCycle)</h1>");
out.println("<hr>");
//out.println("<p>홍길동님, 안녕하세요.</p>");
out.println("<p>"+name+"님, 안녕하세요.</p>");
out.println("</body>");
out.println("</html>");
}
}
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_4_0.xsd>" id="WebApp_ID" version="4.0">
<display-name>servlet</display-name>
<!-- 🐱context-param : 현재 프로젝트에 작성된 모든 웹프로그램에게 필요한 값을 제공하기 위한 엘리먼트 -->
<!-- 아래의 context-param은 모든 클래스에서 사용 가능 -->
<context-param>
<!-- 🐱param-name : 제공값을 구분하기 위한 이름(식별자)을 설정하는 엘리먼트 -->
<param-name>name</param-name>
<!-- 🐱param-value : 제공될 값을 설정하는 엘리먼트 -->
<param-value>홍길동</param-value>
</context-param>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>xyz.itwill.servlet.HelloServlet</servlet-class>
<!-- 🐱init-param : 현재 서블릿(웹프로그램)에게 필요한 값을 제공하기 위한 엘리먼트 -->
<!-- 아래의 init-param은 HelloServlet 클래스에서만 사용 가능 -->
<init-param>
<param-name>title</param-name>
<param-value>서블릿</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello.itwill</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
</web-app>
4. 웹프로그램(서버)만이 접근해서 사용할 수 있는 파일들 - 은닉화된 폴더
- 클라이언트가 사용할 수 없음
- META-INF , WEB-INF
5. 클라이언트에게 주고 싶은 MimeType 설정 보는 법
6. 이클립스 경로 VS 웹디렉토리 경로
- (좌) : 워크스페이스 경로 - 이클립스에서 작업하면 저장되는 경로
- 단순히 프로젝트에 있는 파일일 뿐이지 웹자원이 되지는 못함. 아파치 톰캣이 start 하면서 파일들이 전부 웹자원으로 바뀌는 것
- (우) : 웹디렉토리 경로 - 아파치 톰캣이 가진 웹자원의 경로
반응형
'servlet' 카테고리의 다른 글
[servlet] 6. 쿠키 생성, 전달, 제거 프로그램 (cookie) (0) | 2024.05.25 |
---|---|
[servlet] 5. 파일업로드 프로그램 (multipart/form-data) (0) | 2024.05.24 |
[servlet] 4. 회원가입 프로그램 (form) (0) | 2024.05.24 |
[servlet] 3. 공지사항 프로그램(이미지, html) (0) | 2024.05.23 |
[servlet] 2. 서블릿 클래스 작성하는 법 (0) | 2024.05.23 |