본문 바로가기
WEB/Servlet, JSP

[JSP] EL 사용법

by Amy IT 2022. 7. 17.

 

목차

     

    EL 이란?

    EL 은 Expression Language의 약자로 JSP 2.0 스펙에 추가된 개념입니다. 데이터를 웹 브라우저에 출력하기 위한 언어로서, null 값이나 형 변환 등을 신경 쓸 필요 없이 데이터를 더 효율적으로 처리하기 위해 만들어졌습니다. 표현식에는 문자, 연산자, 변수를 사용할 수 있습니다.

     

    ${ 표현식 }
    ${"홍길동"}<br> <!-- EL --> 
    <%= "홍길동" %><br> <!-- JSP -->
    
    <% int x = 10; %> 
    EL 태그 : ${x} <!-- 일반 변수 사용 안됨 -->
    표준 jsp 태그 x : <%= x %><br>

     

     

    EL 연산자

     

    연산자 설명
    . 자바빈 또는 Map에 접근시 사용
    [] 배열 또는 List에 접근시 사용
    () 우선순위 연산자
    empty 값이 null인지 판단하여 boolean 값으로 리턴
    +, -, *, /, % 산술 연산자 및 나머지 연산자
    &&, ||, ! 논리 연산자
    ==, >, >=, <, <=, != 비교 연산자

     

    ${10+4}<br><!-- 14 -->
    ${10-4}<br><!-- 6 -->
    ${10/4}<br><!-- 2.5 -->
    ${10*4}<br><!-- 40 -->
    <%= 10+4 %><br><!-- 14 -->
    
    ${10>=4}<br><!-- true -->
    ${10<=4}<br><!-- false -->
    ${10!=4}<br><!-- true -->
    
    ${(10!=4) && (4==4)}<br><!-- true -->
    
    ${empty user}, ${not empty user}<!-- true, false -->

     

     

    EL 내장 객체

    JSP와 마찬가지로 EL에서도 내장 객체를 지원합니다. 내장 객체란 내부적으로 변수 선언과 초기화 작업이 자동으로 되는 객체입니다. 객체 생성이나 초기화 작업을 따로 하지 않고 참조변수의 이름만으로 필요한 객체를 곧바로 사용할 수 있습니다.

     

    내장 객체 설명
    pageContext JSP 내장 객체인 pageContext와 동일
    pageScope pageContext에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
    requestScope HttpServletRequest에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
    sessionScope HttpSession에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
    applicationScope ServletContext에 등록된 데이터의 이름과 값을 저장하고 있는 map 객체
    param Query String의 이름과 값을 저장하고 있는 map 객체
    paramValues 같은 이름으로 전달되는 Query String의 이름과 값들을 저장하고 있는 map 객체
    header 요청정보 헤더의 정보들의 이름과 값들을 저장하고 있는 map 객체
    headerValues 요청정보 헤더의 정보들의 이름과 값들을 저장하고 있는 map 객체
    cookie 요청을 보낸 클라이언트의 쿠키 이름과 값을 저장하고 있는 map 객체
    initParam 웹 애플리케이션에 지정한 context 초기 파라미터의 이름과 값을 저장하고 있는 map 객체

     

    requestScope, sessionScope, applicationScope

    HttpServletRequest, HttpSession, ServletContext 객체에 바인딩한 데이터를 접근할 때 JSP보다 훨씬 간단한 코드로 처리할 수 있습니다.

    @WebServlet("/TestServlet")
    public class TestServlet extends HttpServlet {
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setAttribute("xxx", "홍길동"); //request
    		
    		HttpSession session = request.getSession();
    		session.setAttribute("yyy", "이순신"); //session
    		
    		ServletContext ctx = getServletContext();
    		ctx.setAttribute("zzz", "유관순"); //application
    		
    		RequestDispatcher dis = request.getRequestDispatcher("bind.jsp");
    		dis.forward(request, response);
    	}
    }

     

    기존 JSP의 경우 다음과 같이 각각 저장된 객체에 따라 참조변수를 달리하여 getAttribute 메소드를 호출해야 하는 점, getAttribute 메소드의 리턴 타입이 Object이기 때문에 형변환을 해야 하는 점 등의 번거로움이 있습니다. 

    <!-- bind.jsp -->
    <%
    String xxx = (String) request.getAttribute("xxx");
    String yyy = (String) session.getAttribute("yyy");
    String zzz = (String) application.getAttribute("zzz");
    %>
    <%= xxx %><br><!-- 홍길동 -->
    <%= yyy %><br><!-- 이순신 -->
    <%= zzz %><br><!-- 유관순 -->

     

    EL은 이러한 번거로운 작업들을 간소화합니다. EL의 내장 객체인 requestScope, sessionScope, applicationScope를 참조하여 저장된 데이터에 접근할 수도 있지만, 참조 변수가 없어도 자동으로 request, session, application 객체 순서로 getAttribute(name) 메소드를 실행하기 때문에 참조 변수 없이 바로 데이터에 접근할 수 있습니다. 메소드 실행 후 추출된 데이터가 있으면 데이터를 원래 등록된 객체의 타입으로 변환하기 때문에 개발자가 따로 형변환을 신경 쓸 필요도 없습니다.

    <!-- bind.jsp -->
    ${ requestScope.xxx }<br><!-- 홍길동 -->
    ${ sessionScope.yyy }<br><!-- 이순신 -->
    ${ applicationScope.zzz }<br><!-- 유관순 -->
    
    ${ request.xxx }<br><!-- 출력안됨, 내장 변수 이름 다름 주의 -->
    
    ${ xxx }<br><!-- 홍길동 -->
    ${ yyy }<br><!-- 이순신 -->
    ${ zzz }<br><!-- 유관순 -->

     

    param, paramValues

    웹 브라우저에서 클라이언트로부터 전송된 질의 문자열을 처리할 수 있는 내장 객체입니다. 

    <!-- loginForm.html -->
    <form action="login.jsp" method="get">
    	아이디:<input type="text" name="userid"><br>
    	비밀번호:<input type="text" name="passwd"><br>
    	<input type="checkbox" name="tst" value="aaa">aaa
    	<input type="checkbox" name="tst" value="bbb">bbb
    	<input type="checkbox" name="tst" value="ccc">ccc
    <input type="submit" value="로그인">
    </form>

     

    기존 JSP의 경우 getParameter와 getParameterValues 메소드를 이용해 데이터를 파싱한 후 데이터를 사용했습니다.

    <!-- login.jsp -->
    <%
    	String userid = request.getParameter("userid");
    	String passwd = request.getParameter("passwd");
    	String[] tsts = request.getParameterValues("tst");
    %>
    <%= userid %><br>
    <%= passwd %><br>
    <%= tsts[0] %><br>

     

    EL의 내장 객체 param과 paramValues를 이용하면 질의 문자열을 더 간편하게 처리할 수 있게 됩니다.

    <!-- login.jsp -->
    ${ userid }<br> <!-- 출력 안됨 -->
    ${ param.userid }<br>
    ${ param.passwd }<br>
    ${ paramValues.tst[0] }<br>

     

    initParam

    web.xml 파일에서 설정한 context 초기화 파라미터 값을 참조할 때 initParam 내장 객체를 사용할 수 있습니다. 

    <!-- web.xml -->
    <context-param>
    	<param-name>userid</param-name>
    	<param-value>홍길동</param-value>
    </context-param>
    <context-param>
    	<param-name>email</param-name>
    	<param-value>aa@aa.com</param-value>
    </context-param>

     

    기존 JSP의 경우 application 내장 객체의 getInitParameter 메소드를 사용해 파라미터 값을 받았습니다. 

    <!-- initParam.jsp -->
    <%
    	//서블릿
    	String userid1 = getServletContext().getInitParameter("userid");
    	//jsp
    	String userid2 = application.getInitParameter("userid");
    	String email = application.getInitParameter("email");
    %>
    <%= userid1 %><br>
    <%= userid2 %><br>
    <%= email %><br>

     

    EL에서는 initParam 내장 객체로 web.xml 파일에 설정된 key 값을 이용해 데이터를 받아올 수 있습니다.

    <!-- initParam.jsp -->
    ${ initParam.userid }<br>
    ${ initParam.email }<br>

     

     

     

    참고

    처음 해보는 Servlet&JSP 웹 프로그래밍 (오정임 지음, 루비페이퍼)

     

     

     

    댓글