CHAP.07 JSP ์‘์šฉ

1. ์•ก์…˜ ํ…Œ๊ทธ

์•ก์…˜ ํ…Œ๊ทธ๋ž€?

  • ์•ก์…˜(Action) ํ…Œ๊ทธ
    • JSP์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ณต์œ , ํŽ˜์ด์ง€ ์ด๋™๊ณผ ์ „๋‹ฌ, ํƒœ๊ทธ ํŒŒ์ผ ์ž‘์„ฑ ๋“ฑ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ผ์ข…์— ์ปค์Šคํ…€ ํ…Œ๊ทธ
  • ํ‘œ์ค€ ์•ก์…˜(standard action)
    • ์ปค์Šคํ…€ ํ…Œ๊ทธ ๊ธฐ๋ฐ˜์ด์ง€๋งŒ ๋ณ„๋„์˜ taglib ์ง€์‹œ์–ด ์—†์ด jsp ์ ‘๋‘์–ด ์‚ฌ์šฉ
  • ์ปค์Šคํ…€ ์•ก์…˜(custion action)
    • ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ•„์š”

ํ‘œ์ค€ ์•ก์…˜

  • JSP์—์„œ ํ”„๋กœ๊ทธ๋žจ์ ์ธ ์š”์†Œ๋ฅผ ๋งŽ์ด ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ํ™œ์šฉ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
  • JSP ํŒŒ์ผ์—์„œ ์ปค์Šคํ…€ ํ…Œ๊ทธ์˜ ๊ตฌ์กฐ์ ์ธ ํŠน์ง•์„ ์‚ด๋ ค HTML ํ˜•ํƒœ๋กœ ํ”„๋กœ๊ทธ๋žจ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„ํŽธํ•จ

  • ํ‘œ์ค€ ์•ก์…˜ ํ…Œ๊ทธ์˜ ์ข…๋ฅ˜

    ์•ก์…˜ ํƒœ๊ทธ ์„ค๋ช…
    jsp:forward request์™€ response ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•ด ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ํฌ์›Œ๋“œํ•จ
    jsp:include ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จ์‹œํ‚ด
    jsp:useBean ์ž๋ฐ” ๋นˆ์ฆˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ด
    jsp:setProperty ์ž๋ฐ” ๋นˆ์ฆˆ ๊ฐ์ฒด์˜ ์†์„ฑ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜)์— ๊ฐ’์„ ํ• ๋‹นํ•จ
    jsp:getProperty ์ž๋ฐ” ๋นˆ์ฆˆ ๊ฐ์ฒด์˜ ์†์„ฑ๊ฐ’์„ ์ถœ๋ ฅํ•จ
    jsp:param include, forward ์•ก์…˜ ์‚ฌ์šฉ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•จ

include ์•ก์…˜

  • ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ํฌํ•จํ•œ๋‹ค๋Š” ์ ‘์—์„œ include ์ง€์‹œ์–ด์™€ ๋™์ผํ•˜์ง€๋งŒ, ์ฒ˜๋ฆฌ ๊ณผ์ •์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ
    • include ์ง€์‹œ์–ด
      • include๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋‘ ํฌํ•จํ•ด ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ ํ•œ ํ›„ ๋‹ค์Œ ์ฒ˜๋ฆฌ, file ์†์„ฑ ์‚ฌ์šฉ
    • include ์•ก์…˜
      • include ๋œ ํŒŒ์ผ์„ ํ˜ธ์ถœํ•ด ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋งŒ ํฌํ•จํ•ด ๋ณด์—ฌ์คŒ, page ์†์„ฑ ์‚ฌ์šฉ
  • include ์•ก์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ main.jsp์— header.jsp๋ฅผ ํฌํ•จ์‹œํ‚จ ๊ฒฝ์šฐ
    • main.jsp๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด header.jsp์˜ ์‹œํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋˜์–ด ์ถœ๋ ฅ
// main.jsp

<jsp:inlcude page="header.jsp">
  <jsp:param name="title" value="My Homepage"/>
</jsp:inlcude>
// header.jsp
<h2>
  <%= request.getParameter("title") %>
</h2>

foward ์•ก์…˜

  • ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ „ํ™˜ํ•˜๋Š” ์•ก์…˜
  • ๋ฆฌ๋””๋ ‰์…˜response.sendRedirect())๊ณผ ๊ธฐ๋Šฅ์ ์œผ๋กœ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ
    • ๋ฆฌ๋””๋ ‰์…˜
      • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ๋‹ค์‹œ ์ ‘์†ํ•˜๋„๋ก ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์„ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ ‘์†ํ•˜๋Š” ๋ฐฉ์‹
    • foward ์•ก์…˜
      • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ ‘์†ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์„œ๋ฒ„์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ณ , ๊ทธ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
  • ๋‹จ์ˆœํ•œ ํŽ˜์ด์ง€ ์ด๋™ : ๋ฆฌ๋””๋ ‰์…˜
  • ์ตœ์ดˆ request๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ request์˜ setAttribute()๋กœ ์†์„ฑ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ : forward ์•ก์…˜์ด ์ ํ•ฉ

  • include ์•ก์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ
    // main.jsp
    <jsp:forward page="result.jsp">
      <jsp:param name="title" value="My Homepage"/>
    </jsp:include>
    
    // result.jsp
    <h2>
      <%= request.getParameter("title") %>
    </h2>
    

Java bean

  • ์ž๋ฐ” ๋นˆ(Java Bean)
    • ์ž๋ฐ”์˜ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋ธ
    • ์›น ๊ฐœ๋ฐœ์—์„œ๋งŒ ๊ตญํ•œ๋œ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ฉฐ POJO๋ผ๊ณ  ํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง
      • POJO(Plain Old Java Object)
        • ํŠน์ • ๊ธฐ์ˆ ์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์™€ ๋งด๋ฒ„ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ getter/setter ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ” ํด๋ž˜์Šค
      • ex) ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค or DO(Data Object)๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ด๋ธ” ์นผ๋Ÿผ์— ํ•ด๋‹นํ•˜๋Š” private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ getter/setter ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  • ์ž๋ฐ” ๋นˆ ๊ตฌ์กฐ์˜ ํŠน์ง•
    • ์ธ์ž๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž(๊ธฐ๋ณธ ์ƒ์„ฑ์ž)ํฌํ•จ
    • ํŒŒ์ผ ํ˜น์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ง๋ ฌํ™” ๊ตฌ์กฐ
    • getter/setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋งด๋ฒ„ ๋ณ€์ˆ˜(์†์„ฑ)์— ์ ‘๊ทผ
  • ๋งŒ์•ฝ ๋งด๋ฒ„ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค๋ฉด?
    • ex) member, setPerson ๋งด๋ฒ„๋ณ€์ˆ˜: member, ํ”„๋กœํผํ‹ฐ: Person
  • ํšŒ์› ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Member ํด๋ž˜์Šค๋ฅผ ์ž๋ฐ” ๋นˆ ๊ตฌ์กฐ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด
    • getter/setter ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„: โ€˜get/set + ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ณ€์ˆ˜๋ช…โ€™ ํ˜•ํƒœ
    • ์ธ์ž๋ฅผ ๋ฐ›์•„ ํ˜„์žฌ ๋งด๋ฒ„๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ๊ฐ’ ๋ฐ˜ํ™˜
    • ๋งค์„œ๋“œ ๋‚ด์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ ์บก์Аํ™”์˜ ํ•œ ํ˜•ํƒœ์ด๊ธฐ๋„ ํ•จ
      class Member{
        private int id;
        private String name;
        private String email;
        ...
        // setter ๋งค์„œ๋“œ ์„ ์–ธ
        public void setId(int id){ 
          this.id = id;
        }
        // getter ๋งค์„œ๋“œ ์„ ์–ธ
        public int getId(){
          return this.id;
        }
        ...
      }
      

useBean ์•ก์…˜

  • useBean ์•ก์…˜
    • JSP์—์„œ ์ž๋ฐ” ๋นˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์•ก์…˜
    • ๋งค์šฐ ์œ ์šฉํ•˜๋‚˜, JSP๋ฅผ ๋‹จ์ˆœํžˆ ๋ทฐ ์—ญํ• ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ์ผ์€ ์—†์Œ
  • useBean์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ๋ฐฉ์‹
    • useBean์„ ์ด์šฉํ•ด ๋งŒ๋“  ๊ฐ์ฒด์˜ ๋ฒ”์œ„๋Š” ์ง€์ •ํ•˜๋Š” ์†์„ฑ์ธ scope์— ์ฃผ์–ด์ง„ id์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น scope์— ์ €์žฅํ•œ๋‹ค.
  • useBean ์•ก์…˜์˜ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ๊ณผ ์‚ฌ์šฉ ์˜ˆ
    <jsp:useBean id="instanceName" scope="page | request | session | application"
    class="packageName.className" type="pakageName.className" beanName="packageName.className">
    </jsp:useBean>
    
    • id: ์ž๋ฐ” ๋นˆ์„ ํŠน์ • ์Šค์ฝ”ํ”„์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„
      • ํ˜„์žฌ ํŽ˜์ด์ง€์—๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜๋ช…์ด ๋จ
    • scope: ํ•ด๋‹น ํด๋ž˜์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฒ”์œ„
    • class: ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐํ•˜๋ ค๋Š” ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ช…
      • ๋ฐ˜๋“œ์‹œ ํŒจํ‚ค์ง€๋ช…๊นŒ์ง€ ๋ช…์‹œํ•ด์•ผ ํ•˜๋ฉฐ, ์ถ”์ƒํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
    • type: ํŠน์ • ํƒ€์ž…์˜ ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œ ํ•  ๋•Œ ์‚ฌ์šฉ
      • ์ถ”์ƒํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค, ์ผ๋ฐ˜ ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ class ์†์„ฑ์˜ ํด๋ž˜์Šค์—์„œ ์ƒ์† ํ˜น์€ ๊ตฌํ˜„์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•จ
    • beanName: type๊ณผ beanName์„ ์‚ฌ์šฉํ•ด class ์†์„ฑ์„ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Œ
      • java.beans.Beans.instantiate()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Bean์„ ์ธ์Šคํ„ด์Šคํ™”

