본문 바로가기
TIL

[TIL] EL, JSTL Core, Format 태그

by thegreatjy 2023. 11. 16.
728x90

cookie

쿠키는 생성 직후 클라이언트에만 저장되어 있으므로 다시 한 번 방문해서 서버로 전송해줘야 읽을 수 있다.

EL (Expression Language)

표현 언어는 3가지 영역에 저장된 값을 출력할 때 사용한다. 예외와 형변환에 관대하다. null인 변수를 사용할 때, 예외가 발생하지 않는다.

  • JSP 내장 객체의 영역(page, request, session, application)에 담긴 속성을 사용할 수 있다.
  • 산술 연산, 비교 연산, 논리 연산 가능
  • 자바 클래스에 정의된 메서드를 호출할 수 있다.
  • HTML, JS, CSS에서 사용할 수 있다. JSP 스크립트 요소(선언부, 표현식, 스크립틀릿)에서는 사용할 수 없다.
  • null을 조작, 연산할 때 0으로 인식되어 예외가 발생하지 않는다.

사용법

${ 속성 }
<c:set value="${ elVar }"/>        <!-- 액션태그 -->
<jsp:include page="${ pathVar }"/>  <!-- jstl -->
${ object["property"] }
${ object['property'] }
${ object.property } // 영어 변수명만 사용 가능 

EL 내장객체

  • pageScope
    • pageContext 내장 객체와 동일
  • requestScope
  • sessionScope
  • applicationScope
<%
  pageContext.setAttribute("scopeValue1", "페이지 영역");
  request.setAttribute("scopeValue2", "리퀘스트 영역");
  session.setAttribute("scopeValue3", "세션 영역");
  application.setAttribute("scopeValue4", "어플리케이션 영역");
%>

...

<li>페이지 영역 : ${pageScope.scopeValue1}</li>
<li>리퀘스트 영역 : ${requestScope.scopeValue2}</li>
<li>페이지 영역 : ${sessionScope.scopeValue3}</li>
<li>페이지 영역 : ${applicationScope.scopeValue4}</li>

page영역은 포워딩되면 소멸되고 새 page 영역이 만들어진다.

폼값 처리

JSP : request.getParameter()로 폼값을 받는다

EL :

  • param
  • paramValues
    • 요청 매개변수의 값을 문자열 배열로 받아온다. checkbox로부터 다중 선택 폼 값을 전달받을 때 사용된다.
<li>학력 : ${ param.grade }</li>
<li>관심사항 :
  ${ paramValues.inter[0] }
  ${ paramValues.inter[1] }
<li>

객체 전달

  • 영역에 객체 인스턴스를 저장하여 사용한다.
  • 폼으로는 객체를 전달할 수 없다.
<%
    request.setAttribute("integerObj", new Integer(99));
%>
<jsp:forward page="ObjectResult.jsp" />

...

<li>Integer 객체 - ${integerObj}</li>
==================
Integer 객체 - 99

쿠키

쿠키, 헤더값을 el로 읽을 수 있다.

<%
  CookieManager.makeCookie(response, "ELCookie", "EL좋아요", 10);
%>

<li>el cookie : ${cookie.ELCookie.value} </li>
<li>host : ${header.host}</li>

클래스 인스턴스의 메서드 호출

  1. src/main/java 아래에 .java 파일 생성
public class MyELClass {
    // 입력받은 숫자의 홀짝 판별
    public boolean isEven(int value){
        if(value % 2 == 0) return true;
        return false;
    }
}
  1. webapp 아래의 jsp 파일에서 호출
    1. 클래스 인스턴스 생성
    2. 4가지 영역(page, request, session, application)에 저장
<%
  MyELClass myClass = new MyELClass();
  pageContext.setAttribute("myClass", myClass);
%>

...

${ myClass.isEven(22) }

JSTL

tag 종류

tag 기능 접두어
core 변수 선언, 조건/반복문, url 처리 c
formatting 숫자, 날짜, 시간 포맷 지정 fmt
xml xml 파싱 x
function 컬렉션, 문자열 처리 fn
sql db 연결 및 쿼리 실행 sql

Core 태그

변수 선언, 조건문, 반복문

