내장 객체 (영역 객체(Scope) / 속성(Attribute))
▶▶ 내장 객체
▶ 영역 객체 (Scope)와 속성 (Attribute)
– 데이터를 공유할수 있는 범위를 영역이라 하고, 그 영역에 접근할 수 있는 객체를 '영역 객체'라고 함.
즉, 일정 범위에서 데이터를 공유하는 객체.
– '공유 되는 데이터'를 속성(Attribute)이라고 하며, 속성을 공유할 수 있는 유효 범위를 영역(Scope)이라고 함.
영역 | 영역 객체 | 속성의 유효 범위 |
page | pageContext | 해당 페이지가 클라이언트에 서비스를 제공하는 동안에만 유효. (서블릿 인스턴스의 _jspServicer( ) 메서드가 실행되는 동안에만 유효.) |
request | request | 클라이언트의 요청이 처리되는 동안 유효. (포워딩 또는 include를 이용하는 경우, 여러 개의 페이지에서도 요청 정보가 계속 유지되므로 request영역의 속성을 여러 페이지에서 공유할 수 있음.) |
session | session | 세션이 유지되는 동안 유효. (하나의 브라우저(클라이언트)에 1개의 세션이 생성되므로, 같은 웹브라우저 내에서 실행되는 페이지들이 속성을 공유할 수 있음.) ex ) 크롬 브라우저를 열어 네이버에 로그인을 하고, 구글에 잠시 다녀와도 여전히 네이버 로그인이 되어 있음. |
application | application | 웹 애플리케이션이 실행되고 있는 동안 유효. (= 서버가 실행되는 동) (웹 컨테이너에서 해당 애플리케이션은 오직 하나만이 실행되므로 4가지 영역 중 가장 큰 영역에 해당함.) 웹 컨테이너를 종료하면 애플리케이션 영역 객체가 소멸함. |
▶ 영역 객체의 메서드
– [영역객체].setAttribute("속성명", 값); → 영역객체에 저장한다 속성(데이터)를
– [영역객체].getAttribute("속성명"); → 영역객체에서 가져온다 속성(데이터)를
– [영역객체].removeAttribute("속성명"); → 영역객체에서 삭제한다 속성(데이터)를
EX ) Form → Pro → Action.jsp 페이지 작성
• Form 태그의 action속성으로 Form.jsp 페이지에서 Pro.jsp 페이지로 이동하고,
HTML의 a태그 / JS - location 객체 / JSP - response 객체 / 액션 태그 - forward 를 사용하여,
Pro.jsp 페이지에서 Action.jsp 페이지로 이동해보기.
• 영역 객체의 데이터를 저장하고 출력하기.
• JSP페이지에서 실행되는 코드들의 순서 알아두기.
— scopeForm.jsp 페이지 만들기
<body>
<h1> scopeForm.jsp </h1>
<form action="scopePro.jsp" method="get">
아이디 : <input type="text" name="id"> <br><hr>
<input type="submit" value="전송">
</form>
</body>
→ '전송'버튼을 누르면 'scopePro.jsp' 페이지로, 정보 전달 방식은 get방식으로 설정함.
✓ 실행 결과
— scopePro.jsp 페이지 만들기
<body>
<h1>scopePro.jsp</h1>
<%
// 파라미터로 전달된 값 변수에 저장
String id = request.getParameter("id");
// 영역객체에 데이터를 저장
pageContext.setAttribute("p", "pageScope Value!");
request.setAttribute("r", "requestScope Value!");
session.setAttribute("s", "sessionScope Value!");
application.setAttribute("a", "applicationScope Value!");
%>
<!-- 아이디 출력하기 -->
아이디 : <%=id %> <hr>
<!-- 영역객체에 저장된 데이터를 메서드로 출력하기 -->
pageContext 내장객체 값 : <%=pageContext.getAttribute("p") %><br>
request 내장객체 값 : <%=request.getAttribute("r") %><br>
session 내장객체 값 : <%=session.getAttribute("s") %><br>
application 내장객체 값 <%=application.getAttribute("a") %> <br>
<hr>
</body>
→ 아이디 정보는 input태그로 만들었으므로 파라미터로 전달됨. 변수에 저장하여 표현식으로 출력함.
→ 영역객체에 데이터를 저장하기 위해 'setAttribute()' 메서드를 사용하여 데이터를 저장하고,
'getAttribute()' 메서드를 사용하여 표현식으로 출력함.
✓ 실행 결과


