자바 EL(Expression Language) 표현언어 정리
Expression Language, 표현언어는 값을 표현하는데 사용되는 새로운 script 언어로 jsp의 기본문법을 보완하는 역할을 한다. 보통 jsp에 쓰이는 스크립트릿 등을 줄여 영역값을 일일이 받아 출력하는 수고로움을 덜 수 있으며 코드도 간결해진다.
기본적으로 스크립트릿 <% %> 안이 아닌 HTML 영역에 ${ }을 사용한다.
1. 영역(Scope) 객체값 가져와 출력하기
-${key} : request,session,application 등 영역값을 가져올때.
Ex01_Scope.jsp
request.setAttribute("request", "aaa");
session.setAttribute("session", "bbb");
application.setAttribute("application", "ccc");
RequestDispatcher dis = request.getRequestDispatcher("Ex01_Scope_rec.jsp");
dis.forward(request,response);
위와 같이 request, session, application 영역에 각각 aaa, bbb, ccc라는 value를 set하고 forward로 request 객체를 넘겼을 때, EL표현식을 사용하지 않으면
<% String req = request.getAttribute("request"); %>
<%=req %>
이렇게 변수에 request영역의 값을 받아온 후 JSP 표현식으로 출력해야 하지만
EL식을 사용하면 다음과 같이 영역값을 가져올 수 있다.
Ex01_Scope_rec.jsp
request 영역값 EL : ${request}
session 영역값 EL : ${session}
application 영역값 EL : ${application}
결과:
${영역Scope.key} :
영역이 다른데 키 값은 같은 경우가 종종 발생한다.
그럴때는 영역Scope.key 를 이용하면 해당 영역에 담긴 key의 value를 빼온다.
session영역은 sessionScope.key
application영역은 applicationScaope.key 와 같은 형식이다.
key값이 request로 같다고 가정했다.
request 영역값 EL : ${request}
session 영역값 EL : ${sessionScope.request}
application 영역값 EL : ${applicationScope.request}
2. <form> 태그에서 가져와 출력하기
${param.name} :
html <form action="#">태그에서 submit을 이용하여 값을 받아올 때는 param.name을 쓴다.
이때 name은 <input> tag의 name이다.
Ex02_Form.html
<form action="Ex02_Form_rec.jsp">
<input type="text" name="id">
<input type="password" name="pw">
<input type="submit" value="전송">
</form>
이런 form 태그가 있다고 했을때, 원래는
다음과 같이 스크립트릿을 사용해야 하지만
<%
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>
사용자 id : <%=id %><br>
사용자 pw : <%=pw %><br>
다음과 같이 줄일 수 있다.
Ex02_Form_rec.jsp
사용자 ID : %{param.id}
사용자 PW : %{param.pw}
결과:
${paramValues.name[n]} :
<form>태그에서 체크박스와 같이 여러개를 가져와야 할 경우 사용한다.
배열을 일일이 빼듯이 옵션 개수만큼 일일이 써줘야 한다.
개수가 적으면 괜찮지만 많아지면 반복문을 사용하는게 낫다.
<form>안에 checkbox 속성이 3개가 있다고 가정하면
Ex02_Form.html
운동<input type="checkbox" name="hobby" value="운동"/>
공부<input type="checkbox" name="hobby" value="공부"/>
코딩<input type="checkbox" name="hobby" value="코딩"/>
차례로 0,1,2 인덱스를 써주면 셋 전부가 출력되는게 아니라 셋 중에 선택된 것만 출력해주게 된다.
Ex02_Form_rec.jsp
사용자 취미: ${paramValues.hobby[0]} / ${paramValues.hobby[1]} / ${paramValues.hobby[2]}
결과:
3. Cookie영역값 가져와 출력하기
다음과 같이 Cookie 영역에 key가 Cookie, value가 CookieValue인 값이 담겨 있다면
Ex03_Cookie.jsp
<%
Cookie cook = new Cookie("Cookie","CookieValue");
response.addCookie(cook);
response.sendRedirect("Ex03_Cookie_rec.jsp");
%>
cookie.key값.value로 가져올 수 있다.
Ex03_Cookie_rec.jsp
Cookie EL : ${cookie.Cookie.value}
결과:
4. Scope에 담긴 객체 가져와 출력하기
MemberVO.java에 다음과 같은 필드가 있을때
MemberVO.java
public class MemberVO {
String id;
String pw;
String nick;
String age;
request영역에 MemberVO 객체를 key "vo"라 명명하고, value에 vo 객체를 넣은 뒤 Ex04_VO_rec.jsp로 보냈다.
Ex04_VO.jsp
<%
String id = "jason";
String pw = "123";
String nick = "jason01";
String age = "99";
MemberVO vo = new MemberVO(id,pw,nick,age);
request.setAttribute("vo", vo);
RequestDispatcher dis = request.getRequestDispatcher("Ex04_VO_rec.jsp");
dis.forward(request, response);
%>
${key.변수명}:
EL식을 사용할때, request 영역에 올려진 key.변수명을 사용하면 실제 vo.getId() 와 같은 결과를 얻어낼 수 있다.
해당 클래스에 존재하는 getter 메소드를 사용하는 방식이므로 실제로 getter 메소드가 존재해야 한다.
필드만 선언되어 있다고 해서 출력되지 않으니 주의.
Ex04_VO.rec.jsp
아디 EL : ${vo.id}
비번 EL : ${vo.pw}
닉 EL : ${vo.nick}
나이 EL : ${vo.age}
결과:
5. EL식 안에서 연산자 사용하기
EL식 안에서 기본 연산자가 사용가능하고, 삼항연산자를 이용해 간단한 조건문도 가능하다.
다만 Null값인지 아닌지 판별할 때는 비교연산자 '=='를 사용하지 않고 empty / not empty 라는 키워드를 사용한다.
Ex05_Cal.jsp
<%
request.setAttribute("num1", -8);
request.setAttribute("num2", 9);
%>
num1+num2 = ${num1+num2} <br>
num1-num2 = ${num1-num2} <br>
num1*num2 = ${num1*num2} <br>
num1/num2 = ${num1/num2} <br>
num1이 num2보다 큰가? ${num1>num2} <br>
num1과 num2가 양수인가? ${(num1>0) && (num2>0)} <br>
num1이 num2보다 큰가? ${num1>num2? '크다':'작다'} <br>
num1이 null값인가? ${empty num1} <br>
num1이 null값이 아닌가? ${not empty num1}
결과: