반응형

어노테이션 주소를 확인하고, Tomcat이 클라이언트에 대한 정보를 모아서, 두개의 객체정보를 넘겨준다.

protected void service(
        HttpServletRequest request, // 요청처리객체
        HttpServletResponse response // 응답처리객체
        )

 

request : 요청 (Client에서 Server로 넘어올때 처리하는 객체는 request를 이용한다)

response : 응답(응답처리를 넘겨줄 때 사용한다. IO 객체중 Output Stream이 존재한다)

 

//request : client의 요청 정보 포함
String ip = request.getRemoteAddr(); // 요청자 ip
System.out.printf("[%s]님이 요청하셨습니다\n", ip);

 

Servlet은 HTML으로 응답해야한다.

 

//응답처리 : [192.168.219.164]님 환영합니다.
//동적으로 HTML생성 전달

//응답할 컨텐츠에 대한 정보 응답헤더를 통해서 전달
// mime-type : text/html text/xml application/json text image/jpg
response.setContentType("text/html; charset=urf-8;");

 

여러 가지 타입을 통해서, Client의 요청에 동적으로 응답이 가능하다.

 

 

// 출력스트림을(OutputStream) 통해서 전송객체를 얻어오다.
PrintWriter out = response.getWriter();

// 동적은 들어오는 Client에 따라 처리하는 것이다.
// Client에 따라 동적으로 HTML을 만들어서 각각의 사용자에 맞는 형식으로 만들어 응답할 수 있다.
out.print("<html>");
out.print("<head><title>위험한 행위는 당장 멈추십시오. 경고</title></head>");

out.print("<body>");
//out.print("선생님 사랑합니다. -BJH 드림-");
out.printf("<h3>[%s]님 당신의 ip를 추적해서 경찰에 신고하겠습니다.</h3>", ip);
out.print("</body>");
out.print("</html>");

 

- reponse로 응답을 받아준다.

 

 

response.setContentType("text/html; charset=urf-8;");

 

- 한글이 깨질 수 있기 때문에 파일 타입 입력과 동시에, 반드시 charset=urf-8로 인코딩을 적용해주어야 한다.

 

 

package action;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Servlet implementation class HelloAction
 */
@WebServlet("/hello.do")
public class HelloAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(
			HttpServletRequest request, // 요청처리객체
			HttpServletResponse response // 응답처리객체
			) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//System.out.println("---test---");
		
		//request : client의 요청 정보 포함
		String ip = request.getRemoteAddr(); // 요청자 ip
		System.out.printf("[%s]님이 요청하셨습니다\n", ip);
		
		//응답처리 : [192.168.219.164]님 환영합니다.
		//동적으로 HTML생성 전달
		
		//응답할 컨텐츠에 대한 정보 응답헤더를 통해서 전달
		// mime-type : text/html text/xml application/json text image/jpg
		response.setContentType("text/html; charset=urf-8;");
		
		// 출력스트림을(OutputStream) 통해서 전송객체를 얻어오다.
		PrintWriter out = response.getWriter();
		
		// 동적은 들어오는 Client에 따라 처리하는 것이다.
		out.print("<html>");
		out.print("<body>");
		//out.print("선생님 사랑합니다. -BJH 드림-");
		out.printf("<h3>[%s]님 당신의 ip를 추적해서 경찰에 신고하겠습니다.</h3>", ip);
		out.print("</body>");
		out.print("</html>");
	}
}

 

 

 

자바 파일을 생성하면 실행 파일은 WEB-INF 경로에 만들어진다.

 

처음 이노테이션으로 호출을하면 Tomcat은 컨테이너에 해당 url을 가진 Servlet을 확인한다.

 

없으면 Tomcat이 실행파일중에서 찾는다.

 

init()으로 초기화 후, 컨테이너에 다시 Tomcat이 저장해둔다.

 

저장해놓고, Thread에게 실행을 맡기게 되는데, Thread(작업자)가 클라이언트의 요청시에 응답해주고 실행하는 것이다.

 

"Thread는 Tomcat의 부하직원이자 작업자"

 

 

Tomcat은 부하직원으로 Thread에게 할 일을 주고 자기가 일을 직접 다하지 않는다.

 

