Front-end

JSP & Servlet DAY 2 ( Servlet 메서드, 인코딩, Servlet request/response 객체 [ Data Send / 출력 스트림 등 ] 실습 )

도키마 2024. 7. 25. 16:34



 

 

 

 

오늘의 노래 추천 🎠

 

 
Heart Attack
아티스트
Demi Lovato
앨범
Heart Attack
발매일
1970.01.01

 

 
Hall Of Fame (Feat. Will.I.Am) (노스페이스 광고 삽입곡)
아티스트
The Script
앨범
Hall Of Fame (Feat. Will.I.Am)
발매일
1970.01.01

 

저 이런 노래를 좋아해

 


 

 

 

 

 

 

 

 

 

 

 

 

DAY 2

 

 

 

 

 

 

 

 

 

 

 

 

ㅡ Servlet Life Cycle ㅡ

Servlet 객체 생성부터 소멸 과정

servlet life cycle

 

 

 

 

 

 

 

 

 

 

ㅡ HTTP 요청 테스트 해보기 ( postman 활용 ) ㅡ

 

http 요청 테스트

 

 

postman api 다운로드

 

https://web.postman.co/home

 

get started

 

home 에서 new request 선택

 

url send

 

서비스 시작

 

postman 이 클라이언트로서 request 를 보낸것

* doget, dopost 메서드 실행을 위해서는 serive 메서드 주석처리

 

선생님 콘솔에 보내기

 

도메인 주소 : 네트워크 / url

 

 

 

 

 

// @ : annotation ㅡ> 컴파일 시 확인하는 주석
// @ WebServlet("") ㅡ> url-mapping 을 해주는 주석
@WebServlet("/sohui")
public class Ex01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    // 객체 ㅡ> 자바 바이트 형태 (직렬화)
	// 자바 바이트 형태 ㅡ> 객체 (역직렬화)
	// 클래스 자체가 변환이 될 수 있으므로 버전을 부여함

	// 생성자 ㅡ> 객체가 생성될 때 실행됨
	// 객체가 생성되었다고 바로 서블릿의 기능을 사용가능한 것은 아님(일반 자바객체이므로)
	// ㅡ> 서블릿 객체가 통신의 요청과 응답을 담당
	public Ex01Servlet() {
		
	}
	
	// init 메서드 : 객체가 서블릿 역할을 할수 있도록 초기화
	// 무겁고 비용이 많이 드는 작업
	// 서버로 요청이 들어올때마다 작업을 하는 것은 아님 
	// ㅡ> 최초 요청이 생성되면 객체가 생성되고 init 메서드를 호출해 서블릿 객체로 초기화
	// 이후 요청이 들어오면 이미 생성되어있는 객체를 그대로 사용
	public void init(ServletConfig config) throws ServletException {
		System.out.println("초기화 시작");
	}

	// destroy 메서드 : 서블릿 객체를 소멸시킴(서버가 종료될 때, 재시작)
	// 이 메서드가 호출되고 후에 요청이 들어오면 다시 init 메서드 호출
	public void destroy() {
		System.out.println("destroy");
	}

	// Service 메서드 : 사용자의 요청처리 및 응답
	// 사용자가 요청할 때 http 요청 메서드가 있음(get, post, put, patch)
	// 모든 요청은 service 에서 받음
	// 만약 요청 메서드에 따라 다르게 처리하고 싶다면 do get, do post 메서드 이용
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("서비스 시작");
	}

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doget 시작");
		System.out.println(request.getParameter("sohui"));
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("dopost 시작");
		System.out.println(request.getParameter("sohui"));
		doGet(request, response);
	}

 

 

 

 

 

class extends

 

객체 ㅡ> 자바 바이트 형태 ( 직렬화 )

자바 바이트 형태 ㅡ> 객체 ( 역직렬화 )

클래스 자체가 변환 될 수 있으므로 버전을 부여함

 

 

 

 

ㅡ 생성자 ㅡ

 

생성자

 

객체가 생성될 때 실행됨

객체가 생성되었다고해서 바로 Servlet 의 기능을 사용가능 한 것은 아님 ( 일반 자바객체이므로 )

