JSP - EL( Expression Language ) 의 모든 것

harold·2021년 10월 18일
0

jsp

목록 보기
1/2

EL이란


  • 속성 값들을 편리하게 출력하는 언어

  • java bean의 property 값을 JSP 표현식( ex. <%=%> , out.println() ) 이나 action tag( ex. <jsp:useBean> )을 사용하는 것 보다 쉽고 간결하게 꺼낼 수 있는 기술이다.

  • static 메소드를 호출 할 수 있다.


표기법

${ }

  • JSP가 실행될 때 즉시 반영된다. (Immediate evaluation)

  • 객체 프로퍼티 값을 꺼낼때 주로 사용


#{ }

  • 시스템에서 필요하다고 판단될 때 그 값을 사용한다. (Deferred evaluation)

  • 사용자 입력값을 객체의 프로퍼티에 담는 용도로 주로 사용


표기법 예제


java ( 선언 )

Member obj = (Member) pageContext.findAttribute("member");
int value = obj.getNo();
Colored by Color Scripter

jsp ( 표현 )

${ member.no } 또는 ${ member["no"] }

PageContext의 findAttribute()는 서블릿 보관소를 순서대로 모두 뒤져서 객체를 찾는다.

마지막 보관소에도 없다면 null을 반환한다.

findAttribute() 가 찾는 순서

JspContext → ServletRequest → HttpSession → ServletContext


EL 객체


객체설명코드
pageContextJSP의 PageContext 객체
servletContextServletContext 객체${ pageContext.servletContext.객체명 }
sessionHttpSession 객체${ pageContext.session.객체명 }
requestServletRequest 객체${ pageContext.request.객체명 }
responseServletResponse 객체
param요청 매개변수의 값 조회${ param.매개변수명 }
paramValues요청 매개변수의 값 배열 조회${ paramValues.매개변수명 }
headerHTTP 헤더의 값 조회${ header.헤더명 }
headerValuesHTTP 헤더의 값 배열 조회${ headerValues.헤더명 }
cookie쿠키 값 조회${ cookie.쿠키명 }
initParam컨텍스트 초기화 매개변수의 값 조회${ initParam.매개변수명 }
pageScopepage 보관소의 값 조회${ pageScope.객체명 }
requestScoperequest 보관소의 값 조회${ requestScope.객체명 }
sessionScopesession 보관소의 값 조회${ sessionScope.객체명 }
applicationScopeapplication 보관소의 값 조회${ applicationScope.객체명 }

paramValues 나 headerValues 사용법

① $ { paramValues . boadDto [0] } - index 0부터 시작

② $ { paramValues ["bardDto"][1] } - index 1부터 시작

EL의 데이터 저장소 우선순위

  1. Page

  2. request

  3. session

  4. application

  • 우선순위 순으로 돌면서 데이터를 찾아서 사용.
    ( but Page에서 찾으면 request 이후 에서는 찾지 않는다 )

  • Page: Page내에서 저장소로 사용 할 수있다.


EL 리터럴 표현식

문자열 : ${"test"}
문자열 : ${'test'}
정수 : ${20}
부동소수점 : ${3.14}
Boolean : ${true}
null : ${null}	<%-- null은 공백("")으로 출력된다 --%>

EL 표현식 - Array

JSP

<%
    pageContext.setAttribute("scores", new int[]{90, 80, 70, 100});
%>

${scores[2]}

실행결과

70


EL 표현식 - List

JSP

<%
    List<String> list = new LinkedList<>();
    list.add("가나");
    list.add("다라");
    list.add("마바");
 
    pageContext.setAttribute("list", list);
%>

${list[1]}

실행결과

다라


EL 표현식 - Map

<%
    Map<String, String> map = new HashMap<>();
    map.put("1", "a");
    map.put("2", "b");
    map.put("3", "c");
    pageContext.setAttribute("map", map);
%>

${map["1"]}

실행결과

a


EL 표현식 - Java 객체에서 property 값 제어

<%
    pageContext.setAttribute("student",
    			     new Student()
                            .setStudentNo("202012121")
                            .setStudentName("홍길동")
    );
%>

${student.studentNo} - ${student.studentName}

실행결과

202012121 - 홍길동


EL 표현식 - Java의 ResourceBundle 객체에서 값 제어

Java


public class MyResourceBundle extends ListResourceBundle {
    @Override
    protected Object[][] getContents() {
        return new Object[][] {
                {"OK", "확인"},
                {"Cancle", "취소"},
                {"Reset", "재설정"},
                {"Submit", "제출"}
        };
    }
}

JSP


<%
    pageContext.setAttribute("myRB", ResourceBundle.getBundle("MyResourceBundle"));
%>

${myRB.OK}

실행결과

확인


EL 산술 연산자

표현식실행 결과
${10+20}30
${10-20}-10
${10*20}200
${10/20}0.5
${10 div 20}0.5
${10 % 20}10
{10 mod 20}10