똑같은 요청을 동일하게 Tomcat이 인식하면 해당 실행파일을 맡고 있는 Thread가 그 작업을 처리한다.

 

만약, 10명의 요청자가 동일한 요청을 하면, Thread(작업자)가 혼자서 처리하는 것이 아니다.

 

서버안에는 Thread가 10개가 있어서, 각각의 Thread가 Client의 요청을 처리한다.

 

하나의 코드가 여러개로 복사를 해서 각각의 Thread가 그 복사된 코드를 할당받아서 처리한다.

 

Thread는 1인당 1개씩 아주 적절하게 분배가 된다.

 

Thread는 생겼다 없어진다. Client의 요청을 전부 처리하게 되면, Thread는 소멸된다.

 

"Thread는 1인전용 1회용품"

 

처음에 저장해놓은 파일을 통해 여러개의 요청을 할당하고 처리하는 것으로 싱클톤의 특징이 드러난다.

 


 

 

 

 

package action;

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Servlet implementation class LifeCycleAction
 */
@WebServlet("/lifecycle.do")
public class LifeCycleAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
	// 생성자 제일먼저 실행이 된다.
    public LifeCycleAction() {
        super();
        System.out.println("--1.LifeCycleAction()--");
        
    }

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("--2.init(config)--");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("--4.사라졌다 destory()와 함께--");
	}

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	// 이용자에게 보여지는 메서드
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("--3.service()--");
		
		//client의 요청방식을 구한다.
		String method = request.getMethod();
		System.out.println(method); // request의 메서드를 가져온다.
		if(method.equals("GET")) {
			doGet(request, response);
		} else if(method.equals("POST")) {
			doPost(request, response);
		}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	// service를 주석처리 하게 되면, 없는 대신에 doget() 메서드가 호출된다.
	// HttpServletRequest 상속받았는데, 그 안에 GET, POST의 구분 메서드가 저장되어 있다.
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("--3-1.doGet()");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("--3-2.doPost()--");
	}

}

 

 

- 여기서 코드내용을 수정하고 저장하면, 기존에 컨테이너에 저장해놨던 파일과 차이가 생긴것을 Tomcat이 인지한다.

그것을 인지하고, 기존에 있던 파일을 destroy() 한다.

 

 

- 그러고 다시 호출을 하면, 새로 생성을 하게 된다.

 

 

 

form : 서버로 데이터 전송시 사용하는 Tag

속성 :

1. action : 전송대상(누구에게..) / 생략시 자신에게 전송

2. method : 전송방식

GET : URL 주소를 통해서 전송(QueryString 방식)

Query

POST : request body에 넣어서 전송(보안성좋다)

 

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("--3.service()--");

    //client의 요청방식을 구한다.
    String method = request.getMethod();
    System.out.println(method); // request의 메소드를 가져온다.
    if(method.equals("GET")) {
        doGet(request, response);
    } else if(method.equals("POST")) {
        doPost(request, response);
    }
}

 

 

 

- 잘안쓰는 doGet(), doPost() 방식

 

- 기술면접에 가끔씩 나온다. (get 방식은 url 뒷부분인 쿼리쪽에 전송된 정보가 기록이 된다. 보안에 취약하다. 전송용량에 제한이 있다.) (post 방식은 보안성이 좋고, 쿼리부분에 전송된 정보가 기록이 되지 않으며, 전송용량에 제한이 없다.)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- GET : URL주소의 Query(name=value&name=value)를 통해서 Parameter가 전달 
     보안에 취약
     전송용량에 제한이 있다.
-->
<form method="GET" action="lifecycle.do">
	<input name="msg">
	<input type="submit" value="GET 요청">
</form>

<!-- POST : request body안에 숨겨져서 전송(parameter가 전달) 
            보안성 좋다.
            전송용량에 제한없다(대용량화일 전송가능)
-->
<form method="POST" action="lifecycle.do">
	<input name="msg">
	<input name="age">
	<input type="submit" value="POST 요청">
</form>

</body>
</html>

 

 

- GET방식을 쓰면 url에 쿼리부분에 그대로 전달된다.

 

 

