[ JSP 내장 객체 ]
- 개발자가 객체를 별도로 생성하지 않아도 JSP에서 바로 사용할 수 있는 객체
- 컨테이너가 JSP를 서블릿으로 변환할 때 자동으로 객체가 생성됨
- request, response, out, page, config, application, pageContext, exception, session
내장 객체는 말 그대로 JSP가 기본적으로 내장하고 있어서 따로 선언하거나 만들어줄 필요 없이 바로 사용 가능한 객체를 말합니다. 당연한 말이지만 모두 Java의 클래스 객체이므로 서블릿에서도 동일하게 사용이 가능합니다. 서블릿에서는 자동으로 생성되는 내장 객체는 아니지만 대부분 get 메소드를 이용해 객체를 얻어낼 수 있습니다.
전반적인 구조에 대한 아래 링크글을 먼저 참조하시면 좀 더 이해가 수월할 수 있습니다.
JSP 내장객체의 구조와 생명주기 (session / config / application )
[ page - java.lang.Object 객체 ]
page는 JSP 페이지 그 자체를 가리키는 객체입니다. 자바 클래스에서 this와 비슷합니다. 자바 클래스에서 this는 주로 자기 자신이 가지고 있는 값(필드, 메소드)과 다른 객체가 가지고 온 값(파라미터, 메소드)을 명시적으로 구분할 때 사용됩니다. 하지만 JSP에서는 딱히 쓸 일이 없는 것 같습니다.
[ config - javax.servlet.ServletConfig 객체 ]
- 생성 / 소멸 : JSP, 서블릿의 생명주기와 동일 (하지만 초기화 값은 컨테이너의 생명주기와 동일)
- 사용 범위 : 매핑된 JSP, 서블릿 내 (받아서 재전달하는 경우 제외)
ServletConfig 객체는 서블릿이 구동될 때 web.xml에서 읽어온 초기화 정보를 가지고 있는 객체입니다. 따라서 config 객체는 개발자가 미리 서블릿(또는 JSP)에 매핑해둔 초기화 정보를 저장하고 있는 내장 객체입니다. 소스코드 내에 하드코딩하기 싫은(?) 정보들을 미리 web.xml에 기술해두고 서블릿이 구동될 때 가져다가 씁니다.
서블릿의 객체가 생성될 때 자동 생성되며, 같은 서블릿의 객체는 동일한 config 객체를 가지게 됩니다. 초기화 정보는 web.xml에 기술되어 있고 컨테이너가 생성될 때 한 번 읽어서 ServletConfig 객체에 저장해두면 컨테이너를 재시작 하지 않는 이상 바뀌지 않기 때문에 config 객체의 정보 또한 web.xml 파일을 수정하고 컨테이너를 재가동하지 않는 이상 변할 수 없습니다. 서블릿에 변동이 생겨 삭제되고 로드될 때 다시 생성되긴 하지만 web.xml의 값을 바꿀 수 없는만큼 초기화 값은 변하지 않는다고 보면 됩니다.
config 주요 메소드 | 설명 |
String getInitParameter(String name) | param-name의 param-value 값을 가져옴 |
Enumberation<String> getInitParameterNames() | 모든 param-name 값을 가져옴 |
String getServletName() | web.xml에서 명시한 <servlet-name>의 이름을 가져옴 |
ServletContext getServletContext() |
ServletContext 객체를 반환 (application 객체와 동일) |
web.xml에 특정 JSP 파일에 대한 Init 파라미터를 지정하는 코드는 아래와 같습니다. 그리고 위의 메소드로 값을 적절히 가져다가 사용하면 됩니다.
<servlet>
<servlet-name>configEX</servlet-name>
<jsp-file>/test.jsp</jsp-file>
<init-param>
<param-name>defaultData1</param-name>
<param-value>default1</param-value>
</init-param>
<init-param>
<param-name>defaultData2</param-name>
<param-value>default2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>configEX</servlet-name>
<url-pattern>/test.jsp</url-pattern>
</servlet-mapping>
System.out.println(config.getInitParameter("defaultData1"));
System.out.println(config.getInitParameter("defaultData2"));
System.out.println(config.getServletName());
[ application - javax.servlet.ServletContext 객체 ]
- 생성 / 소멸 : 컨테이너의 생명주기와 동일
- 사용 범위 : 프로젝트 내 모든 객체에서 접근 가능
어플리케이션의 내외부의 여러 환경 정보를 담고 있는 객체입니다. 어플리케이션 가장 상단에 위치한 객체쯤으로 생각하면 될 것 같고, 처음 컨테이너가 구동될 때 단 하나의 객체만 생성됩니다. 기본적으로 서버에 대한 정보나 서블릿에 대한 정보들을 가지고 있는데 어플리케이션(프로젝트 단위) 내 모든 JSP/서블릿들이 공유하는 객체다 보니 데이터를 편리하게 운송하는 수단으로 주로 쓰입니다.
application 주요 메소드 | 설명 |
void setAttribute(String name, Object o) | application 객체에 추가 객체를 저장 |
Object getAttribute(String name) | application 객체에 추가된 객체를 가져옴 |
void removeAttribute(String name) | application 객체에 특정 Attribute를 지움 |
String getServerInfo() | 컨테이너 이름과 버전을 리턴 |
void log(String msg) | 제공된 문자열을 서블릿 로그 파일에 기록 |
config와 비슷하게 web.xml에서 초기화 값을 지정해줄 수도 있습니다. 대신 특정 JSP나 서블릿을 매핑하지 않고 모두가 쓸 수 있는 초기화 파라미터가 됩니다. context라는 단어는 그냥 프로젝트 단위를 말한다고 생각하면 됩니다. 가져오는 메소드는 config의 메소드와 거의 동일합니다.
<context-param>
<param-name>location</param-name>
<param-value>/folder/new/</param-value>
</context-param>
<context-param>
<param-name>dataName</param-name>
<param-value>apple.jpg</param-value>
</context-param>
<%
System.out.println(application.getInitParameter("location"));
System.out.println(application.getInitParameter("dataName"));
Enumeration<String> paramName = application.getInitParameterNames();
// Attribute 추가 및 가져오기
application.setAttribute("addAttribute", "Attribute");
System.out.println(application.getAttribute("addAttribute"));
// Attribute와 Initparameter는 다름
System.out.println(application.getInitParameter("addAttribute"));
while(paramName.hasMoreElements()){
System.out.print(paramName.nextElement() + " ");
}
%>
'▸JSP & Servlet > 기본 문법' 카테고리의 다른 글
JSP 내장 객체_session (쿠키와 세션) [4/4] (3) | 2020.02.17 |
---|---|
JSP 내장 객체_pageContext / exception [3/4] (2) | 2020.02.16 |
JSP 내장 객체_request, response, out [1/4] (2) | 2020.02.14 |
JSP 태그의 종류와 사용법 (4) | 2020.02.14 |
JSP, Servlet(서블릿)의 URL 주소 매핑 (2) | 2020.02.13 |
댓글