[JSP]EL/JSTL?


EL/JSTL

EL ( Expression Language )

Expression Language(ํ‘œํ˜„ ์–ธ์–ด)๋Š” ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ, JSP์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์„ ๋ณด์™„ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

JSP์—๋Š” Java ์ฝ”๋“œ์™€ markup ์š”์†Œ๋“ค์ด ์„ž์—ฌ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž, ๋””์ž์ด๋„ˆ๋“ค๋„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ needs๊ฐ€ ์žˆ์—ˆ๊ณ , ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด์— ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ ์ผ๋“ค์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ธ๊ฐ€๋ผ๋Š” ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด Java ์ฝ”๋“œ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด EL์ด๋‹ค.

EL์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • JSP์˜ ์Šค์ฝ”ํ”„(scope)์— ๋งž๋Š” ์†์„ฑ ์‚ฌ์šฉ ๊ฐ scope์˜ ๋ณ€์ˆ˜๋“ค์„ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • (Framework์—์„œ ์ œ๊ณตํ•˜๋Š”)์ง‘ํ•ฉ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ• ์ œ๊ณต

  • ์ˆ˜์น˜ ์—ฐ์‚ฐ, ๊ด€๊ณ„ ์—ฐ์‚ฐ, ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ์ œ๊ณต

  • Java ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ธฐ๋Šฅ ์ œ๊ณต

  • EL๋งŒ์˜ ๊ธฐ๋ณธ ๊ฐ์ฒด ์ œ๊ณต

  • <%= i %>
    • JSP์—์„œ์˜ ๊ฐ’ ํ‘œ๊ธฐ๋ฒ•์ด๋ฉฐ, i๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ${ i }
    • EL์—์„œ์˜ ๊ฐ’ ํ‘œ๊ธฐ๋ฒ•์ด๋ฉฐ, i๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค

๊ฐ์ฒด Scope์—์„œ ์• ํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ด๋ฆ„์ด ๊ฐ™์„ ๊ฒฝ์šฐ, Scope๊ฐ€ ์ž‘์€ ๋ฒ”์œ„์—์„œ ํฐ ๋ฒ”์œ„๋กœ ํ•ด๋‹น ์ด๋ฆ„์ด ์กด์žฌํ•˜๋Š”์ง€ ์ฐพ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, request scope์— A ์• ํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ๊ณ  session scope์— ๋™์ผํ•œ ์ด๋ฆ„์˜ A ์• ํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ์„ ๋•Œ,

${ A }์˜ ๊ฒฐ๊ณผ๋Š” request scope์— ์žˆ๋Š” A ์• ํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

EL ํ‘œ๊ธฐ๋ฒ•์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์€ param ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ JSP ๊ฐ’ ํ‘œ๊ธฐ๋ฒ•์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ฌธ์ž์—ด์ด์ง€๋งŒ, EL์—์„œ ์ˆซ์ž๋Š” ์ˆซ์ž๋กœ, ๋ฌธ์ž์—ด์€ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ localhost:8080/testing/test.sjp?a=10 ์œผ๋กœ ์š”์ฒญ์ด ์˜ฌ ๋•Œ,

test.jsp ํŒŒ์ผ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด,

<%= request.getParameter("a") + 100 %>    JSP => 10100
${param.a + 100 }                         EL  => 110

JSP ๊ฐ’ ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” a๊ฐ€ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— 10100์ด ๋˜์ง€๋งŒ,

EL ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” 10์„ ์ •์ˆ˜ํ˜•์œผ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 110์ด ๋ฉ๋‹ˆ๋‹ค.

EL ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋“ค์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ๊ฐ์ฒด

img

๊ฐ ๊ฐ์ฒด Scope์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋Š” EL ํ‘œ๊ธฐ๋ฒ•์—์„œ ๋‚ด์žฅ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

JSTL ( JavaServer Pages Standard Tag Library )

JSP ํŒŒ์ผ ์•ˆ์— HTML ๋ฌธ๋ฒ•๊ณผ Java ๋ฌธ๋ฒ•์ด ์„ž์—ฌ ์žˆ๋Š” ์ƒํƒœ์—์„œ๋Š”, ํƒœ๊ทธ์— ์ต์ˆ™ํ•œ ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ๊ฐ€ ๋ถˆํŽธํ•˜๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด JSTL(JSP Standard Tag Library)์ด๋‹ค. ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด JSP ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ, JSP์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— JSTL์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•ด์„œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  JSP ํŽ˜์ด์ง€์—์„œ ์•„๋ž˜์˜ ์„ธ ์ค„์„ ๋งจ ์œ„์— ์ž‘์„ฑํ•ด์•ผ ํ•ด์•ผ JSTL ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํƒœ๊ทธ์˜ ์ข…๋ฅ˜์—๋Š” core , format , function , xml , sql ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) set

๋ณ€์ˆ˜์ƒ์„ฑ <c:set var="๋ณ€์ˆ˜๋ช…" value="๊ฐ’" [scope="์˜์—ญ"]/>
var : EL ๋ณ€์ˆ˜์˜ ์ด๋ฆ„
value : ์‹ค์ œ ๊ฐ’์„ ์ง€์ •
scope : ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•  ์˜ใ…‡ใ„ฑ

