JSP

[JSP]EL : 내장객체

MoZZANG 2022. 5. 9. 14:18
xxxScope 내장객체
/*
	EL에서는 각 영역에 저장된 속성을 읽어  올 수 있는
	xxxScope계열 내장 객체를 제공함.
	즉 pageScope/requestScope/sessionScope/applicationScope
	
	
	읽어 올때 : xxxxScope.속성명 혹은 xxxxScope["속성명"]
	또한 xxxxScope는 생략가능 ,
	생략시 가장 작은 영역에 있는값을 읽어옴	
	*/

 

  • requestScope : request 기본 개체에 저장된 속성의 <속성,값> 매핑을 저장한 Map Collection
  • sessionScope : session 기본 개체에 저장된 속성의 <속성,값> 매핑을 저장한 Map Collection
  • applicationScope : application 기본 개체에 저장된 속성의 <속성,값> 매핑을 저장한 Map Collection
  • pageScope : pageContext 기본 개체에 저장된 속성의 <속성,값> 매핑을 저장한 Map Collection

 

<%
pageContext.setAttribute("scopeVar", "페이지 영역");    
request.setAttribute("scopeVar", "리퀘스트 영역");
session.setAttribute("scopeVar", "세션 영역");
application.setAttribute("scopeVar", "어플리케이션 영역");    
%>
<h4>각 영역에 저장된 속성 읽기(xxxScope계열 객체 지정)</h4>
<ul class="list-unstyled">
   <li>\${pageScope.scopeVar } : ${pageScope.scopeVar }</li>
   <li>\${requestScope.scopeVar } : ${requestScope.scopeVar }</li>
   <li>\${sessionScope['scopeVar'] } : ${sessionScope['scopeVar'] }</li>
   <li>\${applicationScope["scopeVar"] } : ${applicationScope["scopeVar"] }</li>
</ul>

 

 

 

 

 

<h4>각 영역에 저장된 속성 읽기(xxxScope계열 객체 미지정)</h4>
<ul class="list-unstyled">
 <li>\${scopeVar } : ${scopeVar }</li>
 <li>\${scopeVar } : ${scopeVar }</li>
 <li>\${scopeVar } : ${scopeVar }</li>
 <li>\${scopeVar } : ${scopeVar }</li>
</ul>
<jsp:forward page="BuiltInObjectOfScopeForwarded.jsp"/>

 

 

BuiltInObjectOfScopeForwarded.jsp

<fieldset class="form-group border p-3">
 <legend class="w-auto p-3">EL의 xxxScope계열 내장객체(포워드된 페이지)</legend>
    <h4>자바코드로 각 영역에 저장된 속성 읽기(xxxScope계열 객체 지정)</h4>
    <ul class="list-unstyled">
    	<li>페이지 영역 : <%=pageContext.getAttribute("scopeVar") %></li>
    	<li>리퀘스트 영역 : <%=request.getAttribute("scopeVar") %></li>
    	<li>세션 영역 : <%=session.getAttribute("scopeVar") %></li>
    	<li>어플리케이션 영역 : <%=application.getAttribute("scopeVar") %></li>
    </ul>
    
    <h4>각 영역에 저장된 속성 읽기(xxxScope계열 객체 지정)</h4>
    <ul class="list-unstyled">
    	<li>\${pageScope.scopeVar } : ${pageScope.scopeVar }</li>
    	<li>\${requestScope.scopeVar } : ${requestScope.scopeVar }</li>
    	<li>\${sessionScope['scopeVar'] } : ${sessionScope['scopeVar'] }</li>
    	<li>\${applicationScope["scopeVar"] } : ${applicationScope["scopeVar"] }</li>
    
    </ul>
    <h4>각 영역에 저장된 속성 읽기(xxxScope계열 객체 미 지정)</h4>
    	<ul class="list-unstyled">
    		<li>\${scopeVar } : ${scopeVar}</li>
    		<li>\${scopeVar } : ${scopeVar}</li>
    		<li>\${scopeVar} : ${scopeVar}</li>
    		<li>\${scopeVar} : ${scopeVar}</li>    		
    	</ul>
    </fieldset>

▲포워드된 페이지 에서는 어떻게 될까?

 

▲ 페이지영역은 없어져버리니까 그 다음 크기가 큰 request영역에서 찾아오기 때문에 pageScope에서 찾는 값은 모두 null이 나온다.

 

 

 

 

 

param내장객체
param

요청 파라미터의 <파라미터명,값> 매핑을 저장한 Map Collection,

파라미터값의 타입은 String request.getParameter(파라미터명)와 동일

