JSP

내장 객체 (영역 객체(Scope) / 속성(Attribute))

태로미 2023. 2. 23. 20:25

 

 

 

 

 

 

 

 

 

 

▶▶   내장 객체

 

 

 

 

 

▶   영역 객체 (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페이지로 넘어와 아이디 및 내장객체의 값들이 출력됨.

   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영역의 데이터만 사용 가능.

→   비밀번호는 앞에서 저장한 정보가 없기 때문에 표현식을 쓰지 않고 바로 값을 저장해줌.

   실행 결과

더보기
Form페이지에서 아이디 값을 입력하고 전송 버튼을 누름.&nbsp; 이제 a태그로 생성된 하이퍼링크로 action페이지로 이동해보겠음.

 

get방식으로 데이터가 잘 넘어오고 출력도 잘 됨.

   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방식으로 아이디는 표현식으로,  비밀번호는 데이터를 직접 입력해줌.

   실행 결과

더보기
알림창이 실행되며 주소줄을 보면 현재 Pro페이지에 머물러 있음.

 

확인 버튼을 누르니 Action페이지로 이동함.

   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창에 문장이 출력됨. (빠름)

   실행 결과

더보기
Form페이지에 아이디를 입력하고 전송 버튼을 누름.

 

console창에 문장이 출력됨.

 

Action페이지로 이동하며 해당 데이터들이 출력됨.

   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영역의 데이터를 사용 가능해지며,  화면은 변경되지만 주소는 변경되지 않음.

   실행 결과

더보기
Form페이지에서 데이터 입력함.

 

화면은 Action페이지로 넘어왔으나 주소는 Pro페이지로 표시됨.

  JSP의 액션 태그의 forward를 사용하면 파라미터로 넘어온 데이터인 아이디

      pageContext를 제외한 request & session  & application 내장객체 데이터들도 출력됨.

     비밀번호 데이터는 따로 지정하지 않았기에 'null' 이 출력됨.

 

 

 

— 만약 비밀번호 데이터도 따로 지정하여 출력하고 싶으면 forward태그의 하위태그인 <jsp:param/> 태그를 사용함.

<jsp:forward page="scopeAction.jsp">
	<jsp:param value="1234" name="pw"/>		// 추가된 하위태그 코드
</jsp:forward>

→   위의 코드에서 하위 태그를 추가하여 이름과 밸류값을 입력하여 비밀번호 데이터도 파라미터로 전달할 수 있음.

→   원래는 한 번에 태그를 열고 닫았으나,  하위 태그가 들어감으로써 마지막에 forward태그를 닫아줌.

   실행결과

더보기
forward 하위 태그 사용으로 파라미터로 전달한 비밀번호 데이터가 잘 출력됨.

 

 

 

 

 

 

 

 

 

 


🐾 참조 도서 및 사이트 🐾

 

—   JSP 2.3 & Servlet 3.1