서블릿 개요
-
Servlet은 HttpServlet 클래스 상속해야 한다.
-
Tomcat은 구동되는 시점에서 새로이 생성된 Servlet을 인식함.
(톰캣 이미 구동되어있는 상태에서, 수정한 서블릿 실행하면 404 not found 에러 뜨는 이유)
-
URL : 요청 프로토콜부터 서버 주소, 포트번호까지 포함한 전체 주소 문자열.
http://서버주소:포트번호/ContextPath명/서블릿 URL mapping명
-
URI : Uniform Resource Identity.
서버에 요청하는 자원에 대한 패스 정보만을 추출.
/ContextPath명/서블릿URL mapping명
Context path : 이클립스 내에 생성된 web project에 대한 path.
일반적으로 web project 명과 동일하게 context path 명이 정해짐.
-
web.xml 파일 = 디스크립터 파일.
이클립스 project Explorer에 보이는 Deployment Descriptor (DD)
WEB-INF 폴더에 만든다.
<servlet>
태그와 <servlet-mappig>
태그를 정의해야 함.
Servlet의 수행
- Application Server 기능을 포함한 Web Server(웹서버)
= WAS (톰캣 서버)
- Web Container
= Web Application(서블릿, JSP 등 Web Components 들로 이루어짐) + Web Application
웹 어플리케이션을 관리하고 수행시키는 프로그램
- Web Application
= 이클립스 내의 Web Project
웹 컨테이너가 관리하는 웹 자원.
- Web Components
Servlet, JSP, Filter, Listener 등 웹 서버에서 수행되는 자원들
- DD
= web.xml
웹 애플리케이션의 환경 파일.
웹 애플리케이션이 웹 컨테이너에 배치될 때 인식됨.
- static resources
HTML, CSS< JS 등 웹 클라이언트에서 처리되는 자원들
- Library
확장 API. 서블릿이 내장하고 있는 API외에 추가로 필요로 하는 API들.
주로 jar파일로 구성됨.
(ex. JDBC 드라이버)
- 웹 컨테이너는 구동될 때 인식되는 웹 애플리케이션들을 하나의 context객체로 생성하여 관리.
- 즉,
Web Project폴더 = Context(톰캣 입장) = 웹 애플리케이션(개발자)
Servlet 요청
Query String 처리
- Query String = 요청 파라미터.
- 웹 클라이언트가 웹 처버에 요청 보내면서 함께 전달하는 추가 문자열.
GET방식
- URL 주소 뒤에
?name=value
형태로 구성됨.
URL?name1=value1&name2=value2
- req객체의 getParameter(name) 로 value값 추출. value값 여러개일 땐 getParameterValues(name) 메소드로 추출.
- 모든 전송파라미터 리턴타입은 String이다.
(다른 타입의 변수에 넣으려면 형변환 해야함)
POST방식
- Query String이 요청바디에 담겨 전달.
<form>
태그 이용하거나, js로 구현하여 요청.
@MultipartConfig 어노테이션 (파일 업로드)
@MultipartConfig(locatin = "C:/upload", maxFileSize = 1024 * 1024 * 20, maxRequestSize = 1024 * 1024 * 20)
location : 업로드 될 파일 ㅈ정하는 위치 지정. 생략시, 컨텍스트 홈 폴더 사용.
maxFileSize : 업로드된 파일에 허용되는 최대 크기. Byte 기준. 1024 * 1024 = 1MB. 기본크기는 무제한
maxRequestSize : form 데이터 요청에 허용되는 최대크기. 기본크기는 무제한
상태정보 관리
- Cookie 기술 : 클라이언트별 상태 정보를, 브라우저 (=클라이언트) 안에 저장.
브라우저에 저장하므로, 보안이 중요한 정보는 저장하면 안됨.
가벼운 정보(작은 정보)위주로 저장.
- HttpSession 기술 : 클라이언트별 상태 정보를, 웹 서버의 HttpSession 객체 에 저장.
서버에 저장하므로, 보안이 주용한 정보 저장.
모든 브라우저의 상태정보를 웹 서버 혼자 저장하므로 웹 서버에 부담이 될 수 있기 대문에,
저장을 유지하는 시간은 브라우저가 구동되어있는 시간 동안으로 제한.
( = 웹 브라우저와 생명주기 같음)
로그인기능, 쇼핑카트 기능 등.
HttpSession 객체
- 브라우저 별로 한 개의 객체만 생성.
- req객체의 getSession() 또는 getSession(true) 메소드 호출하여 생성
- HttpSession 객체에 보관되는 상태정보는 객체로 만들어서, 유일한 이름과 함께 저장.
==> 속성바인딩. session.setAttribute("name", value);
(이름 unique하게 지정해야 함)
- HttpSession 객체 생성시, 세션 ID가 부여됨 -> Cookie 에 담아서, 요청헤더에 담아 전송.
forward
- 클라이언트로부터 수행 요청받은 A가, 수행 권한을 B에게 넘겨서 대신 응답하게 함.
(= 위임. Delegation)
URL문자열 변화 없음. 동일 서버의, 동일 웹 어플리케이션 자원으로만 요청 재지정 가능.
따라서, contextPath는 생략해야 한다.
(어차피 같은 웹앱 자원이니까, 서버가 자동으로 붙여서 대상 찾기 때문)
redirect
- 클라이언트로부터 수행 요청받은 A가, 302 라는 응답코드와 재요청할 B자원 URL 정보를 응답.
-> 브라우저가 응답 내용 파악하여 서버에 B 자원 재요청.
- 동일 서버 뿐만 아니라, 다른 웹사이트 자원으로도 요청 재지정 가능.