ㅡ> Servlet 객체가 통신의 요청과 응답을 담당함

 

 

 

 

ㅡ init 메서드 ㅡ

객체가 Servlet 역할을 할 수 있도록 초기화

 

init 메서드

 

무겁고 비용이 많이 드는 작업이므로

ㅡ> 최초 요청이 생성되면 객체가 생성되고 init 메서드를 호출해

서블릿 객체로 초기화 이후 요청이 들어오면 이미 생성되어있는 객체를 그대로 사용

 

 

 

 

ㅡ destroy 메서드 ㅡ

서블릿 객체를 소멸 (서버가 종료될 때, 재시작)

 

destroy

 

이 메서드가 호출된 후에 요청이 들어오면 다시 init 메서드 호출

 

 

 

 

ㅡ Service 메서드 ㅡ

사용자의 요청처리 및 응답 ( 모든 요청은 service 에서 받음 )

 

serive 메서드

 

사용자가 요청할 때 http 요청 메서드가 있음(get, post, put, patch)

* 만약 요청 메서드에 따라 다르게 처리하고 싶다면 do get, do post 메서드 이용

 

 

 

 

 

 

 

 

ㅡ 데이터 전송 ㅡ

 

데이터 전송

 

ㅡ> form 태그와 속성을 이용해 데이터 전달

 

action 속성

상대경로 : 내 Server 내의 'Servlet'으로 URL-Mapping 된 Servlet

절대경로 : 해당 Port 의 Data Transfer Server의 'Servlet'으로 URL-Mapping 된 Servlet

 

 

 

 

 

 

 

 

[ name data 보내기 실습 ]

 

 

 

 

webapp

 

webapp 에서 새 HTML 파일 생성

 

html code

 

form 태그를 이용해 이름 전송 폼을 작성

 

servlet 생성

 

전송을 위한 Servlet  생성 ( src/main/java )

 

@WebServlet("/NameSendTest")
public class NameSendTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public NameSendTest() {
        super();
        
    }

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		System.out.println(name);
	}

}

 

service 메서드 ㅡ> request 객체를 파라미터로 받음

request 의 getParameter 기능으로 name 식별자를 받아 name 변수에 저장

ㅡ> name 출력

 

action

 

action 에 context path 작성 해주고 저장 후 실행

 

action

 

강사 컴퓨터 url 작성 후 전송

 

~ 전송 완료 ! ~

 

 

 

 

~ form 태그를 이용해 Server 로 보낸 데이터를 확인하려면? ~

 

전송된 데이터 확인

 

getParamater ( 식별자 ) : request (요청 ) 객체가 '식별자' 마다 가지고 있는 값 반환

 

 

 

 

 

 

 

 

[ Servlet 이 받은 데이터를 브라우저에서 출력 ( 출력 스트림 ) 실습 ]

 

 

 

PrintWriter out

 

PrintWrite out = response.getWriter ()

out.print( 출력문 )

 

HTML

 

HTML 문서 작성

 

Servlet 작성

 

request 객체를 이용해 사용자가 입력해 Servlet 으로 받은 정보를 변수에 저장하고

response 객체의 getWriter 메서드를 호출 ( PrintWriter 클래스를 리턴타입으로 함 )

 

ㅡ> 생성된 out 객체의 print 메서드를 사용해 브라우저에 출력

 

https://charliecharlie.tistory.com/353

 

[Servlet&JSP] PrintWriter out = response.getWriter(); 의 동작 원리

클라이언트로부터 Servlet으로 요청이 들어오면 요청(Request)을 파악한 후 응답(Response)을 전달한다. Servlet으로 들어온 요청을 텍스트(HTML) 형태로 응답을 보내려면 아래와 같이 응답으로 내보낼 출

charliecharlie.tistory.com

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// request(요청 객체)
		// 클라이언트가 request 하며 보내온 데이터를 서버에서 받기 위해 사용하는 객체
		// getParameter : request 객체가 식별자를 이용해 데이터를 받기위한 메서드
        String name = request.getParameter("name");
		System.out.println(name);
        
       // 콘솔창 출력은 문제없지만 브라우저에서 인코딩 오류
		// 응답데이터의 인코딩 방식을 브라우저에 알려줘야함(응답에 대한 행위)
		// response 객체
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=UTF-8");
        
        // 받은 데이터 브라우저 출력 (getWriter)
		PrintWriter out = response.getWriter();
		out.print(name+", welcome to join!");
	}

 

