본문 바로가기

학원/복기

[MVC] EL 내장객체

Scope 객체 

 

JSP 내장객체에 따라 속성값을 저장하여 사용할 수 있는 범위를 다르게 설정할 수 있다.
스코프 객체 속성값의 사용범위 : Page Scope, Request Scope, Session Scope, Application Scope
 

  1. Page Scope:
    • 가장 작은 범위의 스코프로, 해당 JSP 페이지에서만 유효하다.
    • 페이지 내에서 선언된 변수는 해당 페이지 내에서만 접근 가능하다.
    • 다른 JSP 페이지에서는 접근할 수 없다.
    • JSP 페이지가 처리되는 동안 유지되며, 페이지가 렌더링되고 응답이 전송되면 소멸된다.
  2. Request Scope:
    • 요청이 들어온 서블릿에서 JSP 페이지로 전달되는 동안 유지되는 스코프이다,
    • 같은 요청 범위에서 서블릿과 JSP 페이지 간에 데이터를 공유할 수 있다.
    • 하나의 요청에서만 유효하며, 다른 요청에서는 접근할 수 없다.
    • 주로 폼 데이터, URL 매개변수 등의 데이터를 전달하는 데 사용된다.
  3. Session Scope:
    • 사용자 세션과 관련된 데이터를 유지하는 스코프이다.
    • 세션이 시작되고 종료될 때까지 유지되며, 같은 세션에 속한 모든 요청에서 접근할 수 있다.
    • 여러 개의 요청에서 사용자 정보, 로그인 상태 등을 유지하는 데 사용된다.
    • 세션이 종료되면 해당 세션에 저장된 데이터는 소멸된다.
  4. Application Scope:
    • 웹 애플리케이션 전체에서 공유되는 스코프이다.
    • 여러 세션 간에 데이터를 공유할 수 있다.
    • 웹 애플리케이션이 시작되고 종료될 때까지 유지되며, 모든 사용자에게 접근이 가능하다.
    • 주로 애플리케이션 설정 정보, 공용 데이터 등을 유지하는 데 사용된다.

 

EL 표현식에서는 스코프 객체에 상관없이 속성명을 사용하여 속성값을 제공받아 출력이 가능하다. 

//스코프 객체의 속성명이 서로 다른 경우
<%
	pageContext.setAttribute("pageName", "홍길동");//Page Scope
	request.setAttribute("requestName", "임꺽정");//Request Scope
	session.setAttribute("sessionName", "전우치");//Session Scope
	application.setAttribute("applicationName", "일지매");//Application Scope
%>

 
JSP 내장객체가 다른 경우 동일한 속성명을 사용하여 속성값 저장이 가능하다.
만약 같은 JSP 내장객체에 동일한 속성명을 사용하여 속성값을 저장하면 기존 속성값 대신 새로운 속성값이 저장된다. (변경 처리와 동일)

//스코프 객체의 속성명이 서로 같은 경우
<%
    pageContext.setAttribute("name", "홍길동");//Page Scope
    request.setAttribute("name", "임꺽정");//Request Scope
    session.setAttribute("name", "전우치");//Session Scope
    application.setAttribute("name", "일지매");//Application Scope
%>

 
 
EL 표현식으로 속성값을 제공받기 위한 순서
: Page Scope >> Request Scope >> Session Scope >> Application Scope 
 
따라서 JSP 내장객체에 동일한 이름의 속성명을 사용하여 속성값을 저장한 경우, 먼저 검색된 Scope 객체의 속성값을 제공받아 출력 처리리 하기 때문에 Scope 객체의 속성명은 다르게 설정할 것을 권장한다. 
 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Scope Attribute</h1>
	<hr>
	<h2>스코프 객체의 속성명이 서로 다른 경우</h2>
	<ul>
		<li>pageName 속성값(Page Scope) = ${pageName }</li>
		<li>requestName 속성값(request Scope) = ${requestName }</li>
		<li>sessionName 속성값(session Scope) = ${sessionName }</li>
		<li>applicationName 속성값(application Scope) = ${applicationName }</li>		
	</ul>
	<h2>스코프 객체의 속성명이 서로 같은 경우</h2>
	<ul>
		<li>pageName 속성값(Page Scope) = ${name }</li>
		<li>requestName 속성값(request Scope) = ${name }</li>
		<li>sessionName 속성값(session Scope) = ${name }</li>
		<li>applicationName 속성값(application Scope) = ${name }</li>		
	</ul>
