JSTL / EL

박준서·2024년 9월 29일
6

Web

목록 보기
3/16
post-thumbnail

EL (Expression Language)

  • EL은 표현을 위한 언어로 JSP 스크립트의 표현식을 대신하여 속성 값을 쉽게 출력하도록 고안된 language 이다.

  • 즉, 표현식 (<%= %>)를 대체할 수 있다.

  • EL 표현식에서 도트 연산자 왼쪽은 반드시 java.util.Map 객체 또는 Java Bean 객체여야 한다.

  • EL 표현식에서 도트 연산자 오른쪽은 반드시 맵의 키이거나 Bean의 프로퍼티여야 한다.

  • EL에서 제공하는 기능

    • JSP의 4가지 기본 객체가 제공하는 영역의 속성(attribute) 사용
    • 자바 클래스 메소드 호출 기능
    • 표현 언어만의 기본 객체 제공
    • 수치, 관계, 논리 연산 제공

EL 문법

[ 스크립트릿 ]

<%= ((com.model.MemberDto) request.getAttribute("userinfo")).getZipDto().getAddress()%>

[ Expression Language ]

${userinfo.zipDto.address}

[EL 문법] Map을 사용하는 경우

${Map.Map의 키}

[EL 문법] Java Bean을 사용하는 경우

${Java Bean.Bean 프로퍼티}
  • Java Bean ?
    • 재사용 가능한 소프트웨어 컴포넌트를 정의하기 위한 표준을 따르는 자바 클래스

    • 여러 애플리케이션 간에 쉽게 데이터 전달 및 조작을 가능하게 하며, JSP나 프레임워크에서 흔히 사용한다.

      Java Bean의 주요 특징

    • 기본 생성자 제공

      • Java Bean 클래스는 파라미터가 없는 기본 생성자를 가져야 한다.
    • 캡슐화 된 필드와 접근자 메서드 (Getter / Setter)

      • 모든 클래스 변수는 private으로 선언되어 캡슐화 되며, 이를 조작하기 위한 Getter와 Setter 메서드를 사용한다.
    • 직렬화

      • Java Bean 클래스는 java.io.Serializable 인터페이스를 구현하여 직렬화가 가능해야 한다. 이를 통해 네트워크 전송이나 파일에 저장할 수 있다.
    • 예시

      public class Person implements java.io.Serializable {
          // 필드(프로퍼티)
          private String name;
          private int age;
      
          // 기본 생성자
          public Person() {
          }
      
          // Getter 및 Setter 메서드
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      }
      

[ EL 문법 ] : [ ] 연산자

  • EL에는 Dot 표기법 외에 [ ] 연산자를 사용하여 객체의 값을 접근할 수 있다.
  • [] 연산자 안의 값이 문자열인 경우, 맵의 키가 될 수도 있고, Bean 프로퍼티나 리스트 및 배열의 인덱스가 될 수 있다.
  • 배열과 리스트의 경우, 문자로 된 인덱스 값은 숫자로 변경하여 처리한다.

[ [ ] 연산자를 이용한 객체 프로퍼티 접근 ]

${userinfo["name"]}

[ Dot 표기법을 이용한 객체 프로퍼티 접근 ]

${userinfo.name}

EL 내장 객체

  • JSP 페이지의 EL 표현식에서 사용할 수 있는 객체
categoryidentifiertypedescription
JSPpageContextJava Bean현재 페이지의 프로세싱과 상응하는 PageContext instance.
ScopepageScopeMappage scope에 저장된 객체를 추출
ScoperequestScopeMaprequest scope에 저장된 객체를 추출
ScopesessionScopeMapsession scope에 저장된 객체를 추출
ScopeapplicationScopeMapapplication scope에 저장된 객체를 추출
요청 매개변수paramMapSerlvetRequest.getParameter(String)을 통해 요청 정보를 추출.
요청 매개 변수paramValuesMapSerlvetRequest.getParameterValues(String)을 통해 요청 정보를 추출.
요청 헤더headerMapHttpServletRequest.getHeader(String)을 통해 헤더 정보를 추출
요청헤더headerValuesMapHttpServletRequest.getHeaders(String)을 통해 헤더 정보를 추출
쿠키cookieMapHttpServletRequest.getCookies()를 통해 쿠키 정보 추출
초기화 매개변수initParamMapServletContext.getInitParameter(String)를 통해 초기화 파라미터를 추출.