- POST방식을 사용하면 url에 보이지 않고, F12를 누르고, 네트워크 부분에서 디버깅하여 확인할 수 있다.

 

 

 

 

 

- 배포 파일 만들기

 

 

- 버전 변경해준다.

.

 

 

 

 


 

 

 

Client의 요청을 동적인 HTML로 응답하기 

 

 

 

 

protected void service(
        HttpServletRequest request, // Client -> Server 요청정보
        HttpServletResponse response // Server -> Client 전송
        ) throws ServletException, IOException {
    // http://localhost:8080/2024_0614_ServletEx2_3x_late/hi.do?nation=kor 한국어 인사말로 주세요.
    //                                                         ?query
    //                                                          parameter(전달인자)

    // Client측에서 들어온 정보 처리(request)

 

- Client쪽에서 들어온 모든 정보는 request에서 처리한다.

- 서버에서 Client로 보낼때는 response로 처리한다.

 

 

 

GET 방식으로 직접적으로 Query를 입력해서 화면에 출력하기

 

 

package action;

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

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HiAction
 */
@WebServlet("/hi.do")
public class HiAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(
			HttpServletRequest request, // Client -> Server 요청정보
			HttpServletResponse response // Server -> Client 전송
			) throws ServletException, IOException {
		// http://localhost:8080/2024_0614_ServletEx2_3x_late/hi.do?nation=kor&display=20
		//                                                         ?query
		//                                                          parameter(전달인자)
		//                                          parameter name :nation, display
		// Client측에서 들어온 정보 처리(request) : query를 통해서 전달된 정보 무조건 String
		String nation = request.getParameter("nation");
		String display = request.getParameter("display");//안들어오던지 철자틀리면 null처리
		
		// nation= kor eng jpn chn ger fra
		if(nation==null) {
			nation = "kor";
		}
		
		String nation_name = "";
		String greeting = "";
		
		switch(nation) {
		case "kor" : nation_name = "한국";
			greeting = "안녕하세요 감사해요 잘있어요 다시만나요"; break;
		case "eng" : nation_name = "미국";
			greeting = "Hello Nice to meet you"; break;
		case "jpn" : nation_name = "일본";
			greeting = "こんにちは"; break;
		case "chn" : nation_name = "중국";
			greeting = "你好。"; break;
		case "ger" : nation_name = "독일";
			greeting = "Guten Tag."; break;
		case "fra" : nation_name = "프랑스";
			greeting = "Bonjour"; break;
		default : nation_name = "어.. 그건 지원을 하지 않고..";
			greeting = "어.. 그건 지원을 하지 않고..";
		}
		
		String msg = String.format("<h3>[%s]어 인사말은 [%s]입니다.</h3>", nation_name,greeting);
		
		// 응답처리
		response.setContentType("text/html; charset=utf-8;");
		// 응답처리 객체 얻어오기
		PrintWriter out = response.getWriter();
		
		out.print("<html>");
		out.print("<head><title></title></head>");
		out.print("<body>");
		out.print(msg);
		out.print("<a href='hi.html'>다시하기</a>");
		out.print("</body>");
		out.print("</html>");
		
	}

}

 

 

 

 

 

 

 

 

 

- 고객이 일일이 쿼리를 입력해서 들어갈 수가 없기에 HTML로 경로를 만들어준다.

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr>
	<h3>인사말이 궁금한 나라를 선택하세요</h3>
</hr>
<!-- Servlet 호출하기 get 방식이던, post 방식이던 정상적으로 전송이 된다 -->
<form action="hi.do">

	<input type="radio" name="nation" value="kor" checked="checked">한국
	<input type="radio" name="nation" value="eng">미국
	<input type="radio" name="nation" value="jpn">일본
	<input type="radio" name="nation" value="chn">중국
	<input type="radio" name="nation" value="ger">독일
	<input type="radio" name="nation" value="fra">프랑스
	<br>
	<input type="submit" value="알아보기">

</form>

</body>
</html>

 

 

 

 

 

- POST로 변경할시에,

 

- F12를 눌러서 Network에서 method:POST를 확인해보면 ger이라는 값을 확인할 수 있다.

 

반응형