✓ Pro페이지 내에서 내장객체 데이터를 저장하고 출력하였으므로 유효 범위를 생각해봤을 때,
같은 페이지 내에서 속성을 공유하는 page영역도 해당 범위내에 속하므로 데이터 출력이 가능하고,
page보다 더 큰 유효 범위를 갖는 request, session, application 또한 모두 출력 가능함.
— scopeAction.jsp 페이지 만들기
<body>
<h1>scopeAction.jsp</h1>
// 파라미터로 전달 될 id와 pw정보를 변수에 저장
<%
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>
// 출력하기
아이디 : <%=id %> <hr>
비밀번호 : <%=pw %><hr>
// 내장객체 데이터 출력하기
pageContext 내장객체 값 : <%=pageContext.getAttribute("p") %><br>
request 내장객체 값 : <%=request.getAttribute("r") %><br>
session 내장객체 값 : <%=session.getAttribute("s") %><br>
application 내장객체 값 : <%=application.getAttribute("a") %> <br>
</body>
→ 이제는 아이디뿐만 아니라 비밀번호도 함께 출력해보겠음.
Pro페이지에서 Action페이지로 넘어올거기 때문에, Pro페이지에서 아이디와 비밀번호 데이터를 저장시키고,
Action페이지에서는 파라미터로 전달 될 아이디와 비밀번호 데이터를 각각 변수에 미리 저장하고, 표현식을 사용.
→ 내장객체들의 유효범위를 알아보기 위해 getAttribute() 메서드를 사용하여 데이터를 출력해봄
— scopePro.jsp페이지에서 scopeAction페이지로 이동하기
방법은 총 4가지가 있으며, 이번에는 아이디와 비밀번호 또한 출력해 보겠음.
1 ) HTML의 a태그로 이동
<h2>페이지 이동하는 방법</h2>
<h3>1 ) HTML의 a태그 : 파라미터의 데이터 / session & application영역의 데이터</h3>
<a href="scopeAction.jsp?id=<%=id%>&pw=1234">scopeAction.jsp 페이지로 이동</a>
→ a태그에 get방식으로 작성하면 action페이지로 데이터 전송 가능! ' ?네임명=표현식 '
→ a태그를 사용하면 파라미터의 데이터와 session & application영역의 데이터만 사용 가능.
→ 비밀번호는 앞에서 저장한 정보가 없기 때문에 표현식을 쓰지 않고 바로 값을 저장해줌.
✓ 실행 결과


✓ a태그를 사용했기에 파라미터로 넘어온 데이터인 아이디와 비밀번호는 출력이 잘 됐고,
pageContext & request를 제외한 session & application 내장객체 데이터들도 출력이 잘 됨.
2 ) JS – location 객체로 이동
<h3>2 ) JS - location 객체 : 파라미터, session, application</h3>
<script type="text/javascript">
alert("js 페이지 이동!");
location.href="scopeAction.jsp?id=<%=id%>&pw=1234";
</script>
→ JavaScript의 location객체를 이용하여 페이지를 이동하기 위해 먼저 script태그를 사용함.
→ alert을 사용하여 알림창이 떠 있는 동안은 Pro페이지에 머무르다가 확인을 누르면 Action페이지로 감.
alert을 사용한 이유는, Form페이지에서 Pro로 넘어왔다가 너무 빠르게 Action페이지로 바로 넘어가서,
마치 Form페이지에서 Action페이지로 바로 넘어가는 것 같기에 alert을 사용하여 단계를 확인시키기 위함임.
→ a태그와 똑같이 get방식으로 아이디는 표현식으로, 비밀번호는 데이터를 직접 입력해줌.
✓ 실행 결과


