ȨÆäÀÌÁö ²À´ë±â·Î

JSP 2.0: ¹¹°¡ ¹Ù²î¾ú³ª? - 4ºÎ

¿ø¹® : http://www.onjava.com/pub/a/onjava/2004/05/12/jsp2part4.html

by Hans Bergsten, JavaServer Pages, 3ÆÇÀÇ ÀúÀÚ

¹ø¿ª ¼Õ±Ç³²(kwon37xi_aT_yahoo dOt co DoT kr)

2004/07/30

À̹ø "JSP 2.0: ¹¹°¡ ¹Ù²î¾ú³ª?" ½Ã¸®ÁîÀÇ ¸¶Áö¸·È¸¿¡¼­´Â Ä¿½ºÅÒ ÅÂ±× ¶óÀ̺귯¸®¸¦ °³¹ßÇϱ⠽±°Ô ÇØÁÖ´Â µÎ°¡Áö »õ·Î¿î ±â¹ýÀ» ¾Ë¾Æº¼ °ÍÀÌ´Ù : ÅÂ±× ÆÄÀÏ(tag files)°ú »õ·Ó°í °£°áÇØÁø ÅÂ±× Çڵ鷯 JAVA APIÀÌ´Ù.

JSP ÅÂ±× ÆÄÀÏ·Î Ä¿½ºÅÒ ¾×¼Ç °³¹ßÇϱâ

(ÁÖ: "Ä¿½ºÅÒ"Àº "»ç¿ëÀÚ Á¤ÀÇ, »ç¿ëÀÚ°¡ µû·Î ¸¸µç"À̶ó´Â Á¤µµÀÇ ÀǹÌÀÌ´Ù. ÀÌ¹Ì ¸¹Àº Ã¥µéÀÌ Ä¿½ºÅÒ Å±×, Ä¿½ºÅÒ ¾×¼ÇÀ̶ó´Â ¸»À» ¾²°í ÀÖÀ¸¹Ç·Î ¹ø¿ªÇÏÁö ¾Ê´Â´Ù.)

JSP´Â JavaÀÇ ±¸·ç °æÁö¿¡ ¿À¸£Áö ¾ÊÀº »ç¶÷µéÀÌ µ¿ÀûÀÎ ÄÁÅÙÆ®¸¦ °¡Áø À¥ ÆäÀÌÁö¸¦ ¸¸µé ¼ö ÀÖµµ·Ï ÇÏ·Á°í ź»ýÇÑ °ÍÀÌ´Ù. Áö±Ý±îÁö µ¿ÀûÀÌ°í º¹ÀâÇÑ ÄÁÅÙÆ®ÀÇ Á¶°¢µéÀ» ¿©·¯ ÆäÀÌÁö°£¿¡ Àç»ç¿ëÇÏ´Â °ÍÀÌ ¾à°£ Èûµé¾ú´ø°Ô »ç½ÇÀÌ´Ù. ¸¸¾à ´ç½ÅÀÌ º¯¼ö¿¡ ÀúÀåµÈ Áú¹®°ú ´äº¯µéÀ» °¡Áø °£´ÜÇÑ ¼³¹®Á¶»ç¸¦ ¿©·¯ ÆäÀÌÁö¿¡ Ãß°¡ÇÏ°í ½Í´Ù°í ÇÏÀÚ. JSP 2.0 ÀÌÀü¿¡´Â ¼¼°¡Áö ¹æ½ÄÀÌ ÀÖ¾ú´Ù. ¼³¹®Á¶»ç°¡ ÇÊ¿äÇÑ ¸ðµç ÆäÀÌÁö¿¡ ¼³¹®Á¶»ç Äڵ带 º¹»çÇؼ­ ºÙ¿©³ÖÀ» ¼ö ÀÖ´Ù. ´õ ³ªÀº ¹æ¹ýÀ¸·Î ¼³¹®Á¶»ç ÆûÀ» »ý¼ºÇÏ´Â JSP¸¦ µû·Î Á¦ÀÛÇÏ°í, ¼³¹®Á¶»ç°¡ ÇÊ¿äÇÑ ÆäÀÌÁö¿¡¼­ <jsp:include>³ª <c:import> ¾×¼ÇÀ¸·Î ÀÌ ÆäÀÌÁö¸¦ ºÒ·¯µéÀδÙ. ÇÏÁö¸¸ Á¦¾à»çÇ×ÀÌ Àִµ¥, ¿¹¸¦µé¾î ´äº¯°°Àº °ÍÀ» ÀÎÀÚ·Î ³Ñ°ÜÁÖ±â À§ÇØ ÀÚ¹Ù ºóÀ̳ª Map µîÀ» »ç¿ëÇÏÁö ¸øÇÏ°í ¿ÀÁ÷ String¸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¼¼¹ø° ¹æ½ÄÀ¸·Î Java ÅÂ±× Çڵ鷯 Ŭ·¡½º·Î Ä¿½ºÅÒ ¾×¼ÇÀ» ±¸ÇöÇÏ´Â °ÍÀε¥, ÀÌ°ÍÀº Java¸¦ ¾Ë¾Æ¾ß¸¸ ÇÑ´Ù.

