JSP 기본 내용 정리
1. JSP에 대하여
JSP(Java Servlet Page)는 서블릿의 확장판으로 웹 프로그래밍을 하기 위한 서버측 스크립트 모델이며, 서블릿 이후에 출현된 최신의 기술이다.
가. 개요
JSP 기술은 웹 개발자에게 개발 생상성과 유지보수의 용이성을 제공하며 자바의 모든 제반 기술(JDBC, 서블릿, RMI, 자바빈즈, EJB 등)을 이용할 수 있게 해 준다. 즉, 서버측 동적 페이지를 작성하기 위한 종합 기술이라 하겠다.
JSP와 비교되는 대표적인 서버측 스크립트 모델로는 마이크로소프트 사의 ASP(Active Server Page)를 들 수 있겠다. ASP는 비주얼베이직을 서버측 스크립트 언어로 이용하며, 컴포넌트 기술인 ActiveX 컨트롤과 COM+를 사용한다.
이에 반해 JSP는 자바를 기본 스크립트 언어로 사용하며 애플릿, 자바빈즈, EJB를 컴포넌트 모델로 사용한다.
나. JSP와 서블릿
JSP는 서블릿과 동일한 관점이다. 다만 JSP는 JSP 컨테이너에 의해 서블릿으로 변환된 다음 클라이언트의 요청을 처리한다.
<% 자바 출력 %>
<%= ~ %>
동일한 약식 표현
2. JSP의 실행
JSP 서블릿의 속성
속성 | 설명 |
compileCommand | JSP 파일이 서블릿으로 변환되었을 때 사용하는 컴파일러를 지정 (반드시 정의되어 있어야 한다.) |
workingDir | JSP 파일을 서블릿으로 변환하기 위한 작업 디렉토리로 변환된 *.java 파일과 컴파일된 *.class 파일이 위치하는 곳 (반드시 정의되어 있어야 한다.) |
verbose | True 면 디버깅 정보가 브라우저에 출력되고 False 이면 웹로직 서버의 로그 파일에 기록됨 |
keepgenerated | true면 반환된 *.java 소스 파일을 작업 디렉토리에 저장 |
pageCheckSeconds | 지정된 초마다 *.jsp 파일의 변경 유무를 검사하여 재컴파일이 필요한지 결정한다. 지정된 값이 0 이면 클라이언트의 매 요청마다 검사를 하며 -1 이면 서버가 시작되기 전까지는 검사를 하지 않는다. |
encoding | 인코딩 문자셋을 정의하는 곳으로 디폴트 값은 서버의 JVM에 설정된 문자셋을 이용한다. |
3. JSP에서의 서비스 수행
서블릿에서는 클라이언트의 요청을 처리할 때 두 가지 방법을 제공하였는데 JSP는 한 가지 방법만을 제공한다. 즉, JSP 파일의 변환된 서블릿 소스 코드를 보면 _jspService() 메서드가 구현되어 있음을 알 수 있을 것이다. 이 메서드는 JSP 컨테이너에 의해 호출되는 메서드로 JSP 서블릿에 의해 자동으로 구현된 메서드이다. EK라서 JSP 파일에서 개발자가 이 메서드를 오버라이딩 해서는 안 된다.
HTTP의 요청/응답(request/response)과 관련된 객체를 보면 서블릿과 JSP 모두 동일한 타입을 사용한다. 어차피 JSP는 서블릿으로 변환되기 때문에 당연한 일이다.
4. JSP의 생명주기
4.1. 생성과 소멸
1. 클라이언트로부터 요청이 들어오면 JSP 컨테이너(JSP 서블릿)는 해당 요청이 최초 요청인 경우와 JSP 파일이 변경된 경우에만 서블릿으로 변환을 하고 이를 컴파일한다.
2. JSP 컨테이너(JSP 서블릿)에 의해 생성된 서블릿의 인스턴스를 메모리에 적재하고 jspInit() 메서드를 호출한다. 서블릿의 init() 메서드와 마찬가지로 jspInit() 메서드는 최초 한 번만 수행하며 역할도 동일하다.
3. JSP 컨테이너는 클라이언트에 서비스할 내용을 처리하는 _jspService() 메서드를 호출한다.
4. 마지막으로 서블릿의 인스턴스가 가비지 컬렉션의 대상이 될 때 JSP 컨테이너에 의해 jspDestroy() 메서드가 호출.
※JSP의 모든 자바 코드는 <% ~ %> 태그 사이에 기술. 메서드와 멤버변수는 <%! ~ %> 태그 사이에 기술해야 함.
■ 처음 브라우저를 통해 접속을 한 경우
최초에 jspInit()메서드와 _jspService() 메서드를 호출한다.
■ JSP 페이지를 변경한 다음 브라우저를 통해서 재접속을 한 경우
변경되었기 때문에 jspDestroy() aptjuem를 호출한 다음 jspInit(), _jspService() 메서드 순으로 호출한다.
■ 다시 브라우저를 통해서 재접속을 한 경우
변경되지 않은 경우 _jspService() 메서드만을 호출한다.
4.2 멤버 변수
JSP에서의 멤버 변수 또한 서블릿과 다른 부분이 없다.
JSP에서의 동기화는 page 지시어의 속성 중에 isThreadSafe 속성을 false로 한다.
이는 Thread-Safe 하지 않는다는 것을 JSP 컨테이너에 알려주어 JSP 컨테이너가 동시성 제어를 직접 담당하도록 하는 것이다.
일반적으로 서블릿 인스턴스는 다중 스레드 방식으로 처리가 되지만 이와 같이 isThreadSafe 속성이 false이면 다중 스레드 방식은 지원되지 않으며, 단일 스레드 방식으로 처리가 된다.
이와 관련해 JSP 파일이 서블릿으로 변환될 때 javax.servlet.SingleThreadModel 인터페이스를 implements 한다.
■ 다중 스레드 모델 : 하나의 인스턴스는 여러 스레드에 의해 실행된다.
■ 단일 스레드 모델 : 하나의 인스턴스는 하나의 스레드에 의해서만 실행된다.
※멤버 변수의 사용은 조회용으로만 사용할 것을 권한다.
5. JSP 태그
JSP 페이지의 기본 구성 요소 6 가지
▣ 주석(comment) <%!-- 주석 -->
▣ 스크립트릿(scriptlet) <jsp:scriptlet> 자바 코드 </jsp:scriptlet>
▣ 지시어(Directive) <jsp:directive.page 속성=“속성값” 속성=“속성값” ... />
▣ 선언(Declaration) <jsp:declaration> 멤버 변수나 메서드 선언 </jsp:declaration>
▣ 형식(Expression) <jsp:expression> 표현식 </jsp:expression>
▣ 액션(Actions)
※JSP에서 제공하는 태그에는 기본 태그와 XML 기반의 태그로 나누어 지는데, 어느 것을 사용해도 무방
5.1 주석(comment)
JSP에서의 주석은 클라이언트로 전송되는 주석과 전송되지 않는 주석으로 나누어 지는데 클라이언트로 전송되는 자료의 양을 고려한다면 클라이언트로 전송되지 않는 주석을 사용하는 것이 바람직할 것이다.
■ 클라이언트로 전송되는 주석 <!-- 주석 -->
■ 클라이언트로 전송되지 않는 주석 <%-- 주석 --%>
5.2 스크립트릿(Scriptlet)
: 스크립트릿은 HTML 사이에 존재하는 자바 코드
서버에서 실시간으로 실행되어 그 결과 값을 HTML 사이에 삽입한다. 동적인 HTML을 구현할 수 있다.
■ 기본 태그 형식 <% 자바 코드만 실행 %>
■ XML 기반 태그 형식 <jsp:scriptlet> 자바 코드 </jsp:scriptlet>
5.3 지시어(Directive)
: JSP에서의 지시어는 JSP 페이지의 속성을 정의하는 것
이러한 속성은 JSP 컨테이너에게 해당 JSP 페이지가 어떻게 처리되어야 하는가에 대한 정보로써 사용된다.
이러한 지시어에는 page 지시어와 include 지시어로 나눌 수 있다.
Page 지시어 태그 속성
■ 기본 태그 형식 <%@ page 속성=“속성값” 속성=“속성값” ... %>
■ XML 기반 태그 형식 <jsp:directive.page 속성=“속성값” 속성=“속성값” ... />
속성 | 설명 | 기본 값 |
language | 사용할 스크립트 언어 | java |
import | 패키지나 클래스를 임포트 | |
session | 세션 사용 유무 | true |
buffer | 버퍼의 크기 | 8 kb |
autoFlush | 버퍼의 내용 자동 전송 유무 | true |
isThreadSafe | 동시성 제어 유무 | true |
info | 작성된 JSP 페이지에 대한 설명 | |
errorPage | 에러 발생시 구동되는 페이지 설정 | |
isErrorPage | 에러 페이지 유무 | false |
contentType | MIME 형식, charset 설정 | text/html;charset=ISO-8859-1 |
■ language
JSP 페이지 내에서 사용할 스크립트 언어를 정의하는 속성이다.
디폴트 값이 java로 지정되어 있으므로 기술할 필요는 없다.
■ import
자바의 import와 동일하며 JSP 페이지 내에서 필요한 패키지나 클래스를 임포트 한다.
그리고 자동으로 임포트되는 패키지들이 있다.
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp;
import javax.servlet.jsp.tagext.*;
■ session
: JSP 페이지 내에서 세션을 사용할 것인지를 결정한다.
디폴트 값이 true 로 설정되어 있고 세션을 사용하지 않는 페이지에서는 false 로 설정하여 메모리 낭비를 방지한다.
세션이란 쿠키의 확장된 개념으로 특정 클라이언트의 정보를 지속적으로 유지할 수 있는 기술을 말한다.
■ buffer
: JspWrite 객체인 out에 의해 사용할 버퍼의 크기를 설정한다.
버퍼의 크기를 지정했을 경우 클라이언트로 전송되는 자료는 먼저 버퍼에 저장된다. 만일 버퍼의 크기를 지정하지 않는 경우는 버퍼를 거치지 않고 클라이언트로 바로 전송된다.
관련된 속성은 autoFlush
※출력 버퍼를 사용하지 않는 경우
버퍼에 전송할 자료를 모아둔 다음, 일괄적으로 클라이언트로 전송을 한다면 에러가 발생했을 때의 문제를 어느 정도는 해결할 수 있다. 버퍼를 사용하지 않으면 일부 전송된 상태에서 나머지 처리 내용 중에 에러가 발생하였을 경우 취소할 방법이 없다.
클라이언트로 자료가 전송되는 시점은 언제인가?
■ autoFlush 속성이 true이며 버퍼가 다 찬 경우
■ 해당 페이지의 서비스 수행이 완료되었을 때, 즉 _jspService() 메서드 수행이 완료되었을 때
■ out.flush() 메서드를 호출 한 경우
■ autoFlush
출력 버퍼가 다 차면 자동으로 클라이언트로 자료를 전송한 다음 출력 버퍼의 내용을 모두 지운다.
■ isThreadSafe
isThreadSafe 가 false 면 JSP 컨테이너에게 동시성 제어를 하도록 한다. 단일 스레드 방식으로 처리가 되며, true면 다중 스레드 방식으로 처리가 된다.
■ info
해당 JSP 페이지에 대한 설명 부분으로 주석문과 같다. 그러므로 실행에는 아무런 영향이 없다.
■ errorPage
해당 JSP가 실행 도중 Exception 이 발생한 경우 errorPage 속성에 정의된 에러 페이지로 제어권이 이동된다.
■ isErrorPage
JSP 페이지가 에러 페이지로 사용되는지 정의한다. 에러 페이지인 경우 true 로 설정한다.
■ contentType
Content 타입을 설정한다
■ include
include 지시어의 위치에 file 속성에 설정된 JSP 페이지를 삽입한다.
5.4 선언(Declaration)
선언 부분에서는 jspInit(), jspDestroy() 메서드를 오버라이딩 할 수 있으며, 스크립트릿이나 표현식(Expression)에서 사용할 변수나 기타 메서드를 정의한다.
그리고 여기에 선언된 변수는 멤버 변수로 정의된다.
■ 기본 태그 형식 <%! 멤버 변수나 메서드 선언 %>
■ XML 기반 태그 형식 <jsp:declaration> 멤버 변수나 메서드 선언 </jsp:declaration>
※ 지역 변수의 선언은 스크립트릿에서 선언 한다.
5.5 표현식(Expression)
: 변수나 연산의 결과값을 HTML 코드 사이에 삽입하며, 모든 결과값은 String 타입으로 변환된다.
그리고 표현식에서는 세미콜론을 사용해서는 안된다.
■ 기본 태그 형식 <%= 자바 결과값만 클라이언트로 전송 %>
또는 <% out.println(표현식) %>
■ XML 기반 태그 형식 <jsp:expression> 표현식 </jsp:expression>
5.6 액션(Actions)
: 일반적으로 JSP에서는 스크립트릿을 통하여 자바 코드를 삽입하는데 액션은 이러한 스크립트릿을 이용하지 않고도 자바 코드를 실행할 수 있도록 해준다.
즉 JSP 페이지 중간에서 다른 JSP나 HTML 페이지를 실행하거나 자바 빈즈를 JSP 페이지에서 이용할 수 있다는 것이다.
각각의 페이지를 기능별로 캡슐화(모듈화)가 가능함을 의미한다.
JSP에서의 액션 4 종류
■ include
■ forward
■ useBean
■ plugin
6. 내장 객체(예약어)
: 내장 객체란 JSP 컨테이너에 의해 서블릿으로 변환될 때 자동으로 선언된 객체들로 JSP 페이지 내에서 선언 없이 사용할 수 있는 객체들의 집합이다.
이러한 내장 객체에는 클라이언트의 요청, 응답, 세션 관리, 예외 처리 등과 관련된 객체들로 구성되어 있으며, JSP 스펙을 지원하는 모든 웹 어플리케이션 서버 제품은 동일한 내장 객체 명을 사용한다.
JSP에서 지원하는 내장 객체 9가지
■ 요청(request)
■ 응답(response)
■ 출력(out)
■ 페이지(page)
■ 페이지 컨텍스트(pageContext)
■ 세션(session)
■ 서블릿 환경(config)
■ 어플리케이션(application)
■ 예외(exception)
가. 요청(request)
: request 내장 객체는 클라이언트의 HTTP 요청 사항과 관련된 정보를 접근하기 위해 생성된 객체이다.
(1)요청 파라미터 관련 메서드
: 클라이언트에서 GET/POST 방식으로 넘어오는 자료를 얻기 위해 사용하는 메서드이다.
■ public String getParameter( String name )
: 지정된 이름(name)으로 넘어온 값을 String 타입으로 리턴한다. 존재하지 않는 경우 null을 리턴한다.
■ public Void setCharacterEncoding( String arg )
: 캐릭터셋을 지정한다. POST 방식에서 한글화 할 때 쓰인다.
■ public String[] getParameterValues( String name )
: 지정된 이름(name)으로 넘어온 모든 값을 String 배열 타입으로 리턴한다.
동일한 이름으로 여러 건의 자료가 넘어온 경우 사용된다.
■ public Enumeration getParameterNames()
: 클라이언트로부터 넘어온 모든 자료를 Enumeration 타입으로 리턴한다. 거의 안 쓴다.
(2) 세션 메서드
: 쿠키가 클라이언트에 정보를 기록하는 반면 세션은 서버측에 이러한 정보를 기록한다. 쇼핑몰 장바구니나 로그온 관리
■ public HttpSession getSession()
: 요청을 한 클라이언트에 대해 이전에 생성된 세션이 있는 경우에는 생성된 세션을 리턴하고,
없는 경우 새로운 세션을 생성한다.
■ public HttpSession getSession( boolean create)
: 파라미터가 True면 getSession() 메서드와 동일, false면 이전에 생성된 세션이 없는 경우 Null을 리턴한다.
■ public String getRequestedSessionId()
: 요청을 한 해당 클라이언트의 세션 ID를 리턴한다.
■ public boolean isRequestedSessionIdValid()
: 요청을 한 해당 클라이언트의 현재 세션이 유효한지 검사한다. 유효하면 리턴 True, 아니면 리턴 False
(3) 쿠키 메서드
: 세션과 달리 쿠키는 클라이언트의 정보를 저장
■ public Cookie[] getCookies()
: 클라이언트의 쿠키 정보를 Cookie 객체의 배열로 리턴한다.
반복문을 통해 쿠키의 이름과 값을 얻을 수 있다.
Cookie[] cookies = request.getCookies(); for( int i=0; i < cookies.length ; i++ ) { cookies[i].getName(); cookies[i].getValue(); } |
(4) HTTP 헤더 메서드
: HTTP 프로토콜에서 통신을 위해 사용되는 기본적인 송수신 단위를 메시지(message)라 한다.
이러한 HTTP 메시지에는 헤더와 바디로 구성되어 있는데, 헤더에는 요청 방식, 쿠키, 호스트, 요청 URL 등의 정보가 수록되어 있다.
■ public String getHeader( String headerName )
: HTTP 요청 헤더 중 지정된 헤더명(headerName)의 값을 String 타입으로 리턴한다. 헤더명이 없으면 null을 리턴.
■ public Enumeration getHeaders( String headerName )
: HTTP 요청 헤더 중 지정된 헤더명(headerName)으로 넘어온 모든 값을 Enumeration 타입으로 리턴한다.
■ pulbic Enumeration getHeaderNames()
: HTTP 요청헤더의 모든 자료를 Enumeration 타입으로 리턴한다.
(5) ServletRequest 객체의 메서드
: HttpServletRequest 객체는 ServletRequest 인터페이스로부터 상속받았으므로 ServletRequest의 메서드를 사용할 수 있다.
■ public String getProtocol(): "HTTP/1.1"과 같은 형식으로 프로토콜 및 Majot/Minor 버전을 리턴한다.
■ public String getRemoteAddr(): 요청한 클라이언트의 IP 주소를 리턴한다.
■ public String getRemoteHost(): 요청한 클라이언트의 호스트 이름을 리턴한다.
■ public String getServerName(): 요청을 받은 서버의 이름을 리턴한다.
■ public int getServerPort(): 요청을 받은 서버의 포트 번호를 리턴한다.
나. 응답(response)
: response 내장 객체는 클라이언트의 HTTP 요청 사항을 처리하고 이에 대한 HTTP 응답을 클라이언트로 전송하기 위해 생성된 객체이다.
(1) 쿠키 메서드
■ public void addCookie( javax.servlet.http.Cookie cookie )
: HTTP 응답 헤더에 쿠키를 추가한다.
추가된 쿠키는 클라이언트로 전송되며 클라이언트의 메모리나 디스크에 저장된다.
(2) 상태 코드 메서드
■ public void setStatus( int status_code )
: 클라이언트의 요청에 대한 서버측의 응답 상태 코드를 클라이언트로 전송하기 위한 메서드이다.
일반적으로 웹 서버는 클라이언트의 요청에 정상적으로 응답한 경우 상태 코드를 200(SC_OK)으로 설정해 준다.
(3) 에러 메서드
: 서버측 에러 상황을 응답 상태 코드로 클라이언트에 전송하기 위한 메서드로 setStatus() 메서드와 동일한 기능.
■ pulibc void sendError( int status_code ) throws IOException
: 상태 코드만 클라이언트로 전송한다.
■ public void sendError( int status_code, String message ) throws IOException
: 상태 코드와 이와 관련된 에러 메시지를 클라이언트로 전송한다.
(4) HTTP 헤더 메서드
■ public void setHeader( String headerName, String value)
: HTTP 응답 헤더에 값을 설정한다. 이전에 동일한 헤더가 설정된 경우에는 마지막에 설정된 값이 우선한다.
addCookie() 메서드를 사용하지 않고도 setHeader() 메서드를 이용해 쿠키를 설정할 수도 있다.
헤더의 설정은 바디 부분이 전송되기 전에 설정해야 한다.
■ public void setIntHeader( String headerName, int intValue )
: HTTP 응답 헤더에 정수 값을 설정한다. setHeader() 메서드와 동일
(5) URL Rewriting 메서드
■ public String encodeURL( String url )
: 일반적으로 HTTP 세션에서는 클라이언트와 서버간에 세션을 유지하기 위해 세션 ID를 HTTP 용청/응답 메시지의 헤더에 포함하여 전송 및 수신을 한다.
즉 쿠키를 통해 일련의 작업이 이루어 진다.
만일 브라우저가 쿠키를 사용하지 않는다면 이러한 세션 ID를 통해 세션을 유지한다는 것은 불가능할 것이다.
불특정 다수의 사용자가 반드시 쿠키를 사용한다는 보장이 없으므로 쿠키를 사용하지 않는 사용자를 위해서도 웹 어플리케이션은 대비를 해야 할 것이다. 이의 해결책으로 폼의 Hidden 타입을 이용해 세션 ID를 매 요청마다 서버로 전송하거나 하이퍼링크를ㄹ 통해 URL에 세션 ID를 쿼리 문자열로 추가하여 서버로 전송하는 방법이 있다. 이를 ‘URL Rewriting 기법’ 이라 한다.
encodeURL() 메서드는 하이퍼링크를 통해 클라이언트가 쿠키를 사용하는 경우에는 메서드의 파라미터를 그대로 사용하며 쿠키를 사용하지 않는 경우에는 파라미터의 url에 세션 ID를 쿼리 문자열로 추가하여 서버로 요청을 시도한다.
<a href = " <%= response.encodeURL( "test.jsp" ) %> "> URL Rewriting</a>
■ public String encodeRedirectURL( String url )
: encodeRedirectURL() 메서드는 다음의 sendRedirect() 메서드를 위해 제공되는 메서드로 쿠키를 사용하지 않는 클라이언트인 경우에도 클라이언트와 서버 간에 세션을 유지하기 위해 자동으로 세션 ID를 쿼리 문자열로 포함시킨 URL을 리턴시켜 준다.
(6) 기타 메서드
■ public void sendRedirect( String location ) throws IOException
: 클라이언트로 302(SC_MOVED_TEMPORARILY) 상태 코드를 전생호 해당 클라이언트가 지정된 URL(location)로 재요청을 할 수 있도록 한다.
※ 액션의 forward와 동일한 효과를 얻을 수 있다.
ex) response.sendRedirect("http://..........");
다. 출력(out)
: out 내장 객체는 HTTP 요청을 처리하여 그 결과를 해당 클라이언트로 전송할 때 사용하는 출력 스트림 객체이다.
(1) 버퍼 메서드
: 여기의 메서드는 page 지시어의 buffer 속성과 관련된 메서드이다.
■ public abstract void clear() throws IOException
: 출력 버퍼의 내용을 지운다.
만일 출력 버퍼의 내용이 flush 되어 클라이언트로 이미 전송된 경우에는 IOException이 발생한다.
■ public abstract void clearBuffer() throws IOException
: clear(I) 메서드와 동일한 기능을 수행하는데, 차이점은 flush되었어도 IOException이 발생하지 않는다.
■ pulbic abstract void flush() throws IOException
: 출력 버퍼의 내용을 클라이언트로 전송한다.
■ public abstract void close() throws IOException
: 출력 버퍼의 내용을 flush 하고 닫는다.
■ public boolean isAutoFlush()
: page 지시어의 autoFlush 속성에 설정된 값을 리턴한다.
■ public int getBufferSize()
: page 지시어의 buffer 속성에 설정된 값을 바이트 단위로 리턴한다.
만일 설정된 값이 “none" 인 경우에는 0을 리턴한다.
■ public abstract int getRemaining()
: 출력 버퍼의 남은 양을 바이트 단위로 리턴한다.
(2) 전송 메서드
: 아래의 메서드는 넘겨진 파라미터의 타입에 관계없이 문자열로 자동 변환되어 클라이언트로 전송한다.
웹의 특성상 구분자는 무시된다. 그러므로 print() 메서드와 println() 메서드는 출력상의 차이는 없다.
■ abstract void print(xxx)
■ abstract void println(xxx)
ex)
<% out.println(" 출력할 문자열 “) out.flush(); %> |
라. 페이지(page)
: page 내장 객체는 JSP 컨테이너에 의해 생성된 서블릿 인스턴스 객체 자신을 참조하는 레퍼런스 객체이다.
따라서 page 내장 객체는 변환된 서블릿 클래스의 멤버 변수나 메서드를 이용할 수 있다.
이러한 page 내장 객체는 JSP 페이지를 작성하는 스크립트 언어가 자바 이외의 언어일 경우를 위해서다.
그러므로 page 내장 객체는 거의 사용되지 않는다.
마. 페이지 컨텍스트(pageContext)
: pageContext 내장 객체는 JSP 페이지의 내장 객체를 얻거나 HTTP 요청을 처리하는 제어권을 다른 페이지로 넘겨주는 역할.
(1) 내장 객체를 구하는 메서드
■ public abstract JspWriter getOut()
: HTTP 응답 출력 스트림인 out 내장 객체를 리턴한다.
■ public abstract HttpSession getSession()
: 해당 페이지를 요청한 클라이언트의 세션 정보를 가지고 있는 session 객체를 리턴한다.
■ public abstract java.lang.Object getPage()
: 해당 페이지의 생성된 서블릿 인스턴스인 page 객체를 리턴한다. ( Object 타입으로 리턴 )
■ public abstract ServletRequest getRequest()
: 클라이언트의 HTTP 요청 정보를 가지고 있는 request 내장 객체를 리턴한다.
■ public abstract ServletResponse getResponse()
: HTTP 요청에 대한 응답 객체인 response 내장 객체를 리턴한다.
■ public abstract java.lang.Exception getException()
: page 지시어의 errorPage 속성을 사용한 페이지에서 HTTP 요청을 처리하는 도중에 예외가 발생하면 errorPage 속성에 설정된 에러 페이지에 예외 객체를 전달한다.
이 때 전달된 그 예외 객체를 리턴한다. 즉, 내장 객체인 exception을 리턴한다.
■ public abstract ServletConfig getServletConfig()
: 해당 서블릿의 초기 정보를 가지고 있는 config 내장 객체를 리턴한다.
■ public abstract ServletContext getServletContext()
: 해당 서블릿의 환경과 관련된 정보를 가지고 있는 application 내장 객체를 리턴한다.
(2) HTTP 요청 처리 제어권 관련 메서드
■ public abstract void forward( String relativeUrlPath ) throws ServletException, IOException
: 클라이언트의 HTTP 요청을 처리하는 제어권을 영구적으로 다른 페이지에 위임한다.
액션(Action)의 forward와 동일한 기능을 수행한다.
<% pageContext.forward("JSPHello.jsp"); %> <jsp:forward page="JSPHello.jsp" /> |
■ public abstract void include( String relativeUrlPath ) throws ServletException, IOException
: 클라이언트의 HTTP 요청을 처리하는 제어권을 임시로 다른 페이지에 위임한 후 다시 그 제어권을 돌려 받는다.
액션(Action)의 include와 동일한 기능을 수행한다.
<% pageContext.include("JSPHello.jsp"); %> <jsp:include page="JSPHello.jsp" flush="true" /> |
※ include() 메서드 호출 전에 출력 버퍼에 기록한 내용은 flush() 메서드를 이용해 모두 클라이언트로 전송해야 한다.
pageContext 내장 객체의 메서드보다는 액션(Action) 태그를 더 선호하는 편이다.
바. 세션(Session)
: 세션이란 웹 서버와 각각의 클라이언트와의 정보를 지속적으로 관리하기 위한 기술. 세션 객체의 속성을 이용하여 기록.
쿠키의 문제점
■ 클라이언트 상에 정보가 기록되는 보안상의 문제
■ 쿠키의 개수 제한
세션은 각각의 클라이언트 별로 고유한 세션 ID를 생성하여 클라이언트에 쿠키로 전송하는 것이다. 실제적인 자료는 서버가 가지고 있고, 이를 구분하는 키인 세션 ID는 클라이언트와 서버 모두 존재하는 것이다.
session 객체를 false로 설정한 경우 개발자가 직접 이러한 선언을 해야 한다.
HttpSession session = request.getSession(true);
■ public String getId()
: JSP 컨테이너에 의해 생성된 세션 ID를 리턴한다.
■ public long getCreationTime()
: 1970년 1월 1일 00시 00분 00초를 기준으로 세션이 생성된 시간을 밀리초로 리턴한다.
■ public long getLastAccessedTime()
: 1970년 1월 1일 00시 00분 00초를 기준으로 클라이언트의 요청이 마지막으로 시도된 시간을 밀리초로 리턴한다.
■ public void setMaxInactiveInterval( int interval )
: JSP 컨테이너는 일정시간 클라이언트의 요청이 없는 경우 세션을 무효화(Invalidate) 시키는데, 그 시간을 초단위로 설정.
만일 음수로 설정하면 해당 세션은 무효화되지 않는다.
■ public int getMaxInactiveInterval()
: setMaxInactiveInterval() 메서드에서 설정한 시간을 리턴한다.
■ public boolean isNew()
: JSP 컨테이너에 의해 세션이 생성되고 아직 클라이언트로 전송되지 않았다면 True를 리턴하고, 아니면 False를 리턴한다.
■ public void invalidate()
: 해당 세션을 제거한다.
사. 서블릿 환경 (Config)
: JSP/서블릿 컨테이너는 서블릿이 최초로 메모리에 로드될 때 서블릿의 초기화와 관련된 정보를 해당 서블릿에게 전달한다.
이 때 전달되는 정보가 바로 config 내장 객체이다.
config 내장 객체는 ServletContext 객체, application 내장 객체 등을 포함하고 있다.
page 내장 객체와 마찬가지로 거의 사용되지 않는다.
■ public ServletContext getServletContext()
: ServletContext 객체를 리턴한다.
■ public String getInitParameter( String name )
: 서블릿의 초기화 파라미터 중 해당되는 이름의 값을 리턴한다. 파라미터가 존재하지 않는 경우 NULL을 리턴한다.
■ public Enumeration getInitParameterNames()
: 서블릿의 초기화 파라미터들에 대한 이름을 Enumeration 객체로 리턴한다.
아. 어플리케이션(application)
: Application 내장 객체는 서블릿이 수행되는 서블릿/JSP 컨테이너와의 통신을 위해 제공되는 객체로 config 내장 객체를 통해 ServletContext 인터페이스 타입으로 생성이 된다.
(1) 서블릿 실행 환경 관련 메서드
■ public int getMajorVersion()
: 웹 어플리케이션 서버가 지원하는 자바 서블릿 API의 Major 버전을 리턴한다.
■ public int getMinorVersion()
: 웹 어플리케이션 서버가 지원하는 자바 서블릿 API의 Minor 버전을 리턴한다.
■ public String getServerInfo()
: 서블릿이 실행되고 있는 서블릿/JSP 컨테이너의 이름과 버전을 리턴한다.
(2) 서버 자원 관련 메서드
■ public String getMimeType( String file )
: 문자열로 주어진 파일에 대한 MIME 타입을 리턴한다.
■ public URL getResource( String path ) throws MalformedURLException
: 주어진 경로에 매핑되는 자원을 URL 객체로 리턴한다. 만일 자원이 없는 경우 NULL을 리턴한다.
■ public InputStream getResourceAsStream( String path )
: 주어진 경로에 매핑되는 자원을 InputStream 객체로 리턴한다. 만일 자원이 없는 경우 NULL을 리턴한다.
■ public String getRealPath( String path )
: 주어진 가상 디렉토리의 실제 경로를 리턴한다.
■ public String getInitParameter( String arg )
: 웹 어플리케이션 초기화 파라미터를 읽어온다. (web.xml에 설정된 파라미터를 읽어온다.)
(3) 로그 메서드
■ public void log( String msg )
: 서블릿/JSP 컨테이너에 지정된 서블릿 로그 파일에 주어진 메시지를 기록한다.
■ public void log( String message, Throwalbe throwable )
: 서블릿/JSP 컨테이너에 지정된 서블릿 로그 파일에 주어진 메시지를 기록한다. 그리고 throwable 예외 객체도 함께 넘겨주는데, 이는 예외 사항에 대한 스택 트레이스 정보를 로그 파일에 함RP 기록하기 위함이다.
자. 예외(exception)
: HTTP 요청을 처리하는 도중에 예외가 발생하면 errorPage 속성에 설정된 에러 페이지에 예외 객체(exception)을 전달한다.
exception 내장 객체에 접근하기 위해서는 해당 에러 페이지는 page 지시어의 isError Page 속성값을 True로 설정해야 한다.
■ public String getMessage()
: 예외가 발생된 경우의 에러 메시지를 리턴하는데, 만일 에러 메시지가 없는 경우 NULL을 리턴한다.
■ public String toString()
: 예외가 발생된 경우의 에러 메시지를 리턴하는데 발생된 예외의 클래스 명도 함께 리턴한다.
■ public void printStackTrace()
: 표준 에러 출력 스트림으로 스택 트레이스 정보를 출력한다.
■ public void printStackTrace( PrintStream s )
: 지정된 출력 스트림(s)으로 스택 트레이스 정보를 출력한다.
■ public void printStackTrace( PrintWriter s )
: 지정된 PrintWriter 객체의 s로 스택 트레이스 정보를 출력한다.
차. 내장 객체의 속성
: 속성을 한마디로 표현하자면 일종의 ‘자료 저장소’ 라고 할 수 있겠다.
이러한 자료 저장소에 자료가 저장되려면 어떤 자료 저장 구조를 가지고 있을 것이다. [표 5-4]
즉, 저장된 자료를 구분하는 키인 속성 이름(Attribute Name)과 속성값(Attribute Value)으로 구성되어 있다.
범위 | 속성 | |
이름(키) | 값 | |
page | Name1 | Value1 |
Name2 | Value2 | |
request | ... | ... |
session | ... | ... |
application | ... | ... |
[표 5-4] 자료 저장 구조
자료 저장소에 저장된 자료는 저장한 주체(내장 객체)에 따라 자료를 사용할 수 있는 범위가 결정된다.
pageContext, request, session, application 내장 객체는 각각 속성(자료 저장소)이란 것을 가지고 있는데, 여기에 저장된 속성값은 내장 객체에 따라 [표 5-5]와 같이 사용 범위(유효 범위)가 결정된다.
[표 5-5] 내장 객체 속성의 유효 범위
유효범위 | 설명 | 관련 내장객체 |
page | 클라이언트의 요청을 해당 페이지가 실행하고 있는 동안 유효하다. | pageContext |
request | 클라이언트의 요청을 실행하고 있는 동안 유효하다. 엄밀히 얘기하면 HttpRequest 객체가 존재하는 동안이다. 따라서 요청을 다른 페이지로 위임한 경우에도 HttpRequest 객체가 존재하므로 유효하다. | request |
session | 세션이 살아있는 동안 유효하다. | session |
application | 서블릿/JSP 컨테이너가 실행되고 있는 동안 유효하다. | application |
※ pageContext, request, session, application 내장 객체의 공통된 속성 관련 메서드
■ public Object getAttribute( String name )
: 주어진 이름의 속성값을 Object 객체 타입으로 리턴한다.
■ public Enumeration getAttributeNames()
: 속성에 대해 이름들을 Enumeration 객체 타입으로 리턴한다.
■ public void setAttribute( String name, Object object )
: 해당 이름의 속성값을 설정한다.
■ public void removeAttribute( String name )
: 주어진 이름의 속성을 제거한다.
7. 액션(Actions)
: 현재 실행되는 JSP 페이지에서 다른 JSP 페이지를 실행할 수 있는 방법. XML 기반의 태그로 구현된다.
■ forward
■ include
■ useBean
※ forward, include 액션은 pageContext 내장 객체의 메서드로도 존재하는데, 동일한 기능을 수행한다.
가. forward 액션
: 클라이언트의 HTTP 요청을 처리하는 제어권을 영구적으로 다른 페이지로 위임하는 액션이다.
※ 클라이언트의 HTTP 요청 정보(파라미터)를 forward 된 페이지에서도 접근할 수 있다.
나. include 액션
: 클라이언트의 HTTP 요청을 처리하는 제어권을 임시로 다른 페이지로 위임한 후 다시 그 제어권을 돌려받는 액션이다.
화면과 관련된 부분은 자바를 이용할 수 없고 JSP로 개발해야 한다.
include 액션의 기능을 활용하면 프리젠테이션 부분도 어느 정도는 모듈화가 가능하다.
※ include 액션이 실행되기 전에 응답 출력 버퍼에 기록한 내용을 클라이언트로 전송하도록 flush 속성을 True로 설정한다.
지시어(Directive)에서 page 지시어 말고도 include 지시어도 존재한다.
<%@ include file="JSPHello.jsp" %>
※ include 지시어는 정적이고, include 액션은 동적이다.
8. JSP와 자바빈즈(JavaBeans)
가. 자바빈즈에 대해서
: 자바빈즈는 컴포넌트 기술의 한 형태이며, 재사용 가능한 어플리케이션을 구축 할 수 있도록 해 준다.
※ 자바빈즈와 EJB는 비즈니스 로직을 처리하기 위한 컴포넌트로 일반적으로 동일한 역할을 수행하지만 차이가 있다.
EJB는 서버 측 모델을 의미하며 자바빈즈는 클라이언트 측 모델을 의미한다.
나. 자바빈즈의 기본 구조
: 자바빈즈는 3가지 기본 구조로 이루어져 있다.
■ 프로퍼티(Properties)
■ 메서드(Method)
■ 이벤트(Events)
자바빈즈 스펙에 따라 기술을 해야한다.
■ 자바빈즈는 abstract이 없어야 한다.
■ 파라미터가 없는 디폴트 생성자(constructor)와 public 메서드(getter/setter)를 구현해야 한다.
■ 자바빈즈를 네트워크를 통해 전달하기 위해서는 Serializable를 구현해야 한다.
(1) 프로퍼티(Properties)
: 프로퍼티는 멤버 변수와 같은 개념이며, 프로퍼티의 속성(read/write)에 따라 관련된 메서드(getter/setter)를 정의할 수 있으며, 이름 명명 규칙이 또한 달라진다.
[표]프로퍼티 속성에 따른 메서드 정의
프로퍼티 속성 | 메서드 정의 | 명명 규칙 |
read | public type getXxx() | Xxx는 프로퍼티 이름과 동일하며 처 글자는 반드시 대문자를 사용 |
write | public void setXxx() |
※ 자바빈즈 스펙에 따라 프로퍼티를 분류하면 네 가지로 나눌 수 있다. 그 중 두 가지가 Simple, Indexed 프로퍼티
■ Simple 프로퍼티
: 일반적인 프로퍼티.
■ Indexed 프로퍼티
: 프로퍼티가 배열 타입일 경우를 말한다. 이때는 인덱스 번호를 가지고 프로퍼티의 값을 구분하게 된다.
(2) 메서드(Method)
: 자바빈즈에서의 메서드는 getter/setter 메서드와 일반 메서드로 구분할 수 있다.
(3) 이벤트(Events)
: 사용자에 의해 어떤 행위가 발생되었을 때 이를 빈에게 알려주는데, 빈은 이에 반응하여 이벤트 핸들러 메서드에서 관련 작업을 처리한다.
주로 Visible 빈을 제작할 경우에 사용된다.
다. useBean 액션
: useBean 액션은 자바빈즈를 생성하고 getter/setter 메서드를 호출하는 태그로 구성되어 있다.
(1) <jsp:useBean> 태그
: 빈의 인스턴스를 생성하기 위해선 <jsp:useBean> 태그를 사용한다.
이 태그는 사용하고자하는 빈 타입의 객체를 선언하고 생성시켜 주는 역할을 하며 다양한 속성을 제공한다.
■ useBean 태그의 속성 및 사용
■ id="beanInstanceName"
: 생성될 빈의 인스턴스 이름으로 표현식(expression)이나 스크립트릿에서 사용된다.
만일 같은 id로 선언된 변수가 존재한다면 JSP 컨테이너에 의해서 IOException이 발생하여 서블릿으로 변환할 수 없다.
■ scope="page | request | session | application"
: 해당 빈 인스턴스를 참조할 수 있는 범위를 말하며, 내장 객체의 속성에서 언급한 유효 범위와 동일한 개념이다.
디폴트 갑은 “page”로 설정되어 있다.
■ class="package.class"
: class 속성값은 사용하고자 하는 자바빈즈의 클래스 이름을 풀 패키지 명으로 기술하면 된다.
■ class="package.class" type="package.class"
: type의 클래스 타입 변수를 선언하고 class의 빈 클래스를 생성하여 이를 대입한다.
즉, type 속성의 값은 class 속성값과 동일하거나 class 속성의 값인 클래스의 슈퍼 클래스일 수도 있다.
type의 값이 슈퍼 클래스인 경우에는 자동으로 형 변환이 일어난다.
■ beanName="{ package.class | <%= expression %> }" type="package.class"
: 빈의 이름을 정하는 곳으로 java.beans.Beans.instantiate() 메서드의 파라미터와도 동일하다.
instantiate() 메서드는 빈을 생성하는 메서드이다.
■ type="package.class"
: type 속성만을 사용하는 경우에는 해당 빈이 어떤 타입으로 생성되었는지 명확하지 않을 때 슈퍼 클래스를 지정함으로서 해당 빈을 모두 사용할 수 있다.
(2) <jsp:setProperty> 태그
: 빈의 속성값을 설정할 경우에 사용되는 태그로 빈의 setter 메서드와 동일한 역할을 수행한다.
<jsp:setProperty> 태그를 사용하기 위해서는 <jsp:useBean> 태그로 반드시 생성되어 있어야 하며 setter 메서드가 있어야 함.
■ setProperty 태그의 속성 및 사용
■ name="beanInstanceName"
: 사용하고자 하는 빈 인스턴스의 이름으로 <jsp:useBean> 태그의 id 값과 일치해야 한다.
■ property="propertyNam" value="{String | <%= expression %>}"
: 사용하고자 하는 빈의 해당 속성에 값을 설정한다. 즉, value 값을 파라미터로 하는 빈의 setter 메서드를 호출함을 의미한다.
그리고 String 타입인 value 값은 빈 setter 메서드의 파라미터 타입과 일치하도록 형 변환을 해 주어야 하는데, 자동으로 된다.
※ 만일 value 값을 설정하지 않으면 클라이언트의 요청 파라미터 중에 property 나 param 속성에 설정된 값과 매칭되는 파라미터로 설정된다.
■ property="propertyName" [ param="parameterName" ]
: 클라이언트가 GET/POST 방식으로 파라미터를 넘겨주면 그 중에서 param에 정의된 값과 동일한 파라미터 이름을 찾아 빈의 해당 속성에 값을 설정한다.
만일 value 값을 설정하지 않으면 클라언트의 요청 파라미터 중에 property나 param 속성에 설정된 값과 매칭되는 파라미터로 설정된다. 그리고 넘어온 파라미터의 값이 비어 있거나 NULL인 경우에는 빈의 속성 값은 설정되지 않는다.
※ 클라이언트로 넘어오는 모든 파라미터의 타입은 String 타입이므로 해당 빈의 setter 메서드의 파라미터 타입과 다른 경우에는 형 변환을 해 주어야 한다. 대부분 자동으로 변환하므로 필요는 없다.
■ property="*"
: 클라이언트로부터 넘어오는 모든 파라미터의 이름을 검사하여 빈의 속성 이름과 일치하는 setter 메서드를 호출한다.
일반적으로 이러한 파라미터는 HTML 페이지의 FORM 태그 구성 요소의 이름이다.
<3> <jsp:getProperty> 태그
: <jsp:getProperty> 태그는 빈의 속성값을 얻기 위한 태그로 빈의 getter 메서드와 동일한 역할을 수행한다.
<jsp:useBean> 태그로 빈이 생성되 있고, 생성된 빈은 getter 메서드가 정의되어 있어야 한다.
그리고 조회된 값은 JSP 페이지 내에 삽입된다. indexed 프로퍼티 값은 조회할 수 없다.
■ getProperty 태그의 속성 및 사용
■ name="beanInstanceName"
: 사용하고자 하는 빈 인스턴스의 이름으로 <jsp:useBean> 태그의 id 값과 일치해야 한다.
■ property="propertyName"
: 조회하고자 하는 빈의 속성 이름을 설정한다. 즉 빈의 getter 메서드를 호출함을 의미한다.
9. 세션(Session) 관리
: HTTP 프로토콜은 연결이 없고(connectionless) 상태를 유지하지 않는(stateless) 특성을 가지고 있다.
특성 | 설명 |
connectionless | 네트워크 연결을 지속적으로 유지하지 않는다. 한번의 요청과 그에 대한 응답으로 연결은 종료된다. |
stateless | 서버와 클라이언트 간에 연결된 상태 정보를 유지하기 위한 메모리를 보유하고 있지 않다. |
※ HTTP 프로토콜 특성 하에서 클라이언트의 상태 정보를 유지하고 관리하는 3가지 방법
- 폼(FORM)의 Hidden 타입
- 쿠키(Cookie)
- 세션(Session)
가. Hidden Type
: Hidden 타입은 <FORM> 태그 내에 존재하는 <INPUT> 태그의 type 속성을 “hidden"으로 설정하고, value 속성에 설정된 값을 POST 방식으로 서버로 전송해 클라이언트의 상태 정보를 유지하는 기법이다. HTML 코드에 포함되어 보안상 문제.
Hidden 타입을 이용하는 경우
■ 서버로 전송하고자 하는 정보의 양이 적거나
■ Hidden 타입의 값을 사용자가 보아도 무방한 경우
■ 모든 페이지가 아닌 특정 페이지에서만 필요로 하는 경우
나. 쿠키 (Cookie)
(1)쿠키에 대하여
: 서버와 연결되지 않은 상태에서 클라이언트의 상태 정보를 유지하는 원리는 매 요청마다 유지하고자 하는 정보를 서버로 전송하는 것이다.
상태 정보를 클라이언트에 텍스트 형식으로 저장하여 관리를 한다. 쿠키는 클라이언트에 저장된 상태 정보를 자동으로 서버로 전생해 준다는 것이며 Hiiden 타입은 개발자가 직접 구현해 주는 것이다.
쿠키가 처리 되는 과정
① 브라우저(클라이언트)에서 서버로 HTTP 요청을 한다.
② 서버는 클라이언트의 요청 메시지를 처리하고 유지하고자 하는 상태 정보를 HTTP 응답 메시지의 헤더에 포함(쿠키설정)하여 브라우저(클라이언트)로 전송한다.
③ 브라우저(클라이언트)는 서버로부터 전송받은 HTTP응답 메시지의 헤더에 설정된 상태 정보(쿠키)를 읽어 메모리나 디스크에 저장한다.
④ 브라우저(클라이언트)는 쿠키를 설정한 서버로 HTTP 요청을 재시도한다. 이EO 이전에 설정된 상태 정보(쿠키)를 HTTP 요청 메시지의 헤더에 포함하여 요청을 한다.
⑤ HTTP 요청 메시지를 받은 서버는 요청 메시지의 헤더에 포함된 클라이언트의 상태 정보(쿠키)를 읽어 처리한다.
쿠키를 사용하여 얻을 수 있는 이점
■ 상태 정보 유지 모델이 단순해진다.
■ 각각의 클라이언트에 따라 다른 처리를 할 수 있다.
■ 상태 정보의 보안 및 유효기간 등을 설정하여 관리할 수 있다.
(2) 쿠키의 설정
: 쿠키의 설정은 일반적으로 서버측에서 이루어지며 클라이언트의 HTTP 요청에 대해 HTTP 응답 메시지를 보낼 때 메시지의 헤더에 쿠키 헤더를 포함하여 전송을 한다. 쿠키의 설정은 바로 HTTP 응답 메시지의 헤더에 쿠키 헤더를 포함시키는 것을 의미한다.
쿠키를 설정하는 방법 2가지
■ 직접 응답 메시지 헤더에 쿠키를 설정하는 것
■ 서블릿 API를 이용하여 쿠키를 설정하는 것 ( 일반적인 경우 )
(3) HTTP 응답 메시지 헤더를 이용한 쿠키 설정
■ Set-Cookie 헤더 형식
Set-Cookie : name=value; expires=date; domain=damain_name; path=path; secure
■ 사용 예
response.addHeader("Set-Cookie", "id=1234; path=/test/jsp" );
다음 클라이언트에서 HTTP 요청 메시지의 헤더에 쿠키가 포함된 모습
Cookie : name1=value1; name2=value2; ....
■ name=value 속성
: 쿠키의 이름과 값을 설정하는 것이다. response.addHeader("Set-Cookie", "id=1234");
생략 가능 ( 디폴트 유효기간은 사용자의 세션이 종료될 때까지 유효 )
■ expires=date 속성
: 클라이언트에 저장된 쿠키의 유효기간을 설정하는 속성
wdy, day-mon-year HH:MM:SS GMT(요일, 일-월-년 시: 분: 초 그리니치 표준시)
ex)response.addHeader( "Set-Cookie", "id=1234; expires=Monday, 11-Mar-01 15:33:20 GMT" );
■ domain=domain_name 속성
: 클라이언트에서 저장된 쿠키들 중에서 해당 사이트에서 설정한 쿠키를 구분하기 위해서 사용되는 속성이 doamin이다.
생략 가능 ( 디폴트 설정은 서버의 도메인으로 설정된다. )
ex)response.addHeader( "Set-Cookie", "id=1234; domain=www.daum.net;" );
■ path = path 속성
: path 속성은 domain 속성과 같은 의미로 사용되는 속성으로 쿠키를 설정한 서버의 디렉토리까지 구분을 한다.
■ secure 속성
: secure 속성은 보안과 관련된 속성으로 HTTP 연결이 SSL(Secure Sockets Layer)과 같이 암호화된 네트워크를 통해서만 쿠키를 전송한다. 생략 가능
(4) 서블릿 API를 이용한 쿠키 설정
: 서블릿의 API를 이용한다는 것은 직접 Set-Cookie, Cookie 헤더를 참조하는 것이 아니라 쿠키 사용의 편의를 위해 제공되는 javax.servlet.http.Cookie 클래스를 이용한다는 것이다.
■ public Cookie( String name, String value )
: 초기의 name과 value를 쌍으로 하는 쿠키를 정의한다. 즉, Cookie 클래스의 생성자이다.
ex)Cookie cookie = new Cookie("id", "1234");
response.addCookie( cookie );
■ public void setDomain( String pattern )
: 서버의 도메인을 설정한다. 브라우저가 서버로 요청시 헤더에 쿠키를 포함할 것인지 판단하는 기준이 된다.
■ public String getDomain()
: 쿠키의 도메인을 리턴한다.
■ public void setMaxAge( int expiry )
: 클라이언트에 저장된 쿠키의 유효 기간을 초 단위로 설정한다. “0”으로 설정할 경우 해당 쿠키를 즉시 삭제한다.
■ public int getMaxAge()
: 쿠키의 유효 기간을 초단위로 리턴한다. 만일 설정된 값이 없으면 음수를 리턴한다.
■ public void setPath( String url )
: 서버의 패스를 설정한다. setDomain()을 사용하는 이유와 같다.
■ public String getPath()
: 설정된 쿠키의 패스를 리턴한다.
■ public void setSecure( boolean flag )
: setSecure() 메서드의 flag 값을 true로 지정하면 보안 프로토콜을 사용하여 쿠키를 전송하도록 설정된다.
■ public boolean getSecure()
: setCure() 메서드에서 설정한 값을 리턴한다.
■ public String getName()
: Cookie() 생성자로 생성한 쿠키의 이름을 리턴한다. 쿠키를 생성한 이후에는 이 이름을 변경할 수가 없다.
■ public void setValue( String new_Value )
: 쿠키의 값을 생성자에서도 설정할 수 있지만 setValue() 메서드에서도 설정할 수 있다.
■ public String getValue()
: 쿠키에 설정되 값을 리턴한다. 하나의 쿠키값만을 리턴하므로 쿠키 목록을 얻기 위해서는 이용할 수 없다.
(5) 쿠키의 생명
: 일반적으로 메모리에 저장되는 쿠키는 클라이언트와 서버간에 세션이 유지되는 동안 존속하게 되는데, 다음의 경우에는 세션이 자동 종료되며 쿠키 또한 메모리에서 사라진다.
■ 요청을 시도한 브라우저를 종료한 경우
■ 다른 URL로 이동한 경우
■ 일정시간 요청을 시도하지 않는 경우
■ 서버가 다운된 경우
그리고 디스크에 저장되는 쿠키는
■ 유효기간이 만료된 경우이거나
■ 쿠키의 최대 저장 개수를 초과하였을 경우
자동으로 삭제된다.
(6) 쿠키의 제한
: Hidden 타입을 이용하여 클라이언트의 상태 정보를 유지하는 것보다 쿠키를 사용하는 것이 효율적임을 알았을 것이다. 하지만 이러한 쿠키에도 여러 가지 제약 사항이 있다.
▣ 최대 300개 까지만 저장이 가능하다.
▣ 각 쿠키는 4KB 이상을 초과하여 저장할 수 없다.
▣ 서버의 도메인 별로 최대 20개까지만 저장이 가능하다.
▣ 만일 쿠키를 저장할 수 있는 최대 저장 개수를 초과하면 이전에 설정된 쿠키는 LRU(Least Recently Used) 방식에 의해 최근에 가장 적게 사용된 쿠키를 기준으로 삭제된다.
5.3 세션(Session)
: 세션은 익스플로러 버전 5.0 이상에서 지원을 한다.
(1) 세션에 대하여
: 세션과 쿠키의 대표적인 차이점이라면 상태 정보가 저장되는 위치라 하겠다. 세션은 상태 정보를 서버측에 저장하고 관리를 한다. 그러므로 안전하다.
① 브라우저에서 서버로 HTTP 요청을 한다.
② 서버는 요청을 시도한 해당 클라이언트의 고유한 세션 ID를 생성하고 유지하고자 하는 상태 정보를 저장한다. 그리고 생성된 세션 ID를 HTTP 응답 메시지의 헤더에 포함(쿠키설정)하여 브라우저(클라이언트)로 전송한다.
③ 브라우저는 서버로부터 전송받은 HTTP 응답 메시지의 헤더에 설정된 세션 ID를 읽어 메모리에 저장한다.
④ 브라우저는 세션 ID를 설정한 서버로 HTTP 요청을 재시도한다. 이때 이전에 설정된 세션 ID를 HTTP 요청 메시지의 헤더에 포함하여 요청을 한다.
⑤ HTTP 요청 메시지를 받은 서버는 요청 메시지의 헤더에 포함된 클라이언트의 세션 ID를 읽어 해당 클라이언트를 구분하고 세션 ID별로 상태 정보를 관리한다.
(2) 세션의 유지와 관리
: 세션의 유지와 관리를 위해서는 request와 session 내장 객체의 메서드를 활용하면 된다.
(3) 세션의 생명
: 세션이 언제 무효화되는지 효율적인 자원관리를 위해 중요하다.
다음과 같은 경우에는 세션을 무효화시킨다.
▣ 요청을 시도한 브라우저가 종료된 경우
▣ 서버가 일정시간 클라이언트로부터 요청을 받지 못한 경우
▣ session.invalidate() 메서드를 호출한 경우
▣ 서버가 다운 된 경우
session.setMaxInactiveInterval() 메서드를 이용해 세션 유지 기간을 변경할 수 있다.