4가지 scope
- Application : 하나의 어플리케이션이 생성되어 소멸될때까지 사용할 수 있는 scope
- Session : 세션 객체가 생성되어 소멸될때까지 사용할 수 있는 scope. 여러개의 요청이 들어와도 계속 남아있음
- Request : 클라이언트가 요청하고 서버는 요청을 받아 응답을 보내는데, 이때 서버가 요청을 받아 어떤 일들을 수행한 다음 응답을 보낼때까지 계속 사용할 수 있는 scope
- Page : 선언된 Page 내에서만 사용 가능
Page scope
- PageContext 추상 클래스 사용
- JSP페이지에서 pageContext라는 내장 객체로 사용 가능
- forward가 될 경우 해당 Page scope에 지정된 변수는 사용 불가 (forward는 수행을 다음 페이지로 넘기는데 페이지를 넘기게 되면 pageContext도 변경되기 때문)
- 사용 방법은 Application/Session/request scope과 동일. 이때, 지역변수처럼 사용된다는 점이 다른 Scope들과의 차이
- JSP에서 EL표기법 등을 사용할 때 쓰임 (Servlet에서는 잘 사용되지 않음)
Request scope
- http요청을 WAS가 받아 웹브라우저에 응답할 때까지 변수값을 유지하고자 할 때 사용
- JSP에서는 request 내장 변수 사용
- Servlet에서는 HttpServletRequest 객체 사용
- 값을 저장할때는 request객체의 setAttribute()메소드, 읽어들일때는 getAttribute()메소드 사용
- forward에서 값을 유지하고자 사용 [ Redirect & Forward - 해당 글에서 예제 볼 수 있음 ]
Session scope
- 웹브라우저 별 변수 관리 (클라이언트마다 하나의 객체를 만들어 관리하는 것이 Session)
- 웹 브라우저의 탭 간에는 세션 정보가 공유됨
- HttpSession 인터페이스를 구현한 객체를 사용
- JSP에서는 session 내장 변수 사용
- Servlet에서는 HttpServletRequest의 getSession() 메소드 이용해 session객체 얻음
- 값을 저장할때는 request객체의 setAttribute()메소드, 읽어들일때는 getAttribute()메소드 사용
Application scope
- 웹 어플리케이션이 시작되고 종료될 때까지 변수 사용
- 하나의 서버에는 웹어플리케이션 여러개 존재 가능 & 웹어플리케이션 하나당 하나의 Application 객체 사용
- 웹어플리케이션의 클라이언트는 여러명일 수 있고 그 모든 클라이언트들은 하나의 Application 객체를 사용하기 때문에 모든 클라이언트가 공통으로 사용해야할 값이 있을 때 사용
- ServletContext 인터페이스를 구현한 객체 사용
- JSP에서는 application 내장 객체 사용
- Servlet에서는 getServletContext() 메소드 이용해 application 객체 얻음
- 값을 저장할때는 request객체의 setAttribute()메소드, 읽어들일때는 getAttribute()메소드 사용
실습
- 하나의 웹 어플리케이션에 ApplicationScope01, ApplicationScope02 서블릿 2개 생성
- applicationscope01.jsp 생성
- ApplicationScope01 서블릿에서 Application scope로 "value"에 값 1 저장
- ApplicationScope02 서블릿에서 Application scope로 저장된 "value"의 값에 1을 더한 후 그 결과 출력
- applicationscope01.jsp에서 Application scope로 저장된 "value"의 값에 2 더한 후 그 결과 출력
ApplicationScope01 코드
package examples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ApplicationScope01
*/
@WebServlet("/ApplicationScope01")
public class ApplicationScope01 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ApplicationScope01() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
ServletContext application = getServletContext();
int value = 1;
application.setAttribute("value", value);
out.println("<h1>value : "+ value + "</h1>");
}
}
ApplicationScope02 코드
package examples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ApplicationScope02
*/
@WebServlet("/ApplicationScope02")
public class ApplicationScope02 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ApplicationScope02() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
ServletContext application = getServletContext();
try {
int value = (int)application.getAttribute("value");
value++;
application.setAttribute("value", value);
out.println("<h1>value : "+ value + "</h1>");
}catch(NullPointerException e) {
out.print("value의 값이 설정되지 않았습니다.");
}
}
}
applicationscope01.jsp 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
try{
int value = (int)application.getAttribute("value");
value += 2;
application.setAttribute("value", value);
%>
<h1><%= value %></h1>
<%
}catch(NullPointerException ex){
%>
<h1>설정된 값이 없습니다</h1>
<%
}
%>
</body>
</html>
먼저, applicationscope01.jsp을 실행하면 받아올 "value"값이 없기 때문에 다음과 같은 결과가 출력된다.
ApplicationScope01을 실행하면 다음과 같이 value 값이 출력되는 것을 볼 수 있다.
이후 ApplicationScope02 실행시키면 출력 결과는 다음과 같다.
이때 applicationscope.jsp를 다시 실행시키면 다음과 같이 value값이 알맞게 출력되는 것을 볼 수 있다.
웹 어플리케이션이 종료될때까지 "value" 값은 유지됨
출처
https://www.boostcourse.org/web316/lecture/16708/?isDesc=false , http://inheritingjava.blogspot.kr/2011/04/chapter-42-scope-of-javabeans-in-jsp.html
'Web' 카테고리의 다른 글
표현 언어 EL (0) | 2021.08.23 |
---|---|
Servlet , JSP 연동하기 (forward) (0) | 2021.08.19 |
Redirect & Forward (0) | 2021.08.08 |
JSP 내장 객체 (0) | 2021.08.02 |
[eclipse] 자바 웹 어플리케이션 생성 (+ Finish버튼 비활성화 시) (0) | 2021.08.01 |