(책) 자바 웹을 다루는 기술

Chap 6 키워드 정리 ★

EunaSon 2023. 7. 27. 02:02

Chap 6. 서블릿 기초

 

6.1 서블릿의 세 가지 기본 기능

서블릿 기본 기능 수행 과정 176p

요청, 응답 관련 API - javax.servlet.http 패키지에 있음 177p

HttpServletRequest 의 여러 가지 메서드 178p

 

6.2 <form> 태그 이용해 서블릿에 요청하기

179p

서블릿과 JSP는 HTML, CSS, 자바스크립트에 자신의 기능을 추가하여, 즉 서로 연동하여 동작함. 특히 사용자의 요청은 HTML의 <form> 태그나 자바스크립트로부터 전송받아서 처리함.

* <form> 태그와 <input> 태그 잘 알아두기 - 클라이언트에서 서버로 데이터 전송하는 기능을 담당

 

181p

<input> 태그- name 속성의 값과 실제 입력한 데이터가 쌍으로 전송됨

 

<form> 태그의 여러 가지 속성 181p

 

6.3 서블릿에서 클라이언트의 요청을 얻는 방법

<form> 태그로 전송된 데이터를 받아오는 메서드 182p

서블릿으로 전송하기 위한 html 파일 예제 183p

요청을 받는 서블릿 클래스 예제 184p

한번에 여러개의 값을 전송하는 html 예제 186p (input 태그 타입속성으로 checkbox, name속성값 모두 동일하게 주면 배열형태로 서블릿에 넘어감)

한번에 여러개의 값을 전송받는 서블릿 클래스 예제 187p (하나의 name으로 여러 값을 전송받는 경우 getParameterValues() 를 이용해 배열 형태로 반환받음)

전송된 데이터가 많아(회원가입 정보 등) 일일이 name 값 기억하기 힘들때 getParameterNames() 사용 188p (전송된 name속성들을 Enumeration 타입으로 저장, 반복문 사용해(hasMoreElement(), nextElement()) value(입력받은 실제값) 가져와 배열로 저장, 반복문으로 name과 value 출력)

 

6.4 서블릿의 응답 처리 방법

191p

서블릿이 처리한 결과를 클라이언트에게 응답할때

-doGet() 이나 doPost() 메서드 안에서 처리

-javax.servlet.http.HttpServletResponse 객체를 이용

-setContentType()을 이용해 클라이언트에게 전송할 데이터 종류(MIME-TYPE)를 지정

-클라이언트와 서블릿의 통신은 자바I/O 스트림을 이용함

 

MIME-TYPE 191p (서버에서 데이터 전송시 어떤 종류의 데이터인지 브라우저에 알려줘야함. 톰캣 컨테이너에서 제공하는 것 중 하나를 지정. 톰캣 컨테이너에서 미리 설정해놓은 데이터 종류들을 마임타입 이라고 함)

 

웹 브라우저는 기본적으로 html만 인식-> 서블릿에서 전송하는 데이터는 MIME-TYPE을 대부분 text/html로 지정 192p

 

193p

서블릿이 클라이언트에 응답하는 과정

setContentType()을 이용해 MIME-TYPE을 지정

> 데이터를 출력할 PrintWriter 객체를 생성

> 출력 데이터를 html 형식으로 만듦

> PrintWriter의 print()나 println()을 이용해 데이터를 출력

 

194p

-request.setCharacterEncoding("utf-8"): input으로 입력받은 값이 한글인 경우 가져올때 깨지지 않게 해주기 위함

-response.setCharacterEncoding("utf-8"): 서블릿에서 화면에 데이터 출력시 한글이 포함되어 있음을 브라우저에 알림

-response.setContentType("text/html;charset=utf-8"): 문자가 utf-8로 인코딩되었고, 응답할 데이터 종류는 html임

 

* PrintWriter out = response.getWriter(); 의 동작 원리

getWriter() 메서드는 PrintWriter 클래스를 리턴타입으로 함

PrintWriter 클래스는 바이트를 문자 형태를 갖는 객체로 바꿔줌

=> 클라이언트에게 문자 형태로 응답하고 싶기 때문에 out 이라는 PrintWriter 클래스 객체를 정의하고, getWriter() 메서드를 통해 인스턴스를 얻는 것

getWriter() 메서드를 통해 응답으로 내보낼 출력 스트림을 얻어낸 후 out.print(HTML 태그) 형태로 작성하여 스트림에 텍스트를 기록함

코드의 마지막에 out.close()를 통해 스트림을 닫아 자원을 해제함. 이를 통해 닫힌 스트림은 다시 사용 불가(flush()는 스트림을 비우고 필요시 계속 사용 가능하다는 차이가 있음)

 

환율 계산기 예제 196p (<select>태그-<option>, <input> type속성='hidden'(화면에는 안보이지만 value가 이미 저장되어 있음))

 

6.5 웹 브라우저에서 서블릿으로 데이터 전송하기