EL 사용

  • pageContext를 제외한 모든 EL 내장 객체는 Map이다.
  • 그러므로 key와 value의 쌍으로 값을 저장하고 있다.
  • 기본 문법
    ${expr}

EL에서 객체 접근

  • request.setAttribute(”userinfo”, “안효인”);
    • ${requestScope.userinfo}
    • ${pageContext.request.userinfo}, ${userinfo}
      • property의 이름만 사용 할 경우 자동으로 pageScope → requestScope → sessionScope → applicationScope 순으로 객체를 찾는다.
  • url?name=준동&hobby=애니보기&hobby=전화일본어
    • ${param.name}
    • ${paramValues.fruit[0]} // 애니보기
request.setAttribute("town.user", memberDto);

// case 1 에러
${town.user.name} // town이라는 속성은 존재하지 않는다

${requestScope["town.user"].name}
  • ${cookie.id.value}
    • cookie가 null이라면 null return

    • null이 아니라면 id 검사 후 null이라면 null return, null 아니라면 value값 검사

    • EL은 값이 null이라도 null을 출력하지 않는다. (빈 문자열)

      [스크립트릿을 통한 쿠키 값 출력]

      Cookie[] cookies = request.getCookies();
      for(Cookie cookie : cookies) {
      	if(cookie.getName().equals("userId")) {
      		out.println(cookie.getValue());
      	}
      }

      [ EL 내장 객체를 통한 쿠키 값 출력 ]

      ${cookie.userId.value}

EL Operator

  • 대부분 java와 동일
description
산술+, -, *, /, %
관계형==, !=, <, >, ≤, ≥
3항 연산조건 ? 값1 : 값2
논리AND, OR, NOT
타당성 검사empty
  • empty 연산자에서 true를 return 하는 경우 → ${empty var}
    • 값이 null이면 true
    • 값이 빈문자열이면 true
    • 길이가 0인 배열이면 true
    • 빈 Map 객체는 true
    • 빈 Collection 객체면 true

