EL (Expression Language)
EL은 표현을 위한 언어로 JSP 스크립트의 표현식을 대신하여 속성 값을 쉽게 출력하도록 고안된 language 이다.
즉, 표현식 (<%= %>)를 대체할 수 있다.
EL 표현식에서 도트 연산자 왼쪽은 반드시 java.util.Map 객체 또는 Java Bean 객체여야 한다.
EL 표현식에서 도트 연산자 오른쪽은 반드시 맵의 키이거나 Bean의 프로퍼티여야 한다.
EL에서 제공하는 기능
❗EL 문법
[ 스크립트릿 ]
<%= ((com.model.MemberDto) request.getAttribute("userinfo")).getZipDto().getAddress()%>
[ Expression Language ]
${userinfo.zipDto.address}
[EL 문법] Map을 사용하는 경우
${Map.Map의 키}
[EL 문법] Java Bean을 사용하는 경우
${Java Bean.Bean 프로퍼티}
재사용 가능한 소프트웨어 컴포넌트를 정의하기 위한 표준을 따르는 자바 클래스
여러 애플리케이션 간에 쉽게 데이터 전달 및 조작을 가능하게 하며, JSP나 프레임워크에서 흔히 사용한다.
Java Bean의 주요 특징
기본 생성자 제공
캡슐화 된 필드와 접근자 메서드 (Getter / Setter)
직렬화
예시
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 문법 ] : [ ] 연산자
[ [ ] 연산자를 이용한 객체 프로퍼티 접근 ]
${userinfo["name"]}
[ Dot 표기법을 이용한 객체 프로퍼티 접근 ]
${userinfo.name}
EL 내장 객체
category | identifier | type | description |
---|---|---|---|
JSP | pageContext | Java Bean | 현재 페이지의 프로세싱과 상응하는 PageContext instance. |
Scope | pageScope | Map | page scope에 저장된 객체를 추출 |
Scope | requestScope | Map | request scope에 저장된 객체를 추출 |
Scope | sessionScope | Map | session scope에 저장된 객체를 추출 |
Scope | applicationScope | Map | application scope에 저장된 객체를 추출 |
요청 매개변수 | param | Map | SerlvetRequest.getParameter(String)을 통해 요청 정보를 추출. |
요청 매개 변수 | paramValues | Map | SerlvetRequest.getParameterValues(String)을 통해 요청 정보를 추출. |
요청 헤더 | header | Map | HttpServletRequest.getHeader(String)을 통해 헤더 정보를 추출 |
요청헤더 | headerValues | Map | HttpServletRequest.getHeaders(String)을 통해 헤더 정보를 추출 |
쿠키 | cookie | Map | HttpServletRequest.getCookies()를 통해 쿠키 정보 추출 |
초기화 매개변수 | initParam | Map | ServletContext.getInitParameter(String)를 통해 초기화 파라미터를 추출. |
EL 사용
${expr}
EL에서 객체 접근
request.setAttribute("town.user", memberDto);
// case 1 에러
${town.user.name} // town이라는 속성은 존재하지 않는다
${requestScope["town.user"].name}
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
description | |
---|---|
산술 | +, -, *, /, % |
관계형 | ==, !=, <, >, ≤, ≥ |
3항 연산 | 조건 ? 값1 : 값2 |
논리 | AND, OR, NOT |
타당성 검사 | empty |
JSTL (JSP Standard Tag Library)
자바 서버 페이지 표준 태그 라이브러리
Java EE 기반의 웹 어플리케이션 개발 플랫폼을 위한 컴포넌트 모음
JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공한다.
custom tag : 개발자가 직접 태그를 작성할 수 있는 기능을 제공
논리적인 판단, 반복문의 처리, 데이터베이스 등의 처리를 할 수 있다.
JSTL은 JSP 페이지에서 스크립트릿을 사용하지 않고 액션을 통해 간단하게 처리할 수 있는 방법을 제공
JSTL에는 다양한 액션이 있고, EL과 함께 사용하여 코드를 간결하게 작성할 수 있다.
library를 추가해야 함.
JSTL Tag
directive 선언 형식
<%@taglib prefix="prefix" uri="uri" %>
library | prefix | function | URI |
---|---|---|---|
core | c | 변수 지원, 흐름 제어, URL 처리 | http://java.sun.com/jsp/jstl/core |
XML | x | XML 코어, 흐름 제어, XML 변환 | http://java.sun.com/jsp/jstl/xml |
국제화 | fmt | 지역, 메시지 형식, 숫자 및 날짜 형식 | http://java.sun.com/jsp/jstl/fmt |
database | sql | SQL | http://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" %>
function | tag | description |
---|---|---|
변수 지원 | set | jsp page에서 사용 할 변수 설정. |
변수 지원 | remove | 설정한 변수를 제거 |
흐름제어 | if | 조건에 따른 코드 실행 |
흐름제어 | choose, when, otherwise | 다중 조건을 처리할 때 사용 |
흐름제어 | forEach | array나 collection의 각 항목을 처리할 때 사용 |
흐름제어 | forTokens | 구분자로 분리된 각각의 토큰을 처리할 때 사용 (StringTokenizer) |
URL 처리 | import | URL을 사용하여 다른 자원의 결과를 삽입 |
URL 처리 | redirect | 지정한 경로로 redirect |
URL 처리 | url | URL 작성 |
기타 태그 | catch | Exception 처리에 사용 |
기타 태그 | out | JspWriter에 내용을 처리한 후 출력 |
변수 선언 : <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 생존범위 변수를 지정.
<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>
[ 리스트 반복하기 ]
```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>
정성스러운 포스팅 잘 보고 갑니다! 🤩🤩
늦은시간에도 JSTL과 EL에 대해 설명을 정말 알기 쉽게 잘 해주셨네요! 👏✨
이제 가을이 성큼 다가왔어요.🍁 청명한 가을 바람 처럼 내일 좋은 결과 있으시길 바래요😊🍂
혹시 시간 나실 때마다 제 블로그에도 한 번씩 들러주시면 감사하겠습니다. 🙏🏻💖
저도 자주 놀러 올게요! 팔로우 했어요 맞팔 부탁드려요! 😊✨