GET방식(url주소에 데이터를 붙여서 전송하는 방식), POST방식(전송하는 데이터 숨김) 198p

GET 방식으로 서블릿에 요청(<form> 태그의 method 속성으로 "get"을 설정->서블릿에서도 doGet()메서드로 처리) 199p

POST 방식으로 서블릿에 요청(<form> 태그의 method 속성으로 "post"를 설정->서블릿에서 doPost()로 처리) 200p

HTTP Status 405 에러(전송방식과 다른 메서드로 처리시 발생) 202p

 

6.6 GET 방식과 POST 방식 요청 동시에 처리하기

204p 예제

서블릿 만들때 doGet(), doPost() 둘다 추가

doHandle()에 처리할 내용 작성,

doGet()과 doPost() 안에서 doHandle()을 호출하여 처리함으로써 두 방식의 요청 처리 가능.  

 

6.7 자바스크립트로 서블릿에 요청하기

206p

서블릿에 요청 시 <form>태그에서 직접 요청(예. 로그인)하는 것이 아니라 자바스크립트 함수를 호출하여 작동 후 자바스크립트 함수에서 서블릿에 요청하는 경우(예. 비밀번호 입력 유무 체크 등).

자바스크립트 함수 - <form> 태그에 접근해서 값 입력여부 체크

->전송할 서블릿 이름을 action 속성에 지정

->submit() 함수를 호출해서 서블릿으로 전송

 

<script> 태그 이용해서 html 코드에 자바스크립트 코드 삽입.

html5에서는 type이 디폴트로 설정되어 있지만 하위호환성을 위해 type 속성으로 "text/javascript" 주기

?) 코드 6-14 ) 아이디, 비밀번호 입력유무 체크에서

user_id.length == 0 || user_id == ""  <- 두 가지의 차이가 무엇?


*html에서 자바스크립트 추가 위치

<head>에 추가

: html parsing > (html block) js fetching 및 executing > html 다시 parsing

이 경우, js파일 크기가 크다면 렌더링(서버로부터 html 파일을 받아 브라우저에 뿌려주는 과정)이 너무 오래 걸리게 되어 사용자가 페이지를 보는데에 시간이 오래 걸릴 수 있음

<body>에 추가

:html parsing > js fetching > js excuting

화면 렌더링에서는 좀더 효과적이지만, html 파일이 큰 경우 js가 포함된 '의미있는 컨텐츠'를 보는데에는 너무 오래 걸림

=> async, defer 속성 사용하여 html 파싱과 스크립트 다운로드를 병렬적으로 진행하는 것이 효율적

async 속성은 <head>에서 <script async src="~~~.js">로 사용

 단, js 실행(excute) 단계에서는 html 파싱이 중지되고, js 실행이 종료 후 html 파싱이 재시작됨

 스크립트 파일이 다수일 경우 다운로드가 완료되는 순으로 js 파일 실행되므로 순서에 의존적인 페이지라면 주의할 것

 => 스크립트 순서 상관 없고 빨리 실행하는 것이 중요할 때 async 사용

defer 속성 또한 에서 <head>에서 <script defer src="~~~.js">로 사용하면 됨

 마찬가지로 html 파싱 중 스크립트 파일을 모두 다운로드 하고,

 async와 달리 html 파싱이 모두 끝난 후 js를 실행(execute)하므로 원하는 방향대로 스크립트 실행가능

 => 스크립트 실행 순서가 중요할 시 defer 사용, 보통은 defer를 사용하는 것이 최선임


(코드 6-15)

PrintWirter out = request.getWriter();

: 클라이언트의 요청에 대한 응답은 문자 또는 바이트 형태일 수 있음

문자 형태로 응답 보내도록 설정하기 위한 코드임

getWriter()의 반환타입은 PrintWriter, PrintWriter 클래스는 바이트를 문자(text) 형태를 갖는 객체로 바꿔줌

=> getWriter() 메서드를 통해 출력스트림을 얻어냄 > html 태그 형태로 출력할 내용 작성하여(String) > out.print(html 태드 형태 String)으로 스트림에 텍스트 기록함 > 서버가 보내는 응답정보에서 특별히 설정하지 않으면 웹 브라우저는 응답받은 문자열을 text/html로 인식하므로, 모두 html 태그로 처리함 

* 출처 https://charliecharlie.tistory.com/353 

 

?) flush()랑 close() 안써도 되나?

 

6.8 서블릿을 이용한 여러 가지 실습 예제

로그인 유효성 검사, 구구단 출력 등의 예제를 통해 서블릿의 요청, 응답 기능에 익숙해지자

211p 다른 폴더의 서블릿에 요청시 매핑 경로도 지정해줘야 함("/프로젝트명/서블릿 매핑이름")

222p 서블릿의 응답기능은 결국 화면을 구현하는 기능임

- 계층형 패키지 구조 사용시 편리함(이클립스>Project Explorer 창>상단의 역삼각형 클릭>Package Presentation>Hierarchical 클릭)