jsp

[jsp] 25. EL의 내장객체

jeri 2024. 7. 16. 09:28
반응형

01. EL의 내장객체 개념

EL 내장객체는 언제사용?

  • JSP 내장객체의 속성값이 동일할 때 EL 표현식에서는 EL 내장객체를 사용하여 스코프 속성값을 구분하여 출력 가능
🖤 implicit_scope.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	//JSP 내장객체에 따라 속성값을 저장하여 사용할 수 있는 범위가 다르게 구분
	//속성값 사용범위(Scope) :Page Scope, Request Scope, Session Scope, Application Scope
	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
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Scope Attribute</h1>
	<hr>

	<h3>스코프 속성명이 서로 다른 경우</h3>
	<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>
    
    
	<h3>스코프 속성명이 서로 같은 경우</h3>
	//<%-- EL 표현식의 속성명으로 속성값을 검색하여 제공하는 순서 존재 --%>
	//<%-- Page Scope >> Request Scope >> Session Scope >> Application Scope >> 미출력 --%>
	//<%-- => JSP 내장객체에 동일한 이름의 속성명이 존재할 경우 먼저 검색된 속성값을 제공받아 출력 --%>
	//<%-- => JSP 내장객체에 속성명을 다르게 설정하는 것을 권장  --%>
	<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>

	//<%-- JSP 내장객체의 속성값이 동일한 경우 EL 표현식에서 EL 내장객체를 사용하여 스코프 속성값을 구분하여 출력 가능 --%>
	//<%-- EL 내장객체 : pageScope, requestScope, sessionScope, applicationScope 내장객체 이용 --%>
	<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>

</body>
</html>

02. EL의 내장객체 종류

1) EL 내장객체 - Request Parameter

implicit_param_form.jsp - 요청페이지
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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 - 응답페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

//<%-- 사용자 입력값을 전달받아 클라이언트에게 전달하는 JSP 문서 --%>

//<%-- POST 방식으로 요청하여 리퀘스트 메세지의 몸체부에 저장되어 전달하는 값에 대한 캐릭터셋 변경 --%>
//<%-- => 인코딩 필터를 이용할 경우 필터에 의해 웹프로그램 실행 전 캐릭터셋 변경 가능 --%>
//<%-- 인코딩 필터 기능을 제공해주는 필터 클래스 만들어 사용할 것 --%>
//<%--<%request.setCharacterEncoding("utf-8");%>--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>EL 내장객체 - Request Parameter</h1>
	<h3>EL 미사용</h3>
	<ul>
		<li>이름 = <%=request.getParameter("name") %></li>
		<li>주소 = <%=request.getParameter("address") %></li>
        
		//<%-- 같은 이름으로 전달되는 값이 여러개 있는 경우 첫번째 전달값만 반환받아 사용 --%>
		//<%--
		//<li>음식-1 = <%=request.getParameter("food") %></li>
		//<li>음식-2 = <%=request.getParameter("food") %></li>
		//--%>
        
		//<%-- 같은 이름으로 전달되는 값이 여러개 있는 경우 getParameterValues() 메소드로
		//모든 전달값을 문자열 배열로 반환받아 사용 가능 --%>
		<li>음식-1 = <%=request.getParameterValues("food")[0] %></li>
		<li>음식-2 = <%=request.getParameterValues("food")[1] %></li>
	</ul>
    
	<h3>EL 사용</h3>
	<ul>
		//<%--EL 표현식에서 param 내장객체 또는 paramValues 내장객체의 맵키로
		//사용하여 전달값을 구분하여 출력 --%>
		<li>이름 = ${param.name }</li>
		<li>주소 = ${param.address }</li>
		<li>음식-1 = ${paramValues.food[0] }</li>
		<li>음식-2 = ${paramValues.food[1] }</li>
	</ul>

</body>
</html>

2) EL 내장객체 - Request Header

[EL 내장객체 - Request Header] implicit_heder.jsp
<%@ 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>
    
	<h3>EL 미사용</h3>
	<ul>
		//<%-- request.getHeader(String name) : 리퀘스트 메세지의 머릿부에 저장된 값에서 원하는 값을
		//이름을 이용하여 반환하는 메소드 --%>
		//<%-- 스마트기기에서 요청했는지, 일반PC에서 요청했는지 등의 정보 알 수 있음 --%>
		<li>현재 접속 서버 = <%=request.getHeader("host") %></li>
		<li>브라우저 종료 = <%=request.getHeader("user-Agent") %></li>
		<li>전달 가능한 문서 종류 = <%=request.getHeaders("accept").nextElement() %></li>
	</ul>
    
    
    
 	<h3>EL 사용</h3>   
    <ul>
		//<%-- EL 표현식에서 header 내장객체 또는 headerValues 내장객체를 이용하여 리퀘스트
		//메세지의 머릿부에 저장된 값들 중 원하는 값을 이름(맵키)으로 제공받아 출력 가능 --%>
		<li>현재 접속 서버 = ${header.host }</li>
		<li>브라우저 종료 = ${header["user-Agent"]}</li>
		<li>전달 가능한 문서 종류 = ${headerValues.accept[0]}</li>
	</ul>

