표현언어(Expression Language)는 간단한 방법으로 데이터를 표현하려고 고안된 언어인 SPEL(Simplest Possible Expression Language)에 기본을 두고 있다.
기존에 JSP의 데이터를 표현할 때 스크립트릿(<% %>)이나 표현식(<%= %>) 혹은 <jsp:getProperty />를 사용했다. 그런데 스크립트릿이나 표현식은 페이지 내에서 객체 선언 부분이 따로 들어가야 하고, <jsp:getProperty>의 경우에도 <jsp:useBean>과 함께 사용해야 하며 단순 출력 이외의 표현은 안된다는 문제가 있었다.
표현 언어는 이러한 문제를 해결하려고 만들어진 기술로, 빈즈 속성 값을 더욱 쉽고 제약을 덜 받는 방법으로 사용할 수 있도록 해준다. 표현 언어를 사용하면 코드가 복잡해지는 것을 줄일 수 있고 JSP를 일종의 템플릿 코드처럼 사용할 수 있다.
request.setAttribute("name", "Kim");
의 값을 가져올때는 request.getAttribute("name")으로 값을 가져오는데 표현 언어를 사용하면 이것을 ${name}로 값을 가져올 수 있다.
그런데 만약 request 외에도
session.setAttribute("name", "Lee");
라고 되어 있으면, 두 개의 name 값이 같으므로 문제가 생길 수 있다. 이럴 경우에는 좀 더 작은 개체 단위부터 찾는다는 것을 기억하자. 같은 이름이면 page의 것을 먼저 참조하게 된다.
만약 구체적으로 어떤 범위인지 지정하고 싶다면, ${sessionScope.name} 이런식으로 지정해줄 수 있다.
따라서, 동일한 이름을 갖는 경우엔 위와 같이 정확하게 내장 객체의 이름을 지정해주고 사용할 필요가 있다.
request.getParameter("name");
이런 파라미터 값은 ${param.name}의 형식으로 가져올 수 있다. 혹은 ${param["name"]}이다.
위에서 requestScope도 존재하기 때문에 이 둘간의 관계에 대해 혼동할 수 있는데, get이나 post 방식으로 넘어온 값들은 ${param.이름} 형식으로 가져와야 하고, request.setAttribute("이름", "값"); 으로 저장한 값들은 ${requestScope.이름} 형식으로 가져온다는 사실을 기억하자.
체크박스나 셀렉트 등으로 여러 개를 가져왔을 경우는 ${paramValues.animal[0]}의 형태로 가져올 수 있다.
아래는 표현 언어를 활용한 간단한 예이다.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action=petresult.jsp>
아이디 : <input type=text name=id><br>
<br> 다음중 회원님이 키우고 있는 동물은?<br>
<br> 개<input type=checkbox name=animal value="개">
고양이<input type=checkbox name=animal value="고양이">
금붕어<input type=checkbox name=animal value="금붕어"><br>
<br> <input type=submit value="확인">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<style></style>
<script type="text/javascript"></script>
</head>
<body>
아이디 : ${param.id}<br>
선택한 동물: ${paramValues.animal[0]} ${paramValues.animal[1]} ${paramValues.animal[2]}
</body>
</html>
표현 언어는 연산이 가능하다. 아래의 코드를 확인하자.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<style></style>
<script type="text/javascript"></script>
</head>
<body>
X = ${param.NUM1}, Y = ${param.NUM2}<br><br>
X + Y = ${param.NUM1 + param.NUM2 }<br>
X가 더 큽니까? ${param.NUM1 - param.NUM2 > 0}<br>
X와 Y가 모두 양수입니까? ${ (param.NUM1 > 0) && (param.NUM2 > 0) }<br>
X와 Y가 같습니까? ${ param.NUM1 == param.NUM2 ? "예" : "아니오" }<br>
</body>
</html>
또한 간단한 연산 외에 empty라는 키워드를 통해 해당값의 존재 유무를 판별할 수 있다.
${empty id ? "guest" : id} 님, 반갑습니다 ^^
배열이나 ArrayList에 있는 값을 가져올 때도 살펴보자.
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<style></style>
<script type="text/javascript"></script>
</head>
<body>
<%
ArrayList<String> arrayList = new ArrayList<String>();
arrayList.add("사과");
arrayList.add("딸기");
arrayList.add("포도");
//이렇게 선언한 변수는 익스프레션 언어에서 가져올 수 없다.
//따라서 어트리뷰트로 추가해주어야 한다.
request.setAttribute("addedList", arrayList);
%>
${requestScope.addedList}<br><br>
${requestScope.addedList[0]}<br>
${requestScope.addedList[1]}<br>
${requestScope.addedList[2]}<br>
</body>
</html>
실행 결과는 아래와 같다.
[사과, 딸기, 포도]
사과
딸기
포도
자바 빈에서도 표현 언어를 사용할 수 있다.
${자바빈객체.프로퍼티이름} 혹은 ${자바빈객체["프로퍼티이름"]} 형식으로 사용한다.
예를들어, ${bean.name}이라고 쓴다면, 실제 내부적으로는 bean 객체 안의 getName()메서드를 호출하여 값을 가져온다.
그런데 만약, 프로퍼티 이름에 언더바(_)나 앤드(&) 등의 특수문자가 존재하는 경우, 반드시 ${자비빈객체["프로퍼티이름"]} 형태로만 사용이 가능하다.
'Programming > Servlet' 카테고리의 다른 글
서블릿(Servlet) url 매핑기법 2가지(web.xml 방식, 어노테이션 방식) (0) | 2020.07.30 |
---|---|
[JSP] JSTL(Jsp Standard Tag Library) 정리 - <c:set>,<c:out>,<c:remove>,<c:if>,<c:choose>,<c:when>,<c:otherwise>,<c:forEach>,<c:forTokens> 등 (1) | 2019.10.27 |
[JSP] JSP Beans(빈즈)에 대해 알아보자 (0) | 2019.10.09 |
(Servlet/JSP) setCharacterEncoding, setContentType 정리 (4) | 2019.10.02 |
JSP 내장객체를 활용한 간단한 twitter 구현하기 (0) | 2019.10.01 |