출력 결과

 

 

 

 

 

 

 

 

~ 부록 : 한글 인코딩 적용하기 ~

 

HTML 상에서 charset 을 변경해도 브라우저에서 한글 출력에 오류가 있음

ㅡ> 브라우저에 인코딩 방식을 알려주지 않았기 때문

 

 

 

 

~ 해결법 ~

response 객체

 

인코딩

 

ㅡ> setCharacterEncoding 메서드

문자 자체를 인코딩

응답할 데이터가 UTF-8 이 아닐땐 해당 코드를 작성해야함

 

ㅡ> setContentType 메서드

컨텐츠의 타입을 지정

응답 데이터의 형식을 브라우저에 알려줌

 

setCharacterEncoding, setContentType

 

* service 메서드 내에 작성

 

 

 

 

 

 

 

 

[ Server로 전송한 숫자 2개를 연산식으로 출력 실습 ]

 

 

 

HTML

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String num1 = request.getParameter("num1");
		String num2 = request.getParameter("num2");
		
		int n1 = Integer.parseInt(num1);
		int n2 = Integer.parseInt(num2);
		int sum = n1+n2;
		
		PrintWriter out = response.getWriter();
		out.print("<h1>"+n1+"+"+n2+"="+sum+"</h1>");
	}

 

출력 결과

 

 

 

 

 

 

 

 

[ Server로 전송한 숫자 2개를 연산식으로 출력 실습 ]

 

 

 

 

HTML

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String num1 = request.getParameter("num1");
		String num2 = request.getParameter("num2");
		String oper = request.getParameter("oper");	
		
		int n1 = Integer.parseInt(num1);
		int n2 = Integer.parseInt(num2);
		int result=0;
		
		if(oper.equals("+")) {
			result = n1+n2;
		}else if(oper.equals("-")) {
			result = n1-n2;
		}else if(oper.equals("*")) {
			result = n1*n2;
		}else if(oper.equals("/")) {
			result = n1/n2;
		}
		
		PrintWriter out = response.getWriter();
		out.print("<h1>"+n1+oper+n2+"="+result+"</h1>");
		
	}

 

출력 결과

 

 

 

 

 

 

 

 

 

[ 전송된 숫자만큼 테이블 cell 생성 실습 ]

 

 

 

 

HTML

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int n = Integer.parseInt(request.getParameter("num"));
		PrintWriter out = response.getWriter();
		
		out.print("<table border='1'>");
		for(int i=0; i<n; i++) {
			out.print("<tr style='float:left'><td>"+(i+1)+"</td></tr>");
		}
		out.print("</table>");
	}

 

출력 결과

 

 

 

 

 

 

 

 

 

[ 색상 설정값으로 배경색 지정 실습 ]

 

 

 

 

HTML

 

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

		String color = request.getParameter("color");
		PrintWriter out = response.getWriter();
		
		out.print("<style> *{background-color:"+color+"}</style>");
		
	}

 

출력 결과

 

 

 

 

 

 

 

 

 

[ 사용자 지정 범위만큼 구구단 테이블을 출력하고 색 설정 실습 ]

 

 

 

 

HTML

 

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int num1 = Integer.parseInt(request.getParameter("num1"));
		int num2 = Integer.parseInt(request.getParameter("num2"));
		String color = request.getParameter("color");
		
		PrintWriter out = response.getWriter();
		
		out.print("<style> table{background-color :"+color+"}</style>");
		out.print("<table border='1'>");
	
		for(int i=num1; i<=num2; i++) {
			out.print("<tr>");
			for(int j=1; j<=9; j++) {
				out.print("<td>"+i+"*"+j+"="+i*j+"</td>");
			}
			out.print("</tr>");
		}
		out.print("</table>");
	}

 

출력 결과

(수정중)




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 



 

 

 

 

 

 

BYE