JSTL & EL & Action Tag/JSTL
JSTL (core)
by pms93
2022. 10. 12.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--
JSTL(JavaServer Pages Standard Tag Library)
- sciptlet, expression의 사용 빈도가 잦아지게 되면서 생기는 가독성 문제를 해결하기 위한 표현식 tag
- 별도의 jar를 lib폴더 내에 넣어줌으로서 사용 가능.
- tag의 종류를 custom tag라고 하며 5가지의 종류가 존재한다.
- 각 태그마다 경로를 입력하여 사용할 수 있지만, 사용의 편리함을 위해 미리 Library를 import하여 사용한다.
* 기본기능(core)
: 변수 선언과 코드 흐름의 제어가 가능하며, 서버로 page이동 요청또한 가능하다.
* 형식화(format)
: encoding과 같다.
* 데이터베이스(sql)
: DB의 data를 INSERT, UPDATE, DELETE 할 수 있다.
* xml처리(xml)
: xml문서를 처리할 때 필요한 기능 제공
* 함수처리(functions)
: 문자열을 처리하는 함수 제공
--> core, format 두 종류가 많이 사용된다.
--%>
<%--
JSTL core기능을 사용하기 위한 준비작업
- uri경로 지정 (Ctrl + spacebar를 통해 자동완성으로 입력 가능)
* prefix
- 경로를 지정한 custom tag의 사용 명칭(변수명과 동일한 개념)을 정한다.
- core tag는 통상적으로 'c'로 많이 사용하는편
core tag의 종류
- <c:set />
: 변수 선언과 동일하다.
: ex) <c:set var = "data" value = "JSTL TSET" />
- 위 선언을 통해 data라는 변수를 "JSTL TEST"문자열로 초기화 한다.
- <c:out />
: System.out.print, Expression(<%=%>)과 동일
: ex) <c:out value = "JSTL TEST" />
: ex) <c:set var = "data" value = "JSTL DATA !!" />
<c:out value = "${ data }" />
- <c:if test = "" />
: test 내에 논리연산자(true, false)의 값을 통해 코드의 흐름 제어 가능
: ex) <c:set var = "name" value = "김변수" />
<c:if test = "${ name == '김변수' }">
<%= name과 문자열 '김변수'가 동일할 경우 실행될 문장 =>
</c:if>
- <c:forEach var = "" begin = "" end = "" step = "" />
: java의 for문과 동일
: var = 초기식, begin, end = 조건식, step = 증감식을 표기
: forEach에 선언된 var는 java의 for문과 동일하게 지역변이므로 코드의 흐름이 탈출하면 함께 소멸
- <c:choose />, <c:when />, <c:otherwise />
: java의 if, else if, else 혹은 switch case문과 동일하다.
: ex) 하단 ex6번 참조
: 정확하진 않으나 choose 내에 set을 통한 변수 선언은 불가능한듯 하다. (시도해봤으나 되지 않는다.)
- <c:url />
: 사용하고자 하는 경로를 변수처럼 담아 사용할 수 있다.
: ex) <c:url var = "root" value = "/" />
: root에 최상위 경로(webContext path)가 담긴다.
: ex) <c:url var = "jstl" value = "/jstl" />
: /webContext path/jspl
- <c:set scope = "" />
: c:set에 scope를 명시함으로서 내장객체에 바로 data 저장이 가능하다.
: ex) <c:set var = "data" value = "JSTL SCOPE !!" scope = "session" />
: !! scope를 지정하지 않으면 default value = pageContext !!
- <c:import>와 <%@ include %>의 차이
- import
: 매서드처럼 가서 실행 후 가져오고 가서 실행 후 가져오는식으로 가져온다.
: import된 파일 내의 변수는 사용할 수 없다.
: return을 통해 코드의 흐름 제어가 불가능하다. (JSTL의 core tag(choose, when, otherwise)를 통해 가능)
:
- include
: 파일의 내용을 그대로 가져와서 실행(가지고 온 후에 그대로 실행)
--%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<h4> ex1 </h4>
<c:set var = "string" value = "JSTL TEST !!" />
<c:out value = "${ string }" /> <br><br>
<h4> ex2 </h4>
<c:out value = "JSTL TEST2 !!" /> <br><br>
<h4> ex3 </h4>
<% String data1 = "자바 변수의 데이터"; %>
<c:out value = "<%= data1 %>" /> <br><br>
<h4> ex4 </h4>
<% String name = "김변수"; %>
<c:set var = "name" value = "<%= name %>" />
<c:if test = "${ name == '김변수' }">
<%= "이름은 김변수가 맞습니다." %>
</c:if>
<br><br>
<h4> ex5 </h4>
<% String[] names = {"김변수", "김상수", "김객체"}; %>
<c:set var = "names" value = "<%= names %>" />
forEach를 사용하지 않은 이름목록 출력 : ${ names[0] } ${ names[1] } ${ names[2] } <br><br>
<%-- 위처럼 forEach를 사용하지 않고 index를 통해서도 출력은 가능하다. --%>
forEach를 사용한 이름 목록 출력1 :
<c:forEach var = "cnt" begin = "0" end = "2" step = "1" >
${ names[cnt] }
</c:forEach>
<br><br>
forEach를 사용한 이름 목록 출력2 :
<c:forEach var = "cnt" begin = "0" end = "<%= names.length %>" step = "1">
${ names[cnt] }
</c:forEach>
<br><br>
<!-- items Attribute를 통한 향상 for문 -->
forEach(items)를 사용한 이름 목록 출력3 :
<c:forEach var = "nameItem" items = "${ names }">
${ nameItem }
</c:forEach>
<br><br>
<h4> ex6_1 </h4>
<% String id = "admin"; %>
<c:set var = "id" value = "<%= id %>" />
<c:choose>
<c:when test = "${ id == 'admin' }">
<c:out value = "id는 admin입니다." />
</c:when>
<c:when test = "${ id == 'admin2' }">
<%= "아이디는 admin2입니다." %>
</c:when>
<c:otherwise>
<c:out value = "if문의 else 혹은 switch case의 default와 같은 부문" />
</c:otherwise>
</c:choose>
<br><br>
<h4> ex6_2 </h4>
내장객체를 통한 이름 목록 출력 :
<% pageContext.setAttribute("names", new String[]{"김변수", "김상수", "김객체"}); %>
<c:forEach var = "cnt" begin = "0" end = "2" step = "1">
<c:out value = "${ names[cnt] }" />
</c:forEach>
<br><br>
<h4> ex7 </h4>
<c:url var = "root" value = "/" />
webContext root : ${ root } <br>
<c:url var = "jstl" value = "/jstl" />
jstl Path : ${ jstl }
<br><br>
<h4> ex8 </h4>
<c:set var = "data" value = "pageContext" scope = "page" />
<c:set var = "data" value = "request" scope = "request" />
<c:set var = "data" value = "session" scope = "session" />
<c:set var = "data" value = "application" scope = "application" />
<c:out value = "${ pageScope.data }" /> <br>
<c:out value = "${ requestScope.data }" /> <br>
<c:out value = "${ sessionScope.data }" /> <br>
<c:out value = "${ applicationScope.data }" />