JSP 2.0¿¡´Â ³×¹ø° ¹æ½ÄÀÌ ÀÖ´Ù: ´Ù½Ã ¸»Çؼ­ ÅÂ±× ÆÄÀÏ·Î Ä¿½ºÅÒ ¾×¼ÇÀ» °³¹ßÇÏ´Â °ÍÀÌ´Ù. ÅÂ±× ÆÄÀÏÀº Á¤±Ô JSPÆäÀÌÁö ó·³ µ¿ÀûÀÎ ºÎºÐ¿¡ JSP ¿ä¼ÒµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â ÅؽºÆ® ÆÄÀÏÀÌ´Ù. ÀÌ°ÍÀº Java ÅÂ±× Çڵ鷯¿Í °°Àº ¸ñÀûÀ¸·Î ¸¸µé¾îÁø °ÍÀÌ´Ù. Áï, Ä¿½ºÅÒ ¾×¼ÇÀ» À§ÇÑ ·ÎÁ÷À» Á¦°øÇÑ´Ù. ÅÂ±× ÆÄÀÏ°ú JSP ÆäÀÌÁöÀÇ ÁÖµÈ Â÷ÀÌÁ¡Àº ÅÂ±× ÆÄÀÏÀº ÆÄÀÏ È®ÀåÀÚ°¡ .tagÀÌ°í, ÆäÀÌÁö Áö½ÃÀÚ ´ë½Å ÅÂ±× Áö½ÃÀÚ¸¦ »ç¿ëÇÏ°í ÅÂ±× ÆÄÀÏ¿¡¼­¸¸ À¯È¿ÇÑ »õ·Î¿î ¸î¸î Áö½ÃÀÚ¸¦ ÀÌ¿ëÇؼ­ ÀԷ°ú Ãâ·ÂÀ» ¼±¾ðÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

ÀÚ¼¼È÷ ÇÑ ¹ø »ìÆ캸ÀÚ. ¿©±â °£´ÜÇÑ ¼³¹®Á¶»ç ÆûÀ» ¸¸µå´Â "poll.tag"¶ó´Â ÅÂ±× ÆÄÀÏÀÌ ÀÖ´Ù.

<%@ tag body-content="empty" %>
<%@ attribute name="question" required="true" %>
<%@ attribute name="answers" required="true" 
   type="java.lang.Object" %>
<%@ attribute name="votesMapName" required="true" %>
<%@ attribute name="answersMapName" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Question: ${question}<br>
<form action="result.jsp" target="result">
   <input type="hidden" name="question" value="${question}">
   <input type="hidden" name="votesMapName" value="${votesMapName}">
   <input type="hidden" name="answersMapName" value="${answersMapName}">
   <c:forEach items="${answers}" var="a">
      <input type="radio" name="vote" value="${a.key}">${a.value}<br>
   </c:forEach>
   <input type="submit" value="Vote">
</form>

ÆÄÀÏ ¸Ç À§ ÅÂ±× Áö½ÃÀÚ°¡ ÀÖ´Ù. ÅÂ±× Áö½ÃÀÚ´Â JSP ÆäÀÌÁö¿¡¼­ »ç¿ëÇÏ´Â ÆäÀÌÁö Áö½ÃÀÚ¿Í ºñ½ÁÇÏ°Ô ÀϹÝÀûÀÎ ÆÄÀÏÀÇ ¼º°ÝÀ» ±ÔÁ¤ÇÑ´Ù. ¿©±â¼­ ³ª´Â body-content ¼Ó¼ºÀ» »ç¿ëÇؼ­ JSP ÆäÀÌÁö¿¡¼­ ÀÌ ÅÂ±× ÆÄÀÏÀ» ³ªÅ¸³»´Â ¾×¼Ç ¿ä¼ÒÀÇ °ªÀÌ ºñ¾î ÀÖ¾î¾ß ÇÔÀ» ¼±¾ðÇß´Ù. ¿¹¸¦ µé¸é, ÀÌ ¾×¼Ç ¿ä¼Ò´Â ¹Ùµð¸¦ °¡Á®¼­´Â ¾ÈµÈ´Ù. ºñ¾îÀÖ´Â °ª ´ë½Å ½ºÅ©¸³Æ®°¡ ¾Æ´Ñ °ª(¹Ùµð´Â ½ºÅ©¸³Æà ¿ä¼Ò¸¦ Á¦¿ÜÇÏ°í ¾î¶² °ªÀ̵ç Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù), ȤÀº ÅÂ±× ÀÇÁ¸°ª(ÄÁÅ×À̳ʴ ¹ÙµðÀÇ ³»¿ëÀ» ¾î¶°ÇÑ º¯È¯µµ ¾øÀÌ ±×´ë·Î ÅÂ±× Çڵ鷯¿¡ ³Ñ°ÜÁØ´Ù) µîÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. Ä¿½ºÅÒ ¾×¼ÇÀ» Àڹ٠Ŭ·¡½º·Î °³¹ßÇغôٸé, body-content¿Í À¯È¿ÇÑ °ªµéÀÌ ÅÂ±× ¶óÀ̺귯¸® ±â¼úÀÚ(Tag Library Descriptor; TLD)¿¡¼­ ¿ÔÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÅÂ±× Áö½ÃÀÚ¿Í ´Ù¸¥ Ưº°ÇÑ ÅÂ±× ÆÄÀÏ Áö½ÃÀÚµéÀº TLD°¡ JSP ÄÁÅ×À̳ʿ¡ Á¦°øÇÏ´Â °Í°ú µ¿ÀÏÇÑ Á¤º¸¸¦ Á¦°øÇϱâ À§ÇØ »ç¿ëµÈ´Ù.