</body>
</html>

3) EL 내장객체 - Cookie

  • 아파치 톰캣이 제공해주는 서블릿 라이브러리에 있음

implicit_cookie_save.jsp - 쿠키값 전달페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	//클라이언트에 쿠키가 저장되도록 Cookies 객체를 생성하여 클라이언트에게 전달
	// => Cookie 객체에 저장되는 쿠키명과 쿠키값은 한글 사용 불가능
	//Cookie cookie = new Cookie("userName","홍길동");
	// => 쿠키값으로 한글을 저장하고자 할 경우 부호화 처리하여 저장 가능 : 부호화처리하는 encodeURI()함수 호출하기
	Cookie cookie = new Cookie("userName","HongGilDong");

	cookie.setMaxAge(60*60); //쿠키 지속시간을 1시간으로 변경
	response.addCookie(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_load.jsp">쿠키값 출력</a></p>
</body>
</html>

implicit_cookie_load.jsp - 쿠키값 출력페이지

Cookie가 잘 전달되었으니 이제 원하는 값을 출력해보자

<%@ 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>
    
    
	<h3>EL 미사용</h3>
	<%
		//클라이언트에서 전달된 모든 쿠키를 Cookie 객체 배열로 반환받아 저장
		Cookie[] cookies = request.getCookies();
		String userName ="";
		//Cookie 객체 배열의 요소값(Cookie 객체)를 하나씩 제공받아 반복 처리
		// => Cookie 객체의 쿠키명을 반환받아 비교하여 쿠키값 저장
		for(Cookie cookie:cookies){
			if(cookie.getName().equals("userName")){
				userName=cookie.getValue();
			}
		}
	%>
	<p>쿠키에 저장된 사용자 이름 = <%=userName %></p>
    
    <h3>EL 사용</h3>
	//<%--EL 표현식에서 cookie 내장객체를 이용하여 쿠키명으로 쿠키값을 제공받아 출력 가능 --%>
	<p>쿠키에 저장된 사용자 이름 = ${ cookie}</p>

	//<%--userName이라는 Cookie객체가 반환됨 --%>
	<p>쿠키에 저장된 사용자 이름 = ${ cookie.userName }</p>

	//<%-- => 쿠키명으로 제공되는 값은 Cookie 객체이므로 반드시 쿠키값을 제공받기 위해 value 표현 --%>
	<p>쿠키에 저장된 사용자 이름 = ${ cookie.userName.value}</p>

</body>
</html>

4) EL 내장객체 - Context Init Parameter

  • listener클래스 할 때 initParam객체 이용할 예정..
implicit_init.jsp
<%@ 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>
    
    
	<h3>EL 미사용</h3>
	<%
		//ServletContext.getInitParameter(String name) :
		//[web.xml] 파일의 context-param 엘리먼트로 제공되는 값을 얻어와 반환하는 메소드
		String name=config.getServletContext().getInitParameter("name");
	%>
	<p>[web.xml] 파일에서 제공되는 이름 = <%=name %></p>
	//<%-- 혹은 아래처럼 바로 출력 --%>
	<p>[web.xml] 파일에서 제공되는 이름 = <%=config.getServletContext().getInitParameter("name")%></p>



	<h3>EL 사용</h3>
	//<%--EL 표현식에서 initParam 내장객체를 이용하여 [web.xml] 파일의 context-param 엘리먼트로
	//제공되는 값을 얻어와 출력 가능 --%>
	<p>[web.xml] 파일에서 제공되는 이름 = ${initParam.name }</p>

</body>
</html>

5) EL 내장객체 - PageContext 객체(자바객체)

  • request 내장객체나 response 내장객체가 없을 때 pagecontext 내장객체에게 달라고 하기
