JSP 2일차
요청, 응답 / 질의 문자열
웹 서버 처리 순서
클라이언트가 웹 브라우저에서 서비스 요청(HTTP 프로토콜 기반 요청정보 생성, 웹서버에 전달) → 웹서버는 전달받은 요청정보의 URI를 확인하고 서블릿으면 서블릿 컨테이너에 처리 넘김 → 서블릿 컨테이너가 요청받은 서블릿 클래스 파일 실행 → 최초 요청인지 파악 → 최초 : 메모리에 로딩 후 객체 생성, init() 메소드 호출 / 반복 : 생략 → 서블릿 컨테이너가 HttpServletRequest, HttpServletResponse 객체 생성 → service() 메소드 호출 → 메소드 실행 완료되면 클라이언트에 응답 전달 / 서버 프로그램 완료, HttpServlet 객체 소멸
응답 정보 처리 - HttpServletResponse
- ServletResponse 인터페이스를 상속받은 HttpServletResponse 사용 ⇒ 일반적인 네트워크 통신 관련 메소드 + http 프로토콜 통신 기반 메소드
- 쿠키 설정, HTTP 응답 헤더 설정 등 HTTP 프로토콜과 직접적인 관계가 있는 메소드 포함
한글 응답
- 한글 깨지는 것 방지하기 위해 서버가 클라이언트로 보내는 데이터의 문서타입과 한글을 지원하는 문자셋을 응답정보 헤더에 설정
setContentType(”text/html;charset=UTF=8”);
- 띄워쓰기 금지
요청 정보 처리 - HttpServletRequest
- 클라이언트가 서버로 전달하는 요청정보
네트워크 정보
- 웹서버에 서비스 요청할 때 사용한 프로토콜, 서버의 호스트 이름, IP 주소, 서버의 포트 번호,클라이언트의 IP 주소, 클라이언트의 호스트 이름, 클라이언트 소스 포트 번호
URL 정보
- 클라이언트가 요청한 문서 정보, URL, 웹 애플리케이션 경로 정보, 서비스 처리하면서 사용되는 구체적인 프로토콜 정보, 루트 디렉토리 기준 서블릿 경로
모든 헤더 정보
- 헤더 이름들 모아서 객체로 반환, 객체의 커서 다음 데이터의 유무, 요청정보의 헤더 이름
Collection
- 배열의 한계를 벗어나 데이터를 그룹으로 처리. 크기를 유동적으로 바꿀 수 있음
- 하나의 그룹에 서로 다른 데이터 타입 저장 가능
- Enumeration, Iterator
- 그룹 안의 요소에 접근할 때 인덱스, 키로 접근하지 않고 커서 개념으로 접근. Collection 안에 있는 모든 요소를 차례로 접근할 때 사용
- 다형성 구현
추가 정보
- 클라이언트 요청 방식, 요청 URL에서 ?뒤의 문자열 전체 추출
질의 문자열
개요
질의 문자열이란
- 웹 클라이언트에서 웹서버에 정보를 요청할 때 정해진 방식으로 데이터를 전달할 수 있으며 이때 사용하는 문자열
- 서블릿이나 JSP 같은 서버상에서 수행되는 기술을 요청할 때 사용
- HTML의
<form>
태그
질의 문자열 전송 규칙
- 요청 방식과 상관없이 클라이언트가 입력한 데이터는 정해진 규칙으로 인코딩 되어 전달
- name=value 형식으로 전달. 여러 개의 쌍이 있을 경우 &를 구분자로 사용
- 영문, 숫자, 일부 특수문자 그대로 전달. 나머지 문자는 %기호와 함께 16진수로 바뀌어 전달
- 공백 문자는 + 기호로 변경
HTML 입력 양식
<form>
태그
- 웹에서 화면 관련된 기술의 기초
-
<form action="서버프로그램 경로" method="요청방식">
- action : 질의 문자열들을 전달받아 처리할 서버 프로그램 저장
- method : 클라이언트가 서버 프로그램을 어떤 방식으로 요청할지 지정
요청방식에 따른 처리
GET 방식
- 서버로 전달되는 질의 문자열이 브라우저의 주소 줄에 모두 나타남 ⇒ 질의 문자열을 요청정보 헤더에 포함하여 전달
- 255바이트 미만의 외부에 노출되어도 상관 없는 데이터를 전달할 때 적합
- 인코딩, 디코딩 작업이 없어서 처리속도 면에서 이점
POST 방식
- 질의 문자열이 요청정보 몸체에 포함 ⇒ 외부에 노출되지 않음
- 질의 문자열의 길이 제한 없음
-
<form>
태그 사용해야만 요청 가능
서블릿 작성
- 서버 프로그램을 구현하면서 클라이언트에 관한 정보가 필요하면 HTTP 요청정보에서 추출
메소드 구현
- 최초 요청 : init() ⇒ service()
- 반복 요청 : service()
- doGet, doPost
- 개발자의 선택
- 요청 방식에 따라 구분해서 처리하고 싶을 때 사용
서블릿 연결
-
<form>
태그의 action 속성에 매핑되는 정보 지정
질의 문자열 추출
- HttpServletRequest 메소드 사용
- String getarameter(String name) : 질의 문자열로 넘어온 값 하나씩 추출. name이 중복되지 않고 유일하게 하나만 넘어올 때 사용. 반환 타입 String
- String getQueryString() : 같은 이름으로 여러 개의 변수가 전달되었을 때 한번에 모든 값을 추출하여 String 타입 배열로 반환
- String getQueryString() : 클라이언트가 전달할 질의 문자열 전체 하나의 String으로 추출. GET 요청에서만 사용 가능
- ServletInputStream getInputStream() throws IOException : HTTP의 요청정보 몸체와 연결된 입력스트림 생성하여 반환
한글 처리
post 방식
- 서블릿 API에서 한글 코드 변환 메소드 제공
- req.setCharacterEncoding()
- ECU-KR : 한글과 영문만 지원. 한 글자 2byte
- UTF-8 : 전 세계 모든 언어
get 방식
- 질의 문자열들이 URI에 포함되어 전달되기 때문에 URI 인코딩 처리 작업 필요
- 클라이언트가 입력한 문자열 인코딩
- 소스에서 직접 ⇒
<metacharset="UTF-8">
- 이클리스에서 지정 ⇒ 설정 변경
- 소스에서 직접 ⇒
- 서버에서 URI 인코딩
- server.xml 설정 변경