ÀÌ ¿¹Á¦¿¡¼­ ÅÂ±× Áö½ÃÀÚ ´ÙÀ½¿¡ ³ª¿À´Â attribute Áö½ÃÀÚ´Â µ¿¸íÀÇ TLD ¿ä¼Ò°¡ ÇÏ´Â °Í°ú °°Àº ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ°ÍÀº À¯È¿ÇÑ Ä¿½ºÅÒ ¾×¼Ç ¿ä¼ÒÀÇ ¼Ó¼ºÀ» ¼±¾ðÇÑ´Ù. poll ÅÂ±× ÆÄÀÏÀº ³×°¡Áö ¼Ó¼ºÀ» °¡Áø´Ù :

¾×¼Ç ¿ä¼Ò ¼Ó¼º Çϳª´ç name ¼Ó¼ºÀ¸·Î ¼±¾ðµÈ À̸§À» °¡Áø ÇÑ°³ÀÇ attribute Áö½ÃÀÚ°¡ ÀÖ´Ù. ÀÌ ¿¹Á¦ÀÇ ¸ðµç ¾×¼Ç ¿ä¼Ò ¼Ó¼ºÀº °¢ attribute Áö½ÃÀÚÀÇ required ¼Ó¼º¿¡ ¼±¾ðµÈ ´ë·Î ÇʼöÀûÀ¸·Î ¿ä±¸µÈ´Ù. type ¼Ó¼º¿¡ ÀÇÇØ ¼±¾ðµÈ ´ë·Î, answers ¼Ó¼ºÀÇ °ªÀº Map °´Ã¼À̾î¾ß¸¸ ÇÑ´Ù. ±×¿Ü ´Ù¸¥ ¸ðµç ¼Ó¼ºÀº ±âº» ÇüÀÎ String ÇüÀ̾î¾ßÇÑ´Ù. ±×·¡¼­ ³ª´Â ±×·¯ÇÑ ¼Ó¼º¿¡´Â type ¼Ó¼ºÀ» ¸í½ÃÇÏÁö ¾Ê¾Ò´Ù.

ÀÌ ÅÂ±× ÆÄÀÏÀÇ ³ª¸ÓÁö´Â ÀϹÝÀûÀÎ ±âÁ¸ JSP ÀÌ´Ù. taglib Áö½ÃÀÚ°¡ JSTL core ¶óÀ̺귯¸®°¡ ÀÌÆÄÀÏ¿¡¼­ »ç¿ëµÈ´Ù°í ¼±¾ðÇÏ°í, ÆÄÀÏÀÇ ¹Ùµð¿¡¼­´Â EL Ç¥Çö½Ä¾È¿¡¼­ ¼Ó¼º °ªµé(ÅÂ±× ÆÄÀÏ¿¡ ÆäÀÌÁö ½ºÄÚÇÁ º¯¼ö·Î »ý¼ºµÈ)À» »ç¿ëÇؼ­ Áú¹®°ú °¢ ´äº¯¸¶´Ù ¶óµð¿À ¹öÆ°ÀÌ ´Þ¸° ÆûÀ» »ý¼ºÇÑ´Ù. Æû¿¡¼­ answers¿Í votesÀÇ Map º¯¼ö À̸§°ú Áú¹®Àº hiddenÀ¸·Î ÀÎÄÚµù µÇ¾î ´ÙÀ½°ú °°Àº ÇüÅ·Π»ç¿ëµÉ ÅõÇ¥ ó¸®ÇÏ´Â ÆäÀÌÁö·Î º¸³»Áö°Ô µÈ´Ù :

<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
   <head>
      <title>Poll Results</title>
   </head>
   <body bgcolor="white">
      <c:set target="${applicationScope[param.votesMapName]}" 
        property="${param.vote}" 
        value="${applicationScope[param.votesMapName][param.vote] + 1}" />
    
      <p>
        Question: ${param.question}<br>
        <c:forEach items="${applicationScope[param.answersMapName]}"
          var="a">
          ${a.key}) ${a.value}: 
          ${applicationScope[param.votesMapName][a.key]}<br>
        </c:forEach>
      </p>
   </body>
</html>

ÀÌ°ÍÀº JSTL ¾×¼ÇÀ» »ç¿ëÇÑ Æò¹üÇÑ JSP ÆäÀÌÁöÀÌ´Ù. voteMapName ÆĶó¹ÌÅÍ¿¡ ÀÇÇØ Á¦°øµÇ´Â À̸§À¸·Î ¾îÇø®ÄÉÀÌ¼Ç ½ºÄÚÇÁ¿¡ Á¸ÀçÇÏ´Â Map °´Ã¼°¡ ÅõÇ¥ °á°ú¸¦ °¡Áö°í Àִµ¥, ±× °´Ã¼¿¡ ÀÖ´Â ¼³¹®Á¶»ç´äº¯°ú Å°°ªÀÌ ÀÏÄ¡ÇÏ´Â º¯¼öÀÇ °ªÀ» Áõ°¡½ÃÄÑÁØ´Ù. ´ÙÀ½À¸·Î, ÀÌ°ÍÀº Áú¹®À» Ãâ·ÂÇÏ°í "answerMapName" ÆĶó¹ÌÅÍ¿¡ ÀÇÇØ Á¦°øµÇ´Â ¾îÇø®ÄÉÀÌ¼Ç ½ºÄÚÇÁÀÇ ¼³¹®Á¶»ç ´äº¯µéÀÇ ¸Ê º¯¼ö¸¦ ¼øȸÇÏ¿© °¢ ´äº¯À» ÇöÀç µæÇ¥¼ö¿Í ÇÔ²² Ãâ·ÂÇÑ´Ù.