값을 얻어올때 : param.파라미터명

 

 

paramValues

요청 파라미터의 <파라미터명,값배열> 매핑을 저장한 Map Collection,
파라미터값의 타입은 String[], request.getParametervalues(파라미터명)와 동일
값을 얻어올때 : paramValues.파라미터명

 

 

 

<%
//페이지 이동 전 리퀘스트 영역에 속성저장
request.setAttribute("dtoObject",new MemberDTO("KIM","1234","김길동","20"));
request.setAttribute("stringObject",new String("문자열 객체"));
request.setAttribute("integerObject",new Integer(1000));
%>

<jsp:forward page="BuiltInObjectOfParamResult.jsp">
	<jsp:param value="10" name="first"/>
	<jsp:param value="5" name="second"/>
</jsp:forward>

▲request 영역에 저장과 foward방식으로 파라미터와 값을 Result페이지로 넘긴다.

 

 

 

BuiltInObjectOfParamResult.jsp

<h4>자바코드로 영역에 저장된 속성 및 파라미터로 전달된 값 읽기</h4>
<h6>영역에 저장된 속성</h6>
<%
    MemberDTO member=(MemberDTO)request.getAttribute("dtoObject");
%>
<ul class="list-unstyled">
   <li>MemberDTO객체 :<%=member%> </li>
   <li>String객체 :<%=request.getAttribute("stringObject")%> </li>
   <li>Integer객체 :<%=request.getAttribute("integerObject")%> </li>
</ul>
<h6>파라미터로 전달된 값</h6>
<%
   int first=Integer.parseInt(request.getParameter("first")); 
    int second=Integer.parseInt(request.getParameter("second")); 
%>
두 파라미터합 : <%=first+second%>
<h4>EL로 request 영역에 저장된 속성 및 파라미터로 전달된 값 읽기</h4>
<h6>영역에 저장된 속성</h6>
<!-- 
    영역에 저장된 값은 xxxScope내장 객체로]
    -xxxScope.속성명 혹은 xxxScope["속성명"]
    파라미터로 전달 된 값은
    param내장객체 혹은 paramValues내장객체로

    ]
    -param.파라미터명 혹은 param["파라미터명"]
     paramValues.파리미터명 혹은 paramValues["파라미터명"]

     param은 request.getParameter()와 같고
     paramValues는 request.getParameterValues()와 같다

    ※EL에서는 문자열등을 표시할때 ""이나 '' 둘다 사용가능
 -->
<ul class="list-unstyled">
   <li>MemberDTO객체 :${requestScope.dtoObject } </li>
   <li>String객체 :${stringObject } </li>
   <li>Integer객체 :${integerObject } </li>
</ul>

 

▲ 결과값

 

 

 

param내장객체 예제

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BuiltInObjectOfParamExamIndex.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>Expression Language</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">사용자입력값 받기</legend>
    		<form action="BuiltInObjectOfParamExamResult.jsp" method="post">
			<div class="form-group">
				<label><kbd class="lead">이름</kbd></label> 
				<input type="text" class="form-control" name="name" placeholder="이름을 입력하세요">
			</div>			
			<div class="form-group">
				<label><kbd class="lead">성별</kbd></label>
				<div class="d-flex">
					<div class="custom-control custom-radio mr-2">
						<input type="radio" class="custom-control-input" name="gender" value="남자" id="male"> 
						<label for="male" class="custom-control-label">남자</label>
					</div>
					<div class="custom-control custom-radio">
						<input type="radio" class="custom-control-input" name="gender" value="여자" id="female"> 
						<label for="female"	class="custom-control-label">여자</label>
					</div>
				</div>
			</div>
			<div class="form-group">
				<label><kbd class="lead">관심사항</kbd></label>
				<div class="d-flex">
					<div class="custom-control custom-checkbox">
						<input type="checkbox" class="custom-control-input" name="inter" value="정치" id="POL">
						<label class="custom-control-label" for="POL">정치</label>
					</div>
					<div class="custom-control custom-checkbox mx-2">
						<input type="checkbox" class="custom-control-input" name="inter" value="경제" id="ECO">
						<label class="custom-control-label" for="ECO">경제</label>
					</div>
					<div class="custom-control custom-checkbox">
						<input type="checkbox" class="custom-control-input" name="inter" value="연예" id="ENT">
						<label class="custom-control-label" for="ENT">연예</label>
					</div>
					<div class="custom-control custom-checkbox ml-2">
						<input type="checkbox" class="custom-control-input" name="inter" value="스포츠" id="SPO">
						<label class="custom-control-label" for="SPO">스포츠</label>
					</div>
				</div>
			</div>
			<div class="form-group">
				<label><kbd class="lead">학력사항</kbd></label> 
				<select name="grade" class="custom-select mt-3 custom-select-lg">
					<option value="">학력을 선택하세요</option>
					<option value="초등학교">초등학교</option>
					<option value="중학교">중학교</option>
					<option value="고등학교">고등학교</option>
					<option value="대학교">대학교</option>
				</select>
			</div>			
			<button type="submit" class="btn btn-primary">확인</button>
		</form>
    	</fieldset>
  	</div><!-- container -->
</body>
</html>

▲확인 버튼을 누르면 BuiltInObjectOfParamExamResult.jsp로 전송한다.

 

 

 

BuiltInObjectOfParamExamResult.jsp

<%@page import="java.util.Arrays"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ include file="/Common/Validate.jsp" %> 
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
   
<%
    //POST방식 한글 처리
    request.setCharacterEncoding("UTF-8");

	//POST방식일때 한글 깨지는 거 처리용
	request.setCharacterEncoding("UTF-8");
	if(!"POST".equals(request.getMethod())){
		out.println("<script>");
		out.println("alert('잘못된 접근입니다');");				
		out.println("history.back();");
		out.println("</script>");
		return;//void _jspService()메소드 빠져 나가기	
	}/////////
	
	//파라미터 받기
	String name=request.getParameter("name");
	if(!isValidate(out, name,"이름을 입력하세요")) return;	
	String gender=request.getParameter("gender");
	if(!isValidate(out, gender,"성별을 선택하세요")) return;
	String[] inter=request.getParameterValues("inter");
	if(!isValidate(out,inter,3)) return;
	String grade=request.getParameter("grade");
	if(!isValidate(out, grade,"학력사항을 선택하세요")) return;
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BuiltInObjectOfParamExamResult.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>
	<div class="jumbotron jumbotron-fluid bg-warning">
	    <div class="container-fluid">
	      <h1>Expression Language</h1>      
	    </div><!--container-fluid-->
  	</div><!--jumbotron-fluid--> 
  	<div class="container">    
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">자바코드(스크립팅 요소)로 파라미터 받기</legend>
    		<ul class="list-unstyled">
    			<li>이름:<%=name %></li>
    			<li>성별:<%=gender %></li>
    			<li>관심사항:<%=Arrays.toString(inter) %> </li>
    			<li>학력:<%=grade %></li>    		
    		</ul>
    	</fieldset>
    	<fieldset class="form-group border p-3">
    		<legend class="w-auto p-3">EL로 파라미터 받기</legend>
    		<ul class="list-unstyled">
    			<li>이름:${param.name }</li>
    			<li>성별:${param.gender }</li>
    			<li>관심사항:
    			<c:forEach var="interVal" items="${paramValues.inter}">
    				${interVal }&nbsp;
    			</c:forEach>
    			</li>
    			<li>학력:${param.grade}</li>    		
    		</ul>
    	</fieldset>
  	</div><!-- container -->
</body>
</html>

▲파라미터로 전달받은 값은 param 내장객체로 받을 수 있다.

 

 

 

 

header  및 cookie 
header

: 요청정보의 <헤더이름,값> 매필을 저장한 Map Collection,
값을 얻어올때 : header.헤더명 단, user-agent의 경우  헤더명에 - (대쉬) 가 들어가기때문에  header["user-agent"]로 

 

headerValues

: 요청정보의 <헤더이름,값배열> 매필을 저장한 Map Collection
request.getHeaders(이름)결과와 동일

 

 

cookie

: <쿠키명,값> 매핑을 저장한 Map Collection.

값 얻어올때: cookie.쿠키명.value

 

 

 

<!-- 
    ※EL에서는 값을 설정하거나 영역에 속성을 
      저장(설정)하지는 못한다.
      단지 저장된 값을 출력만 할 수 있다.
-->
    		 
<h4>1. EL의 pageContext내장객체</h4> 
<!-- JSP의 pageContext내장객체와 같다.단,
      자바빈 규칙으로 접근 가능한 메소드만 제공한다.
