내장객체의 종류
내장 객체는 JSP 페이지 작성 시 자주 사용되는 기능들을 구현하기 위해 제공되며, 선언없이 내장객체 변수명을 통해 바로 사용할 수 있다.
변수명 : 타입 : 역할
request : javax.servlet.ServletRequest, javax.servlet.http.HttpRequest : 웹 클라이언트의 요청 정보를 저장
response : javax.servlet.ServeltResponse : 웹 클라이언트의 요청 정보를 처리하는 응답 정보를 저장
pageContext : javax.servlet.jsp.PageContext : 페이지 실행에 필요한 정보를 저장, forward 및 include 기능 실행 시 사용
out : javax.servlet.jsp.Jsp.JspWriter : JSP 페이지로부터 생성된 결과 출력 시 사용되는 출력 스트림
application : javax.servlet.ServletContext : 웹 서버 내 동일 애플리케이션 처리 정보를 저장
config : javax.servlet.ServletConfig : 현재 JSP 페이지에 대한 서블릿 설정 정보를 저장
page : java.lang.Object : 현재 JSP 페이지의 서블릿 객체, 즉 현재 페이지에 대한 참조변수
exception : java.lang.Throwable :예외 처리 객체
session : javax.servlet.http.HttpSession : 클라이언트에 대한 HTTP 세션 정보를 저장
이러한 내장 객체들을 선언없이 사용할 수 있는 것은 JSP 페이지가 서블릿 형태의 클래스로 변환될 때 자동으로 생성되기 때문이다.
내장 객체의 동작
JSP의 내장객체는 서블릿으로 변환되면서 미리 정해진 이름으로 선언되거나 파라미터 형식으로 전달받기로 약속되어 있다.
서블릿 변환 시 자동으로 작성되는 _jspService() 메서드는 request와 response를 입력 파라미터 변수로 사용하고 앞서 보았던 나머지 내장 객체들도 _jspService() 메서드에서 선언과 초기화를 해주고 있음을 확인할 수 있다.
따라서 _jspService() 메서드에서 선언되는 내장 객체는 _jspService()가 로딩되기 전 멤버 변수와 멤버 메서드를 정의한 선언문(Declaration)에서는 사용할 수 없다.
JSP 페이지에서 직접 선언하지 않고도 내장객체 사용이 가능한 것은 앞서 살펴본 대로 JSP 페이지가 서블릿 형태의 클래스로 변환되면서 자동으로 약속된 참조 변수명으로 _jspService() 메서드 내에서 선언해주기 때문이다.
request 객체
동적 웹 서비스 내에서 웹 클라이언트가 웹 브라우저를 통해 웹 서버에게 요청을 보낼 때 웹 브라우저에서는 웹 클라이언트의 요청과 관련된 여러 데이터들을 HTTP 요청 메시지 형태로 구성하여 웹 서버에 전송하게 된다.
웹 서버는 전송받은 HTTP 요청 메시지를 분석한 후 요청 처리의 대상이 서블릿이나 JSP일 경우 요청에 대한 처리를 웹 컨테이너에게 위임한다.
웹 컨테이너는 웹 서버에게 넘겨받은 HTTP 요청 메시지를 통해 요청에 대한 일련의 정보들을 HttpServletRequest 타입의 객체에 담아 요청 처리 대상 서블릿 인스턴스에 파라미터 형태로 전달한다.
JSP 페이지 역시 요청 수행 전에 서블릿으로 변환한 후 인스턴스화되므로 최종적인 처리 과정은 동일하다.
JSP 페이지의 내장객체읜 request의 타입도 서블릿과 동일한 javax.servlet.http.HttpServletRequest이므로 사용방법은 동일하다.
JSP 페이지의 request 내장 객체는 서블릿 클래스에서 프로그래머가 재정의해야 했던 doGet과 doPost 메서드의 첫 번째 파라미터와 동일한 역할을 하며 주로 HTML 폼이나 HTTP 요청 메시지에 담긴 헤더정보와 웹 클라이언트, 웹 서버 관련 정보를 가져올 때 사용한다.
(1) 요청 전송 정보
웹 클라이언트가 웹 브라우저를 통해 웹 서버에 요청을 전송하기 위해서 HTTP 요청 메시지에 여러 가지 정보가 필요하여 이러한 정보들을 JSP 페이지에서 request 내장 객체들을 통해 확인할 수 있다.
아래는 request 내장객체가 HTTP 요청 메시지의 정보들을 확인하기 위해 제공하는 메서드들이다.
메서드 : 리턴타입 : 설명
getHeaderNames() : Enumeration : HTTP 요청 메시지 헤더에 저장된 모든 헤더 이름을 Enumeration 객체로 리턴
getHeader(String name) : String : HTTp 요청 메시지 헤더에 헤더 이름이 name인 요소가 가진 값을 리턴, 해당 헤더 이름이 존재하지 않을 경우 null 리턴
getHeaders(String name) : Enumberation : HTTP 요청 메시지 헤더에 헤더 이름이 name인 요소가 가진값들을 Enumeration 객체로 리턴
getProtocol() : String : 요청에 사용된 프로토콜 리턴
getMethod() : String : 요청방식(Get/Post)을 리턴
getContextPath() : String : 현재 JSP 페이지의 경로를 리턴
getRequestURI() : String : 요청 웹 클라이언트 URL의 도메인 이름과 쿼리스트링을 제외한 주소를 리턴
getRequestURL() : StringBuffer : 요청 웹 클라이언트 URL을 StringBuffer로 리턴
getQueryString() : String : 파라미터와 파라미터에 지정된 값을 포함한 요청 쿼리 스트링을 리턴
getRemoteHost() : String : 요청 웹 클라이언트의 호스트명을 리턴
getRemoteAddr() : String : 요청 웹 클라이언트의 IP 주소를 리턴
getServerName() : String : 요청 받은 웹 서버의 도메인 이름 리턴
getServerPort() : int : 요청 받은 웹 서버의 포트 번호 리턴
HTTP 요청 메시지의 헤더 정보를 확인하고자 할 때는 getHeaderNames() 메서드를 사용할 수 있으며 Enumeration 타입의 객체를 생성하여 hasMoreElements() 메서드를 사용해 헤더에 지정된 헤더이름들을 불러온 후 헤더 이름에 저장된 헤더값을 getHeader() 메서드를 통해 출력한다.
Enumeration 이란?
Enumeration 인터페이스는 객체들의 집합 (Vector)에서 여러 객체들을 하나씩 처리하는 메서드를 제공하는 컬렉션 타입이다.
저장된 객체 요소의 존재 여부에 따라 true나 false를 리턴하는 hasMoreElements()
다음 객체 요소를 반환하는 nextElement()메서드를 제공한다.
(2) 요청 파라미터 정보
회원가입 페이지나 게시판과 같은 대화형 웹 페이지는 HTTP 요청 메시지와 같이 요청 전송을 위한 기본 정보 외에 사용자가 직접 입력 혹은 선택한 여러 데이터의 값을 파라미터에 담아 전송하고 웹 서버에는 전달된 파라미터를 사용하자가 요청한 서비스를 수행하기 위한 데이터로 사용하게 된다.
request 내장 객체를 이용한 요청 파라미터 정보는 JSP 페이지 제작 시 필수적으로 사용되며 가장 빈번이 사용된다.
서블릿에서는 파라미터의 전달 방식은 Get방식과 Post방식에 따라 작성해야 하는 메서드가 달랐지만 JSP 페이지의 경우 Get방식이나 Post 방식에 상관없이 파라미터의 값을 가져오는 방법은 동일하여 request 내장 객체에서 요청 파라미터에 대한 정보를 가져와주는 메서드들은 다음과 같다.
메서드 : 리턴타입 : 설명
getParameter(String name) : String : 요청 시 name으로 지정된 파라미터의 값을 리턴, 해당 파라미터 이름이 존재하지 않을 시에는 null 리턴
getParameterValues(String name) : String[] : name으로 지정된 파라미터의 모든 값을 String 배열값으로 리턴 , 하나의 파라미터로 여러 개의 값을 가지는 checkbox와 같은 태그에 사용
getParameterNames() : Enumeration : 요청에 포함된 모든 파라미터의 이름을 Enumertaion 객체로 리턴
JSP 페이지 내부에서 웹 클라이언트에서 전송된 파라미터를 통해 데이터를 인식할 수 있다는 것은 자바의 다양한 기능에 해당 데이터를 활용할 수 있는 가능성을 내포하고 있다는 데 큰 의미를 지닌다.
이렇게 전달된 데이터들은 이후 JDBC를 통해 데이터베이스와 연계되면서 더욱 강력한 기능 구현이 가능하다.
이 외에도 request 내장 객체는 클라이언트의 요청 정보에 필요한 몇몇 값을 미리 저장할 때 사용되는 쿠키나 접속 유지를 위해 사용되는 세션과 관련된 메서드들도 제공하고 있다.
getCookie() : Cookie[] : 현재 요청에 포함된 모든 쿠기 객체를 배열에 저장하여 리턴
getSession() : HttpSession : 현재 요청의 최근 세션값을 리턴, 세션값이 할당되어 있지 않을 경우 새로운 세션값을 생성
getSession(boolean create) : HttpSession : 현재 요청의 최근 세션값을 리턴, 세션값이 할당되어 있지 않고 create의 값이 true일 경우 새로운 세션값을 생성
resopnse 객체
앞서 보았던 request 내장객체와 댕은되는 response 내장 객체는 웹 서버에서의 응답정보에 관련된 기능을 제공한다.
response 내장 객체는 서블릿 클래스에서 보았던 doGet()과 doPost() 메서드에 사용되는 두 번째 파라미터의 타입과 동일한 javax.servlet.http.HttpServletResponse 타입이므로 서블릿에서 사용하던 방식 그대로 사용한다.
JSP 페이지에서 response 내장객체를 사용하면 HTTP 응답 메시지의 헤더 정보 설정이나 페이지 리다이렉팅, 쿠키 추가 등의 기능 수행이 가능하다.
(1) 리다이렉트 페이지 이동
response 내장객체에서 자주 사용되는 메서드 중 하나인 sendRedirect() 메서드는 현재 JSP 페이지 실행을 중단하고 다른 웹페이지로 요청을 전송하여 페이지 이동 효과를 줄 수 있는 기능을 수행한다.
sendRedirect(String location) : void : 현재 페이자가 받은 요청을 다른 페이지로 재전송
이는 웹 서버측에서 웹 브라우저에게 다른 페이지로의 이동을 요청하는 것을 의미한다.
즉, 최초 요청에 대한 응답에 sendRedirect() 메서드가 사용되어 다른 페이지로 이동하게 되므로 최초 요청에 대한 처리 후 자동으로 웹 클라이언트에서 다른 페이지에 대한 요청을 새롭게 전송하게 되는 것이다.
따라서 웹 브라우저 측은 내부적으로 두 번의 요청을 전송하게 되는 효과를 가진다.
웹 브라우저에서 요청 파라미터로 지정되었던 값은 리다이렉트가 일어난 이후에는 없어진다.
이는 리다이렉트 방식이 새로운 요청을 내부적으로 발생시켜 기존의 request와 response 내장객체를 사용하기 않아 요청 파라미터의 값이 유지되지 않기 때문이다.
페이지 이동시에도 이러한 요청 정보들을 유지하려면 포워딩 기법이나 인클루드 기법을 사용한다.
(2) HTTP 응답 메시지 헤더 정보
HTTp 요청 메시지 정보를 제공해줄 수 있는 메서드를 가진 request 내장객체와는 반대로 response 내장객체는 HTTP 응답 메시지 헤더의 값을 지정해줄 수 있는 메서드들을 가지고 있다.
setHeader(String name, String value) : void : 이름이 name인 헤더의 값을 String 타입의 value로 지정
setIntHeader(String name, int value) : void : 이름이 name인 헤더의 값을 int 타입의 value로 지정
setDataHeader(String name, long date) : void : 이름이 name인 헤더의 값을 long타입의 date로 지정(실제 지정되는 값은 날짜를 표현하는 밀리초 단위를 의미)
addHeader(String name, String value) : void : 이름이 name인 헤더에 String 타입의 value값을 추가
addintHeader(String name, int value) : void : 이름이 name인 헤더에 int 타입의 value를 추가
addDateHeader(String name, long date) : void : 이름이 name인 헤더에 long 타입의 date 값을 추가(실제 지정되는 값을 날짜를 표현하는 밀리초 단위를 의미)
containsHeader(String name) : void : 이름이 name인 헤더가 존재하면 true, 그렇지 않다면 false를 리턴
getHeaderNames() : Collection : 현재 response객체의 헤더의 이름 집합을 String 타입으로 지정된 Collection 객체로 리턴
getHeaders(String name) : Collection : 이름이 name인 헤더의 값 집합을 String 타입으로 저장된 Collection 객체로 리턴
response 내장 객체에서 사용 가능한 HTTP 응답 메시지 헤더 관련 메서드들은 그 종류가 다양하지만 헤더에 추가 정보를 입력하는 경우를 제외하고는 JSP 페이지에서 사용되는 일은 드물다.
(3) 그 외의 메서드
response객체에는 앞서 보았던 리다이렉트나 헤더 정보에 관련된 메서드 외에도 응답 결과의 콘텐트 타입을 지정하거나 쿠키나 오류 코드에 관련된 기능을 수행하는 메서드를 제공하고 있다.
setContentType(String type) : void : 응답 결과 페이지의 contentType을 설정
addCookie(Cookie cookie) : void : 쿠리를 HTTP 응답 메시지 헤더에 추가
sendError(int status, String msg) : void : 페이지의 오류 코드를 세팅하고 메시지를 전송
getStatus() : int : 현재 response 객체의 최근 상태 코드 값을 int 타입으로 리턴
setStatus() : void : 현재 response 객체의 상태 코드를 지정
콘텐트 타입의 경우 앞서 알아본 page 지시자의 contentType 속성을 이용하는 방법과 동일하다.
response.setContentType("text/html");
웹 서비스의 동작은 요청과 응답이 번걸아 수행되며 진행되지만 웹 클라이언트가 어떤 요청을 보내느냐에 따라 응답이 수행되므로 request 내장 객체에 비해 response 내장 객체의 일반적인 활용도는 상대적으로 낮은 편이다.
Out 객체
out 내장 객체는 java.io.Writer 클래스를 상속받은 javax.servlet.jsp.JspWriter 타입으로 선언되는 객체로, 응답 페이지 제작에 사용되는 출력 스트림을 제공하여 사용자가 보게될 결과 화면을 구현하는데 직접적으로 사용되므로 서블릿 형태의 크랠스 변환 시 내부적으로 항상 사용된다.
out 내장 객체는 기본적으로 출력에 관련된 메서드들과 출력 버퍼에 관련된 메서드들을 가지고 있다.
(1) 출력
newLine() : void : 현재 위치에서 라인 구분자를 삽입
print(inputParameter) : void : boolean, char, char[], double, float, int, long ,Object , String 타입 데이터를 입력받아 출력
println(intputParemter) : void : boolean, char, char[], double, float, int, long ,Object , String 타입 데이터를 입력받아 출력 후 현재 라인 종료, 입력 파라미터를 사용하지 않을 경우 현재 라인을 종료
(2) 출력 버퍼
out 내장객체에서 다루는 출력버퍼란 응답 결과로 웹 브라우저에 전송되어 출력될 내용을 전송하기 전에 임시로 저장해주는 메모리로, page 지시자의 buffer와 autoflush 속성들은 모두 out 내장 객체의 출력 버퍼와 관련이 깊다.
출력버퍼를 사용하는 경우는 드물다.
getBufferSize() : int : 출력버퍼에 설정된 크기를 리턴
getRemaining() : int : 현재 출력 버퍼에 남은 크기를 리턴
flush() : void : 출력 버퍼의 내용을 출력 스트림을 통해 웹브라우저로 전송
isAutoFlush() : boolean : 출력 버퍼가 다 찼을 경우 자동 플러시 가능 여부를 boolean 타입으로 리턴
clear() : void : 출력 버퍼의 내용을 비움, 출력 버퍼가 플러시된 상태라면 IOException 발생
clearBuffer() : void : 출력 버퍼의 내용을 비움, 출력 버퍼가 플러시된 상태라도 IOException 발생시키지 않음
close() : void : 출력 버퍼의 내용을 플러시 후 스트림을 닫음
pageContext 객체
pageContext 내장 객체는 java.servlet.jsp.JspContext 클래스를 상속받은 javax.servlet.jsp.PageContext 타입으로 선언되는 객체이다.
JSP 페이지에 하나씩 존재하며 해당 페이지 내에서만 유효한 객체이며 다른 내장객체의 생성/접근 관련 기능을 제공한다.
또한 현재 페이지의 요청과 응답 제어권을 다른 페이지로 넘겨줌으로써 페이지의 흐름을 제어하는 기능을 수행하기도 하고, 특정 내장객체들의 속성을 제어하며 오류 데이터를 구하는 기능도 제공하는 등 하나의 JSP 페이지 영역 내에서 사용되는 여러 기능을 담당하고 있다.
(1) 내장객체 접근
pageContext 내장 객체가 제공하는 주요한 기능 중 하나는 다른 내장객체 접근과 생성에 관여한다는 것이다. 아래 pageContext 내장 객체의 메서드를 사용하면 pageContext 내장 객체만으로 다른 모든 내장객체에 접근하여 참조변수를 통해 사용이 가능하다.
getException : Exception : 현재 페이지의 exception 객체 리턴
getOut() : JspWriter : 현재 페이지의 out 객체 리턴
getPage() : Object : 현재 페이지를 통해 생성된 서블릿 인스턴스인 page 객체 리턴
getRequest() : ServletRequest : 현재 페이지의 request 객체 리턴
getResponse() : ServletResponse : 현재 페이지의 response 객체 리턴
getServletConfig() : ServletConfig : 현재 페이지의 config 객체 리턴
getServletContext() : ServletContext : 현재 페이지의 ServletContext를 리턴, application 객체를 의미
getSession() :HttpSession : 현재 페이지의 session 객체 리턴
위 메서드들은 JSP 페이지가 서블릿으로 변환될 때 다른 내장 객체의 생성을 위해 자동으로 작성되어 JSP 페이지에서 선언없어 바로 사용할 수 있도록 해준다는 점에서 의미가 있다.
따라서 위 메서드들을 통해 다른 내장객체에 접근은 가능하지만, JSP 페이지에서 바로 사용할 수 있는 객체가 이미 정의되어 있는 상태이므로 JSP 페이지 내에서 사용하는 경우는 흔치 않다.
변환된 서블릿 형태의 클래스에 자동 작성된 코드들을 보면 알 수 있듯이 우리가 JSP 페이지를 작성할 때 pageContext 내장 객체가 제공하는 다른 내장객체의 접근 관련 메서드들은 사용할 필요는 없다.
그러나 pageContext 내장객체는 JSP 페이지가 서블릿 형태의 클래스로 변환되었을 때 _jspService() 메서드에서 다른 내장객체들을 선언하고 생성하는 역할을 한다는 것을 기억해야 한다.
(2) pageContext 내장 객체를 이용한 포워딩
포워딩 방식은 response 내장객체의 리다이렉트 방식처럼 다른 웹 페이지로의 이동에 관련된 방식이며 요청/응답에 대한 제어권을 완전히 넘겨주어야 할 때 사용하는 방식이다.
forward(String relativeUrlPath) : void : 현재 페이지의 요청/응답 처리 제어권을 relativeUrlPath로 지정된 주소로 넘김
포워딩 방식과 리다이렉트 방식의 중요한 차이점은 요청/응답 처리에 대한 제어권의 이양 여부에 있다. 리다이렉트 방식은 단순히 새로운 페이지로의 요청을 웹 브라우저가 전송하는 방식이므로 두 번의 요청/응답 이 일어나는 효과를 가지며 페이지 이동시 request및 response 내장객체가 새롭게 생성된다.
그러나 포워딩 방식의 경우 forward 메서드를 호출한 페이지의 요청/응답 제어권을 forward메서드에 명시된 대상 웹페이지에 그대로 전달하게 므로 최초 요청에 대한 응답처리를 대상 웹 페이지에 위임하는 효과를 가진다.
포워딩 방식에서의 응답 종료 시점은 포워딩된 대상 웹 페이지에서 요청 처리가 종료될 때 이며 요청/응답 제어권의 이양은 영구적이다.
따라서 forward 메서드를 호출한 웹 페이지는 포워딩 후 요청/응답 제어권을 돌려받을 수 없으므로 페이지의 기능 수행이 더 이상 불가능해 진다.
내부적으로 포워딩 대상이 될 웹 페이지로 이동하기 전 out 내장 객체의 clear 메서드가 실행되어 출력 버퍼를 모두 비우기 때문이다.
포워딩 방식은 리다이렉트 방식과는 달리 forward() 메서드를 사용하여 다른 웹페이지의 이동이 일어나도 기능 수행 역할을 다른 JSP 페이지에 일임한 것이므로 웹 브라우저의 인터넷 주소창에는 변경이 없다.
(3) pagecontext 내장 객체를 이용한 인클루드
포워딩 방식에 대응되는 인클루드 방식은 요청/응답의 제어권을 인클루드 대상 웹 페이지의 처리 종료후 다시 돌려받는 다는 점에서 차이가 있다.
include(String relativeUrlPath) : void : 현재 페이지의 요청/응답 처리 제어권을 relativeUrlPath로 지정된 주소에 임시로 넘김
최초 호출 페이지에서 인클루드 방식을 사용하여 요청/응답 제어권을 대상 페이지로 넘겨주고, 대상 페이지의 처리가 끝난 후 요청 페이지에서 요청/응답에 대한 제어권을 돌려받는다.
따라서 인클루드 방식은 단어 include의 뜻 그대로 인클루드 될 대상페이지를 호출 페이지가 포함하라는 효과를 가진다.
포워드 방식과 인클루드 방식은 이렇게 요청/응답 제어권의 반환 여부에 따라 큰 차이를 보이므로 두 가지 방식의 차이점을 숙지해야 한다.
(4) 페이지 범위의 데이터 공유
pageContext 내장 객체는 자신이 속한 페이지, 즉 하나의 서블릿 범위 내에서 데이터 공유가 가능하다.
getAttribute(String name) :Object : 현재 페이지에서 이름이 name인 속성값을 Object타입으로 리턴, name인 이름의 속성이 없을 경우 null리턴
setAttribute(String name, Object value) : void : 현재 페이지 범위에서 사용될 속성의 이름을 name으로, 값을 value로 저장
removeAttribute(String name) : void : 이름이 name 인 속성값을 제거
위 메서드들을 사용하여 pageContext 내장객체에 데이터를 공유하면 해당 페이지 범위 내에서 사용이 가능하다.
pageContext 내장객체를 이용한 데이터의 공유는 해당 페이지의 범위에 한하게 되므로 다른 JSP 페이지에 데이터 접근의 시도는 실패할 것이다.
또한 pageConetext 내장 객체는 자신이 속한 페이지의 관리목적으로 사용할 수 있는 많은 기능 수행이 가능하다.
현재 페이지의 모든 객체를 생성하거나 관리할 수 있고 forward/include 방식을 이용한 페이지의 흐름제어도 가능하다. 그러나 pageContext 내장객체의 유효범위는 명확하게 현재 속한 페이지에 국한된다.
application 객체
application 내장 객체는 javax.servlet.ServletContext 인터페이스의 인스턴스로 웹 컨테이너가 이 인터페이스를 구현하여 객체를 제공하게 되므로 JSP 페이지에서 변환된 서블릿 형태의 파일에서 웹 컨테이너의 제품군에 따라 사용되는 클래스명이 다를 수 있다.
application 내장 객체는 하나의 서블릿 클래스나 JSP 페이지 범위에서 사용 가능한 pageContext 내장객체와는 달리 현재 수행중인 웹 애플리케이션 영역 내 관련 정보에 대한 기능을 수행하는 객체이므로 동일한 웹 애플리케이션에 속해있는 모든 JSP 페이지와 서블릿 클래스가 공유하게 된다.
따라서 application 내장 객체는 일반적인 서버측의 정보와 서버의 자원 및 JSP 페이지를 포함한 서블릿의 실행 환경에 대한 정보, 웹 애플리케이션에서 일어나는 이벤트에 대한 로그 정보 등을 다루는 메서드들을 제공한다.
(1) 일반적인 서버의 정보
application 내장객체를 이용하면 현재 웹 애플리케이션의 사용중인 웹 컨테이너에 대한 일반적인 정보 열람이 가능하다.
getServerInfo() : String : 현재 사용중인 웹 컨테이너의 이름과 버전을 리턴
getMinorVersion() : int :현재 웹 컨테이너가 지원 가능한 서블릿 API 마이너 버전을 리턴
getMajorVersion() : int : 현재 웹 컨테이너가 지원 가능한 서블릿 API 메이저 버전을 리턴
위 메서드를 사용하면 웹 컨테이너의 이름과 버전 및 지원 가능한 서블릿 API 버전 범위를 출력할 수 있다.
(2) 서버의 자원 정보
JSP 페이지 작성 시 텍스트 파일과 같은 특정 자원에 접근하여 해당 파일의 내용을 사용해야 할 경우 가장 간단한 방법으로 파일의 절대 경로를 사용하여 파일을 읽어오는 방법이 있다.
이 방법을 사용하면 복잡하지 않고 빠르게 자원 접근과 관련된 기능을 구현할 수 있지만, 웹 컨테이너 제품의 교체나 제품 업그레이드 혹은 서버 내 폴더 변경 등 서버 자원의 변경이 발생될 경우 파일의 실제 저장 경로가 변경될 가능성을 가지므로 장기적으로 보았을 때 적합하지 않을 경우가 존재한다.
application 내장객체는 절대 경로를 사용하지 않고도 현재 웹 애플리케이션 범위에 속해있는 서버의 자원에 접근하는 방법을 제공하는 메서드를 가지고 있다.
getResource(String path) : URL : path로 지정된 자원을 URL 타입으로 리턴
getResourceAsStream(String path) : InputStream : path로 지정된 자원을 InputStream 타입으로 리턴
getRealPath(String path) : String : path로 지정된 자원을 시스템 내 실제 경로로 리턴
getContext(String uripath) : ServletContext : uripath로 지정된 자원의 콘텍스트 정보를 Servelt Context 타입으로 리턴
getRequestDispatcher(String path) : RequestDispatcher : path로 지정된 자원의 RequestDispatcher 타입을 리턴
(3) 초기화 파라미터
웹 애플리케이션이 시작될 때 활성화 되는 콘텍스트 초기화 파라미터는 web.xml을 통해 지정해줄 수 있다.
web.xml 내에 파라미터를 지정이 가능하다.
WEB-INF폴더에 web.xml 파일을 생성하면 된다.
<context-param> : 콘텍스트 초기화 파라미터를 나타냄
<description> : 지정할 초기화 파라미터의 설명
<param-name> : 초기화 파라미터에 이름을 지정
<param-value> : 앞서 지정한 파라미터 명에 지정할 값을 설정할 때 사용한다.
<param-name>으로 지정된 이름은 이후 JSP 페이지에서 application 내장 객체를 통해 초기화 파라미터 접근 시 사용될 파라미터 명이 된다.
이렇게 web.xml 파일에 지정해 놓은 콘텍스트 초기화 파라미터는 application 내장 객체를 통해 접근이 가능하다.
웹 애플리케이션 범위 내의 정보 공유가 가능하다는 의미로 해당 웹 애플리케이션에 속한 모든 JSP 페이지를 포함한 서블릿 클래스에서 활용 가능하다.
getInitParameter(String name) : String : name으로 지정한 콘텍스트 초기 파라미터 값을 String 타입으로 리턴
getInitParameterNames() : Enumeration : 콘텍스트 초기 파라미터의 이름 집합을 Enumeration 타입으로 리턴
(4) 로그(log)
웹 애플리케이션 제작시 사용자에게 노출되는 정보 외에 관리 측면에서 필요한 정보를 그때그때 특정 파일에 실시간으로 저장할 필요가 있다.
이럴 경우 로그 기능을 유용하게 사용할 수 있다.
application 내장 객체는 간단한 로그 작성 기능을 제공하고 있으며 아래의 메서드를 통해 쉽게 구현이 가능하다.
log(String msg) : void : 서블릿 로그 파일에 msg의 내용을 기록
log(String message, Throwable throwable : void : message의 내용과 Throwable 예외 stacktrace를 서블릿 로그 파일에 기록
log 메서드는 Exception 타입의 예외 참조 변수와 String 타입의 문자열을 파라미터로 받는 형식도 존재하지만 2.2 버전에서는 Deprecated 되었으므로 사용을 권하지 않는다.
웹 컨테이너의 제품군 혹은 같은 제품이라도 버전에 따라 로그 파일이 저장되는 경로는 다를 수 있다.
application 내장객체의 log 메서드를 사용하여 페이지 호출 시 사용한 로그 기능이 파일에 저장됨을 알 수 있다.
페이지 호출이 정상적으로 이루어졌을 경우 작성한 메시지를 로그로 남긴다.
이를 통해 여러 내장객체들과 JSP 내 자바 문법을 활용하면 다양한 활용이 가능하다.
config 객체
config 내장 객체는 javax.servlet.ServletConfig 인터페이스의 인스턴스로 JSP 페이지를 포함한 서블릿 클래스의 인스턴스가 생성될 때 필요한 초기 파라미터 정보들을 저장해두어 읽어올 수 있는 객체이다.
따라서 config 내장 객체는 웹 컨테이너의 관리 목적과 함께 웹 컨테이너 내 생성된 모든 웹 애플리케이션의 초기화 정보 공유에 그 목적이 있다.
초기 파라미터 정보들은 웹 컨테이너가 시작될 때 web.xml 파일을 참조하여 할당되며 현재 속해 있는 웹 컨테이너에 존재하는 모든 웹 애플리케이션에 공유된다.
따라서 config 내장 객체는 JSP 페이지를 포함한 서블릿당 단 하나의 객체만 생성되고 모두 동일한 인스턴스를 참조한다.
config 내장객체로 사용 가능한 메서드는 다음과 같다.
getInitParameter(String name) : String : name으로 지정된 초기 파라미터의 값을 String 타입으로 리턴
getInitParameterNames() : Enumeration : 초기 파라미터의 이름 집합을 Enumeration 타입으로 리턴
getServletContext() : ServletContext : 현재 사용중인 ServletContext의 참조변수, 즉 application 내장 객체를 리턴
getServletName() : String : 현재 서블릿의 이름을 String 타입으로 리턴
그러나 일반적으로 중대형 규모 이상의 환경에서 서블릿 활용이 많은 경우를 제외하고 web.xml 파일 내부에 파라미터를 넣는 작업은 흔치 않다.
웹 컨테이너 초기화 파라미터를 등록하기 위한 web.xml
앞서 application 내장 객체에서 콘텍스트 초기화 파라미터를 지정할 때 언급했던 web.xml과 config 내장 객체에서 언급한 웹 컨테이너 초기화 파라미터를 지정하기 위한 web.xml은 파일명은 동일하지만 다른 파일이다.
먼저 다루었던 web.xml은 각 웹 애플리케이션의 WEB-INF 폴더에 속한 web.xml을 가리키며, 현재 언급하고 있는 web.xml은 tomcat설치 폴더\conf\폴더에 위치한 web.xml을 가리킨다.
초기화 파라미터를 지정하기 위해 <init-param> 태그를 사용한다.
page 객체
page 내장 객체는 JSP 페이지를 포함한 현재 서블릿의 인스턴스를 참조한다.
즉 , page 내장객체는 자기 자신을 가리킨다는 것을 의미한다.
page 내장객체가 바로 this이므로, page 내장객체의 활용은 this의 활용가 거의 동일하다.
따라서 page 내장객체는 사실상 현재 페이지를 가리키는 용도로 사용하기 위해 JSP 페이지에서 제공되지만 JSP 및 서블릿이 모두 자바를 사용하기 때문에 page 내장 객체를 사용하지 않아도 현재 페이지의 멤버변수나 메서드에 접근할 수 있는 방법을 가지고 있으므로 상대적으로 사용빈도는 낮다.
exception 객체
exception 내장객체는 java.lang.Throwable 클래스 타입의 참조변수로 JSP 페이지에서 예외 발생 시 page 지시자를 통해 지정된 오류 처리 페이지에서 해당 예외 이벤트 처리하기 위해 전달되는 객체를 의미한다.
exception 내장객체를 통해 사용할 수 잇는 페이지 에러 처리 기능 구현을 위한 메서드는 다음과 같다.
getMessage() : String : 현재 오류에 대한 상세 메시지를 String 타입으로 리턴
printStackTrace() : void : 현재 오류의 StackTrace 정보 출력
printStackTrace(PrintWriter s) : void : 현재 오류의 StackTrace 정보를 PrintWriter 객체 s로 출력
printStackTrace(PrintStream s) : void :현재 오류의 StackTrace 정보를 PrintStream 객체 s로 출력
toString() : String : 현재 오류에 대한 간략한 메시지를 String 타입으로 리턴
exception 내장객체를 사용하는 방법은 일반적으로 page 지시자를 병행한 에러페이지와 같이 에러처리를 위해 제작되는 JSP 페이지에 사용된다.
session 객체
session 내장 객체는 HttpSession 인스턴스를 사용하여 웹 클라이언트와 웹 서버의 연결 및 세션 관리를 위해 사용된다.
session 내장객체는 page 지시자의 session 속성을 "true"로 지정하여 사용해줄 수 있으며, 세션관리에 사용되는 메서드는 아래와 같다.
getAttribute(String name) : Object : session 객체에 저장된 속성을 반환
setAttribute(String name, Object value) : void : session 객체에 속성을 저장
removeAttribute(String name) : void : session 객체에 저장된 속성을 제거
getId() : String : 세션 ID 값을 반환
getMaxInactiveInterval() : int : 세션의 유효 시간을 반환
setMaxInactiveInterval(int interval) : void : 세션의 유효 시간을 설정
invalidate() : void : 현재 세션 정보를 제거
'Back-end' 카테고리의 다른 글
JSP의 세션관리 (0) | 2021.08.28 |
---|---|
JSP의 에러처리 (0) | 2021.08.21 |
Spring 용어정리(3) (0) | 2021.08.16 |
JSP 기초 (0) | 2021.08.14 |
Spring 용어정리 (2) (0) | 2021.08.11 |