useBean์˜ ํ™œ์šฉ

  • useBean์„ ์ฃผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    • HTMLํผ์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์„ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ์—ฐ๋™ ํ•  ๋•Œ ์ฃผ๋กœ ํ™œ์šฉ
      • ex) ํšŒ์› ๊ฐ€์ž… ํŽ˜์ด์ง€์—์„œ ์•„์ด๋””, ์ด๋ฆ„, ์ „ํ™”๋ฒˆํ˜ธ, ์ฃผ์†Œ ๋“ฑ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ฐ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ
      • ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„ Member ๊ฐ์ฒด์— ๋„ฃ๊ณ  ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ์ธ์ž๋ฅผ ์ „๋‹ฌ
      <jsp:useBean id="m" class="com.my.Member"/>
      <jsp:setProperty name="m" property="*"/>
      
      <%
        MemberDAO dad = new MemberDAO();
        dao.insertDB(m);
      %>
      

setProperty์™€ getProperty ํ‘œ์ค€ ์•ก์…˜

  • setProperty ํ‘œ์ค€ ์•ก์…˜ ์‚ฌ์šฉ
    • ์ž๋ฐ”๋นˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ๋‹ค์Œ์—๋Š” set-๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ • ๊ฐ€๋Šฅ
    • <jsp:setProperty> ํ‘œ์ค€ ์•ก์…˜์„ ์ด์šฉํ•˜๋ฉด set-๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœ ํ•˜์ง€ ์•Š์•„๋„ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์„ค์ •
    <% obj.setAge("27") %>
    // ->
    <jsp:setProperty name="obj" property="age" value="27"/>
    
  • getProperty ํ‘œ์ค€ ์•ก์…˜ ์‚ฌ์šฉ
    • ์ž๋ฐ”๋นˆ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ฝ์–ด ์˜ค๊ธฐ ์œ„ํ•ด get-๋ฉ”์„œ๋“œ ์ด์šฉ
    • jsp:getProperty>ํ‘œ์ค€ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด get-๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
    <% int age = obj.getAge(); %>
    // ->
    <jsp:getProperty name="obj" property="age"/>
    
  • ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • <jsp:setProperty/> ์•ก์…˜์— value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ๋Œ€์‹  param์ด๋ผ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์ด๋ฆ„์„ ์ง์ ‘ ์ง€์ • ๊ฐ€๋Šฅ
    <jsp:useBean class="mall.PersonalInfo" id="pinfo" />
    <jsp:setProperty name="pinfo" property="name" param="NAME"/>
    <jsp:setProperty name="pinfo" property="gender" param="GENDER"/>
    <jsp:setProperty name="pinfo" property="age" param="AGE"/>
    
    • ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ์™€ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ํ•œ๋ฒˆ์— ๊ฐ’ ์„ค์ • ๊ฐ€๋Šฅ
    <jsp:setProperty name="info" property="*"/>
    

์ž๋ฐ”๋นˆ์˜ ๋‹คํ˜•์„ฑ ํ™œ์šฉ

์ฐธ๊ณ ํ•˜์„ธ์š”

2. [์‹ค์Šต 7-1] ์•ก์…˜ ์ข…ํ•ฉ ์˜ˆ์ œ: ๊ณ„์‚ฐ๊ธฐ ๊ตฌํ˜„

3. ์ปค์Šคํ…€ ํ…Œ๊ทธ์™€ EL