¿ì¸®´Â ¼³¹®Á¶»ç ÅõÇ¥ 󸮸¦ ¾î¶»°Ô Çϴ°¡ º¸´Ù´Â ¼³¹®Á¶»ç ÅÂ±× ÆÄÀÏÀ» ÅëÇØ ±¸ÇöµÈ Ä¿½ºÅÒ ¾×¼ÇÀ» ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¿¡ ´õ °ü½ÉÀÌ ÀÖÀ¸¹Ç·Î, ¿©±â ¿¹Á¦¸¦ º¸¿©ÁØ´Ù:

<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>

<html>
   <head>
      <title>My Page</title>
   </head>
   <body bgcolor="white">
      <jsp:useBean id="myAnswers" scope="application" 
        class="java.util.TreeMap">
        <c:set target="${myAnswers}" property="1" value="Yes" />
        <c:set target="${myAnswers}" property="2" value="No" />
        <c:set target="${myAnswers}" property="3" value="Maybe" />
      </jsp:useBean>
      <jsp:useBean id="myVotes" scope="application"
        class="java.util.HashMap" />    
      ...
      <p>
        <my:poll question="Will you start using tag files?" 
          answers="${myAnswers}"
          answersMapName="myAnswers" votesMapName="myVotes" />
      </p>
      ...
   </body>
</html>

ÁÖÀÇÇؼ­ º¼ ù¹ø° »çÇ×Àº ÅÂ±× ÆÄÀÏÀ» °¡Áö°í ÀÖ´Â ÅÂ±× ¶óÀ̺귯¸®¸¦ ¼±¾ðÇÏ´Â taglib Áö½ÃÀÚÀÌ´Ù. TLD¸¦ »ý¼ºÇÏÁö ¾Ê°í ÅÂ±× ÆÄÀÏÀ» »ç¿ëÇÏ·Á¸é, WEB-INF/tags µð·ºÅ丮 ¾Æ·¡ÀÇ ¾îµð¿£°¡ ÅÂ±× ÆÄÀÏÀ» ÀúÀåÇؾ߸¸ ÇÑ´Ù.

poll.tag ¿¹Á¦ÆÄÀÏÀº WEB-INF/tags/mytags µð·ºÅ丮¿¡ ÀúÀåµÇ¾ú°í ÀÌ µð·ºÅ丮 À̸§À» taglib Áö½ÃÀÚÀÇ 'tagdir ' ¼Ó¼ºÀÇ °ªÀ¸·Î »ç¿ëÇß´Ù. ÀÌ·¸°ÔÇÏ¿© ÄÁÅ×À̳ʿ¡°Ô ÀÌ µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç ÅÂ±× ÆÄÀÏÀÌ ÇÑ°³ÀÇ µ¿ÀÏÇÑ ÅÂ±× ¶óÀ̺귯¸®¿¡ ¼ÓÇÑ´Ù°í ¼±¾ðÇÏ°í, ÀÌ ¶óÀ̺귯¸®ÀÇ ¾×¼ÇÀ» À§ÇÑ ¾×¼Ç ¿ä¼ÒµéÀÌ taglib Áö½ÃÀÚÀÇ prefix ¼Ó¼º¿¡ ÁöÁ¤µÈ °ª - ÀÌ ¿¹Á¦¿¡¼­´Â "my" - À» ÀÌ¿ëÇØ ±¸ºÐ¶ó°í ¾Ë·ÁÁØ´Ù. ´Ù¸¥ ¹æ¹ýÀ¸·Î, ÅÂ±× ÆÄÀÏÀ» TLDÆÄÀÏ°ú ÇÔ²² .jar ·Î ¹­À» ¼ö ÀÖ´Ù. ±×¸®°í ÅÂ±× ¶óÀ̺귯¸®¸¦ ÀϹÝÀûÀÎ Ä¿½ºÅÒ ÅÂ±× ¶óÀ̺귯¸®¿Í ¸¶Âù°¡Áö ¹æ½ÄÀÇ taglib Áö½ÃÀÚ·Î ¼±¾ðÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î, tagdir ¼Ó¼º´ë½Å uri ¼Ó¼ºÀ» »ç¿ëÇÑ´Ù.

ÀÌ ¿¹Á¦¿¡¼­, ´äº¯°ú ÅõÇ¥ °á°ú¸¦ À§ÇÑ Map °´Ã¼´Â <jsp:useBean> ¾×¼Ç¿¡ ÀÇÇØ »ý¼ºµÇ°í JSTLÀÇ <c:set> ¾×¼Ç¿¡ ÀÇÇØ °ªÀÌ Áõ°¡µÈ´Ù. ÇÏÁö¸¸, ¹°·Ð ´Ù¸¥ ¾î¶² ¹æ½ÄÀ¸·Î °´Ã¼¸¦ »ý¼ºÇصµ µÈ´Ù. (¿¹: ¾ÆÆÄÄ¡ÀÇ Struts ¿¡¼­´Â ÄÁÅؽºÆ® ¸®½º³Ê³ª "plugin" Ŭ·¡½º¿¡¼­). °´Ã¼µé¾î ¾î¶»°Ô »ý¼ºµÇ¾úµçÁö °£¿¡, ÅÂ±× ÆÄÀÏÀº ÀϹÝÀûÀÎ JSP Ä¿½ºÅÒ ¾×¼Ç ¿ä¼Ò¸¦ ÅëÇØ ¼öÇàµÈ´Ù. ³ª´Â answers ¼Ó¼ºÀÇ °ªÀ¸·Î¼­ answers MapÀÇ °ªÀ» °è»êÇϱâ À§ÇØ EL Ç¥Çö½ÄÀ» »ç¿ëÇß´Ù. ÅÂ±× ÆÄÀÏ ¼Ó¼ºÀº EL Ç¥Çö½ÄÀ» ±âº»ÀûÀ¸·Î ¹Þ¾ÆµéÀδÙ. ÇÏÁö¸¸ attribute Áö½ÃÀÚÀÇ rtexprvalue¸¦ ÀÌ¿ëÇØ Á¤ÀûÀÎ °ª¸¸À» ¹Þ¾ÆµéÀ̵µ·Ï ¼±¾ðÇÒ ¼öµµ ÀÖ´Ù.

