본문 바로가기

Java

자바 EL(표현언어)의 개념

자바 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}


결과: