본문 바로가기

Web

Scope

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()메소드 사용

실습

  1. 하나의 웹 어플리케이션에 ApplicationScope01, ApplicationScope02 서블릿 2개 생성
  2. applicationscope01.jsp 생성
  3. ApplicationScope01 서블릿에서 Application scope로 "value"에 값 1 저장
  4. ApplicationScope02 서블릿에서 Application scope로 저장된 "value"의 값에 1을 더한 후 그 결과 출력
  5. 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=falsehttp://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