<c:set var="count" value="${fn:length(list)}"/>
=>count๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2) if

๋ถ„๊ธฐ <c:if test = "true"> ํ•ญ์ƒ ์‹คํ–‰๋œ๋‹ค. </c:if>
if๋Š” ์กฐ๊ฑด์ด ํ•œ ๊ฐœ์ธ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
if - else ์‚ฌ์šฉ์€ ๋ถˆ๊ฐ€ํ•˜๋ฉฐ, choose ํƒœ๊ทธ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

3) choose

if-else์—์„œ else ๋ถ€๋ถ„ ํ•ด๊ฒฐ์„ ์œ„ํ•œ switch๊ฐ™์€ ํƒœ๊ทธ
<c:choose>
  <c:when test="์กฐ๊ฑด1">
    ...
  </c:when>
  <c:when test="์กฐ๊ฑด2">
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>

์—ฌ๊ธฐ์„œ test๋ผ๋Š” ์˜ˆ์•ฝ์–ด๊ฐ€ ์žˆ๋Š”๋ฐ HTML์š”์†Œ์˜ attribute๊ฐ™์€ ์กด์žฌ์ด๋ฉฐ ๋ณ€๊ฒฝ๋ถˆ๊ฐ€ํ•˜๋‹ค.
ex) <c:when a="์กฐ๊ฑด1">์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    (if์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.)

4) foreach

img

5) import

include๋ฅผ JSTL๋กœ ๋ฐ”๊พธ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
<jsp:include page="/WEB-INF/views/includes/header.jsp"/>

<c:import url="/WEB-INF/views/includes/header.jsp"/>

importํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ JSTL๋‚ด์—์„œ๋Š” HTML์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
=> JSP ์ฃผ์„์„ ์‚ฌ์šฉํ•  ๊ฒƒ
<c:import url="/WEB-INF/views/includes/navigation.jsp"/>
   <%-- navigation.jsp์—๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.--%>
   <!-- navigation.jsp์—๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ๋‹ค.-->    ERROR
   <c:param name="menu" value="main"/>
</c:import>

6) ๋‚ ์งœ format

<fmt:parseDate value='${ vo.regDate }' var='regDate' pattern="yyyy-MM-dd H:m" />
<td><fmt:formatDate value="${ regDate }" pattern="MM์›”dd์ผ H:m"/></td>
  • vo.regDate๋Š” MySQL์˜ Datetime ํƒ€์ž…์˜ ๊ฐ’์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • Datetime์€ 2018-03-17 11:48:33 ์˜ format์„ ๊ฐ–๋Š”๋ฐ, ์ด๋ฅผ JSP์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ณด๊ธฐ๊ฐ€ ์•ˆ์ข‹์œผ๋ฏ€๋กœ โ€œ03์›”17์ผ 11:48โ€์˜ format์œผ๋กœ ๋ฐ”๊พธ๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰์„ ํ•˜์‹œ๋ฉด ๋” ๋งŽ์€ pattern์ด ์žˆ์œผ๋ฏ€๋กœ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

7) split

<c:set var="phone" value="${ fn:split(userVO.phone , '-') }" />
  • ๋ฌธ์ž์—ด์„ ๊ตฌ๋ถ„์ž์— ๋”ฐ๋ผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ธ๋“œํฐ๋ฒˆํ˜ธ 010-1111-1111 ์ด๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์žˆ์„ ๋•Œ ํ•˜์ดํ”ˆ โ€œ-โ€œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒŒ์‹ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

8) ํ•ฉ๊ณ„

<c:set var ="total" value = "0" />

<c:forEach var="price" items="${prices}">
    <c:set var= "total" value="${ total + price }"/>
</c:forEach>

<c:out value="${total}"/>

9) ๊ฐœํ–‰์ฒ˜๋ฆฌ

๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ textarea๋กœ ์ž…๋ ฅ๋œ ๊ฐ’์€ ๊ฐœํ–‰์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด DB์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€ JSP์— ๊ฐ’์„ ์ถœ๋ ฅ ํ•ด๋ณด๋ฉด ๊ฐœํ–‰์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” pageContext์™€ ๋”๋ถˆ์–ด JSTL replace ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<%
    pageContext.setAttribute("newLine", "\n");
%>

<td align="center">
    ${fn:replace(productVO.info, newLine, '<br>') }
</td>

10) JSTL ์ ์šฉ ์ „๊ณผ ์ ์šฉ ํ›„ ๋น„๊ต ( 1 )

img

11) JSTL ์ ์šฉ ์ „๊ณผ ์ ์šฉ ํ›„ ๋น„๊ต (2)

img

JSP ํŒŒ์ผ์— ์Šคํด๋ฆฝํ‹€๋ฆฟ <% %>์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, JSTL๊ณผ EL ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” <% %>์„ ์‚ฌ์šฉํ•˜๋ฉด HTML ํƒœ๊ทธ๋ฅผ ๋“ค์—ฌ์“ฐ๊ธฐ ํ•  ๋•Œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋„ ๋‚˜์ค‘์— Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ JSTL/EL ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, JSTL/EL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.