request.setAttribute("id", "ahn");
이면 이것을 ${id} 로 값을 가져올 수 있다.
그런데 만약 request 외에도
session.setAttribute("id", "korea");라고 되어 있으면, 두개의 네임값이 같으므로 문제가 생길 수 있다. 이런때에는 좀더 작은 개체단위부터 찾는다는 것을 기억하자.
같은 이름이면 page의 것을 먼저 참조하게 된다.
page < request < session < application
만약 구체적으로 어떤 범위인지 지정하고 싶다면,
${applicationScope.id} 이런식으로 지정해줄 수 있다.
따라서 동일한 이름을 갖는 경우 위와 같이 정확하게 내장객체의 이름을 지정해주고 사용할 필요가 있다.
request.getParameter("name");이런 파라메터값은
${param.name} 의 형식으로 가져올 수 있다.
혹은 ${param["COLOR"]}
위에서 requestScope 도 존재하기 때문에 이 둘간의 관계에 대해 혼동할 수 있는데,
get이나 post방식으로 넘어온 값들은 ${param.이름} 형식으로 가져와야하고,
request.setAttribute("이름", "값"); 으로 저장한 값들은 ${requestScope.이름} 형식으로 가져온다는 사실을 기억하자.
체크박스나 셀렉트 등으로 여러개를 가져왔을 경우,
${paramValues.ANIMAL[0]}
의 형태로 가져올 수 있다.
아래는 익스프레션 언어를 활용한 간단한 예이다.
HTML폼으로 선택한 값을 받는 JSP 파일에서 특별한 JSP 문법 없이 바로 값을 출력해주고 있다.
test.html 파일
<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>
petresult.jsp 파일
<%@ 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>
이번에는 조금더 익스프레션 언어의 활용을 볼 수 있다.
대괄호 안에서 약간의 연산이 가능하다는 것을 확인할 수 있다.
테스트는 get방식으로 파라메터를 넣어서 확인할 수 있다.
<%@ 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} 님, 반갑습니다 ^^
id값이 존재할 경우 id이름으로, 아니면 guest 라고 보여주는 예이다.
배열이나 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() 메소드를 호출하여 값을 가져오게 된다.
그런데 만약 프로퍼티이름에 _(언더바)나 &(앤드) 등의 특수문자가 존재하는 경우,
${자바빈객체.프로퍼티이름} 형태는 사용할 수 없고, 반드시 ${자바빈객체["프로퍼티 이름"]} 형태로만 사용가능하다는 것을 기억하자.