</body>
</html>

 
Scope 객체에 동일한 이름의 속성명을 사용하여 속성값을 저장한 경우 EL 내장객체를 사용하여 스코프 객체를 구분하여 속성값을 제공받아 출력 처리할 수 있다.
→ EL 내장객체 : pageScope, requestScope, sessionScope, applicationScope - Map 객체 

<ul>
	<li>pageName 속성값(Page Scope) = ${pageScope.name }</li>
	<li>requestName 속성값(request Scope) = ${requestScope.name }</li>
	<li>sessionName 속성값(session Scope) = ${sessionScope.name }</li>
	<li>applicationName 속성값(application Scope) = ${applicationScope.name }</li>		
</ul>

하지만 이렇게 하는건 권장하지 않으며, Scope 객체의 속성명은 다르게 설정할 것을 권장한다.
 


param 내장객체 

 
 
예제)
 
 
[implicit_param_form.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Request Parameter</h1>
	<hr>
	<form action="implicit_param_action.jsp" method="post">
		<div><b>개인정보</b></div>
		<div>이름 : <input type="text" name="name"></div>
		<div>주소 : <input type="text" name="address"></div>
		<br>
		<div><b>좋아하는 음식</b></div>
		<div>음식-1 : <input type="text" name="food"></div>
		<div>음식-2 : <input type="text" name="food"></div>
		<br>
		<button type="submit">제출</button>
	</form>
</body>
</html>


 
[implicit_param_action.jsp] : 입력값을 전달받아 클라이언트에게 전달하여 응답하는 JSP 문서
 
EL을 사용하지 않은 경우

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//POST 방식으로 요청하여 리퀘스트 메세지 몸체부에 저장되어 전달되는 캐릭터셋 변경
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Request Parameter</h1>
	<hr>
	<h2>EL 미사용</h2>
	<ul>
		<li>이름 = <%=request.getParameter("name") %></li>
		<li>주소 = <%=request.getParameter("address") %></li>
		<li>음식-1 = <%=request.getParameter("food") %></li>
		<li>음식-2 = <%=request.getParameter("food") %></li>
	</ul>
</body>
</html>

 
같은 이름으로 전달된 값이 여러개인 경우 첫번째 전달값만 반환받아 사용할 수 있다.

같은 이름으로 전달된 값이 여러개인 경우 getParameterValues() 메소드를 호출하여 모든 전달값을 문자열 배열로 반환받아 사용 가능하다. 

<li>음식-1 = <%=request.getParameterValues("food")[0] %></li>
<li>음식-2 = <%=request.getParameterValues("food")[1] %></li>

 
 
EL을 사용한 경우
 
EL 표현식에서  param 내장객체 또는 paramValues 내장객체를 사용하여 전달값을 제공받아 출력 처리가 가능하다.
param 내장객체 또는  paramValues 내장객체는 Map 객체로, 맵키 대신 전달값의 이름을 사용하여 전달값을 구분한다.
 

<h2>EL 사용</h2>
	<ul>
		<li>이름 = ${param.name }</li>
		<li>주소 = ${param.address }</li> 
		<!--  배열의 첨자는 반드시 []를 사용 -->
		<li>음식-1 = ${paramValues.food[0] }</li>
		<li>음식-1 = ${paramValues.food[1] }</li>
	</ul>


header 내장객체

 
대다수의 클라이언트에 대한 정보들은 Request Header에 저장된다.
이를 가져오는 방법을 알아보자.
 
 
먼저 EL을 미사용한 경우의 예시를 보자. 
 
 
[implicit_header.jsp]
 
request.getHeader(String name) : 리퀘스트 메세지의 머릿부에 저장된 값들중 매개변수로 전달받은 이름의 값을 반환하는 메소드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Request Header</h1>
	<h2>EL 미사용</h2>
	<ul>
		<li>현재 접속중인 서버 = <%=request.getHeader("host") %></li>
		<li>클라이언트 브라우저의 종류 = <%=request.getHeader("user-Agent") %></li>
		<li>전달 가능한 문서의 종류 = <%=request.getHeaders("accept").nextElement() %></li>
	</ul>
</body>
</html>

 

 
 
EL을 사용한 경우
 
EL 표현식에서 header 내장객체 또는 headerValues 내장객체를 사용하여 리퀘스트 메세지의 머릿부에 저장된 값을 제공받아 출력 처리가 가능하다.
header 내장객체 또는 headerValues 내장객체는 Map 객체로, 맵키 대신 헤더값을 구분하는 이름을 사용하여 헤더값을 제공받아 출력할 수 있다. 

<h2>EL 사용</h2>
	<ul>
		<li>현재 접속중인 서버 = ${header.host }</li>
		<li>클라이언트 브라우저의 종류 = ${header["user-Agent"] }</li>
		<li>전달 가능한 문서의 종류 = ${headerValues.accept[0] }</li>
	</ul>


Cookie 내장객체 

 

예제)
 
