반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

JSP - 데이터들을 담을 수 있는 'JSP 내장객체 종류와 범위순서' 본문

⋆ 。゜☁︎ 。⋆ 。゜☾゜。⋆⋆ 。゜☁︎ 。⋆ 。゜☾゜。⋆/JSP

JSP - 데이터들을 담을 수 있는 'JSP 내장객체 종류와 범위순서'

yeonee 여니 2023. 7. 30. 22:10
728x90
반응형
SMALL

안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다 :)

 

yeonee 블로그 : 네이버 블로그

예쁘고 맛있게 먹고 건강하게,강인하지만 온화하게 행하라. ※맛스타운스타일상 인스타 www.instagram.com/s2._.y25n ※맛집감성일상 유튜브https://youtube.com/channel/@S2_yeonee 티스토리https://yeoneeluv.tistory.co

blog.naver.com

 

 

 

* 데이터들을 담을수 있는 JSP 내장객체 종류

1. ServletContext(application Scope)
 *  한 애플리케이션당 1개 존재하는 객체
 *  이 영역에 데이터를 담으면 애플리케이션 전역에서 사용 가능 => 공유범위가 가장 큼

2. HttpSession (Session Scope)
 *  한 브라우저당 1개 존재하는 객체
 *  이 영역에 데이터를 담으면 jsp / servlet단에서 사용 가능
 *  값이 한번 담기면 서버가 멈추거나 브라우저가 닫히기 전까지 사용가능.

3. HttpServletRequest(request Scope)
 *  요청 및 응답시 매번 생성되는 객체
 *  이 영역에 데이터를 담으면 해당 request객체를 포워딩 받는 응답 jsp 에서만 쓸수 있다.
 *  => 공유범위가 요청에 대한 응답jsp 하나뿐

4. PageContext(page Scope)
 *  현재 jsp에서만 사용 가능 => 공유범위가 가장 작음

 

다음 예시를 보며 좀 더 제대로 알아보자.

<Servlet 영역>

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // EL사용할때 내장객체들에 저장된 키값이 동일할 경우 
    // 공유범위가 제일 작은 Scope에서부터 제시된 키값을 검색함.
    // page => request => session => application 순
    request.setAttribute("scope","request");
    session.setAttribute("scope","session");
        
request.getRequestDispatcher("views/1_EL/01_el.jsp").forward(request, response);
		
response.getWriter().append("Served at: ").append(request.getContextPath());

아래 jsp에서 3번으로 출력할 내용으로 request와 session에 같은 키값을 가진 scope를 담아줍니다.

 

<01_el.jsp영역>

<h3>3. EL사용할때 내장객체들에 저장된 키값이 동일할 경우
scope 값 : ${scope } <br>
<!-- 
EL은 공유범위가 제일 작은 Scope에서부터 제시된 키값을 검색함.
page => request => session => application 순

만약 모든 영역에서 못 찾을 경우?? => 아무것도 출력 안됨. 화면상 오류는 안뜸
ex) 존재하지 않는 값을 입력 -> scope 값 : ${scope2 } 
-->
</h3>

그리고 JSP상에서 표현하고자 하는 값을 키값 scope를 el을 사용하여 ${scope } 형식으로 표현하여 저장된 키값에 접근하여 출력합니다.

 

<화면 출력 모습>

EL사용할때 내장객체들에 저장된 키값이 동일할 경우 EL은 공유범위가 제일 작은 Scope에서부터 제시된 키값을 검색하여 (page => request => session => application 순) 화면에 출력합니다.

※ 만약 모든 영역에서 못 찾을 경우 ? 에러가 나지 않고 그냥 아무것도 출력이 되지 않습니다.
    ex) 존재하지 않는 값을 입력 -> scope 값 : ${scope2 } 

 


 

다음 예시를 보며 좀 더 제대로 알아보자.

<Servlet 영역>

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    //application에 담기
    ServletContext application = request.getServletContext();
    application.setAttribute("scope", "application");

        
request.getRequestDispatcher("views/1_EL/01_el.jsp").forward(request, response);
		
response.getWriter().append("Served at: ").append(request.getContextPath());

application 객체를 얻어와서 값을 담아줍니다.
scope 명칭의 키값으로 application 문자열을 담아줍니다.

 

<01_el.jsp영역>

<h3>4. 직접 Scope영역을 지정해서 접근하기</h3>
<%
    pageContext.setAttribute("scope", "page");
%>

pageScope에 담긴 값 : ${scope } 또는 ${pageScope.scope } <br>
requestScope에 담긴 값 : ${requestScope.scope } <br>
sessionScope에 담긴 값 : ${sessionScope.scope } <br>
applicationScope에 담긴 값 : ${applicationScope.scope } <br><br>

application에 담은 scope 키값이 다른 scope와 겹칠 수 있습니다.
<% %>표현식 안에 직접 scope영역을 지정하여 값을 불러낼 수 있습니다.

하나하나 직접 scope영역을 지정해서 접근해보자.

 

<화면 출력 모습>

동일한 키값이더라도 각 하나하나의 scope에 담겨있는 키값이 출력되는 것이 보입니다.
안전성을 위해서 scope의 값을 꺼낼때는 el표현식으로 ${ scope종류.Scope.키값 }으로 적어주는 것이 불러오는 값이 어디선가 혹시라도 중복되지 않고 안전합니다.

※ 직접 값을 담을 때에는 request 혹은 session 하나만 선택해서 사용하는 것이 편리합니다.
관리해야할 scope가 늘어날수록 유지보수가 힘들어지기 때문입니다.

728x90
반응형
LIST