-->	
        <h6>자바코드로 컨텍스트 루트 얻기</h6>

        <ul class="list-unstyled">
            <li>방법1 : request내장객체 - <%=request.getContextPath() %></li>
            <%
                String context=((HttpServletRequest)pageContext.getRequest()).getContextPath();
            %>
            <li>방법2 : pageContext내장객체 - <%=context %></li>
        </ul>  
        <h6>EL로 컨텍스트 루트 얻기</h6>  
        \${pageContext.request.contextPath}	: ${pageContext.request.contextPath}		
        <h6>자바코드로 세션의 유효시간 얻기</h6>
        <%=session.getMaxInactiveInterval() %>초<br/>
        <%=request.getSession().getMaxInactiveInterval() %>초<br/>
        <%=pageContext.getSession().getMaxInactiveInterval() %>초<br/>
        <%=((HttpServletRequest)pageContext.getRequest()).getSession().getMaxInactiveInterval() %>초<br/>
        <h6>EL로 세션의 유효시간 얻기</h6>
        \${pageContext.session.maxInactiveInterval } : ${pageContext.session.maxInactiveInterval }초<br/>
        \${pageContext.request.session.maxInactiveInterval } : ${pageContext.request.session.maxInactiveInterval }초
        <h4>2. EL의 header내장객체</h4> 
        <h6>자바코드로 요청헤더값 얻기</h6>
        <%=request.getHeader("user-agent") %>
        <h6>EL로 요청헤더값 얻기</h6>
        <!-- 
            EL식으로 요청헤더명에 따른 
            헤더 값을 출력할때는
            header.요청헤더명이나
            혹은 header["요청헤더명"]
                    단,키값에 해당하는 요청헤더명에
                   특수 문자가 들어가 있는 경우에는 
                   무조건 []사용
        -->
        <!-- PropertyNotFoundException:pageContext.request의 header속성이 없다 
             즉 요청헤더를 구할때는 무조건 header내장객체 사용
        -->
        \${pageContext.request.header["user-agent"]} : \${pageContext.request.header["user-agent"]}<br/>
        \${header.user-agent} : ${header.user-agent}<br/>
        \${header['user-agent']} : ${header['user-agent']}
        <h4>3. EL의 cookie내장객체</h4> 
        <%
            //자바코드로 쿠키 설정
            Cookie cookie = new Cookie("KOSMO","한소인");
            cookie.setPath(request.getContextPath());
            response.addCookie(cookie);	    		
        %>
        <h6>자바코드로 쿠키 얻기</h6>
        <%
            Cookie[] cookies = request.getCookies();
            if(cookies !=null){
                for(Cookie cook:cookies){
                    String name= cook.getName();
                    String value= cook.getValue();
                    out.println(name + " : "+value+"<br/>");
                }
            }    		
        %>
        <h6>EL로 쿠키 얻기</h6>
        \${pageContext.request.cookies} : ${pageContext.request.cookies}<br/> 
        <!-- cookie내장객체 미 사용 -->   		
        <c:forEach items="${pageContext.request.cookies}" var="cook">
            ${cook.name} : ${cook.value} <br/>   		
        </c:forEach>
        <!-- 
            cookie.쿠키명.value로 쿠키명에 해당하는 쿠키값을 
            얻을 수 있다.		 
        -->
        <!-- cookie내장객체 사용 -->   		
        \${cookie.KOSMO.value } : ${cookie.KOSMO.value }<br/>
        \${cookie['KOSMO'].value } : ${cookie['KOSMO'].value }

 

 

 

 

initParam내장객체
<!-- 
      컨텍스트 초기화 파라미터를 얻어 올수 있는 내장 객체  
    -->
    <!-- 
   [Context초기화 파라미터]
   -Context초기화 파라미터는 ServletContext의
    getInitParameter("파라미터명")메소드를 통해서 
    얻는다.
   -Context를 구성하는 모든 서블릿에서 공유할 수 있는 변수
   [Servlet초기화 파라미터]
   -Servlet초기화 파라미터는 ServletConfig의
    getInitParameter("파라미터명")메소드를 통해서 얻는다
   -해당 서블릿에서만 사용할 수 있는 변수    
      ※초기화 파라미터는 web.xml에 등록
   -->
   <h6>자바코드로 컨텍스트 초기화 파라미터 얻기</h6>
   <ul class="list-unstyled">
    <li>ORACLE-URL : <%=application.getInitParameter("ORACLE-URL") %></li>
    <li>ORACLE-DRIVER : <%=application.getInitParameter("ORACLE-DRIVER") %></li>
    <li>PAGE-SIZE : <%=application.getInitParameter("PAGE-SIZE") %></li>
    <li>BLOCK-PAGE : <%=application.getInitParameter("BLOCK-PAGE") %></li>
   </ul>
   <h6>EL로 컨텍스트 초기화 파라미터 얻기</h6>
   <ul class="list-unstyled">
    <li>ORACLE-URL : ${initParam['ORACLE-URL']}</li>
    <li>ORACLE-DRIVER : ${initParam['ORACLE-DRIVER']}</li>
    <li>PAGE-SIZE : ${initParam['PAGE-SIZE']}</li>
    <li>BLOCK-PAGE : ${initParam['BLOCK-PAGE']}</li>
   </ul>

 

 

 