[implicit_cookie_add.jsp]
 
클라이언트에 쿠키를 저장하기 위해 Cooke 객체를 생성할 것이다.
Cookie 객체에 저장되는 쿠키명과 쿠키값은 영문자, 숫자, 일부 특수문자의 문자열만 사용이 가능하다. 
만약 영문자, 숫자, 일부 특수문자를 제외한 문자를 문자열에 포함시키고 싶으면 부호화 처리하여 사용하면 된다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//클라이언트에 쿠키를 저장하기 위해 Cooke 객체 생성
	Cookie cookie=new Cookie("userName","HongGilDong");
	cookie.setMaxAge(60*60);//쿠키의 지속시간(초)변경
	response.addCookie(cookie);//response 객체에 Cookie 객체 추가 - 클라이언트에 쿠키가 전달되어 저장
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Cookie</h1>
	<hr>
	<p>클라이언트에게 쿠키를 전달하여 저장 하였습니다.</p>
	<p><a href="implicit_cookie_use.jsp">쿠키값 출력</a>
</body>
</html>

 
 
[implicit_cookie_use.jsp]
: 클라이언트가 보내온 쿠키의 쿠키값을 반환받아 클라이언트에게 전달하여 응답하는 JSP 문서
 
 
EL 미사용하는 경우
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Cookie</h1>
	<hr>
	<h2>EL 미사용</h2>
	<%
		//클라이언트에서 보내온 모든 쿠키를 Cookie 객체 배열로 반환받아 저장
		Cookie[] cookies=request.getCookies();
		String userName="";//쿠키값을 저장하기 위한 변수
		//Cookie 객체 배열의 요소값(Cookie 객체)을 차례대로 제공받아 반복 처리하는 for 구문
		for(Cookie cookie : cookies) {
			//Cookie 객체에 저장된 쿠키명을 반환받아 문자열과 비교하여 같은 경우 
			if(cookie.getName().equals("userName")) {
				userName=cookie.getValue();//Cookie 객체에 저장된 쿠키값을 반환받아 저장
			}
		}
	%>
	<p>쿠키에 저장된 사용자 이름 = <%=userName %></p>
</body>
</html>

 
 
EL을 사용하는 경우
 
EL 표현식에서 cookie 내장객체를 사용하여 쿠키값을 제공받아 출력 처리가 가능하다.
cookie 내장객체는 Map 객체로, 맵키 대신 쿠키명을 사용하여 Cookie 객체를 제공받아 value 표현식으로 쿠키값을 제공받아 출력할 수 있다.