ÀÌ ÆäÀÌÁö¸¦ ¿äûÇϸé, JSP ÄÁÅ×À̳ʴ ´Ù¸¥ °Íµé°ú ¸¶Âù°¡Áö·Î ±×°ÍÀ» ó¸®ÇÑ´Ù. taglib Áö½ÃÀÚ¿Í ¿ä¼ÒÀÇ ¼±ÇàÀÚ(prefix)ÀÇ µµ¿òÀ» ¹Þ¾Æ <my:poll> Ä¿½ºÅÒ ¿ä¼ÒÀÇ ±¸ÇöÀ» ÀûÀçÇÑ´Ù. ÄÁÅ×À̳ʴ ÅÂ±× ÆÄÀÏÀ» Àڱ⠳ª¸§ÀÇ ¹æ¹ýÀ¸·Î ó¸®ÇÑ´Ù. Tomcat 5 ÄÁÅ×À̳ʴ ÅÂ±× ÆÄÀÏÀ» Java ÅÂ±× Çڵ鷯 Ŭ·¡½º·Î ¹Ù²Ù°í ÄÄÆÄÀÏÇÑ µÚ ±×°ÍÀ» ½ÇÇàÇÑ´Ù.

Ä¿½ºÅÒ ¾×¼ÇÀÇ ¹Ùµð ó¸®Çϱâ

ÀÚ¹Ù·Î ÀÛ¼ºµÈ ÅÂ±× Çڵ鷯 Ŭ·¡½º¿Í ¸¶Âù°¡Áö·Î, ÅÂ±× ÆÄÀϵµ ÄÁÅ×À̳ʿ¡°Ô Ä¿½ºÅÒ ¾×¼Ç ¿ä¼ÒÀÇ ¹Ùµð¸¦ Æò°¡ÇÏ°í, Ãß°¡ÀûÀ¸·Î Æò°¡ °á°ú¸¦ ´õ ó¸®Çϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.

¾×¼Ç ¿ä¼ÒÀÇ ¹Ùµð¿¡ ¼³¹®Á¶»ç¿¡ °üÇÑ ÂªÀº ¼³¸íÀ» Ãß°¡ÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾îº¸ÀÚ. ´ÙÀ½°ú °°´Ù :

<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
...
<html>
   ...
   <body bgcolor="white">
      ...
      <p>
        <my:poll question="Will you start using tag files?" 
          answers="${myAnswers}"
          answersMapName="myAnswers" votesMapName="myVotes" >
          JSP 2.0 introduces a new way to develop custom action
          tag handlers, called <i>tag files</i>
        </my:poll>
      </p>
      ...
   </body>
</html>

ÀÌ ¿¹Á¦¿¡¼­ÀÇ ¹Ùµð´Â ¿ÀÁ÷ ÅؽºÆ®¸¸À» °¡Áö°í ÀÖ´Ù. ÇÏÁö¸¸ ¾×¼Ç ¿ä¼Ò³ª EL Ç¥Çö½ÄÀÌ ¿Ã ¼öµµ ÀÖ´Ù. ¹Ùµð¸¦ Æò°¡ÇÏ°í °á°ú¸¦ Ãâ·ÂÇϱâ À§ÇØ, poll ÅÂ±× ÆÄÀÏÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù:

<%@ tag body-content="scriptless" %>
<%@ attribute name="question" required="true" %>
<%@ attribute name="answers" required="true" 
   type="java.lang.Object" %>
<%@ attribute name="votesMapName" required="true" %>
<%@ attribute name="answersMapName" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<p>
   <jsp:doBody/>
</p>
Question: ${question}<br>
<form action="result.jsp" target="result">
   <input type="hidden" name="question" value="${question}">
   <input type="hidden" name="votesMapName" value="${votesMapName}">
   <input type="hidden" name="answersMapName" value="${answersMapName}">
   <c:forEach items="${answers}" var="a">
      <input type="radio" name="vote" value="${a.key}">${a.value}<br>
   </c:forEach>
   <input type="submit" value="Vote">
</form>