์ปค์Šคํ…€ ํ…Œ๊ทธ๋ž€?

  • ์ปค์Šคํ…€ ํ…Œ๊ทธ(Custom Tag)
    • ์‚ฌ์šฉ์ž ์ •์˜ ํ…Œ๊ทธ
    • ์Šคํฌ๋ฆฝํŠธ๋ฆฟ ์‚ฌ์šฉ์„ ์ค„์ด๊ณ  ํ…Œ๊ทธ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํ…Œ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ™œ์šฉํ•˜๊ณ ์ž ๊ฐœ๋ฐœ๋œ ๊ทœ๊ฒฉ
    • ์™ธํ˜•์ ์ธ ํ˜•ํƒœ๋Š” XML(HTML) ํ…Œ๊ทธ ๊ตฌ์กฐ์ด์ง€๋งŒ ์„œ๋ธ”๋ฆฟ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ํ†ตํ•ฉ๋จ
    • ์ปค์Šคํ…€ ํ…Œ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” taglib์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ํ…Œ๊ทธ๊ฐ€ ์–ด๋””์— ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋จผ์ € ์„ ์–ธํ•ด์•ผ ํ•˜๋ฉฐ ํ…Œ๊ทธ์— ์‚ฌ์šฉํ•  ์ ‘๋‘์–ด ์ง€์ •
    • ์ปค์Šคํ…€ ํ…Œ๊ทธ ์ž์ฒด๊ฐ€ ์„œ๋ฒ„์—์„œ ํ•ด์„๋˜๋ฉฐ, ํ”„๋กœ์ ํŠธ๊ฐ€ ํŠน์ • ์ปค์Šคํ…€ ํ…Œ๊ทธ์— ์ข…์† ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ปค์Šคํ…€ ํ…Œ๊ทธ๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์€ ์ ์ฐจ ๊ฐ์†Œ
      • ๋Œ€์‹  ์ปค์Šคํ…€ ํ…Œ๊ทธ ๊ธฐ์ˆ ๋กœ ๋งŒ๋“ค์–ด์ง„ JSTL(JSP Standard Tag Libirary)์ด ์ž๋ฐ” ์›น๊ฐœ๋ฐœ์— ๊ผญ ํ•„์š”ํ•œ ์š”์†Œ๊ฐ€ ๋จ
  • ์ปค์Šคํ…€ ํ…Œ๊ทธ์˜ ์˜ˆ์‹œ
    • ํŠน์ • ์ƒํ’ˆ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ•ด๋‹น ์ƒํ’ˆ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด ์ถœ๋ ฅ
    <%@ taglib tagdir="/WEB-INF/tags" prefix="m" %>
    <m:printData pid="8127832"/>
    
    • ํ…Œ๊ทธ ํŒŒ์ผ๋กœ ์ •์˜๋œ ์ปค์Šคํ…€ ํ…Œ๊ทธ ์‚ฌ์šฉ
    • WEB-INF/tags/printData.tag ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ํ…Œ๊ทธ ์ •์˜๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ด
    • m์€ ํ…Œ๊ทธ ์•ž์— ๋ถ™์ผ ์ ‘๋‘์–ด๋กœ ํ…Œ๊ทธ ํŒŒ์ผ๋ช…์ด ํ…Œ๊ทธ ์ด๋ฆ„์ด ๋จ
    • ํ‘œ์ค€ ์•ก์…˜๊ณผ ์ปค์Šคํ…€ ํ…Œ๊ทธ
      • ์ปค์Šคํ…€ ํ…Œ๊ทธ๋Š” ํ…Œ๊ทธ ๊ตฌ์กฐ๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹
      • ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ์ปค์Šคํ…€ ํ…Œ๊ทธ๋ฅผ ๊ตฌํ˜„ํ•ด ํ”„๋กœ๊ทธ๋ ˜์— ํ™œ์šฉ
      • <jsp:setPropert>์—ญ์‹œ ์ปค์Šคํ…€ ํ…Œ๊ทธ๋กœ jsp์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์–ด ํ‘œ์ค€ ์•ก์…˜์ด๋ผ ๋ถ€๋ฅด๊ณ  taglib์ง€์‹œ์–ด ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปค์Šคํ…€ ํ…Œ๊ทธ ๋งŒ๋“ค๊ธฐ

  • ๋งŒ๋“œ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•
    • ํ…Œ๊ทธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์—ฌ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
    • ํ…Œ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • ํ…Œ๊ทธ ํŒŒ์ผ(tag file)์ด๋ž€ JSP ํŽ˜์ด์ง€์™€ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ๋กœ, ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  taglib์ง€์‹œ์–ด๋กœ ์ง€์ •
    <%@tag body-content="scriptless" %>
    <table border=1 cellpadding=20>
      <tr>
        <td>
          <jsp:doBody/>
        </td>
      </tr>
    </table>
    
  • ํ…Œ๊ทธ ํด๋ž˜์Šค(tag class)๋Š” ํ…Œ๊ทธ ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ์™„์ „ํ•œ ์ž๋ฐ” ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ์ž‘์„ฑ
    • ์ปดํŒŒ์ผ ํ›„ .tldํŒŒ์ผ์— ํƒœ๊ทธ ํด๋ž˜์Šค ๋“ฑ๋ก
    • .tldํŒŒ์ผ์„ web.xml ํŒŒ์ผ์— ๋“ฑ๋ก
    package util;
    import java.io.*;
    import javax.servlet.jsp.*;
    import javax.servlet.jsp.tagext.*;
    public class BoxTag extends SimpleTagSupport {
      public void doTag() throws JspException, IOException {
        JspContext context = getJspContext();
        JspWriter out = context.getOut();
        JspFragment body = getJspBody();
        out.println("<TABLE border=1 cellpadding=20><TR><TD>");
        body.invoke(out);
        out.println("</TD></TR></TABLE>");
        return;
      }
    }
    

