[필독][기초] / JSP [part 3]

2016. 1. 5. 15:20language/jsp

5. 내재 객체(Implicit Objects)

내재 객체는 JSP 문서내에서 이용되는 객체로 레퍼런스를 얻기 위한 작업없이 바로 사용할 수 있는 객체를 말한다. 

 

5.1out

javax.servlet.jsp.JspWriter 추상 클래스 타입 인스턴스의 레퍼런스이다.
데이터를 응답 스트림으로 작성하는데 사용한다.
아래와 같이 작성한 후 http://localhost:8989/helloWorld.jsp를 방문한다. /helloWorld.jsp 

<html>
<body>
<%
out.println("<strong>Hello World!</strong>");
%>
</body>
</html>


5.2 request

javax.servlet.http.HttpServletRequest 인터페이스 타입 인스턴스의 레퍼런스이다.
요청 파라미터와 헤더에 있는 사용자가 보낸 정보, 그리고 사용자에 관한 정보에 접근할 수 있다.
아래와 같이 작성하고 http://localhost:8989/request.jsp?user=gildong를 방문한다. /request.jsp 

<html>
<head>
  <title>request</title>
</head>
<body>
<%
out.println("Hello, " + request.getParameter("user"));
%>
</body>
</html>


5.3 response

javax.servlet.http.HttpServletResponse 인터페이스 타입 인스턴스의 레퍼런스이다.

5.4 pageContext

javax.servlet.jsp.PageContext 타입 인스턴스의 레퍼런스이다.
JSP 내에서 이용 가능한 모든 자원에 대한 접근 방법을 제공해 준다.
이를 이용하면 ServletRequest, ServletResponse, ServletContext, HttpSession, ServletConfig 와 같은 자원에 접근할 수 있다.

 

5.5 session

session 내재 객체는 서블릿의 javax.servlet.http.HttpSession 타입 인스턴스의 레퍼런스이다.
세션 데이타를 읽고 저장하는 데 사용된다.
아래를 작성한 후 http://localhost:8989/session.jsp를 여러번 방문한다.
/session.jsp 

<html>
<head>
  <title>session</title>
</head>
<body>
<%
Integer count = (Integer)session.getAttribute("count");
  
if (count == null) {
             count = new Integer(1);
             session.setAttribute("count", count);
} else {
             count = new Integer(count.intValue() + 1);
             session.setAttribute("count", count);
}

out.println("COUNT: " + count); 
%> 
</body>
</html>


5.6 application

javax.servlet.ServletContext 인터페이스 타입 인스턴스의 레퍼런스이다.


 

5.7 config

config 내재 객체는 ServletConfig 이다.
ServletConfig 는 서블릿 각각의 초기화 파라미터 정보를 담고 있다.


 

5.8 page

page 내재 객체는 페이지 구현 클래스 인스턴스를 참조하는 Object 타입의 레퍼런스이다.
page변수는 단순히 JSP와 구현 서블릿 사이의 연결 역할을 한다고 하는데, 쓰임새가 많지 않다.
JSP 코드에서 page 라는 변수를 사용하지 못하는 이유이다.


 

5.9 exception

exception 내재 객체는 JSP 페이지에서 발생한 잡히지 않은 익셉션에 대한 접근을 제공한다.
JSP 페이지 내에서 exception 변수는 page 지시어의 isErrorPage 속성이 true 로 설정한 페이지내에서만 사용할 수 있다.

6. JSP에서 꼭 확인해야 할 사항들

6.1 include 지시어와 include 표준 액션의 차이점

지시어는 서블릿으로 변환될 때 단 한번 해석되지만 표준액션의 경우는 요청시마다 매번 해석된다.
그러므로 포함되는 페이지의 내용이 요청시마다 변하지 않고 일정할 때는 include 지시어를, 포함되는 페이지의 내용이 요청시마다 변한다면 include 표준 액션을 사용하는 것이 좋을 것이다. include 지시어는 포함하는 JSP를 중심으로 하나의 서블릿으로 변환되고, include 표준 액션은 각각의 서블릿이 동작하여 하나의 응답을 만들어낸다.

 

6.2 서블릿 컨텍스트와 웹 애플리케이션의 관계

서블릿 컨텍스트에는 웹 애플리케이션의 서버측 컴포넌트와 서블릿 컨테이너와의 통신을 담당하는 메소드가 있다.
서블릿 스펙에 의해 모든 웹 애플리케이션마다 단 하나의 서블릿컨텍스트가 있다.
그래서 서블릿 컨텍스트는 JSP 와 서블릿과 같은 서버측 컴포넌트의 공동 저장소의 기능을 가진다.
서블릿 컨텍스트에 저장된 자원은 웹 애플리케이션의 일생동안 존재한다.

 

