๐ปEL & JSTL
- ๋ ๊ฐ์ง ์๋ก ๋ค๋ฅธ ๊ธฐ์ ์ด๋ฉฐ, ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น์ง ์์ง๋ง ๊ตฌ๋ฌธ์ ๋จ์ํ๊ฒ ํ๊ณ ๊ฐ๋ ์ฑ์ ํฅ์์์ผ์ค๋ค.
- ์ฌ๋ก๊ฑด : JSPํ์ด์ง์์ ๋๋๋ก ์๋ฐ๋ฅผ ์ฐ์ง ๋ง์
- ํ์ฌ๋ EL๊ณผ JSTL๋ฅผ ์ฌ์ฉํด์ JSPํ์ด์ง์์ ์๋ฐ๋ฅผ ์ ์ฐ์ง์๋๋ค.
- EL ๋๋ JSTL ์์ฑ์ ์๋ฌ๋ ์ง์ง ์๋ฌ๊ฐ ์๋๋ฏ๋ก ์คํ์์ผ๋ ๋๋ค.
๐ปEL ์ธ์ด
- Expression Language์ ์ฝ์์ด๋ค.
- ์๋ฐํํ์(<%= >) ๊ธฐ๋ฅ์ ๋์ ํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง ์ธ์ด์ด๋ค.
- ๋ชจ๋ ๊ฒ์ ์๋ตํ๊ณ key๋ง ์ ์ด๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ์ผ๋ฐ ์์(์ง์ญ๋ณ์, ๋ฉค๋ฒ๋ณ์)์ ์ถ๋ ฅํ ์ ์๋ค.
- ๋ด์ฅ ๊ฐ์ฒด(pageContext, request, session, application) ๋ด๋ถ์ ๋ฐ์ดํฐ๋ง ์ ์ฉ์ผ๋ก ์ถ๋ ฅํ๋ ํํ์์ด๋ค.
- ${} ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค.
ํํ์๊ณผ EL ์ฌ์ฉ๋ฒ ๋น๊ต
<%
int a = 10;
pageContext.setAttribute("b", 20);
request.setAttribute("c", 30);
%>
<h2>ํํ์</h2>
<div>a: <%= a %></div>
<div>b: <%= pageContext.getAttribute("b") %></div>
<div>c: <%= request.getAttribute("c") %></div>
<h2>EL</h2>
<div>a: ${a}</div> <%-- ๋น ๊ฐ --%>
<div>b: ${b}</div>
<div>c: ${c}</div>
๋ณ์ a๋ ์ง์ญ๋ณ์์ด๋ฏ๋ก EL ํํ์ผ๋ก ์ถ๋ ฅํ๋ฉด ๋น ๊ฐ์ ์ถ๋ ฅํ๋ค.
EL ์ฐ์ฐ ๊ธฐ๋ฅ
์ฌ์น์ฐ์ฐ
<div>b+10 = ${b+10}</div>
<div>b-10 = ${b-10}</div>
<div>b*10 = ${b*10}</div>
<div>b/10 = ${b/10}</div>
<div>b%10 = ${b%10}</div>
<div>b mod 10 = ${b mod 10}</div>
์ฐ์ฐํ ๋ชจ๋ ํญ๋ชฉ์ ์ค๊ดํธ ์์ ๋ฃ์ด์ผ ์ฐ์ฐ์๋ก ์ธ์ํ๋ค. ์ค๊ดํธ ๋ฐ์ ์์ฑํ๋ฉด ์ฐ์ฐ์๊ฐ ์๋๋ผ HTML์ PCDATA๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
'%' ์ฐ์ฐ์๋ 'mod'๋ผ๋ ํค์๋๋ก๋ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค. ๊ฐ๋ ํน์๋ฌธ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ํค์๋๋ก ์นํ์ด ํ์ํ๋ฏ๋ก ์กด์ฌํ๋ ๊ฒ๋ง ์์๋๋ฉด ๋๋ค. (์ธ์ธํ์์์ด ๊ตฌ๊ธ๋งํ๋ฉด ๋๋ค)
๋น๊ต ์ฐ์ฐ
<div>b > 10 = ${b > 10}</div>
<div>b < 10 = ${b < 10}</div>
<div>b > 10 = ${b gt 10}</div>
<div>b < 10 = ${b lt 10}</div>
<div>b >= 10 = ${b >= 10}</div>
<div>b >= 10 = ${b ge 10}</div>
<div>b == 20 = ${b == 20}</div>
<div>b != 20 = ${b != 20}</div>
<div>b == 20 = ${b eq 20}</div>
<div>b != 20 = ${b ne 20}</div>
xml๊ฐ์ ๋งํฌ์ ๊ธฐ๋ฐ์ ์ฝ๋์์๋ ๋ถ๋ฑํธ๋ฅผ ํ๊ทธ์ ์์๊ณผ ๋์ผ๋ก ์ธ์์ ํ๊ธฐ๋๋ฌธ์๋ถ๋ฑํธ(< , >)๊ฐ ์ธ์๋์ง ์์ ๋๊ฐ ์๋ค. ์ฝ๋ ๋ด์์ ๋ถ๋ฑํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ถ๋ฑํธ๋ฅผ ํค์๋๋ก ์นํํด์ฃผ์ด์ผ ํ๋ค.
'>' ๋ถ๋ฑํธ๋ '>' ํค์๋๋ก , '<' ๋ถ๋ฑํธ๋ '<' ํค์๋๋ก ์นํํ๋ค.
'==' ๊ธฐํธ๋ ํค์๋๋ก ์นํํ ์ ์๋๋ฐ equal์ ์ฝ์์ธ 'eq'๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ณ , '!=' ๊ธฐํธ๋ 'ne'๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ ผ๋ฆฌ ์ฐ์ฐ
<div>${false && true}</div>
<div>${true || false}</div>
<div>${!true}</div>
๋ ผ๋ฆฌ ์ฐ์ฐํ ๋๋ 'Dead code'๋ฅผ ์ฃผ์ํด์ผ ํ๋ค.
*Dead code
- ์ผํธ ์ํท(Short-circuit) ์ด๋ผ๊ณ ๋ ํ๋ค.
- ์ฝ๋๊ฐ ์คํ๋์ง ์๊ฑฐ๋ ์ฌ์ฉ๋์ง ์๋ ์ํ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ ์ฃผ๋ก ์กฐ๊ฑด๋ฌธ์ด๋ ๋ฃจํ์์ ๋ฐ์ํ๋ค.
- && ์ฐ์ฐ์๋ ์์ชฝ์ ๋ค ๋ด์ผํ๊ณ , or ์ฐ์ฐ์๋ ํ์ชฝ๋ง true๋ฉด true์ด๋ค.
- true && true : ์ผ์ชฝ์ด true๋๊น ์ค๋ฅธ์ชฝ๋ ํ์ธํด์ผํ๋ค (์ ์)
- false && true : ์ผ์ชฝ์ด false์์ ๋ฐ๋ผ ์ค๋ฅธ์ชฝ ๊ฒ์ฌ๋ฅผ ์ํด๋ ๋๋ฏ๋ก (Dead code)
- true || false : ์ผ์ชฝ์ด true์ด๋ฏ๋ก ์ค๋ฅธ์ชฝ ๊ฒ์ฌ๋ฅผ ์ํด๋ ๋๋ฏ๋ก (Dead code)
์ผํญ์ฐ์ฐ์
์ผํญ์ฐ์ฐ์๋ ๊ฐ๋ฅํ๋ค.
<div>${b > 0 ? "์์" : "์์" }</div>
๋ฌธ์์ด ๋น๊ต
equals ๋ฉ์๋ ์์ด ์ฐ์ฐ์๋ก ๋น๊ต ๊ฐ๋ฅํ๋ฉฐ ์๋ฐ์ดํ("), ๊ฝ๋ฐ์ดํ(') ๋ ๋ค ์ง์ํ๋ค.
<div>${"๋ฌธ์์ด".equals("๋ฌธ์์ด")}</div>
<div>${"๋ฌธ์์ด" == "๋ฌธ์์ด" }</div>
<div>${"๋ฌธ์์ด" == '๋ฌธ์์ด' }</div>
๊ฐ์ฒด ์ ๊ทผ(Map)
<%
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("kor", 100);
map.put("eng", 90);
map.put("math", 80);
pageContext.setAttribute("map", map);
%>
EL์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์ ์์์ ์ ๊ทผํ๊ฑฐ๋ ๋งต์ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํํ์์ผ๋ก ์ ๊ทผ
<div>๊ตญ์ด: <%=map.get("kor") %></div>
<div>์์ด: <%=map.get("eng") %></div>
<div>์ํ: <%=map.get("math") %></div>
ํํ์์ผ๋ก ์ ๊ทผํ ๋๋ get(key) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ๋ค.
el๋ก ์ ๊ทผ
<div>๊ตญ์ด: ${map.get("kor") }</div>
<div>๊ตญ์ด: ${map["kor"] }</div>
<div>๊ตญ์ด: ${map.kor}</div>
el๋ก ์ ๊ทผํ ๋๋ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
1. ํํ์๊ณผ ๊ฐ์ด get(key) ๋ฉ์๋๋ก ์ ๊ทผํ๋ค. ์ด๋ฌ๋ฉด el ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด 2,3๋ฒ์ ์ฌ์ฉํ๋ค.
2. ํค์ธ๋ฑ์ค([])๋ก ์ ๊ทผํ๋ค.
3. ๋ฉค๋ฒ ์ ๊ทผ ์ฐ์ฐ์(.)๋ก ์ ๊ทผํ๋ค.
๊ฐ์ฒด ์ ๊ทผ(์ผ๋ฐ๊ฐ์ฒด)
<%
Score score = new Score();
score.setKor(99);
score.setEng(88);
score.setMath(77);
pageContext.setAttribute("score", score);
%>
map์ ํ๋ฒ์ ํ๋์ ์์๋ฅผ ์ ์ฅํ์ง๋ง, class๋ ํ ๊ฐ์ฒด์ ์ฌ๋ฌ ์์ฑ์ ๋ด์ ์ ์์ด ์์ ๋ค๋ฅธ ์ํฉ์ฒ๋ผ ๋ณด์ธ๋ค.
ํํ์์ผ๋ก ์ ๊ทผ
<div>๊ตญ์ด: <%=score.getKor() %></div>
๋ฏธ๋ฆฌ java ํ์ผ์ getter ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค.
el๋ก ์ ๊ทผ
<div>๊ตญ์ด: ${score.getKor()}</div>
<div>๊ตญ์ด: ${score.kor}</div>
<div>๊ตญ์ด: ${score["kor"]}</div>
el๋ก ์ ๊ทผํ ๋๋ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
1. ํํ์๊ณผ ๊ฐ์ด getter ๋ฉ์๋๋ก ์ ๊ทผํ๋ค. ์ด๋ฌ๋ฉด el ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด 2,3๋ฒ์ ์ฌ์ฉํ๋ค.
2. get๋ฅผ ์๋ตํ๊ณ ๋ฉค๋ฒ ์ ๊ทผ ์ฐ์ฐ์ + ์์ฑ๋ช ์ผ๋ก ์์ฑํ๋ค.
3. ํค์ธ๋ฑ์ค์ ์์ฑ๋ช ์ ์์ฑํ๋ค.
(2,3 ๋ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ EL ๋ด์์ kor์ get๋ฅผ ๋ถ์ฌ์ getKor()๋ก ๋ง๋ค์ด์ค๋ค.)
๋ด์ฅ ๊ฐ์ฒด ์ฐ์ ์์
- pageContext, request, session, application ์ด ์๋ก ์ถฉ๋์ด ๋ฌ์ ๋ EL์ ์๋ช ์ฃผ๊ธฐ ์์ผ๋ก ํ์ํ๋ค.
- ๋ถ๋ชจ์ ์์์ด ์ถฉ๋๋๋ฉด ์์ ๋จผ์ ์ ์ฉ๋๊ณ , ๋์ ๋ฒ์์ ์ข์ ๋ฒ์๊ฐ ์ถฉ๋๋๋ฉด ์ข์ ๋ฒ์๊ฐ ๋จผ์ ์ ์ฉ๋๋ฏ์ด ์๋ช ์ฃผ๊ธฐ๊ฐ ํ์คํ ์์ผ๋ก ์ ์ฉ๋๋ค.
- ๋ด์ฅ ๊ฐ์ฒด๋ช ์ Scope์ ํจ๊ป ์ ์ผ๋ฉด ํด๋น ๋ด์ฅ ๊ฐ์ฒด์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
<%
pageContext.setAttribute("color", "tomato");
request.setAttribute("color", "orange");
session.setAttribute("color", "gold");
application.setAttribute("color", "cornflowerblue");
%>
<div style="background-color:${color};">${color}</div> <!-- //pageContext -->
<div style="background-color:${requestScope.color};">${requestScope.color}</div>
<div style="background-color:${sessionScope.color};">${sessionScope.color}</div>
<div style="background-color:${applicationScope.color};">${applicationScope.color}</div>
๐ปJSTL
- JSP Standard Tag Library ์ ์ฝ์์ด๋ค.
- ํ์ค ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ง๋ง ์ค์ ๋ก๋ ํ์ฅํ๊ทธ์ด๋ค.
- ์๋ฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฅ์ ํ๊ทธ ํ์์ผ๋ก ๊ตฌํํ๋ค.
- JSP ํ์ด์ง์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ํ๊ทธ ํํ๋ก ์ ๊ณตํ์ฌ, JSP ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
- jar ํ์ผ์ด ์์ด์ผ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
jar ๋ค์ด๋ก๋
1. maven repository ์ ์
๊ฐ์ข jar ํ์ผ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋ค.
2. 'JSTL' ๊ฒ์
์๋จ ๊ฒ์์ฐฝ์ 'JSTL' ๊ฒ์ํ๋ค.
2๋ฒ์งธ ๋๋ ์ฐ์ธก ์ซ์๋ฅผ ๋ณด๋ฉด ์ฌ๋๋ค์ด ์ผ๋ง๋ ์ฌ์ฉํ๊ณ ์๋์ง๋ฅผ ๋ํ๋๋๋ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ์ ํํ๋ฉด ๋๋ค.
3. ๋ฒ์ ์ ํ
์ต์ ๋ฒ์ ์ ์ ํํ๋ค.
4. jar ํ์ผ ๋ค์ด๋ก๋
์ค๊ฐ ์ฏค ์์น์ jar๋ฅผ ์ ํํ์ฌ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.
5. ํ๋ก์ ํธ์ ์ฐ๊ฒฐ
lib ํด๋ ๋ด์ ๋ค์ด๋ก๋ ๋ฐ์ jar ํ์ผ์ ๋ถ์ฌ๋ฃ๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ
๋ค์์คํ์ด์ค(namespace) ์ ์ํ๊ธฐ
- JSTL์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ JSP ํ์ด์ง์์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ค์์คํ์ด์ค(namespace)๋ฅผ ์ ์ํด์ผํ๋ค.
- ๋ค์์คํ์ด์ค๋ JSTL ํ๊ทธ๋ค์ ์๋ณํ๋๋ฐ ์ฌ์ฉ๋๋ค.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- taglib: ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ง์ ํ๋ JSP ์ง์์์ด๋ค.
- prefix: ํ๊ทธ๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ ๋์ฌ์ด๋ค. ๊ฐ๋ฐ์๋ผ๋ฆฌ์ ์ฝ์์ผ๋ก core์ ์ฝ์๋ก c๋ก ์ ๋๋ค.
- uri: ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์น๋ฅผ ์ง์ ํ๋ ์๋ณ์์ด๋ค. JSTL์ core ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ, ์์ ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ค.
์ดํ์๋ ํด๋น ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ JSTL์ ํ๊ทธ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
<c:set var="c" value="30" />
JSTL์ ๋ณ์๋ฅผ ์ ์ธํ๋ ํ๊ทธ๋ก ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด c๋ผ๋ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.
<c:> ํ๊ทธ๋ก ์์ฑํ๋ค.
๋ณ์ ์ ์ธํ๊ธฐ ๋ฐ ์์ ํ๊ธฐ
<c:set var="c" value="300" />
๋ณ์ ์ ์ธ๊ณผ ์์ ํ๋ ๋ฐฉ๋ฒ์ <c:set> ํ๊ทธ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋์ผํ๋ค.
๋ณ์ ์ญ์ ํ๊ธฐ
<c:remove var="c"/>
<div>c: ${empty c}</div>
<c:remove> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์ญ์ ํ๋ค.
empty ์์ฑ์ ๋ณ์ c๊ฐ ์์ผ๋ฉด true, ์์ผ๋ฉด false ๋ฐํํ๋ค.
์กฐ๊ฑด๋ฌธ
<c:if>
<c:set var="num" value="10" />
<c:if test="${num > 0}">
<div>${num}์ ์์์
๋๋ค.</div>
</c:if>
<c:if test="${num < 0}">
<div>${num}์ ์์๊ฐ ์๋๋๋ค.</div>
</c:if>
JSTL์๋ else if ์ ์ด ์์ด์, ์กฐ๊ฑด์ด ์ฌ๋ฌ๊ฐ ์์ ๋๋ if๋ฌธ์ ์ฌ๋ฌ๊ฐ ์์ฑํ๋ ๊ฒ๊ณผ ๋ค์ค ์กฐ๊ฑด๋ฌธ์ผ๋ก <c:choose>๋ฅผ ์ฌ์ฉํ๋ค.
๋ค์ค ์กฐ๊ฑด๋ฌธ
<c:choose>
<c:when test="${num > 0}">์์</c:when>
<c:when test="${num < 0}">์์</c:when>
<c:otherwise>0์
๋๋ค.</c:otherwise>
</c:choose>
default๋ก <c:otherwise> ๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ณต๋ฌธ
<c:forEach>
<c:forEach var="i" begin="0" end="9" step="1">
<div>์ซ์: ${i}</div>
</c:forEach>
step์ ์์(์ ์)๋ง ๊ฐ๋ฅํ๋ค
ํฅ์๋ for๋ฌธ์ฒ๋ผ ์ฌ์ฉํ๊ธฐ
<%
String[] names = {"ํ๊ธธ๋", "์๋ฌด๊ฐ", "ํํํ", "ํธํธํธ", "ํํํ"};
pageContext.setAttribute("names", names);
%>
<c:set var="n" value="0" />
<table>
<tr>
<th>์ด๋ฆ</th>
<th>index</th>
<th>n</th>
<th>count</th>
<th>current</th>
<th>first</th>
<th>last</th>
</tr>
<c:forEach var="name" items="${names}" varStatus="status">
<tr>
<td>${name}</td>
<td>${status.index}</td>
<td>${n}</td>
<td>${status.count}</td> <!-- 1๋ถํฐ ์์ํ๋ค. -->
<td>${status.current}</td> <!-- ํ์ฌ ๊ฐ์ ธ์จ ์์ํ
๊ฐ. -->
<td>${status.first}</td> <!-- ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค์ธ์ง boolean๊ฐ์ผ๋ก ๋ฐํํ๋ค. -->
<td>${status.last}</td> <!-- ๋ง์ง๋ง ์ธ๋ฑ์ค์ธ์ง boolean๊ฐ์ผ๋ก ๋ฐํํ๋ค. -->
</tr>
<c:set var="n" value="${n+1}" /> <!-- n=n+1 -->
</c:forEach>
</table>