✓ JS의 location 객체를 사용했기에 파라미터로 넘어온 데이터인 아이디와 비밀번호는 출력이 잘 됐고,
pageContext & request를 제외한 session & application 내장객체 데이터들도 출력이 잘 됨.
3 ) JSP – response 객체로 이동
<h3>3 ) JSP - response 객체 : 파라미터, session, application</h3>
<%
System.out.println("JSP 페이지이동 - 시작!");
response.sendRedirect("scopeAction.jsp?id=" + id + "&pw=1234");
System.out.println("JSP 페이지이동 - 끝!");
%>
→ JSP의 response객체의 sendRedirect() 메서드를 이용하여 페이지를 이동하기 위해 스크립틀릿을 열어줌.
a태그와 JS처럼 get방식+표현식은 에러 발생함. 생각해보니 스크립틀릿 안에 작성하는거라 표현식이 필요 없음.
Java영역이니까 Java처럼 작성, get방식과 연결연산자로 출력하고자 하는 변수를 넣어주면 출력 가능.
마찬가지로 비밀번호는 직접 데이터 입력함.
→ System.out.println()사용으로 console창에 문장이 출력되고, 페이지 이동후 다시 console창에 문장이 출력됨. (빠름)
✓ 실행 결과



✓ JSP의 response객체의 sendRedirect() 메서드를 사용했기에 파라미터로 넘어온 데이터인 아이디와 비밀번호와
pageContext & request를 제외한 session & application 내장객체 데이터들도 출력이 잘 됨.
⚠️여기서 잠깐⚠️
일반적으로 코드의 흐름은 위에서 아래로 실행되며, 이러한 흐름을 제어하고자 사용하는 것이 선택문 반복문임.
그런데 우리는 제어문을 사용하지도 않았는데, 왜 JS의 location객체를 이용하여 작성한 alert창이 뜨지 않을까?
이는 JSP에서 실행되는 코드에 순위가 정해져 있기 때문!!!
— JSP페이지 = HTML + JS + JSP(Java)
— 1순위 JSP(Java) / 2순위 HTML / 3순위 JS
→ 물론 찰나의 순간이지만 이 순서대로 코드를 만들고 실행함.
그래서 response객체의 sendRedirect() 메서드를 주석처리하면,
JSP(Java)코드가 먼저 만들어지고 실행되므로 console창에 'JSP페이지이동-시작! 끝!'이 먼저 출력되고, 알림창이 뜸.
→ sendRedirect()를 사용하면 JSP코드가 먼저이므로 페이지가 바로 넘어가서 JS코드는 실행조차 안됨.
✓ JSP, JS페이지 이동은 둘 중에 하나만 사용하기!
4 ) 액션 태그 – forward로 이동
<h3>4 ) 액션 태그 - forward : 파라미터, request, session, application</h3>
<jsp:forward page="scopeAction.jsp"/>
→ 액션 태그를 사용할 때는 <jsp: 로 시작하여 닫는 태그 /> 까지 한번에 작성하고,
forward 액션을 사용할 때는, 큰 따옴표 안에 "이동할 페이지"를 작성함.
→ 이렇게 포워딩을 하면 request영역의 데이터를 사용 가능해지며, 화면은 변경되지만 주소는 변경되지 않음.
✓ 실행 결과


✓ JSP의 액션 태그의 forward를 사용하면 파라미터로 넘어온 데이터인 아이디와
pageContext를 제외한 request & session & application 내장객체 데이터들도 출력됨.
비밀번호 데이터는 따로 지정하지 않았기에 'null' 이 출력됨.
— 만약 비밀번호 데이터도 따로 지정하여 출력하고 싶으면 forward태그의 하위태그인 <jsp:param/> 태그를 사용함.
<jsp:forward page="scopeAction.jsp">
<jsp:param value="1234" name="pw"/> // 추가된 하위태그 코드
</jsp:forward>
→ 위의 코드에서 하위 태그를 추가하여 이름과 밸류값을 입력하여 비밀번호 데이터도 파라미터로 전달할 수 있음.
→ 원래는 한 번에 태그를 열고 닫았으나, 하위 태그가 들어감으로써 마지막에 forward태그를 닫아줌.
✓ 실행결과

🐾 참조 도서 및 사이트 🐾
— JSP 2.3 & Servlet 3.1