ํ…Œ๊ทธ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

  • ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํƒœ๊ทธ ํŒŒ์ผ
    • ํƒœ๊ทธ ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ์ปค์Šคํ…€ ์•ก์…˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณธ์ฒด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ์ปค์Šคํ…€ ์•ก์…˜์˜ ๋ณธ์ฒด๋ž€ ์‹œ์ž‘ ํ…Œ๊ทธ์™€ ๋ ํ…Œ๊ทธ ์‚ฌ์ด์— ์˜ค๋Š” ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค <util:box>์•ผ์œ ํšŒ๊ฐ€ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</util:box>
    • ์ปค์Šคํ…€ ์•ก์…˜์ด ๋ณธ์ฒด๋ฅผ ๊ฐ–์ง€ ์•Š๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ํƒœ๊ทธ ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ tag์ง€์‹œ์ž๋ฅผ ์จ์•ผ ํ•œ๋‹ค <%@ tag body-content="empty" %>
  • ํ…Œ๊ทธ ํŒŒ์ผ์—๋Š” ๋ช‡๊ฐ€์ง€ ์ง€์‹œ์–ด๋ฅผ ๋” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ | ์ด๋ฆ„ | ์—ญํ•  | | :โ€”โ€”โ€”โ€”โ€“: | :โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”: | | tag์ง€์‹œ์–ด | ์›น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํƒœ๊ทธ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ  | | include ์ง€์‹œ์–ด | ๋‹ค๋ฅธ ํƒœ๊ทธ ํŒŒ์ผ์„ ํฌํ•จ | | taglib ์ง€์‹œ์–ด | ํƒœ๊ทธ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ๋‹ค๋ฅธ ์ปค์Šคํ…€ ์•ก์…˜์˜ ํ…Œ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(tag libary)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ  | | attribute ์ง€์‹œ์–ด | ์ปค์Šคํ…€ ์•ก์…˜์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ  | | variable ์ง€์‹œ์–ด | ์ปค์Šคํ…€ ์•ก์—ฐ์ด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ  |

  • include ์ง€์‹œ์–ด์™€ taglib์ง€์‹œ์–ด๋Š” jspํŽ˜์ด์ง€์—์„œ์™€ ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์„ธ ์ง€์‹œ์–ด๋Š” ํƒœ๊ทธํŒŒ์ผ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ์„ ์„ ์ถœ๋ ฅํ•˜๋Š” ์ปค์Šคํ…€ ํƒœ๊ทธ ํŒŒ์ผ
    • WEB-INF/tags/line.tag ๋กœ ์ €์žฅ

      <!-- line.tag -->
      <%@ tag body-content="empty" %>
      ---------------------
      <br>
      
    • jsp ํŽ˜์ด์ง€์—์„œ ์ปค์Šคํ…€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด taglib์ง€์‹œ์–ด ์‚ฌ์šฉ
      <%@taglib prefix="util" tagdir="/WEB-INF/tags" %>
      
    • jspํŽ˜์ด์ง€ ๋‚ด์—์„œ ์ ‘๋‘์–ด์™€ ํ…Œ๊ทธ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ๊ทธ ์‚ฌ์šฉ
      • <util:line/>
    <%@page contentType="text/html"; charset=euc-kr %>
    <%@taglib prefix="util" tagdir="/WEB-INF/tags" %>
    <html>
      <head>
        <title>์˜ค๋Š˜์˜ ๋ฉ”๋‰ด</title>
      </head>
      <body>
        <h3>์˜ค๋Š˜์˜ ์ ์‹ฌ ๋ฉ”๋‰ด์ž…๋‹ˆ๋‹ค.</h3>
        <util:line/>
        ์‚ผ๊ณ„ํƒ•<br>
        ๋ณถ์Œ๋ฐฅ<br>
        ํŠ€๊น€์šฐ๋™<br>
        <util:line/>
      </body>
    </html>
    
  • ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ํ…Œ๊ทธ ํŒŒ์ผ
    <!-- newLine.tag -->
    <%@tag body-content="empty" %>
    <%@attribute name="color"%>
    <%@attribute name="size" type="java.lang.Integer" %>
    <FONT color=${color} >
    <%
      for (int cnt = 0; cnt < size; cnt++)
      out.print("-");
    %>
    </FONT><BR>
    
    <%@page contentType="text/html; charset=euc-kr"%>
    <%@taglib prefix="util" tagdir="/WEB-INF/tags/util" %>
    <HTML>
      <HEAD><TITLE>์˜ค๋Š˜์˜ ๋ฉ”๋‰ด</TITLE></HEAD>
      <BODY>
        <util:newLine color="blue" size="25" />
        ์ €๋… ๋ฉ”๋‰ด <BR>
        <util:newLine color="red" size="20" />
        ๋ถˆ๊ณ ๊ธฐ ๋ฎ๋ฐฅ <BR>
        ์นด๋ ˆ๋ผ์ด์Šค <BR>
        ์ซ„๋ฉด <BR>
        <util:newLine color="blue" size="25" />
      </BODY>
    </HTML>
    
  • ์ปค์Šคํ…€ ์•ก์…˜์˜ ๋ณธ์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ…Œ๊ทธ ํŒŒ์ผ
    <!-- box.tag -->
    <%@tag body-content= "scriptless" %>
    <TABLE border=1 cellpadding=20>
      <TR>
        <TD>
          <jsp:doBody/>
        </TD>
      </TR>
    </TABLE>
    
    <%@page contentType=โ€œtext/html; charset="euc-kr"%>
    <%@taglib prefix="util" tagdir="/WEB-INF/tags/util" %>
    <HTML>
      <HEAD><TITLE>๊ณต์ง€์‚ฌํ•ญ</TITLE></HEAD>
      <BODY>
        ๊ตฌ๋‚ด ์‹๋‹น์—์„œ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
        <util:box>
        ๊ณต์‚ฌ ๊ด€๊ณ„๋กœ ๊ธ‰์‹์„ ์ผ์‹œ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. <BR>
        </util:box>
      </BODY>
    </HTML>
    
  • ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ์ปค์Šคํ…€ ์•ก์…˜ 01
    <%@tag pageEncoding="euc-kr"%>
    <%@tag body-content="empty" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@attribute name="num1" type="java.lang.Integer"%>
    <%@attribute name="num2" type="java.lang.Integer"%>
    <%@variable name-given="maximum" variable-class="java.lang.Integer" scope="AT_END"%>
    <!-- AT_END ํ…Œ๊ทธ๊ฐ€ ๋๋‚ ๋•Œ -->
    <!-- AT_BEGIN ํ…Œ๊ทธ๊ฐ€ ์‹œ์ž‘ํ• ๋•Œ -->
    <!-- ์•„๋ฌดํŠผ ๋จธ ํ•˜๋‚˜ ๋” ์žˆ์Œ -->
    <%
      int result;
      if (num1 > num2)
        result = num1;
      else
        result = num2;
    %>
    <c:set var="maximum" value="<%= result %>" />
    
    <%@page contentType="text/html; charset=euc-kr"%>
    <%@taglib prefix="util" tagdir="/WEB-INF/tags/util" %>
    <HTML>
      <HEAD><TITLE>์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ</TITLE></HEAD>
      <BODY>
        <H3>์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ</H3>
        <util:max num1="${param.NUM1}" num2="${param.NUM2}" />
        ์ตœ๋Œ€๊ฐ’: ${maximum}
      </BODY>
    </HTML>
    
  • ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ์ปค์Šคํ…€ ์•ก์…˜ 01
    <%@tag pageEncoding="euc-kr"%>
    <%@tag body-content="empty" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@attribute name="var" required="true" rtexprvalue="false"%>
    <!-- required -> null check -->
    <!--runtime expression value? -> expression or EL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅํ•˜๋ฉด ์•ˆ๋จ -->
    <%@attribute name="num1" type="java.lang.Integer"%>
    <%@attribute name="num2" type="java.lang.Integer"%>
    <%@variable name-from-attribute="var" alias="maximum"
    variable-class="java.lang.Integer" scope="AT_END"%>
    <%
      int result;
      if (num1 > num2)
        result = num1;
      else
        result = num2;
    %>
    <c:set var="maximum" value="<%= result %>" />
    
    <%@page contentType="text/html; charset=euc-kr"%>
    <%@taglib prefix="util" tagdir="/WEB-INF/tags/util" %>
    <HTML>
      <HEAD><TITLE>์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ</TITLE></HEAD>
      <BODY>
        <H3>์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ</H3>
        <util:newMax var="MAX" num1="${param.NUM1}" num2="${param.NUM2}" />
        ์ตœ๋Œ€๊ฐ’: ${MAX}
      </BODY>
    </HTML>
    

