ksouth9

내장 객체의 영역 - page, request, session, application 본문

Web/JSP

내장 객체의 영역 - page, request, session, application

ksouth9 2022. 5. 7. 21:59
  • page 영역 : 동일한 페이지에서만 공유된다. 페이지를 벗어나면 소멸된다.
  • request 영역 : 하나의 요청에 의해 호출된 페이지와 포워드(요청 전달)된 페이지까지 공유된다. 새로운 페이지를 요청(페이지 이동)하면 소멸된다.
  • session 영역 : 클라이언트가 처음 접속한 후 웹 브라우저를 닫을 때까지 공유된다. 포워드나 페이지 이동 시에도 영역은 소멸되지 않는다.
  • application 영역 : 한 번 저장되면 웹 애플리케이션이 종료될 때까지 유지된다. 즉, 서버가 셧다운되지 않는다면 언제까지든 공유되는 영역이다.

page 영역 사용방법

pageContext.setAttribute("변수이름",Object obj);

request 영역 사용방법

request.setAttribute("변수이름",Object obj);

session 영역 사용방법

session.setAttribute("변수이름",Object obj);

application 영역 사용방법

application.setAttribute("변수이름",Object obj);

 

page 영역


page 영역은 기본적으로 클라이언트의 요청을 처리하는 데 관여하는 JSP 페이지마다 하나씩 생성된다. 그리고 이때 각 JSP 페이지는 page 영역을 사용하기 위한 pageContext 객체를 할당 받는다. 이 객체에 저장된 정보는 해당 페이지에서만 사용할 수 있고 페이지를 벗어나면 소멸된다. 한편 include 지시어로 포함한 파일은 하나의 페이지로 통합되므로 Page 영역이 공유된다.

 

page 영역에 속성값 저장하고 불러오기

<%@ page import="common.Person"%>	// 외부 클래스 임포트
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
// 속성 저장
pageContext.setAttribute("pageInteger", 1000);
pageContext.setAttribute("pageString", "페이지 영역의 문자열");
pageContext.setAttribute("pagePerson", new Person("한석봉", 99)); 
%>
<html>
<head><title>page 영역</title></head>
<body>
    <h2>page 영역의 속성값 읽기</h2>
    <%
    // 속성 읽기
    int pInteger = (Integer)(pageContext.getAttribute("pageInteger"));
    String pString = pageContext.getAttribute("pageString").toString();
    Person pPerson = (Person)(pageContext.getAttribute("pagePerson"));
    %>
    <ul>
        <li>Integer 객체 : <%= pInteger %></li>
        <li>String 객체 : <%= pString %></li>
        <li>Person 객체 : <%= pPerson.getName() %>, <%= pPerson.getAge() %></li>
    </ul>

    <h2>include된 파일에서 page 영역 읽어오기</h2>
    <%@ include file="PageInclude.jsp" %>
       
    <h2>페이지 이동 후 page 영역 읽어오기</h2>
    <a href="PageLocation.jsp">PageLocation.jsp 바로가기</a>
</body>
</html>

외부 클래스를 사용하기 위해서 임포트를 한후 pageContext 객체를 통해 page 영역에 속성값을 저장한후 읽어온다.(기본적인 속성값을 저장하고 읽어오는 방법)

include 지시어로 다른 JSP 파일을 포함시켰다. '포함' 관계이므로 '같은 페이지'가 된다. 따라서 page 영역이 그대로 유지된다. 하지만 바로 밑에 <a> 태그에서는 <a>태그로 감싼 링크를 클릭하면 '다른 페이지'로 '이동'하게 된다. 따라서 이전 페이지에 만든 page 영역은 소멸된다. <a> 태그를 통한 이동은 새로운 페이지를 요청하는 것이다. 즉, 서로 다른 페이지이므로 page영역은 공유되지 않는다.

 

※같은 페이지에 속하는 스크립틀릿들은 자바 코드로 변환될 때 모두 _jspService() 메서드의 본문에 추가된다. 따라서 변수명을 바꿔주기 않으면 같은 이름의 변수를 중복해서 선언하는 꼴이 되어 컴파일 오류가 발생된다.

request 영역


클라이언트가 요청을 할 때마다 새로운 request 객체가 생성되고, 같은 요청을 처리하는 데 사용되는 모든 JSP 페이지가 공유한다.

