오늘의 노래 추천 🎠
- 아티스트
- Demi Lovato
- 앨범
- Heart Attack
- 발매일
- 1970.01.01
- 아티스트
- The Script
- 앨범
- Hall Of Fame (Feat. Will.I.Am)
- 발매일
- 1970.01.01
저 이런 노래를 좋아해
DAY 2
ㅡ Servlet Life Cycle ㅡ
Servlet 객체 생성부터 소멸 과정

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

postman api 다운로드

home 에서 new request 선택


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);
}

객체 ㅡ> 자바 바이트 형태 ( 직렬화 )
자바 바이트 형태 ㅡ> 객체 ( 역직렬화 )
클래스 자체가 변환 될 수 있으므로 버전을 부여함
ㅡ 생성자 ㅡ

객체가 생성될 때 실행됨
객체가 생성되었다고해서 바로 Servlet 의 기능을 사용가능 한 것은 아님 ( 일반 자바객체이므로 )
ㅡ> Servlet 객체가 통신의 요청과 응답을 담당함
ㅡ init 메서드 ㅡ
객체가 Servlet 역할을 할 수 있도록 초기화

무겁고 비용이 많이 드는 작업이므로
ㅡ> 최초 요청이 생성되면 객체가 생성되고 init 메서드를 호출해
서블릿 객체로 초기화 이후 요청이 들어오면 이미 생성되어있는 객체를 그대로 사용
ㅡ destroy 메서드 ㅡ
서블릿 객체를 소멸 (서버가 종료될 때, 재시작)

이 메서드가 호출된 후에 요청이 들어오면 다시 init 메서드 호출
ㅡ Service 메서드 ㅡ
사용자의 요청처리 및 응답 ( 모든 요청은 service 에서 받음 )

사용자가 요청할 때 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 에서 새 HTML 파일 생성

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

전송을 위한 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 에 context path 작성 해주고 저장 후 실행

강사 컴퓨터 url 작성 후 전송
~ 전송 완료 ! ~
~ form 태그를 이용해 Server 로 보낸 데이터를 확인하려면? ~

getParamater ( 식별자 ) : request (요청 ) 객체가 '식별자' 마다 가지고 있는 값 반환
[ Servlet 이 받은 데이터를 브라우저에서 출력 ( 출력 스트림 ) 실습 ]

PrintWrite out = response.getWriter ()
out.print( 출력문 )

HTML 문서 작성

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 메서드
컨텐츠의 타입을 지정
응답 데이터의 형식을 브라우저에 알려줌

* service 메서드 내에 작성
[ Server로 전송한 숫자 2개를 연산식으로 출력 실습 ]

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개를 연산식으로 출력 실습 ]

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 생성 실습 ]

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>");
}

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

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>");
}


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

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