프로필사진
Servlet(4) - 서블릿의 생명주기 + 예제

2019. 11. 4. 11:04🔴 JSP웹개발

300x250

  • 해당 서블릿 객체가 컨테이너에 없을때
  1. 브라우저 → http사이트로 동적요청 (ex.로그인 버튼을 누름)

  2. Tomcat(WAS)에게 동적요청을 전달
    Tomcat = servlet container
    서블릿을 관리하는 역할

  3. Tomcat이 /login객체의 서블릿 객체가 있는지? 찾아봄

  4. Class의 집합으로 이동 → LoginServlet클래스를 통해 Container으로 객체 생성 (init()호출=초기화)

  5. 스레드 할당:

    서버 1, 클라이언트 3 인 상황일 때
    → 동시에 요청이 들어오면 메인스레드가 요청마다 스레드를 별도로 만듬
    service()메소드 실행doGet(), doPost() 방식인지 판단

  6. 개발자 → doget / dopost 방식에 따라 실행해야하는 로직들을 짜 놓음

  • 해당 서블릿 객체가 컨테이너에 있을때 (JoinServlet) → init() 실행 안함
  • 서비스 요청이 장시간 없거나 부족할때 → 객체 destroy()

즉 : 객체는 한번 생성 & 재활용된다!!


예제1 : LifeCycleServlet.java

<LifeCycleServlet.java 파일 생성>

처음으로 Tomcat이 LifeCycleServlet 생성했을때 콘솔:

Tomcat이LifeCycleServlet 클래스를 통해 객체 생성Servlet Container에 저장

→ 클래스 내 service() 호출

생성자, init(), service() + service()의 request.getMethod() → 콘솔에 출력됨

  • 생성자 & init() → 사실 같은 것
  • request.getMethod() = GET

service() → doGet, doPost 방식 구분해주기

 

콘솔:

다시실행 → 콘솔:

  1. 객체가 없어서 생성자, init()부터 실행

  2. 다시 한번 요청 → container에 life.do존재함 → service()만 실행


예제2

<join.html.html 파일 생성>

!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>

	<form method="get" action="../parameter.do">
		<input name="name" placeholder="이름을 입력하세요"/><br>
		취미 : <input type="checkbox" name="hobby" value="독서"/>독서
		<input type="checkbox" name="hobby" value="영화"/>영화
		<input type="checkbox" name="hobby" value="운동"/>운동<br>
		<input type="submit" value="get전송"/>
	</form>
	
	<hr>
	
	<form method="post" action="../parameter.do">
		<input name="name" placeholder="이름을 입력하세요"/><br>
		취미 : <input type="checkbox" name="hobby" value="독서"/>독서
		<input type="checkbox" name="hobby" value="영화"/>영화
		<input type="checkbox" name="hobby" value="운동"/>운동<br>
		<input type="submit" value="post전송"/>
	</form>

</body>
</html>

 

서버 실행 → 직접 파라미터 입력:

 

<ParameterServlet.java>

doGet, doPost 로직 짜기

 

package servlet;

import java.io.IOException;
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("/parameter.do")
public class ParameterServlet extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String method = request.getMethod();
		
		if(method.equals("GET")) {
			doGet(request, response);
		} else {
			doPost(request, response);
		}

	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//name에 입력한 데이터를 가져옴
		String name = request.getParameter("name");
		System.out.println(name);
		
		//hobby는 복수 -> 배열로 받아야함
		String[] hobbyArray = request.getParameterValues("hobby");
		for(String hobby : hobbyArray) {
			System.out.println(hobby);
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//name에 입력한 데이터를 가져옴
		String name = request.getParameter("name");
		System.out.println(name);
		
		//hobby는 복수 -> 배열로 받아야함
		String[] hobbyArray = request.getParameterValues("hobby");
		for(String hobby : hobbyArray) {
			System.out.println(hobby);
		}
	}

}

 

콘솔:

위 = get방식

데이터를 url로 보냄 → Tomcat에서 인코딩 방식을 지정했기 때문에 깨지지 않음

아래 = post방식

내부적으로 숨겨진 공간에 데이터를 담아서 박스 자체를 보내기 때문에 깨짐

→ 인코딩방식을 따로 써줘야함!!

 

protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//post방식으로 한들 데이터를 보낼 경우 -> 인코딩 방식을 지정해야함
		request.setCharacterEncoding("utf-8");
		
		//name에 입력한 데이터를 가져옴
		String name = request.getParameter("name");
		System.out.println(name);
		
		//hobby는 복수 -> 배열로 받아야함
		String[] hobbyArray = request.getParameterValues("hobby");
		for(String hobby : hobbyArray) {
			System.out.println(hobby);
		}
	}

참고자료

https://opentutorials.org/module/2817/16196

https://gmlwjd9405.github.io/2018/10/28/servlet.html

300x250