ù°, ÅÂ±× Áö½ÃÀÚÀÇ body-content ¼Ó¼ºÀÇ °ªÀ» "scriptless"·Î º¯°æÇÑ´Ù. ÀÌ¹Ì ¸»Çß´Ù½ÃÇÇ, ÀÌ·¸°Ô ÇÏ¸é ¹Ùµð´Â ½ºÅ©¸³Æà ¿ä¼Ò¸¦ Á¦¿ÜÇÏ°í´Â ¾î¶°ÇÑ ³»¿ëÀÌ¶óµµ Æ÷ÇÔÇÒ ¼ö ÀְԵȴÙ. ´ÙÀ½À¸·Î, <jsp:doBody>¾×¼ÇÀ» Ãß°¡ÇÑ´Ù. À̸¦ÅëÇØ ÄÁÅ×À̳ʰ¡ ¹Ùµð¸¦ Æò°¡ÇÏ°í °á°ú¸¦ Ãâ·ÂÇÏ°Ô ÇÑ´Ù. ´Ù¸¥ ¹æ¹ýÀ¸·Î, var ¼Ó¼ºÀ» »ç¿ëÇؼ­ Æò°¡ °á°ú¸¦ °¡Á®¿Í ´Ù¸¥ 󸮸¦ ÇÒ ¼öµµ ÀÖ´Ù.

¿©±â¼­ ¼³¸íÇÑ ±â´É¿Ü¿¡ Ãß°¡ÀûÀ¸·Î, ÅÂ±× ÆÄÀÏÀº ÀÚ½ÅÀ» È£ÃâÇÑ ÆÄÀÏ¿¡ º¯¼ö¸¦ ÅëÇØ Á¤º¸¸¦ µ¹·ÁÁÙ ¼öµµ ÀÖ°í, ¼±¾ðµÇÁö ¾ÊÀº ¼Ó¼ºÀ» ó¸®ÇÏ°í ´ÜÆíÀûÀÎ ¼Ó¼ºÀ» °¡Áú ¼ö ÀÖ´Ù(¿¹: ÅÂ±× ÆÄÀÏÀÌ ¾×¼Ç ¿ä¼ÒÀÇ ¹Ùµð¸¦ Æò°¡ÇÏ´Â °Í°ú ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î ÅÂ±× ÆÄÀÏ¿¡ÀÇÇØ Æò°¡µÇ´Â ¾×¼Ç ¿ä¼Ò¿Í EL Ç¥Çö½ÄÀ» °®°í ÀÖ´Â ¼Ó¼º). ÀÌ¿¡ ´ëÇÑ ¸ðµç »çÇ×À» ³ªÀÇ JSP Ã¥ 11Àå¿¡¼­ º¼ ¼ö ÀÖ´Ù. ¿Â¶óÀο¡¼­ »ùÇ÷Πº¼ ¼ö ÀÖ´Ù.

´õ °£ÆíÇØÁø Java ÅÂ±× Çڵ鷯 API

Ä¿½ºÅÒ ¾×¼Ç ÅÂ±× Çڵ鷯¸¦ ÅÂ±× ÆÄÀÏ·Î ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô µÈ °ÍÀº ƯÈ÷ ¸¹Àº ¾çÀÇ HTMLÀ» »ý¼ºÇÏ´Â Ä¿½ºÅÒ ¾×¼Ç¿¡¼­ ¸Å¿ì ÈǸ¢ÇÑ ±â´ÉÀÌ´Ù. ±×·¯³ª ¸î¸î ±â´ÉÀº ´ÜÁö JSP ¾×¼Ç°ú EL Ç¥Çö½Ä¸¸À¸·Î¸¸ ÀÛ¼ºÇϱâ´Â ¾î·Æ´Ù. ±×·¡¼­ Java ÅÂ±× Çڵ鷯 API°¡ ¿©ÀüÈ÷ ÇÊ¿äÇÏ´Ù. JSP 2.0 ÀÌÀü¿¡´Â Java·Î ÅÂ±× Çڵ鷯¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ²Ï ±î´Ù·Î¿Ô´Ù. ¾×¼Ç ¿ä¼ÒÀÇ ¹Ùµð¸¦ ó¸®Çϱâ À§ÇØ ÄÁÅ×ÀÌ³Ê¿Í ÅÂ±× ÇÚµé¾î»çÀÌÀÇ º¹ÀâÇÑ »óÈ£ÀÛ¿ëÀÌ ÇÊ¿äÇ߱⠶§¹®ÀÌ´Ù.

¾×¼Ç ¿ä¼Ò ¹Ùµð¿¡¼­ Java ½ºÅ©¸³Æà ¿ä¼Ò¸¦ Áö¿øÇϱâ À§Çؼ­ ÀÌ·¸°Ô º¹ÀâÇÏ°Ô µÇ¾ú´Ù. ±×·¯³ª, ¹Ùµð°¡ ¿ÀÁ÷ ÅÛÇø´ ÅؽºÆ®¿Í EL Ç¥Çö½Ä, ¾×¼Ç ¿ä¼Ò¸¸ Æ÷ÇÔÇÏ°Ô µÈ´Ù¸é, ´õ¿í ´Ü¼øÇÑ API µðÀÚÀÎÀÌ °¡´ÉÇØ Áø´Ù. ¹Ù·Î ±×°ÍÀÌ JSP 2.0¿¡¼­ ÀÌ·ïÁø °ÍÀÌ°í, ´Ü¼øÇÑ ÅÂ±× Çڵ鷯 API(simple tag handler API)¶ó°í ºÒ¸®¿î´Ù.

Á»Àü¿¡ ÅÂ±× ÆÄÀÏ·Î ±¸ÇöÇß´ø ¼³¹®Á¶»ç Ä¿½ºÅÒ¾×¼ÇÀÇ Java ÅÂ±× Çڵ鷯 :

