본문 바로가기

Language/Java

Servlet

08.30 TIL

 

Servlet

1. 브라우저의 언어와 servlet 또는 JSP만 직접 소통
html/css/javascript는 절대 일반 순수 자바 클래스와 소통 불가 즉 웹 요청/응답 처리는 일반 자바 클래스로는 불가능을 의미
따라서 웹 요청/응답 처리는 servlet 또는 JSP로 개발 해야 함

2. 이클립스 웹 개발 구조
src
- *.java 개발
- 순수 DAO와 DTO 또는 일반 모든 자바 소스
- web 상에서 http 기반으로 요청/응답 직접 처리하는 Servlet WebContent
- *.html/*.css/*.js/이미지, 동영상../*.jsp

3. http 기반의 url 형식 http://ip:port/project명/file명 http://ip:port 를 도메인으로 매핑 필수
80만 http의 기본 따라서 생략 가능
http://localhost:80/step01_basic/request.html
http://localhost/step01_basic/request.html
- Servlet1.java 라는 servlet을 playdata라는 url 가짜명으로 매핑
http://localhost/step01_basic/playdata

4. 하나의 프로세스 내부에 쓰레드로 개별 실행 단위로 설계된 WAS 및 API
- 장점 : 자원 절약/기업 관점에서 비용 절감 / client 관점에선 실행 속도 향상
Servlet 객체 수 : 요청한 client 수 = 1 : * doGet() : 요청한 client 수 = 1 : 1
HttpServletRequest 객체 수 : HttpServletResponse 객체 수 : client 수 = 1 : 1 : 1

5. Web container(web server=servlet engine) 기능
- client가 요청시 client에 1:1 매핑되는 HttpServletRequest객체와 HttpServletResponse객체가 자동 생성
- Servlet 객체는 최초의 client가 요청시에만 단 한번 생성
//http://localhost/step01_basic/playdata
@WebServlet("/playdata")
public class Servlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Servlet1() {
    	System.out.println("Servlet1 생성자");
    }

    /*doGet()
     * - 실행 시점 : client가 url로 요청시 자동 실행
     * - doGet() 재정의는 하나 명시적으로 호출하는 코드는 없다!!!!!
     * - web container(web server, was, servlet engine)에 요청이 오면 감지 후에
     * 	자동 실행
     * - web container 필수
     */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//server console 창에 출력하는 로직
		System.out.println("Servlet1 doGet()");
		
		//접속한 client 브라우저에 한글 데이터 출력
		//인터넷 상에 http 기반으로 응답
		//한글 encoding 설정 / html 포맷으로 응답 설정
		response.setContentType("text/html;charset=utf-8");
		
		//2byte 단위로 client 브라우저에 응답 가능한 출력객체
		PrintWriter out = response.getWriter();
		out.println("유재석과 백종원, 펜싱");
	}

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

 

 

Servlet API

1. HttpSevlet
- http 프로토콜을 사용 가능하게 구현된 클래스
- 사용자 정의 servlet은 상속 및 재정의로만 쉽게 개발 가능
- 장점 : 서비스 로직에만 집중해서 개발 가능

2. HttpServletRequest
- http 프로토콜 기반으로 요청하는 client의 정보를 보유
- ip/브라우저 기본정보/client가 server에 전송하는 입력데이터등..
- doGet() or doPost() 메소드 실행시 parameter 즉 
메소드 실행을 위해 필요한 client의 정보를 제공해주는 API


3. HttpServletResponse
- http 프로토콜 기반으로 요청하는 client에게만 응답 처리 
- 한글 등 속성 지정해서 응답 포멧 설정
- client 브라우저에 응답하는 객체 
- setContentType() : client 브라우저에 응답하는 포멧 + 인코딩 설정
- getWriter() : 2byte 출력 가능한 PrintWriter 객체 생성 /PrintWriter 는 접속된 client에게만 출력 


4. PrintWriter
- 2byte 단위로 client 브라우저에 출력 

 

Servlet LifeCycle

1. 기본 생성자
- () parameter가 없는 생성자
- 최초 client가 호출시 실행되서 객체 생성
- 새로운 로직의 갱신된 객체 생성시 단 한번 생성(갱신직후 최초 client가 요청시 단 한번 실행)

2. init() - 생성자 호출 직후에 단 한번 실행 - 권장하는 로직, 공유 자원초기화 로직으로 적합

3. doGet()/doPost() - client 요청시 1:1 실행 - service 메소드라 표현

4. destroy() - 갱신된 servlet bytecode가 서버 메모리에 로딩시 자동 호출
- 구버전 객체 메모리 해제시에 자동 실행 - 자원 반환용 로직 구현시 적합
- 서버 다운 직전에도 자동 호출(자원 해제를 깨끗이 하기 위한 action)
@WebServlet("/Servlet2LifeCycle")
public class Servlet2LifeCycle extends HttpServlet {
       
    public Servlet2LifeCycle() {
    	System.out.println("생성자");
    }
    
    public void init() {
    	System.out.println("init()");
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet() 언제?");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost()");
	}
	
	public void destroy() {
		System.out.println("destroy()");
		
	}
}

 

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>request2form.html</title>
</head>
<body>

	<h3>로그인 화면</h3>
	<!-- http://localhost:80/step01_basic/idcheck
		request2form.html과 동일한 url 선상의 servlet 지정 및 요청 설정
		 -->
	<form action="idcheck" method="post">
	
		<!-- 1 line 입력 가능한 form tag -->
		id 입력 form : <input type="text" name="id"> <br>
		pw 입력 form : <input type="password" name="pw"> <br>
		
		<!-- server에 데이터 전송하면서 요청하는 tag -->
		<input type="submit" value="로그인">
		
	</form>
	
	<hr>
	
	<form>
	
	</form>
	<hr>

</body>
</html>
// <form action="idcheck">
@WebServlet("/idcheck")
public class Servlet2Validation extends HttpServlet {

	//get방식이라는 http 표준 요청 방식을 처리하는 재정의한 메소드
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet()");
		
		//입력된 client 데이터 획득
		//<input type="text" name="id">
		String id = request.getParameter("id");
		
		//<input type="password" name="pw">
		String pw = request.getParameter("pw");
		
		System.out.println(id + " " + pw);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost()");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		System.out.println(id + " " + pw);
	}
}

'Language > Java' 카테고리의 다른 글

[Spring] 스프링 프로젝트 생성  (0) 2021.10.07
JSP  (0) 2021.09.19
Apache Tomcat  (0) 2021.08.30
Lombok 라이브러리  (0) 2021.08.18
Stream, Optional & Lambda  (0) 2021.08.17