EL์ด๋ž€?

  • ํ‘œํ˜„ ์–ธ์–ด(Expression Language, EL)
    • ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ž๋ฐ” ๊ฐ์ฒด ํ˜น์€ scope object์— ์ €์žฅ๋œ ์ž๋ฐ” ๋นˆ ๊ฐ์ฒด๋ฅผ ์†์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
    • ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ์ œํ•œ๋œ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋„ ๊ฐ€๋Šฅ
    • EL์€ ๋‹จ์ˆœํ•œ ์ถœ๋ ฅ ์™ธ์—๋„ ์‚ฌ์น™์—ฐ์‚ฐ, ๋น„๊ต์—ฐ์‚ฐ, ๋…ผ๋ฆฌ์—ฐ์‚ฐ, 3ํ•ญ ์—ฐ์‚ฐ ๋“ฑ์„ ์ง€์›
      • ์—ฐ์‚ฐ๊ธฐ๋Šฅ์€ ํ•ต์‹ฌ ๋กœ์ง์˜ ๊ตฌํ˜„๋ณด๋‹ค๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ถœ๋ ฅ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ •๋„์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
  • EL์˜ ์žฅ์ 
    • ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ์†์‰ฝ๊ฒŒ ๋ณ€์ˆ˜/๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ฑฐ๋‚˜ null ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
  • ์ž๋ฐ” ๋นˆ ์ ‘๊ทผ
    • EL์„ ํ†ตํ•ด scope object์— ์ €์žฅ๋œ ์ž๋ฐ” ๋นˆ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ• ${์ €์žฅ์ด๋ฆ„.๋ณ€์ˆ˜๋ช…}
    • ์ž๋ฐ” ๋นˆ ์„ค๋ช…์—์„œ ๋งŒ๋“  Memberํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ์ •๋ณด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ
      • ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด seesion์— ์ €์žฅ๋˜๋Š” ๊ณผ์ •์ด ์žˆ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •
        <h2>๋งด๋ฒ„ ์ •๋ณด</h2>
        ์ด๋ฆ„: ${m.name} <br>
        
  • EL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
    • ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ <jsp:getProperty>์•ก์…˜์œผ๋กœ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ์Œ
      <!--ํ‘œํ˜„์‹ ์‚ฌ์šฉ-->
      ์ด๋ฆ„: <%= m.name %> <br> 
      
      <!--์•ก์…˜ ์‚ฌ์šฉ-->
      ์ด๋ฆ„: <jsp:getProperty name="m" property="nname"/> <br> 
      
  • EL ์—ฐ์‚ฐ
    • ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์น™์—ฐ์‚ฐ, ๋น„๊ต์—ฐ์‚ฐ, ๋…ผ๋ฆฌ์—ฐ์‚ฐ, 3ํ•ญ์—ฐ์‚ฐ ๋“ฑ์ด ๊ฐ€๋Šฅ
  • ๋ฐฐ์—ด, ๋งต ๋ฐ์ดํ„ฐ ์—ฐ๋™
    • ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฐฐ์—ด์ด๋‚˜ ๋งต ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ
      ${myList[0]} // ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ
      ${myMap["name"]} // ๋งต์ธ ๊ฒฝ์šฐ
      
    • Scope Object ์ ‘๊ทผ
      • EL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  scope์—์„œ ์ž๋ฐ” ๋นˆ ๊ฐ์ฒด๋ฅผ ์ฐพ์Œ
      • ํŠน์ • scope๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ์ฐธ์กฐํ•˜๋ ค๋ฉด ๋‚ด์žฅ๊ฐ์ฒด๋ช…Scope.์†์„ฑ์ด๋ฆ„์‚ฌ์šฉ
        • ex) session๊ณผ request ๋ชจ๋‘์— m์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅ๋œ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ํ• ๋•Œ, request scope์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ
          ์ด๋ฆ„ : ${requestScope.m.name}
          