implicit_page.jsp
<%@ 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>
	<h3>EL 미사용 시 pageContext객체 사용법</h3>
	//<%-- request 내장객체 = HttpServletRequest객체와 동일--%>
	//<%-- JSP에는 request 내장객체가 있기 때문에 내장객체를 이용하여 HttpServletRequest객체의
	//다음과 같은 메소드 호출이 가능한 것임 --%>
	<p>컨텍스트 경로 = <%=request.getContextPath() %></p>
	<p>요청자원의 URI 주소 = <%=request.getRequestURI() %></p>
	//<%-- pageContext.getRequest()
  	//	: 웹프로그램의 ServletRequest객체(부모)를 반환하는 메소드 : 사용가능한 메소드 적음 --%>
	//<%-- => ServletRequest객체(부모)를 HttpServletRequest객체(자식)로 형변환하면
	//HttpServletRequest 객체(자식)의 메소드 호출 가능 --%>
	<p>컨텍스트 경로 = <%=((HttpServletRequest)pageContext.getRequest()).getContextPath() %></p>
	<p>요청자원의 URI 주소 = <%=((HttpServletRequest)pageContext.getRequest()).getRequestURI() %></p>
    
    
    
	<h3>EL 사용 시 pageContext객체 사용법</h3>
	//<%-- EL 표현식에서 pageContext 내장객체(자바객체)를 사용하여 PageContext 객체의 메소드 호출 가능 --%>
	//<%--<p>컨텍스트 경로 = ${pageContext.getRequest().getContextPath() }</p>--%>
    
	//<%-- => Getter 메소드는 EL 표현식에서 이름만 사용하면 자동 호출 --%>
	<p>컨텍스트 경로 = ${pageContext.request.contextPath }</p>
	<p>요청자원의 URI 주소 = ${pageContext.request.requestURI}</p>
	//그렇다면 pageContext객체는 언제사용할까??
	// => 웹자원의 경로는 절대경로로 표현하는 것을 권장하는데,
  	//컨텍스트경로는 바뀔 수 있으므로 requset에게 반환받아 사용해야함
	//model1에서는 JSP에 자바코드로 <%=request.getContextPath()%> 로 표현했었음.
	//마찬가지로 model2에서도 view역할을 하는 JSP에 자바코드가 아닌 표현식언어를 이용해
  	//${pageContext.request.ContextPath}로 변경해서 사용할 것임	
  	//또한, EL언어의 커스텀태그에는 request내장객체, response내장객체가 없음
  	//그러므로 pageContext내장객체에게 ServletRequest or ServletResponse 달라고 요청 후
  	//HttpServletRequest or HttpServletResponse로 형변환하여 사용함



</body>
</html>

EL 미사용
EL 미사용
EL 사용

03. EL 연산자

  • EL 표현식에서 사용하는 연산자 - 산술연산자, 관계연산자, 논리연산자 등

el_operator.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ 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 Operator</h1>
  • 산술연산자
	<% request.setAttribute("first", 20); %>
	<% request.setAttribute("second", 10); %>
	<div>first = ${first }</div>
	<div>second = ${second }</div>

	<div>first * second = ${first * second }</div>

	<div>first / second = ${first / second }</div>
	<div>first div second = ${first div second }</div>     //<%-- div 연산자 존재 --%>

	//<%-- 주의) 정수 % 정수 = 정수가 아닌 무조건 실수 --%>
	<div>first % second = ${first % second }</div>
	<div>first mod second = ${first mod second }</div>     //<%-- mod 연산자 존재 --%>

	<div>first + second = ${first + second }</div>

	<div>first - second = ${first - second }</div>

  • 관계연산자
	<div>first &gt; second = ${first > second}</div>
	<div>first gt second = ${first gt second}</div>

	<div>first &lt; second = ${first < second}</div>
	<div>first lt second = ${first lt second}</div>

	<div>first &gt;= second = ${first >= second}</div>
	<div>first ge second = ${first ge second}</div>

	<div>first &lt;= second = ${first <= second}</div>
	<div>first le second = ${first le second}</div>

	<div>first == second = ${first == second}</div>
	<div>first eq second = ${first eq second}</div>

	<div>first != second = ${first != second}</div>
	<div>first ne second = ${first ne second}</div>

  • 논리연산자
	<%request.setAttribute("num", 15); %>
	<div> first = ${first }</div>
	<div> second = ${second }</div>
	<div> num = ${num }</div>
	<div>first &gt; num && second &lt; num = ${first > num && second < num }</div>
	<div>first gt num and second lt num = ${first gt num and second lt num }</div>
	<div>first &lt; num || second &gt; num = ${first < num || second > num }</div>
	<div>first lt num or second gt num = ${first lt num or second gt num }</div>

  • Empty 연산자
	<%
		Object object = null;
		request.setAttribute("object", object);

		String string = "";
		request.setAttribute("string", string);

		String[] array = {};
		request.setAttribute("array", array);

		List<String> list = new ArrayList<String>();
		request.setAttribute("list", list);
	%>
	//<%-- object 연산자 : EL 표현식으로 제공되는 속성값이 없거나 속성값이 Java객체나 Map 객체인
	//경우 저장값이 없으면 [true]를 제공하고, 속성값이 있거나 Java객체 또는 Map 객체에 저장값이
	//있는 경우 [false]를 제공하는 연산자 --%>
	<div>object Empty = ${empty(object) }</div>
	<div>string Empty = ${empty(string) }</div>
	<div>array Empty = ${empty(array) }</div>
	<div>list Empty = ${empty(list) }</div>

</body>
</html>

 

반응형