영역(Scope) 객체와 속성(Attribute)

essential·2023년 8월 4일
0

JSP

목록 보기
13/21

속성(Attribute)

  • 공유되는 데이터

영역(Scope)

  • 속성을 공유할 수 있는 유효 범위
영역영역 객체속성의 유효 범위
pagepageContext해당 페이지가 클라이언트에 서비스를 제공하는 동안에만 유효(서블릿 인스턴스의 _jspServicer() 메소드가 실행되는 동안에만 유효)
requestrequest클라이언트의 요청이 처리되는 동안 유효(포워딩 또는 include를 이용하는 경우 여러 개의 페이지에서도 요청 정보가 계속 유지되므로 request 영역의 속성을 여러 페이지에서 공유 할 수 있다.)
sessionsession세션이 유지되는 동안 유효 (하나의 브라우저에 1개의 세션이 생성되므로 같은 웹 브라우저 내에서 실행되는 페이지들이 속성을 공유할 수 있다.
applicationapplication웹 어플리케이션이 실행되고 있는 동안 유효 (웹 컨테이너에서 해당 어플리케이션은 오직 하나만이 실행되므로 네 가지 영역 중 가장 큰 영역에 해당 된다.

속성과 관련된 메소드들

  • pageContext, request,session, application 내장 객체들이 동일하게 정의하고 있는 메소드들
리턴 타입메소드명해설
ObjectgetAttribute(String key)key 값으로 등록되어 있는 속성을 Object 타입으로 리턴(key 값에 해당되는 속성이 없을 경우 null 을 리턴)
EnumerationgetAttributeNames()해당 영역에 등록되어 있는 모든 속성들의 이름을 Enumeration 타입으로 리턴
없음setAttribute(String key,Object obj)해당 영역에 key 값의 이름으로 obj객체를 등록
없음removeAttribute(String key)key 값으로 등록되어 있는 속성을 제거

예제

attributeTest1_Form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>attribute Test Form</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<form action="attributeTest1.jsp" method="post">
<table border="1">
	<tr><td colspan="2">Application 영역에 저장할 내용들</td></tr>
	<tr>
		<td>이름</td>
		<td><input type="text" name="name"></td>
	</tr>
	<tr>
		<td>아이디</td>
		<td><input type="text" name="id"></td>
	</tr>
	<tr>
		<td colspan="2"><input type="submit" value="전송"></td>
	</tr>
</table>
</form>
</body>
</html>

attributeTest1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>attributeTest</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<%
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
String id=request.getParameter("id");
if(name!=null && id != null){
		application.setAttribute("name", name); //웹서버가 구동되는 순간 자동으로 단 하나 생성
		application.setAttribute("id", id);
}
%>
<h3><%=name %>님 반갑습니다.<br><%=name %>님의 아이디는 <%=id %>입니다.</h3>
<form action="attributeTest2.jsp" method="post"></form>
<table>
	<tr><td colspan="2">Session 영역에 저장할 내용들</td></tr>
	<tr>
		<td>email 주소</td>
		<td><input type="text" name="email"></td>
	</tr>
	<tr>
		<td>집 주소</td>
		<td><input type="text" name="address"></td>
	</tr>
	<tr>
		<td>전화번호</td>
		<td><input type="text" name="tel"></td>
	</tr>
	<tr>
		<td colspan="2"><input type="submit" value="전송"></td>
	</tr>
</table>

</body>
</html>

attributeTest2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Attribute Test</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<%
request.setCharacterEncoding("utf-8");
String email=request.getParameter("eamil"); //데이터 읽어오기
String address=request.getParameter("address");
String tel=request.getParameter("tel");
session.setAttribute("email", email); //세션 객체에 저장
session.setAttribute("address", address);
session.setAttribute("tel", tel);

String name=(String)application.getAttribute("name"); //getAttribute 의 리턴 타입은 Object 라서 (String) 앞에 붙여줌
%>
<h3><%=name %>님의 정보가 모두 저장되었습니다.</h3>
<a href="attributeTest3.jsp">확인하러 가기</a>
</body>
</html>

attributeTest3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@page import="java.util.Enumeration" %>
<html>
<head>
<meta charset="UTF-8">
<title>Attribute Test</title>
</head>
<body>
<h2>영역과 속성 테스트</h2>
<table border="1">
	<tr><td colspan="2">Application 영역에 저장된 내용들</td></tr>
	<tr>
		<td></td>
		<td><%=application.getAttribute("name") %></td>
	</tr>
	<tr>
		<td></td>
		<td><%=application.getAttribute("name") %></td>
	</tr>
</table>
<table border="1"></table>
	<tr><td colspan="2">Session 영역에 저장된 내용들</td></tr>
<%
Enumeration e=session.getAttributeNames();
while(e.hasMoreElements()){
	String attributeName=(String)e.nextElement();
	String attributeValue= (String)session.getAttribute(attributeName);
	%>
	<tr>
		<td><%=attributeName %></td>
		<td><%=attributeValue %></td>
	</tr>
	<%
}
%>
</body>
</html>

attributeTest1_Form.jsp 실행 시 화면


전송 버튼 클릭 시 test1.jsp 로 전환되어 나오는 화면


전송 버튼 클릭 시 test2.jsp 로 전환

  • get, set 으로 세션에 값 저장

확인하러 가기 클릭 시 test3.jsp 로 전환되어 나오는 화면


모든 브라우저 닫고 test3.jsp 접속 시 화면

  • Application 객체는 서버를 중지해야 없어지기 때문에 Session 객체만 없어짐

서버 재구동 시 화면

  • Application 객체도 없어짐

내장 객체 영역 (scope)

  • request
    • 요청이 일어난 후 처리가 완료될 때까지 유지
    • 새로운 요청에 대해서는 새로운 request 객체가 만들어진다.
    • 단 forward나 include를 사용하는 경우에는 기존의 request 객체를 새로운 요청에 공유 한다.
  • session
    • 웹 브라우저로 처음 요청시 웹 서버에 새로운 세션 객체가 생성
    • 웹 브라우저 종료시 세션 객체는 자동으로 소멸 된다.
    • 웹 서버 종료시나 세션 만료 시간이 지나면서 세션 객체는 자동으로 소멸 된다.
    • 브라우저 별로 세션 객체는 별도로 생성 된다.
  • application
    • 웹 서버 구동시 application 별로 하나의 객체가 생성되며 웹 서버 종료시 해당 객체는 자동 소멸 된다.
  • pageContext
    • 해당 요청 페이지가 실행되면서 생성이 되고 해당 페이지를 벗어나면 자동 소멸 된다.

예제

attributeTest4.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>
<%
pageContext.setAttribute("pageScope", "pageValue");
request.setAttribute("requestScope", "requestValue");
%>

pageValue=<%=pageContext.getAttribute("pageScope") %><br>
requestValue=<%=request.getAttribute("requestScope") %>
</body>
</html>
  • 이 페이지를 벗어나면 Context 객체는 소멸 됨

attributeTest5.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>
<%
pageContext.setAttribute("pageScope", "pageValue");
request.setAttribute("requestScope", "requestValue");
%>
<jsp:forward page="requestTest5Result.jsp"></jsp:forward>
</body>
</html>

requestTest5Result.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>
pageValue=<%=pageContext.getAttribute("pageScope") %><br>
requestValue=<%=request.getAttribute("requestScope") %>
</body>
</html>

attributeTest5.jsp 실행시 화면

  • URL(Test5.jsp) 변경되지 않고 requestTest5Result.jsp 실행 됨
  • foward 된 request 객체는 소멸되지 않고 그대로 유지되어 requestValue 값 확인 가능
  • pageContext 객체는 해당 페이지에서만 유지되어 소멸 됨
profile
essential

0개의 댓글