JSTL (JSP Standard Tag Library)

  • 자바 서버 페이지 표준 태그 라이브러리

  • Java EE 기반의 웹 어플리케이션 개발 플랫폼을 위한 컴포넌트 모음

  • JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공한다.

  • custom tag : 개발자가 직접 태그를 작성할 수 있는 기능을 제공

    • custom tag 중에서 많이 사용되는 것들을 모아서 JSTL이라는 규약을 만듬
  • 논리적인 판단, 반복문의 처리, 데이터베이스 등의 처리를 할 수 있다.

  • JSTL은 JSP 페이지에서 스크립트릿을 사용하지 않고 액션을 통해 간단하게 처리할 수 있는 방법을 제공

  • JSTL에는 다양한 액션이 있고, EL과 함께 사용하여 코드를 간결하게 작성할 수 있다.

  • library를 추가해야 함.

  • JSTL Tag

    • directive 선언 형식

      <%@taglib prefix="prefix" uri="uri" %>
      libraryprefixfunctionURI
      corec변수 지원, 흐름 제어, URL 처리http://java.sun.com/jsp/jstl/core
      XMLxXML 코어, 흐름 제어, XML 변환http://java.sun.com/jsp/jstl/xml
      국제화fmt지역, 메시지 형식, 숫자 및 날짜 형식http://java.sun.com/jsp/jstl/fmt
      databasesqlSQLhttp://java.sun.com/jsp/jstl/sql
      함수Collection, String 처리http://java.sun.com/jsp/jstl/functions
    • JSTL - core tag

      • 선언

         <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl.core" %>
        functiontagdescription
        변수 지원setjsp page에서 사용 할 변수 설정.
        변수 지원remove설정한 변수를 제거
        흐름제어if조건에 따른 코드 실행
        흐름제어choose, when, otherwise다중 조건을 처리할 때 사용
        흐름제어forEacharray나 collection의 각 항목을 처리할 때 사용
        흐름제어forTokens구분자로 분리된 각각의 토큰을 처리할 때 사용 (StringTokenizer)
        URL 처리importURL을 사용하여 다른 자원의 결과를 삽입
        URL 처리redirect지정한 경로로 redirect
        URL 처리urlURL 작성
        기타 태그catchException 처리에 사용
        기타 태그outJspWriter에 내용을 처리한 후 출력
    • 변수 선언 : <c:set>
      - <c:set> 액션은 변수나 특정 객체의 프로퍼티에 값을 할당할 때 사용
      - value 속성의 값이나 액션의 Body content로 값을 설정
      - var 속성은 변수를 나타내며, 변수의 생존 범위는 scope 속성으로 설정. (디폴트 : page)
      - 특정 객체의 프로퍼티에 값을 할당할 때는 target 속성에 객체를 설정하고, property에 프로퍼티 명을 설정.

      [ 변수 선언 및 값 설정 ]
       <c:set var="username" value="jundong" />
       <p>Username : ${username} </p> // 출력 : Username : jundong
      [ 변수 범위 설정 (scope) ]
       <c:set var="username" value="jundong" scope="session" />
       <p>Username in Session: ${sessionScope.username}</p>// 출력: Username in Session: jundong

      [ Body Content로 값 설정 ]

      <c:set var="message">Hello, Welcome to our website!</c:set>
      <p>Message: ${message}</p> <!-- 출력: Message: Hello, Welcome to our website! -->
      

      [ 특정 객체의 프로퍼티 설정 ]

      <jsp:useBean id="user" class="com.example.User" scope="page" />
      <c:set target="${user}" property="name" value="Alice" />
      <p>User Name: ${user.name}</p> <!-- 출력: User Name: Alice -->
    • 예외 : <c:catch>

      • 기본적으로 JSP 페이지는 예외가 발생하면 지정된 오류 페이지를 통해 처리한다.

      • <c:catch> 액션은 JSP 페이지에서 예외가 발생할 만한 코드를 오류 페이지로 넘기지 않고 직접 처리할 때 사용

      • var 속성에는 발생한 예외를 담을 page 생존범위 변수를 지정.

        • var 속성은 예외가 발생했을 때, 발생한 예외 객체를 저장할 변수의 이름을 지정하는 데 사용
      • <c:catch>와 <c:if> 액션을 함께 사용하여 Java 코드의 try - catch와 같은 기능 구현.

        <%@ page contentType="text/html" pageEncoding="UTF-8" errorPage = "error.jsp" %>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
        
        <c:catch var="ex">
        <%
        	String str = null;
        	out.println("length of string : " + str.length());
        %>
        </c:catch>
        
        <c:if test="${ex != null}">
        	예외가 발생했습니다. $[ex.message}
        </c:if>
    • 조건문 : <c:if>, <c:choose>, <c:when>, <c:ohterwise>
      - <c:if> 액션은 test 속성에 지정된 표현식을 평가하여, 결과가 true인 경우 액션의 Body 내용을 수행한다.
      - <c:if> 액션의 var 속성은 표현식의 평가 결과인 Boolean 값을 담을 변수이다. 변수의 생존 범위는 scope 속성으로 설정한다.
      - <c:choose>, <c:when>, <c:ohterwise>를 사용하면 if, else if, else와 같이 사용할 수 있다.

      ``java
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

      <c:set var="age" value="25" />
      
      <!-- age가 18 이상일 경우 실행 -->
      <c:if test="${age >= 18}">
          <p>성인입니다.</p>
      </c:if>
      
      <!-- var 속성을 사용하여 Boolean 값을 저장 -->
      <c:if test="${age >= 18}" var="isAdult" scope="session" />
      <p>isAdult: ${sessionScope.isAdult}</p>  <!-- 출력: isAdult: true -->
      
      ```
      
      ```java
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      
      <c:set var="score" value="85" />
      
      <c:choose>
          <!-- score가 90 이상인 경우 -->
          <c:when test="${score >= 90}">
              <p>등급: A</p>
          </c:when>
      
          <!-- score가 80 이상 90 미만인 경우 -->
          <c:when test="${score >= 80}">
              <p>등급: B</p>
          </c:when>
      
          <!-- 그 외의 경우 -->
          <c:otherwise>
              <p>등급: C</p>
          </c:otherwise>
      </c:choose>
      
      ```
    • 반복문 : <c:forEach>

      • <c:forEach> 액션은 컬렉션에 있는 항목들에 대해 액션의 body 컨텐츠를 반복하여 수행
      • 컬렉션에는 Array, Collection, Map 또는 콤마로 분리된 문자열이 올 수 있다.
      • var 속성에는 반복에 대한 현재 항목을 담는 변수를 지정하고 items 속성은 반복할 항목들을 갖는 컬렉션 지정.
      • varStatus 속성에 지정한 변수를 통해 현재 반복의 상태를 알 수 있다.

    [ 리스트 반복하기 ]

      ```java
      	<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      
      <c:set var="cities" value="${['Seoul', 'Busan', 'Incheon', 'Daegu']}" />
      
      <!-- List 컬렉션 반복 -->
      <c:forEach var="city" items="${cities}">
          <p>도시 이름: ${city}</p>
      </c:forEach>
      
      ```
      
      
      

    [ 반복 상태를 확인하는 varStatus 사용하기 ]

      ```java
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      
      <c:set var="numbers" value="${[10, 20, 30, 40, 50]}" />
      
      <!-- 반복 상태를 확인 -->
      <c:forEach var="num" items="${numbers}" varStatus="status">
          <p>인덱스: ${status.index}, 값: ${num}</p>
          <c:if test="${status.first}">
              <p>이것은 첫 번째 요소입니다.</p>
          </c:if>
          <c:if test="${status.last}">
              <p>이것은 마지막 요소입니다.</p>
          </c:if>
      </c:forEach>
      
      ```
      
    • 출력 결과

        	<p>인덱스: 0, 값: 10</p>
          <p>이것은 첫 번째 요소입니다.</p>
          
          <p>인덱스: 1, 값: 20</p>
          
          <p>인덱스: 2, 값: 30</p>
          
          <p>인덱스: 3, 값: 40</p>
          
          <p>인덱스: 4, 값: 50</p>
          <p>이것은 마지막 요소입니다.</p>
          
          

      [ 콤마로 분리된 문자열 반복 ]

      			<c:set var="colors" value="Red,Green,Blue,Yellow" />
      
      			<c:forEach var="color" items="${fn:split(colors, ',')}">
      				<p>색상: ${color}</p>
      			</c:forEach>
profile
Back-End Developer

1개의 댓글

comment-user-thumbnail
2024년 9월 29일

정성스러운 포스팅 잘 보고 갑니다! 🤩🤩

늦은시간에도 JSTL과 EL에 대해 설명을 정말 알기 쉽게 잘 해주셨네요! 👏✨

이제 가을이 성큼 다가왔어요.🍁 청명한 가을 바람 처럼 내일 좋은 결과 있으시길 바래요😊🍂

혹시 시간 나실 때마다 제 블로그에도 한 번씩 들러주시면 감사하겠습니다. 🙏🏻💖

저도 자주 놀러 올게요! 팔로우 했어요 맞팔 부탁드려요! 😊✨

답글 달기

관련 채용 정보