<h2>EL 사용</h2>
<!-- 쿠키 객체 -->
<p>쿠키에 저장된 사용자 이름 =${cookie.userName} </p> 
<!-- 쿠키 객체가 가진 값 -->
<p>쿠키에 저장된 사용자 이름 =${cookie.userName.value} </p>


initParam 내장객체

 
예제)
 

 


먼저 [web.xml] 에 context-param 엘리먼트를 이용해 값을 저장할것이다.
 
context-param : 모든 웹프로그램에게 값을 제공하기 위한 엘리먼트

  <context-param>
  	<param-name>name</param-name>
  	<param-value>홍길동</param-value>
  </context-param>

 
[implicit_init.jsp]
 
EL을 사용하지 않고 값을 반환해보자

application.getInitParameter(String name) : [web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 얻어와 반환되는 메소드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Context Init Parameter</h1>
	<hr>
	<h2>EL 미사용</h2>
	<p>이름 = <%=application.getInitParameter("name") %></p>
	<p>이름 = <%=request.getServletContext().getInitParameter("name") %></p>
</body>
</html>

 

EL 사용해 값을 더 쉽게 반환할 수 있다.
 
EL 표현식에서 initParam 내장객체를 사용하여 [web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 출력 처리할 수 있다. 
initParam 내장객체는 Map 객체로, 맵키 대신 param-name 엘리먼트의 이름을 사용하여 param-value 엘리먼트의 값을 제공받아 출력한다.
 

<h2>EL 사용</h2>
<p>이름 = ${initParam.name }</p>


PageContext

 
예제)
 
[implicit_page.jsp]
 
EL을 사용하지 않은 경우
 
request 내장객체는 HttpServletRequest 객체를 뜻한다. HttpServletRequest 객체는 요청정보를 저장한 객체이다. 
 
pageContext 내장객체는 웹프로그램 작성에 필요한 모든 정보를 저장한 객체이다.
pageContext.getRequest() : 요청 정보가 저장된 ServletRequest 객체를 반환하는 메소드 
 
HttpServletRequest 객체는 ServletRequest 객체의 자식이기 때문에 더 많은 메소드를 가지고 있다.
따라서  ServletRequest 객체를 HttpServletRequest 객체로 형변환이 가능하다.
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - PageContext</h1>
	<hr>
	<h2>EL 미사용</h2>
	<p>컨텍스트 경로 = <%=request.getContextPath() %></p><!-- 컨텍스트 경로 = /mvc  -->
	<p>요청 URI 주소 = <%=request.getRequestURI() %></p><!-- 요청 URI 주소 = /mvc/el/implicit_page.jsp -->
	<hr>
	<!-- 부모보다 자식이 더 많은 메소드를 가지고 있기 때문에 형변환 -->
	<p>컨텍스트 경로 = <%=((HttpServletRequest)pageContext.getRequest()).getContextPath()  %></p>
	<p>요청 URI 주소 = <%=((HttpServletRequest)pageContext.getRequest()).getRequestURI()  %></p>
</body>
</html>

 
EL 사용하는 경우
 
EL 표현식에서 pageContext 내장객체를 사용하여 JSP의 pageContext 내장객체를 제공받아 사용할 수 있다.
따라서 EL 표현식에서 PageContext 내장객체로 JSP의 pageContext 내장객체의 메소드를 호출할 수 있다.

<h2>EL 사용</h2>
<p>컨텍스트 경로 = ${pageContext.getRequest().getContextPath() }</p>

EL 표현식에서 Gtter 메소드는 필드명을 이용하여 자동 호출이 가능하다.

<h2>EL 사용</h2>
<p>컨텍스트 경로 = ${pageContext.request.contextPath }</p>
<p>요청 URI 주소 = ${pageContext.request.requestURI }</p>