6.3 page 지시어의 session 속성

<%@ page session="false"> 와 같이 page 지시어의 session 속성이 false라면 해당 페이지가 session 객체를 생성하지도 못하고 또한 기존의 session 객체에 대한 레퍼런스도 얻을 수도 없다.
false 로 되어 있는 상태에서 session 객체에 접근하고자 하면 에러가 발생한다.

 

6.4 jsp:useBean표준 액션의 scope속성의 의미

scope 속성은 jsp:useBean 속성 중에서 가장 중요한 부분이다.
이 속성은 자바 빈즈를 객체화시킨 후 어느 범위까지 사용을 할 것인지를 결정한다.
scope 속성을 어떻게 지정했는가에 따라서 빈 객체는 여러 페이지에서 소멸하지 않고 참조되기고 한다.
예를 들어 scope 속성이 session 으로 설정되었다면 이 빈 객체는 세션이 종료할 때까지 소멸되지 않고 유지된다.
생성된 빈 객체는 이후 어떤 페이지에서도 참조될 수 없을 때 자동으로 소멸된다.
scope 속성은 기본 값은 page 이다.
scope 속성에는 4개의 값을 지정해 줄 수 있는데 각각의 값에 대해서 정리하면 다음과 같다.

scope 설명
page scope속성의 기본 값이므로 특별히 지정하지 않으면 이 옵션이 적용된다.
page영역으로 생성된 객체는 요청된 페이지 내에서만 유효하다.
같은 페이지를 요청해도 새로운 빈 객체가 생성된다.
페이지의 실행 종료와 함께 빈 객체는 소멸된다.
page 영역은 한 페이지에서만 유효하므로 <jsp:include> 표준 액션으로 포함된 페이지에서나 <jsp:forward> 표준 액션으로 제어권이 이동한 페이지내에서 <jsp:useBean> 표준 액션 코드가 있다면 이 코드는 이미 만들어진 빈 객체를 참조하는 것이 아니라 새로운 객체를 생성한다. <jsp:include> 표준 액션으로 포함되는 페이지에서 생성한 빈 객체는 포함하는 페이지에서는 참조할 수 없다.
page 영역의 빈 객체는 빈 객체의 상태가 유지될 필요가 없을 때 적합하다.
request 이 값으로 범위를 지정하면 현재의 JSP 페이지와 연결되어 있는 모든 JSP 페이지까지 영향을 미친다.
즉, <jsp:forward>, <jsp:include> 표준 액션으로 연결되어 있는 JSP 페이지에서도 오리지날 페이지에서 생성한 빈을 참조할 수 있게 된다.
scope 이 request 로 생성된 빈은 HttpServletRequest 객체에 저장되기 때문이다.
session 이 값으로 범위를 지정해 놓으면 세션에 유효할 때까지 자바 빈즈의 객체가 유효하다.
즉, 세션이 유지되는 동안 같은 세션에서 호출되는 모든 페이지에서 빈 객체는 소멸되지 않고 유지된다.
이는 session 영역의 빈은 생성 후 session 객체(HttpSession)에 저장되기 때문이다.
반면, page 영역이나 request 영역으로 생성된 빈은 브라우저의 요청에 대한 응답을 돌려준 다음에는 소멸된다.
각 사용자에 대하여 독립적으로 생성되는 session 객체는 세션이 종료될 때까지 모든 서버측 컴포넌트에서 참조할 수 있는 값을 유지할 수 있게 해준다.
한가지 주의할 점은 page 지시어에서 session 속성을 false 로 설정했을 경우에는 session 객체에 저장한 빈 객체를 사용할 수 없다.
application scope 이 application 으로 지정하면 해당 빈은 웹 애플리케이션이 언로드될까지 소멸되지 않는다.
application 영역으로 생성된 빈은 application 내재 객체, 즉 ServletContext 에 저장되기 때문이다.
따라서 서블릿 컨텍스트를 접근할 수 있는 동일한 웹 애플리케이션내의 JSP, 서블릿은 이 빈을 접근할 수 있다.
위에서 서블릿 컨텍스트의 공동 저장소 역할을 살펴보았는데, appplication 영역으로 생성된 빈은 웹 애플리케이션의 공동자원이다.
그런 이유로 application 영역의 빈은 신중하게 결정해야 한다.

 

 

 

출처 : http://www.java-school.net/jsp/JSP

 

 

도움이 되셨다면 공감을 부탁드립니다. ^^