태그 기능
set 변수 설정
remove 변수 제거
if 단일 조건문. else는 없다
choose 다중 조건. when-otherwise
forEach for, 향상된 for 두 가지 존재
redirect sendRedirect()와 동일한 기능

⇒ forward VS redirect

첫째, URL의 변화여부(변화 O -> redirect, 변화 X -> forward)

둘째, 객체의 재사용여부(재사용 O -> forward, 재사용 X -> redirect)

위와 같은 차이점 때문에 웹 애플리케이션을 작성할 때 forward와 redirect 두 가지 방식 중 하나를 적절히 선택하여 사용해야한다. 예를 들어 게시판 애플리케이션을 작성한다고 해보자. 사용자가 보낸 요청정보를 이용하여 글쓰기 기능을 수행하는 CGI(Common Gateway Interface)가 있다면, 이 CGI의 응답 페이지는 forward와 redirect 중 어느 것을 사용해야 될까? 정답은 redirect이다.

사용자가 실수 혹은 고의로 글쓰기 CGI응답 페이지에서 새로고침을 누르면 어떻게 될까? forward의 경우 요청정보가 그대로 살아있기 때문에 똑같은 글이 여러번 등록될 수 있다. 하지만 redirect의 경우 처음 글을 작성할 때 보냈던 요청정보는 존재하지 않는다. 또한 글쓰기 기능을 하는 URL1이 아닌 URL2로 요청을 보내기 때문에 글쓰기가 여러번 수행되지 않는다.

즉, 시스템(session, DB)에 변화가 생기는 요청(로그인, 회원가입, 글쓰기)의 경우 redirect방식으로 응답하는 것이 바람직하며, 시스템에 변화가 생기지 않는 단순조회(리스트보기, 검색)의 경우 forward방식으로 응답하는 것이 바람직하다.

<c:set> 태그

변수 선언

<c:set var="expVar" value="<%= new Date() %>"/>
<c:set var="betweenVar">변수값 이렇게 설정</c:set>

<c:set var="personVar2" value="<%= new Person() %>" scope="request"/>
<c:set target="${personVar2}" property="name" value="값2" />

변수 사용

${ expVar }
${ betweenVar }
${ requestScope.personVar1.name }

<c:if> 태그

<c:if test="조건" var="변수명" scope="영역">
    조건이 true일 때 출력할 문장
</c:if>
속성 기능
test if문에서 사용할 조건
var 조건의 결과를 저장할 변수명
scope 변수가 저장될 영역 지정
- 문자열 tRuE는 대소문자에 상관없이 항상 true 반환
- 공백el공백과 같이 공백이 삽입되면 무조건 false 반환
- test=” ${ result } “

<c:redirect> 태그

<c:redirect url="이동할 경로" />

response 내장 객체의 sendRedirect()와 동일하게 페이지 이동 처리

매개변수 전달은 <c:param> 태그 혹은 request 영역 사용

redirect는 request 영역이 공유되지 않음. forward는 request 영역 공유(서버에서 실행되므로)

<c:out> 태그

<c:out value="출력할 변수" default="기본값" escapeXml="특수문자 처리 true/false" />
  • 변수가 null이면 default에 지정된 값이 출력된다.
  • escapeXml 속성이 true이면 html 태그(마크업 언어)를 사용할 수 있다.
속성 설명
value 출력할 변수 지정
escapeXml 특수문자를 변환할지 여부. 기본값은 true. 특수기호를 그대로 출력
default value 속성에 값을 지정하지 않았을 때, 기본 출력값

formatting(국제화) 태그

국가별로 언어, 날짜, 시간, 숫자 형식을 설정할 때 사용한다.

숫자 포맷팅 및 파싱 fmt:formatNumber

로케일 설정 fmt:setLocale

국가별로 다른 통화 기호나 날짜를 표현할 때 사용

한글로 설정 : 
<fmt:setLocale value="ko_kr"/>
<fmt:formatNumber value="10000" type="currency" />
<fmt:formatDate value="${today}" />
========================================
한글로 설정 : ₩10,000 2023. 11. 16.

References

https://doublesprogramming.tistory.com/63

728x90