내장 객체의 영역은 각 객체가 저장되는 메모리의 유효기간과 같다.
자바에서는 클래스 단위로 구성되지만 웹 애플리케이션에서는 페이지 단위로 구성된다.
내장 객체의 영역은 총 4가지가 있다.
주요 메서드는
void setAttribute(String name, Object value)
각 영역에 속성을 저장.
첫 번째 인수는 속성명, 두번 째 인수는 저장할 값
값의 타입은 Object이므로 모든 타입의 객체를 저장
Object getAttribute(String name)
영역에 저장된 속성값을 가져옴.
Obejct로 자동 형변환되어 저장되므로 원래 타입으로 형 변환 후 사용.
void removeAttribute(String name)
영역에 저장된 속성을 삭제.
삭제할 속성명이 존재하지 않더라도 에러는 발생하지 않음.
데이터 전송 객체란 주로 데이터를 저장하거나 전송하는 데 쓰이는 객체로, 다른 로직 없이 순수하게 데이터만을 담고있음.
자바빈즈 규약에 따라 작성.
자바빈즈 규약
자바빈즈는 기본패키지 이외의 패키지에 속해야함.
멤버 변수의 접근 지정자는 private로 선언.
기본 생성자가 있어야함.
멤버 변수에 접근할 수 있는 게터/세터 메서드가 있어야함.
게터/세터 메서드의 접근 지정자는 publi로 선언.
Person.java
package common; // 기본 패키지 이외의 패키지(규약 1번)
public class Person {
private String name; // private 멤버 변수(규약 2번)
private int age; // private 멤버 변수(규약 2번)
public Person() {} // 기본 생성자(규약 3번)
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
// public 게터/세터 메서드들(규약 4번, 5번)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
page 영역은 기본적으로 클라이언트의 요청을 처리하는 데 관여하는 JSP 페이지마다 하나씩 생성.
이때 각 JSP 페이지는 page 영역을 사용하기 위한 pageContext 객체를 할당받음.
pageContext는 내장 객체 중 하나이고 이 객체에 저장된 정보는 해당 페이지에서만 사용 할 수 있고 페이지를 벗어나면 소멸된다.
include 지시어로 포함한 파일은 하나의 페이지로 통합되므로 page 영역이 공유됨.
PageContextMain.jsp
<%@ 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 영역에 속성값을 저장.
기본 타입 값들은 래퍼클래스로 오토박싱 된 후 저장됨.
다시 읽어올때 모든 속성이 Object타입으로 저장되어 있으므로 다시 원래 타입으로 형변환이 필요.
PageInclude.jsp
<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h4>Include 페이지</h4>
<%
int pInteger2 = (Integer)(pageContext.getAttribute("pageInteger"));
//String pString2 = pageContext.getAttribute("pageString").toString();
Person pPerson2 = (Person)(pageContext.getAttribute("pagePerson"));
%>
<ul>
<li>Integer 객체 : <%= pInteger2 %></li>
<li>String 객체 : <%= pageContext.getAttribute("pageString") %></li>
<li>Person 객체 : <%= pPerson2.getName() %>, <%= pPerson2.getAge() %></li>
</ul>
include 지시어로 PageInclude.jsp를 포함시켰음.
PageInclude.jsp도 PageContextMain.jsp와 같은 page 영역이 되어 pageContext를 공유함.
PageLocation.jsp
<%@ page import="common.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head><title>page 영역</title></head>
<body>
<h2>이동 후 page 영역의 속성값 읽기</h2>
<%
Object pInteger = pageContext.getAttribute("pageInteger");
Object pString = pageContext.getAttribute("pageString");
Object pPerson = pageContext.getAttribute("pagePerson");
%>
<ul>
<li>Integer 객체 : <%= (pInteger == null) ? "값 없음" : pInteger %></li>
<li>String 객체 : <%= (pString == null) ? "값 없음" : pString %></li>
<li>Person 객체 : <%= (pPerson == null) ? "값 없음" : ((Person)pPerson).getName() %></li>
</ul>
</body>
</html>
a 태그를 통한 이동은 새로운 페이지를 요청함.
서로 다른 페이지이므로 page 영역은 공유되지 않음.
클라이언트가 요청을 할 때마다 새로운 request 객체가 생성되고, 같은 요청을 처리하는 데 사용되는 모든 JSP 페이지가 공유.
request 영역에 저장된 정보는 현재 페이지와 포워드된 페이지까지 공유.
RequestMain.jsp
<%@ 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=한글¶mEng=English")
.forward(request, response);
%>
</body>
</html>
포워드란 현재 페이지로 들어온 요청을 다음 페이지로 보내는 기능이다.
getRequestDispatcher("포워드 할 파일 경로").forward(request, response) 로 포워드를 하면 아래와 같은 실행 결과가 나온다.
RequestForward.jsp
<%@ 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 영역에서 속성들을 읽어와서 화면을 출력.
클라이언트가 웹 브라우저를 최초로 열고난 후 닫을 때까지 요청되는 모든 페이지는 session 객체를 공유.
세션은 클라이언트가 서버에 접속해 있는 상태 또는 단위를 말하는것으로, 회원인증 후 로그인 상태를 유지하는 처리에 사용.
SessionMain.jsp
<%@ 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>
session 영역에 ArrayList<> 객체를 저장.
SessionLocation.jsp
<%@ 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>
링크를 클릭하여 페이지가 이동된 후 session 영역에 저장된 값이 출력됨.
이후 브라우저를 닫기 전까지는 SessionLocation.jsp을 직접 실행하여도 값이 남아있지만 브라우저를 닫고 실행할 시 session 객체는 사라지기때문에 오류가 발생.
웹 애플리케이션은 단 하나의 application 객체만 생성.
웹 서버를 시작할 때 생성되며, 웹 서버를 닫을 때 삭제됨.
클라이언트가 요청하는 모든 페이지가 application 객체를 공유함.
ApplicationMain.jsp
<%@ 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>
ApplicationResult.jsp
<%@ 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>
모든 브라우저를 닫고 ApplicationResult.jsp을 실행하여도 위와 같이 출력된다.
웹서버를 종료하였다가 ApplicationResult.jsp을 실행하면 오류가 발생한다.