따라서 request 영역에 저장된 정보는 현재 페이지포워드된 페이지까지 공유할 수 있다. 단, 페이지 이동 시에는 소멸되어 사용할 수 없게 된다. request 영역은 하나의 요청에 대한 응답이 완료될 때 소멸하게 되므로 page 영역보다는 접근 범위가 조금 더 넓다.

request 영역 예제

<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
// 속성 저장
request.setAttribute("requestString", "request 영역의 문자열");
request.setAttribute("requestPerson", new Person("안중근", 31)); 
%>
<html>
<head><title>request 영역</title></head>
<body>
    <h2>request 영역의 속성값 삭제하기</h2>
    <%
    //속성 삭제
        request.removeAttribute("requestString"); 
        request.removeAttribute("requestInteger"); // 에러 없음
    %>
    <h2>request 영역의 속성값 읽기</h2>
    <%
    Person rPerson = (Person)(request.getAttribute("requestPerson"));
    %>
    <ul>
        <li>String 객체 : <%= request.getAttribute("requestString") %></li>
        <li>Person 객체 : <%= rPerson.getName() %>, <%= rPerson.getAge() %></li>
    </ul>
    <h2>포워드된 페이지에서 request 영역 속성값 읽기</h2>
    <%
    request.getRequestDispatcher("RequestForward.jsp?paramHan=한글&paramEng=English")  
        .forward(request, response);
    %>
</body>
</html>

request 영역에 String 객체와 Person 객체를 저장한다. 그리고 밑에 코드에서 request 영역에 저장된 속성을 삭제하는데 이때 "requestString"은 정상적으로 삭제가 되지만 "requestInteger"는 존재하지않는 객체이므로 삭제가 되지않고, 이러한 경우라도 에러는 발생되지 않는다. 이어서 밑에 코드에서 속성값을 읽어와서 출력한다. 

포워드 하는 코드에서는 쿼리스트링으로 매개변수도 전달할 수 있다.

포워드를 수행하는 코드

request.getRequestDispatcher("포워드할 파일 경로").forward(request, response)
  • 포워드 : 현재 페이지로 들어온 요청을 다음 페이지로 보내는 기능.

포워드 예제

<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>request 영역</title></head>
<body>
    <h2>포워드로 전달된 페이지</h2>
    <h4>RequestMain 파일의 리퀘스트 영역 속성 읽기</h4>
    <%  
    Person pPerson = (Person)(request.getAttribute("requestPerson"));
    %>
    <ul>
        <li>String 객체 : <%= request.getAttribute("requestString") %></li>
        <li>Person 객체 : <%= pPerson.getName() %>, <%= pPerson.getAge() %></li>
    </ul>
    <h4>매개변수로 전달된 값 출력하기</h4>
    <%
        request.setCharacterEncoding("UTF-8");
        out.println(request.getParameter("paramHan"));
        out.println(request.getParameter("paramEng"));
    %>
</body>
</html>

이전 페이지 request 영역에 저장된 속성들을 읽어와서 출력한다. 포워드를 해도 request 영역이 공유되므로 문제없이 출력된다.

내용은 포워드로 전달된 내용이 보이지만, 포워드 예제의 웹 브라우저의 주소표시줄에는 이전 페이지의 파일이름이 표시된다. 

포워드 예제 마지막 코드에 있는 getParameter("paramHan"), getParameter("paramEng")는 이전 페이지에서 선언 된것이 없기때문에 이전 페이지에서 포워드로 보낼때 request.getRequestDispatcher("RequestForward.jsp?paramHan=한글&paramEng=English").forward(request, response); 이런식으로 파라미터에 인자값을 추가해 주어야 한다.

 

이처럼 request 영역에 저장된 속성값은 현재 페이지와 포워드된 페이지까지 공유된다.

session 영역


클라이언트가 웹 브라우저를 최초로 열고난 후 닫을 때까지 요청되는 모든 페이지는 session 객체를 공유할 수 있다.

세션이란, 클라이언트가 서버에 접속해 있는 상태 혹은 단위를 말하는 것으로, 주로 회원인증 후 로그인 상태를 유지하는 처리에 사용된다.

 

session 예제