4. JSTL

JSTL์ด๋ž€?

  • JSTL(JSP Standard Tag Library)
    • JSP์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฆฟ(์ž๋ฐ” ์ฝ”๋“œ ๋ธ”๋ก)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  HTMLํ˜•์‹์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ, ๊ฐ„๋‹จํ•œ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ‘œ์ค€ ์ปค์Šคํ…€ ํ…Œ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ์„œ๋ฒ„์—์„œ๋งŒ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋””์ž์ด๋„ˆ์™€์˜ ํ˜‘์—…์— ๋ถˆํŽธํ•œ ๋ถ€๋ถ„ ์กด์žฌ
    • ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ UI ํ™•์ธ์„ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์•ผ๋งŒ ํ•˜๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฌธ์ œ
      • ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ์ค‘์‹ฌ์˜ ํ”„๋ŸฐํŠธ์•ค๋“œ ๊ฐœ๋ฐœ ํŠธ๋žœ๋“œ์™€๋Š” ๋‹ค์†Œ ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์Œ
    • ๋ทฐ ์ค‘์‹ฌ์˜ JSP ๊ตฌํ˜„์—๋Š” core ์ •๋„๋งŒ ์‚ฌ์šฉ

JSTL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

  • JSTL ์‚ฌ์šฉํ•˜๊ธฐ
    • JSTL์„ JSP์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด taglib์ง€์‹œ์–ด๋ฅผ ์ถ”๊ฐ€
    • ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” core๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ
      <%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>
      

core ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌ, ํ๋ฆ„ ์ œ์–ด, URL ๊ด€๋ฆฌ, ์ถœ๋ ฅ ๋“ฑ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ๊ธฐ๋Šฅ ํƒœ๊ทธ ์‚ฌ์šฉ์˜ˆ
    ๋ณ€์ˆ˜ ๊ด€๋ จ remove, set ๋ณ€์ˆ˜ ์ง€์ •๊ณผ ์‚ญ์ œ
    ํ๋ฆ„ ์ œ์–ด if, choose when otherwise, forEach, forTokens ์กฐ๊ฑด ์ฒ˜๋ฆฌ, ๋ฐ˜๋ณต, ํ† ํฐ ํŒŒ์‹ฑ
    URL ๊ด€๋ฆฌ import, redirect, url, param URL ํ•ธ๋“ค๋ง
    ๊ธฐํƒ€ catch, out ์—๋Ÿฌ์ฒ˜๋ฆฌ, ์ถœ๋ ฅ
  • <c:set></c:set>

    • ํŠน์ • scope์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ
    • scope ๋‚ด์žฅ ๊ฐ์ฒด์˜ setAttribute() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ๊ณผ ๋™์ผ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์ง€๋งŒ, EL์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋„ ์ €์žฅ ๊ฐ€๋Šฅ
    • target์†์„ฑ์œผ๋กœ ํŠน์ • ํƒ€์ž…์˜ ๊ฐ์ฒด์— setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์†์„ฑ ์ €์žฅ ๊ฐ€๋Šฅ
    <c:set var="product1" value="<b>์• ํ”Œ ์•„์ดํฐ</b>"/>
    <c:set var="product2" value="์‚ผ์„ฑ ๊ฒ”๋Ÿญ์‹œ ๋…ธํŠธ"/>
    <c:set var="intArray" value="${[1,2,3,4,5]}"/>
      
    
  • <c:out></c:out>

    • ์ถœ๋ ฅ์„ ์œ„ํ•œ ํ…Œ๊ทธ๋กœ ๋Œ€๋ถ€๋ถ„์€ EL๋กœ ๋Œ€์ฒด๋จ
      • ๋•Œ์— ๋”ฐ๋ผ์„œ๋Š” ์กฐ๊ฑด๋ฌธ ์‚ฌ์šฉ์„ ์ค„์ด๋Š” ์šฉ๋„๋กœ ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ
    <!-- <c:set/> ์—์„œ ์„ ์–ธํ•œ product1, intArray ์ถœ๋ ฅ -->
    <c:out value="${product1}" default="Not registered" escapeXml="true"/>
    
    <!-- ์• ํ”Œ ์•„์ดํฐ์ด ํ…Œ๊ทธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ถœ๋ ฅ ex) ์• ํ”Œ ์•„์ดํฐ -->
    <p>${product1}</p>
    <!-- intArray[2]์˜ ๊ฐ’์ด ์ถœ๋ ฅ๋จ ex) 3 -->
    <p>${intArray[2]}</p>
    
    • default: ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์„ ๋•Œ ์ถœ๋ ฅํ•  ๊ฐ’์„ ์˜๋ฏธ
      • ex) product1์„ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ โ€œNot registeredโ€๋ฅผ ๋Œ€์‹  ์ถœ๋ ฅ
    • excapeXml: true์ธ ๊ฒฝ์šฐ ํ…Œ๊ทธ๋ฅผ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ
      • ๊ธฐ๋ณธ๊ฐ’: false, ํ…Œ๊ทธ๊ฐ€ ๋ฐ˜์˜๋˜์–ด ์ถœ๋ ฅ
    • <c:set/>์œผ๋กœ ์ €์žฅ๋œ ๊ฐ’์€ EL๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์žฅ ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ž„
    • ๋ฐฐ์—ด ์—ญ์‹œ EL์„ ์ด์šฉํ•ด ์ธ๋ฑ์Šค๊ฐ’ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
  • <c:if></c:if>
    • ์ž๋ฐ”์˜ if ๋ฌธ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ else๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ
    • ์กฐ๊ฑด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์†์„ฑ์„ ์ฐธ์กฐํ•  ๋ฒ”์œ„(scope)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ๋„ ์žˆ์ง€๋งŒ ํ•„์ˆ˜ ์‚ฌํ•ญ์€ ์•„๋‹˜
    • ์‚ฌ์šฉํ˜•์‹
      <c:if test="์กฐ๊ฑด" [var="๊ฒฐ๊ณผ ๋ณ€์ˆ˜"] [scope="{page|request|seesion|application}"]>
        ์กฐ๊ฑด์ด true์ธ ๊ฒฝ์šฐ๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๋ถ€๋ถ„
      </c:if>
      
    • ์‚ฌ์šฉ ์˜ˆ์‹œ
      <c:if test="${msg == 'user1}" var="result">
        test result: ${result}
      </c:if>
      
      <!-- !empty๋Š” ๋’ค์˜ ๋ณ€์ˆ˜๊ฐ€ null์ธ์ง€ ์ฒดํฌ ํ›„ true false ๋ฐ˜ํ™˜ -->
      <c:if test="${!empty product2}">
        <p>
          <b>${product2} ์ด๋ฏธ ์ถ”๊ฐ€๋จ</b>
        </p>
      </c:if>
      
  • <c:choose/>, <c:when/>, <c:otherwise/>

    • if, else์™€ ๋น„์Šทํ•œ ์ฝ”๋“œ
    <!-- choose, when, otherwise -->
    <c:set var="checkout" value="true"/>
    <c:choose>
      <c:when test="${checkout}">
        <p>์ฃผ๋ฌธ์ œํ’ˆ: ${product2}</p>
      </c:when>
      <c:otherwise>
        <p>์ฃผ๋ฌธ์ œํ’ˆ์ด ์•„๋‹˜!!</p>
      </c:otherwise>
    </c:choose>
    
  • <c:forEach></c:forEach>
    • ํ™”๋ฉด์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ถœ๋ ฅํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
    • ์ž๋ฐ”์˜ for ๋ฌธ๊ณผ ๊ฐ™์€ ๊ฐœ๋…์ด์ง€๋งŒ ์ปค์Šคํ…€ ํ…Œ๊ทธ ํŠน์„ฑ์ƒ ์ •๋ฐ€ํ•œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ณต๋˜๋Š” ์†์„ฑ์„ ์ž˜ ํ™œ์šฉํ•ด์•ผ ํ•จ
    • ์ง„ํ–‰์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด index,count๋“ฑ์„ ์ง€์›ํ•˜๋Š” varStatus์ œ๊ณต
    • ์‚ฌ์šฉ ํ˜•์‹
      <c:forEach [var="์ฐธ์กฐ ๊ฐ์ฒด"] [varStatus="์ƒํƒœ ์ •๋ณด ๋ณ€์ˆ˜"] begin="์‹œ์ž‘" end="์ข…๋ฃŒ" [step="๋ฐ˜๋ณต ๋‹จ๊ณ„ ์ฆ๊ฐ€ ๊ฐ’, 1์ด ๊ธฐ๋ณธ"]>
          
      ๋ฐ˜๋ณต ์ถœ๋ ฅ๋˜๋Š” ๋ถ€๋ถ„
      </c:forEach>
      
    • var: ๋ฐฐ์—ด, ๋ฆฌ์ŠคํŠธ ๋“ฑ ์ง‘ํ•ฉํ˜• ๊ฐ์ฒด
    • varStatus: ๋ฐ˜๋ณต ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฑ„

    • ์‚ฌ์šฉ ์˜ˆ์‹œ
      <c:forEach var="m" items="${members}" begins="0" varStatus="status" end="5">
      index: ${status.index} <br> <!-- 0๋ถ€ํ„ฐ -->
      count: ${status.count}<br> <!-- 1๋ถ€ํ„ฐ -->
      name: ${m.name} <br>
      email: ${m.email} <br>
      <hr>
      </c:forEach>
      
  • <c:forTokens></c:forTokens>
    • ์ž๋ฐ”์˜ StringTokenizer์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ๋ถ„์ž๋กœ ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜๋Š” ํ…Œ๊ทธ
    • ์ถœ๋ ฅํ•  ๋ฌธ์ž์—ด์ด ๊ตฌ๋ถ„์ž๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์„ ๋•Œ, ๋ชจ๋“  ๊ฐ’์„ ๋ฐ˜๋ณตํ•ด์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
    <!-- forTokens -->
    <c:forTokens var="city" items="Seoul/Tokyo/NewYork/Toronto" delims="/" varStatus="status">
      <c:if test="${status.first}">
        ๋„์‹œ ๋ชฉ๋ก:
      </c:if>
      ${city}
      <c:if test="${!status.last}"> , </c:if>
    </c:forTokens>
    

5. [์‹ค์Šต 7-2] JSTL๊ณผ EL ์ข…ํ•ฉ ์˜ˆ์ œ

6. Maven ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