컬렉션에 저장된 객체를 EL로 출력

 

 <h4>컬렉션에 저장된 객체를 EL로 출력</h4>
       <%
        //데이타 준비
        MemberDTO first= new MemberDTO("KIM","1234","김길동","20");
        MemberDTO second= new MemberDTO("LEE","1234","이길동","30");
        //리스트 계열 컬렉션에 객체 저장
        List<MemberDTO> list= Arrays.asList(first,second);
        //맵 계열 컬렉션에 객체 저장
        Map<String,MemberDTO> map = new HashMap<>();
        map.put("first", first);
        map.put("second", second); 

       %>

       <h4>자바코드로 출력</h4>

       <h5>리스트 계열 컬렉션</h5>
       <h6>일반 for문으로 출력</h6>
       <% for(int i=0; i < list.size();i++){ %>
        <%=list.get(i) %><br/>
       <%} %>
       <h6>확장 for문으로 출력</h6>
       <% for(MemberDTO member:list){%>
        <%=member %><br/>
       <%} %>
       <h5>맵 계열 컬렉션</h5>
       <%
        Set<String> keys= map.keySet();
        for(String key:keys){
       %>
        <%=key %> : <%=map.get(key) %><br/>
       <%} %>
       <h4>EL로 출력</h4>
       <c:set var="list" value="<%=list%>"/>
       <c:set var="map" value="<%=map%>"/>
       <h5>리스트 계열 컬렉션</h5>
       <h6>JSTL 미 사용</h6>
       \${list} : ${list}<br/>
       <!-- list.get(0)와 같다 -->
       \${list[0]} : ${list[0]}
       <ul class="list-unstyled">
        <li>이름:${list[0].name},아이디:${list[0].id} ,비번:${list[0].pwd}</li>
        <li>${list[1]}</li>
        <!-- 출력만 안된다 \${list[100]}는 null이다-->
        <li>${list[100]}</li>
       </ul>
       <h6>JSTL 사용:즉 저장된 객체를 수를 모름</h6>
       <ul class="list-unstyled">
       <c:forEach items="${list}" var="member">
          <li>이름:${member.name},아이디:${member["id"]} ,비번:${member.pwd}</li>	   
       </c:forEach>
       </ul>
       <h5>맵 계열 컬렉션</h5>
       <h6>JSTL 미 사용</h6>
        \${map} : ${map}<br/>
        <!-- map.get("first"):와 같다 -->
        \${map.first} : ${map.first}
         <ul class="list-unstyled">
            <li>이름:${map.first.name},아이디:${map["first"]["id"]},비번:${map['first'].pwd }</li>
            <li>\${map.second} : ${map.second}</li>
            <li>\${map.third} : ${map.third}</li><!-- \${map.third}는 null이다 -->
         </ul>
        <h6>JSTL 사용:즉 키를 모름</h6>
        <ul class="list-unstyled">
            <!-- 
            JSTL의 forEach사용시
            var에 지정한 변수명.value는 밸류값
            변수명.key는 키값
            -->
            <c:forEach items="${map}" var="item">
                키은 ${item.key} 값은 ${item.value}<br/>
                이름:${item.value.name},아이디:${item.value.id},비번:${item.value.pwd}<br/>	  			
            </c:forEach>		  	
        </ul>
        <!-- \${}에서 자바객체의 메소드 호출 가능
             단,객체의 값을 변화시키는 메소드는 호출불가(에러)
             호출가능한 메소드는 읽기용류의 메소드들만 가능
         -->
        <h4>컬렉션의 읽기용 메소드의 호출</h4>
        \${list.isEmpty() } : ${list.isEmpty() }<br/>
        \${list.size() } : ${list.size() }<br/>
        <% map.clear(); %>
        \${map.isEmpty() } : ${map.isEmpty() }<br/>
        \${map.size() } : ${map.size() }<br/>
        \${list.clear()} : \${list.clear()}<!-- UnsupportedOperationException:읽기용 메소드가 아님으로 -->

 

 

'JSP' 카테고리의 다른 글

[JSP] JSTL Core Tag - part.2(if,choose ~when ~otherwise,forEach)  (0) 2022.05.10
[JSP] JSTL Core Tag - part.1(set,remove)  (0) 2022.05.10
[JSP]Expression Language(EL : 표현언어)  (0) 2022.05.06
[JSP]Action Tag  (0) 2022.05.03
[JSP]session  (0) 2022.05.03