package com.mycompany.mylib;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class PollTag extends SimpleTagSupport {
   private String question;
   private Map answers;
   private String votesMapName;
   private String answersMapName;

   public void setQuestion(String question) {
      this.question = question;
   }

   public void setAnswers(Map answers) {
      this.answers = answers;
   }

   public void setVotesMapName(String votesMapName) {
      this.votesMapName = votesMapName;
   }

   public void setAnswersMapName(String answersMapName) {
      this.answersMapName = answersMapName;
   }

   public void doTag() throws JspException, IOException {
      JspWriter out = getJspContext().getOut();
      JspFragment body = getJspBody();
      if (body != null) {
         out.println("<p>");
         body.invoke(null);
         out.println("</p>");
      }
      out.print("Question:");
      out.print(question);
      out.println("<br>");
      out.println("<form action=\"result.jsp\" target=\"result\">");
      out.print("<input type=\"hidden\" name=\"question\" value=\"");
      out.print(question);
      out.println("\">");
      out.print("<input type=\"hidden\" name=\"votesMapName\" value=\"");
      out.print(votesMapName);
      out.println("\">");
      out.print("<input type=\"hidden\" name=\"answersMapName\" value=\"");
      out.print(answersMapName);
      out.println("\">");
      Iterator i = answers.keySet().iterator();
      while (i.hasNext()) {
         String key = (String) i.next();
         String value = (String) answers.get(key);
         out.print("<input type=\"radio\" name=\"vote\" value=\"");
         out.print(key);
         out.print("\">");
         out.print(value);
         out.println("<br>");
      }
      out.println("<input type=\"submit\" value=\"Vote\">");
      out.println("</form>");
   }
}

´Ü¼øÇÑ Å±״ »õ·Î¿î javax.servlet.jsp.tagext.SimpleTag ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. ¿¹Á¦ÀÇ ÅÂ±× Çڵ鷯´Â ¸ðµç ¸Þ¼ÒµåÀÇ ±âº»ÀûÀÎ ±¸ÇöÀ» Á¦°øÇØ ÁÖ´Â javax.servlet.jsp.tagext.SimpleTagSupport Ŭ·¡½º¸¦ »ó¼ÓÇؼ­ ÀÛ¼ºÇß´Ù. ±âÁ¸ÀÇ ÅÂ±× Çڵ鷯 Ŭ·¡½º¿Í ¸¶Âù°¡Áö·Î, °¢°¢ÀÇ Ä¿½ºÅÒ ¾×¼Ç ¼Ó¼ºÀ» À§ÇØ ¼ÂÅÍ ¸Þ½îµå(setter methods)°¡ ÇÊ¿äÇÏ´Ù. ÇÏÁö¸¸ ó¸® ¸Þ¼Òµå´Â ¿ÀÁ÷ doTag() Çϳª¸¸ ±¸ÇöÇÏ¸é µÈ´Ù.

¿¹Á¦ ÅÂ±× Çڵ鷯¿¡¼­´Â, doTag() ¸Þ½îµå°¡ SimpleTagSupport Ŭ·¡½º¿¡¼­ »ó¼Ó¹ÞÀº getJspBody() ¸Þ¼Òµå¸¦ ½ÇÇàÇÔÀ¸·Î½á ¾×¼Ç ¿ä¼Ò ¹ÙµðÀÇ ½ÇÇà ´ëÇàÀÚ(JspFragmentÀÇ ÀνºÅϽº)¸¦ ¾ò´Â´Ù. ¸¸¾à ¹Ùµð°¡ Á¸ÀçÇÑ´Ù¸é, ÅÂ±× Çڵ鷯´Â ¼öÇà °á°ú¸¦ Ãâ·Â¿¡ Ãß°¡Ç϶ó´Â Àǹ̷Πnull °ªÀ» ÀÎÀÚ·ÎÁÖ¾î invoke() ¸Þ½îµå¸¦ ½ÇÇàÇÑ´Ù. <jsp:doBody> ¾×¼Ç°ú ¸¶Âù°¡Áö·Î, WriterÀÇ ÀνºÅϽº¸¦ invoke() ¸Þ½îµåÀÇ ÀÎÀÚ·Î ³Ñ±èÀ¸·Î½á °á°ú¸¦ Àâ¾Æ³¾ ¼ö ÀÖ´Ù. ±×·¯¸é doTag() ¸Þ½îµå´Â ÅÂ±× ÆÄÀÏ ±¸Çö¿¡¼­ Çß´ø °Í ó·³ ¸ðµç ´äº¯À» À§ÇÑ ¶óµð¿À ´ÜÃ߸¦ °¡Áø Æû HTMLÀ» Ãâ·ÂÇÑ´Ù.