<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
ArrayList<String> lists = new ArrayList<String>();
lists.add("리스트");
lists.add("컬렉션");
session.setAttribute("lists", lists);
%>       
<html>
<head><title>session 영역</title></head>
<body>
    <h2>페이지 이동 후 session 영역의 속성 읽기</h2>
    <a href="SessionLocation.jsp">SessionLocation.jsp 바로가기</a>
</body>
</html>

ArrayList 컬렉션을 생성한 후 2개의 String 객체를 저장한 다음 이 컬렉션을 통째로 session 영역에 저장했다. 그리고 <a> 태그를 이용해서 페이지를 이동시킨다.

 

이동된 페이지

<%@ page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>session 영역</title></head>
<body>
    <h2>페이지 이동 후 session 영역의 속성 읽기</h2>
    <%
    ArrayList<String> lists = (ArrayList<String>)session.getAttribute("lists"); 
    for (String str : lists)
        out.print(str + "<br/>");
    %>    
</body>
</html>

ArrayList 컬렉션 인스턴스를 생성한 후 파라미터값으로 이전 페이지에서 선언했던 "lists"를 넣어준다. 그리고 향상된 for문을 이용해서 list안의 값들을 출력해준다.

페이지가 이동되었지만 session 영역에 저장된 속성값은 정상적으로 출력이 된다. session 영역의 속성값을 삭제하고 싶다면 웹 브라우저를 완전히 닫았다가 열면 된다. X버튼을 눌러서 완전히 웹 브라우저를 닫아야 한다. 그 후 이동된 페이지로 이동하게 되면 500 에러가 발생한다. 웹 브라우저를 닫음으로 인해서 session 객체가 삭제되고, 첫 번째 페이지를 다시 실행하면 그때 새로운 session 객체가 만들어진다.

application 영역


웹 애플리케이션은 단 하나의 application 객체만 생성하고, 클라이언트가 요청하는 모든 페이지가 application 객체를 공유하게 된다.

application 객체는 웹 서버를 시작할 때 만들어지며, 웹 서버를 내릴 때 삭제된다. 따라서 application 영역에 한 번 저장된 정보는 페이지를 이동하거나, 웹 브라우저를 닫았다가 새롭게 접속해도 삭제되지 않는다.

 

application 예제

<%@ page import="java.util.HashMap"%>
<%@ page import="common.Person"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>application 영역</title></head>
<body>
    <h2>application 영역의 공유</h2>
    <%
    Map<String, Person> maps = new HashMap<>();
    maps.put("actor1", new Person("이수일", 30));
    maps.put("actor2", new Person("심순애", 28));
    application.setAttribute("maps", maps);
    %>
    application 영역에 속성이 저장되었습니다.
</body>
</html>

HashMap 컬렉션을 생성한 후 두 개의 Person 객체를 저장한 다음 컬렉션 전체를 application 영역에 저장했다.

 

새로운 페이지

<%@ page import="java.util.Set"%>
<%@ page import="common.Person"%>
<%@ page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head><title>application 영역</title></head>
<body>
    <h2>application 영역의 속성 읽기</h2>
    <%
    Map<String, Person> maps
            = (Map<String, Person>)application.getAttribute("maps");
    Set<String> keys = maps.keySet(); 
    for (String key : keys) {
        Person person = maps.get(key);
        out.print(String.format("이름 : %s, 나이 : %d<br/>", 
                person.getName(), person.getAge()));
    }  
    %>
</body>
</html>

application 영역에 저장한 "maps" 속성값을 읽어서 Map<String, Person> 타입 변수에 저장한다. Map 컬렉션에 담긴 데이터를 확인하려면 먼저 key들을 알아내야 한다. 그래서 keySet()메서드로 키 값을 얻어온다. 그리고 향상된 for문을 이용해서 키에 해당하는 값들을 하나씩 꺼내서 출력한다. Map에 저장된 객체를 꺼낼 때는 get()을 사용한다.

 

'Web > JSP' 카테고리의 다른 글

세션(Session)  (0) 2022.05.09
쿠키(Cookie)  (0) 2022.05.08
내장 객체의 영역 - 데이터 전송 객체(DTO)  (0) 2022.05.07
내장 객체의 영역  (0) 2022.05.07
내장 객체 메서드  (0) 2022.05.04