EL 논리 연산자

표현식실행 결과
${ true && false }false
${ true and false }false
${ false || true }true
${ false or true }true
${ not true }false
${ !true }false

EL 관계 연산자

표현식연산자
${ 10 == 11 }false
${ 10 eq 11 }false
${ 10 != 11 }true
${ 10 ne 11 }true
${ 10 < 11 }true
${ 10 lt 11 }true
${ 10 > 11 }false
${ 10 gt 11 }false
${ 10 <= 11 }true
${ 10 le 11 }true
${ 10 >= 11 }false
${ 10 ge 11 }false

empty 연산자

  • 값이 null이면 true

  • 문자열, 배열, Map, Collection 객체의 크기가 0이면 true

  • 그 외에는 false


예제

<%
    pageContext.setAttribute("title", "EL 연산자");
%>

${empty title}, ${empty title2}

실행 결과

false, true


조건 연산자

  • 3항 연산자와 문법이 동일

예제

${10 > 20 ? "크다" : "작다"}

실행 결과

작다


EL 예약 키워드

일반 연산자EL 기호 연산자
+, -+, -
**
/div
%mod
&&and
||or
!not
>lt ( less than )
<gt ( greater than )
>=le ( less or eqaul )
<=ge ( greater or equal )
==eq ( equal )
!=ne(not equal)
value == nullempty

객체 저장 시 key가 EL 예약 키워드면 500 Error 발생 됨


<%
    pageContext.setAttribute("ne", "EL 예약 키워드를 Key로 사용");
%>

${ne}	// error

EL 활용

학생 정보 변경 > 회원가입 예제


  • <% %>에 session에서 객체를 가져오는 자바 코드를 작성

JSP

<%@ page import="com.atoz_develop.spms.vo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    Student loginMember = (Student) session.getAttribute("student");
    Student student = (Student) request.getAttribute("student");
%>
<html>
<head>
    <title>학생 정보</title>
</head>
<body>
<h1>학생정보</h1>
<form action='update' method='post'>
    학번: <input type='text' name='student_no' value='<%=student.getStudentNo()%>' readonly><br>
    학과: <input type='text' name='department' value='<%=student.getDepartment()%>'><br>
    이름: <input type='text' name='student_name' value='<%=student.getStudentName()%>'><br>
    학년: <input type='text' name='grade' value='<%=student.getGrade()%>' readonly><br>
    성별: <input type='text' name='gender' value='<%=student.getGender()%>' readonly><br>
    나이: <input type='text' name='age' value='<%=student.getAge()%>' readonly><br>
    전화번호: <input type='text' name='phone_number' value='<%=student.getPhoneNumber()%>'><br>
    주소: <input type='text' name='address' value='<%=student.getAddress()%>'><br>
    <input type='submit' value='수정'>
    <%
        if(loginMember != null && "admin".equals(loginMember.getStudentNo())) {
    %>
    <input type="button" value="삭제" onClick="location.href='delete?student_no=<%=student.getStudentNo()%>'" />
    <%
        }
    %>
    <input type='button' value='취소' onClick='location.href="list"'>
</form>
</body>
</html>

  • <%= %>를 사용하는 대신 -> EL 표현식으로 바꾸면 다음과 같다.

JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>학생 정보</title>
</head>
<body>
<h1>학생정보</h1>
<form action='update' method='post'>
    학번: <input type='text' name='student_no' value='${requestScope.student.studentNo}' readonly><br>
    학과: <input type='text' name='department' value='${requestScope.student.department}'><br>
    이름: <input type='text' name='student_name' value='${requestScope.student.studentName}'><br>
    학년: <input type='text' name='grade' value='${requestScope.student.grade}' readonly><br>
    성별: <input type='text' name='gender' value='${requestScope.student.gender}' readonly><br>
    나이: <input type='text' name='age' value='${requestScope.student.age}' readonly><br>
    전화번호: <input type='text' name='phone_number' value='${requestScope.student.phoneNumber}'><br>
    주소: <input type='text' name='address' value='${requestScope.student.address}'><br>
    <input type='submit' value='수정'>
    <input type="button" value="삭제" onClick="location.href='delete?student_no=${student.studentNo}'"
           style="display: ${'admin' eq sessionScope.student.studentNo ? inline-block : none}">
    <input type='button' value='취소' onClick='location.href="list"'>
</form>
</body>
</html>

이와 같이 EL을 사용하면 <% %>에 객체를 꺼내는 코드를 작성하거나 <jsp:useBean>을 사용할 필요가 없고 <%= %>보다 훨씬 간결하게 작성할 수 있다.

이렇게 EL만 사용해도 코드가 훨씬 간결해지지만 나아가 JSP에 자바로 작성된 반복문 같은 코드를 없애려면 JSTL을 사용해야 한다.



Reference Site

0개의 댓글