±âÁ¸ÀÇ ÅÂ±× Çڵ鷯°¡ ¹Ùµð¸¦ ó¸®ÇϱâÀ§ÇØ ¼¼ °³ÀÇ ¸Þ½îµå(doStartTag(), doAfterBody() ±×¸®°í doEndTag(). °¢ ¸Þ¼Òµå´Â ÄÁÅ×À̳ʰ¡ ´ÙÀ½¿¡ ¹» ÇÒÁö¸¦ ÁöÁ¤ÇÏ´Â °ªÀ» ¸®ÅÏÇÑ´Ù)¸¦ È£ÃâÇϴµ¥ ¹ÝÇØ, Áö±ÝÀº ÅÂ±× Çڵ鷯¸¦ ÀÛµ¿½ÃÅ°±â À§ÇØ ÄÁÅ×À̳ʰ¡ È£ÃâÇÏ´Â ¸Þ¼Òµå°¡ ¿ÀÁ÷ ÇÑ °³À̱⠶§¹®¿¡, SimpleTag·Î ÅÂ±× Çڵ鷯¸¦ ±¸ÇöÇϴ°ÍÀÌ ±âÁ¸ ÅÂ±× Çڵ鷯 API¸¦ ÀÌ¿ëÇÏ´Â °Íº¸´Ù ÈξÀ ½±´Ù. °Ô´Ù°¡ ´Ü¼øÇÑ ÅÂ±× Çڵ鷯ÀÇ ÀνºÅϽº´Â °áÄÚ Àç»ç¿ëµÇÁö ¾Ê±â ¶§¹®¿¡, »óŸ¦ Àç¼³Á¤ÇÏ´Â °Í¿¡ ´ëÇØ °ÆÁ¤ ²¨µµ µÈ´Ù. »óÅ Àç¼³Á¤Çϱâ´Â ³ªÀÇ ÀÌÀü ±Û, "JSP 1.2: Great News for the JSP Community, Part 2" ¿¡¼­ ¼³¸íÇÑ ´ë·Î »ó´çÈ÷ ¸¹Àº ¹®Á¦¸¦ ¾ß±â½ÃÅ°´Â °ÍÀ¸·Î ¾Ë·ÁÁ³´Ù.

´Ü¼øÇÑ ÅÂ±× Çڵ鷯ÀÇ TLD ¼±¾ðÀº ±âÁ¸ ÅÂ±× Çڵ鷯¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î ÇÑ´Ù. ÇÏÁö¸¸ <body-content> TLD ¿ä¼Ò´Â JSP°¡ ¾Æ´Ñ °ªÀ» °¡Á®¾ß¸¸ ÇÑ´Ù. ½ºÅ©¸³Æà ¿ä¼Ò°¡ ´Ü¼øÇÑ ÅÂ±× Çڵ鷯·Î ±¸ÇöµÈ Ä¿½ºÅÒ ¾×¼Ç ¿ä¼ÒÀÇ ¹Ùµð¿¡¼­ Çã¶ôµÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

ÀÌ »çÇ× ÀÌ¿Ü¿¡´Â ´Ü¼øÇÑ ÅÂ±× Çڵ鷯·Î ±¸ÇöÇÑ Ä¿½ºÅÒ ¾×¼ÇÀ» »ç¿ëÇÑ´Â °ÍÀº ±âÁ¸ÀÇ ÅÂ±× Çڵ鷯¸¦ »ç¿ëÇÏ´Â °Í°ú ÀüÇô ´Ù¸¦ ¹Ù ¾ø´Ù.

´Ü¼øÇÑ ÅÂ±× Çڵ鷯¿Í ±âÁ¸ ÅÂ±× Çڵ鷯 ¸ðµÎ javax.faces.jsp.tagext.DynamicAttributes¶ó °í ºÒ¸®´Â »õ·Î¿î ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÔÀ¸·Î½á ¼±¾ðµÇÁö ¾ÊÀº ¼Ó¼ºÀ» Áö¿øÇÒ ¼ö ÀÖ´Ù. µÎ ÇüÅ ¸ðµÎ¸¦ À§ÇÑ ¼Ó¼ºÀº ´Ù¸¥ ¾×¼ÇÀ̳ª EL Ç¥Çö½ÄÀ» Æ÷ÇÔÇÏ´Â ¼Ó¼ºÀ» À§ÇÑ JspFragment ÇüÀÌ µÉ ¼ö ÀÖ°í ÅÂ±× Çڵ鷯¿¡ ÀÇÇØ ¸î¹øÀÌ¶óµµ Æò°¡ µÉ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ±â´É¿¡ ´ëÇØ ³ªÀÇ Ã¥ JavaServer Pages Á¦3ÆÇ¿¡¼­ ÀÐ¾î º¼ ¼ö ÀÖ´Ù.

¸¶¹«¸®

À̹ø ½Ã¸®Áî¿¡¼­ ³ª´Â JSP 2.0¿¡ Ãß°¡µÈ ¸ðµç »õ·Î¿î ±â´ÉÀ» º¸¿©ÁÖ¾ú´Ù : Expression Language, ´õ ³ªÀº ¿À·ù ó¸®, »õ·Î¿î ¼³Á¤ ¿É¼Ç, ´õ ³ª¾ÆÁø XML ÆäÀÌÁö Çü½Ä ±×¸®°í ÅÂ±× Çڵ鷯¸¦ °³¹ßÇϱâÀ§ÇÑ µÎ°¡Áö »õ·Î¿î ¹æ¹ý. ÀüºÎ Çؼ­, ÀÌ·¯ÇÑ °³¼± »çÇ×µéÀº JSP ÆäÀÌÁö¸¦ ´õ¿í ½±°Ô ÀÌÇØÇÏ°í À¯Áöº¸¼ö ÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

JSP 2.0ÀÇ »õ·Î¿î ±â´ÉµéÀ» Á¢Çغ¸°í ½Í´Ù¸é, Apache Tomcat 5¸¦ »ç¿ëÇغ¸¶ó°í ±ÇÇÏ°í ½Í´Ù. ÅèĹÀº »õ·Î¿î JSP ½ºÆåÀ» ÃÖÃÊ·Î ±¸ÇöÇÑ JSP ÄÁÅ×À̳ÊÀÌ´Ù. Jakarta Project »çÀÌÆ®¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.