##Servlet

커스텀 액션 태그(Custom Action Tag)

운중동토토로 2024. 8. 28. 02:12

* 커스텀 액션 태그(Custom Action Tab)

     JSTL ?

     jsp에서 사용되는 커스텀 액션 태그
    공통적으로 사용되는 코드들을 합하여 보다 쉽게 사용할 수 있도록 태그화하여

    표준으로 제공되는 라이브러리

 

    라이브러리 추가

    1. 톰캣사이트 접속 "https://tomcat.apache.org/"
    2. 메뉴에서 taglib 메뉴를 찾아 접속 (Download-Taglibs)
    3. 4개의 라이브러리 파일 다운로드(.jar) -> dev-jstl 폴더에 복사
    4. WEB-INF/lib/ 위치에 라이브러리 추가

 

    JSTL 선언방법

    JSTL을 사용하기 위하여 해당 jsp페이지 상단에 taglib 지시어를 사용하여 선언
    <%@ taglib prefix="접두어" uri="라이브러리 파일상의 uri주소" %>

    1. JSTL Core Library

       변수와 조건문, 반복문 등 로직과 관련된 문법을 제공

 

          1) 변수

              변수 선언과 동시에 초기화 <c:set var="변수명" value="값" [scope="저장객체"]>
               - 변수 선언하고 초기화까지의 기능을 제공
               - 해당 변수의 저장된 값을 어떤 scope에 setAttribute를 통해서 담아둘지 결정
                  => c:set으로 선언한 변수는 반드시 EL로 접근해야 함!
               ex1) num1 이라는 변수에 10이라는 값을 저장

                       <c:set var="num1" value="10"/> => pageContext.setAttribute("num1", 10)

                       scope를 지정하지 않으면 기본 pageScope로 지정된다.
               ex2) request 영역에 num2라는 변수에 20이라는 값을 저장
                       <c:set var="num2" value="20" scope="request"/>

               => c:set으로 선언한 변수는 반드시 EL로 접근해야 함!
                    num1 : ${ num1 }
                    num2 : ${ num2 }

               ex3) num1과 num2의 합을 저장한 addNum이라는 변수를 session 영역에 저장

                       <c:set var="addNum" value="${ num1 + num2 }" scope="session"/>
                       addNum : ${ addNum }
               - value 속성 대신 시작태그와 종료태그 사이에 초기값 지정 가능
                 <c:set var="result">
                           9999
                 </c:set>
                 => ${ result }
                 <c:set var="result" value="7777" scope="request"/>


              변수 삭제 <c:remove var="삭제할 변수명" [scope="삭제하고자하는 영역"]>
               - 해당 scope 영역에 저장되어 있는 변수를 찾아 제거하는 태그
                  => 해당 scope에 .removeAttribute() 를 사용하여 제거하는 것과 동일하게 처리됨
               ex1) addNum 변수를 삭제, 특정 scope 영역에서 제거

                       addNum : ${ addNum }

                       <c:remove var="addNum" scope="session"/>
               ex2) 모든 scope에서 result 제거
                        <c:remove var="result"/>


              변수(데이터) 출력 <c:out value="출력하고자 하는 값" [default="기본값"] [escapeXml="true|false"]>
              ex1) addNum에 저장된 값을 출력
                      <c:out value="${ addNum }" />
                      <c:out value="${ addNum }" default="데이터 없음" />
              ex2) outData라는 변수에 "강조태그!!!" 값을 저장
                      <c:set var="outData" value="강조태그!!!" />
                      <c:out value="${ outData }" />

              excapeXml 속성이 true(기본값)

              -> 출력데이터에 태그가 포함되어 있는 경우 해석되지 않음 => innerText
              <c:out value="${ outData }" escapeXml="false" /> => innerHTML


    2. 조건문 - if     <c:if test="조건식">

        - Java의 if문과 비슷한 역할을 하는 태그
        - 조건식은 test 속성에 작성 (EL구문을 사용하여 작성)
        ex1) num1이 num2보다 큰가?  JSTL로 선언된 변수는 접근 불가! (EL로만 접근 가능)
                <c:if test="${ num1 > num2 }">
                       num1이 num2보다 큽니다.
                </c:if>
                <c:if test="${ num1 < num2 }">
                       num1이 num2보다 작습니다.
                </c:if>
        ex2) hi 변수에 저장된 값이 "안녕" 일 경우 hihihi~ 출력, 그렇지 않은 경우 byebye 출력
                <c:set var="hi" value="안녕" />
                <c:if test="${ hi eq '안녕' }">
                         hihihi~ <br>
                </c:if>
                <c:if test="${ hi ne '안녕' }">
                         byebye <br>
                </c:if>


    3. 조건문 - Choose <c:choose, c:when, c:otherwise>

        - Java의 if - else, if - else if문과 비슷하게 동작하는 태그
        - 구조
          choose 하위 요소로 c:when, c:otherwise를 사용!
          c:choose
                c:when /c:when
                c:otherwise /c:otherwise
          c:choose
        ex1) num1의 값이 20보다 크면 "20보다 큼", 10보다 크거나 같으면 "10보다 크거나같음"
                , 그렇지 않으면 "10보다 작음" 을 출력
                <c:choose>
                      <c:when test="${ num1 gt 20 }">
                            20보다 큼
                      </c:when>
                      <c:when test="${ num1 ge 10 }">    (<==   <%-- num1 >= 10 )
                            10보다 크거나 같음
                      </c:when>
                      <c:otherwise>10보다 작음</c:otherwise>
                </c:choose>


    4. 반복문 - c:forEach

        for loop문  <c:forEach var="변수명" begin="초기값" end="끝값" [step="반복 시 증가값"]>
        향상된 for문  <c:forEach var="변수명" items="배열/컬렉션(순차적으로 접근하고자 하는 객체)"
                                [varStatus="현재 접근된 요소의 상태값을 보관하는 변수명"]>
         

         <c:forEach var="i" begin="0" end="9">
                   i의 값은 : ${ i }
         </c:forEach>
         ex1) h1 ~ h6 태그를 출력하는데, "나는 hx태그야"

                 <c:forEach var="t" begin="1" end="6">
                           <h${ t }> 나는 h${ t }태그야 </h${ t }>
                 </c:forEach>
         ex2) <c:set var="fruits">
                       수박, 애플, 토마토, 망고, 딸기
                 </c:set>
                 - fruits에 저장된 값 : ${ fruits }
                 <c:forEach var="f" items="${ fruits }">
                           ${ f }
                 </c:forEach>
         ex3) colors라는 변수에 4가지의 색상을 콤마(,)로 구분하여 저장, 목록 태그로 해당 글자 색상을 출력
                 <c:set var="colors">
                           red, orange, blue, pink
                 </c:set>
                 <ul>
                      <c:forEach var="c" items="${ colors }">
                                <li style="color: ${ c };">${ c }</li>
                      </c:forEach>
                 </ul>
         ex4) ArrayList<Person> list = new ArrayList<>();
                 list.add(new Person("홍길동", 30, "남자"));
                 list.add(new Person("홍골동", 26, "남자"));
                 list.add(new Person("홍걸동", 25, "여자"));

 

                 <c:set var="pList" value="<%= list %>" scope="request"/>    (<==    request.setAttribute("pList", list); )
                 
                 <table border="1">
                       <thead>
                             <tr>
                                   <th>No</th>
                                   <th>이름</th>
                                   <th>나이</th>
                                   <th>성별</th>
                             </tr>
                       </thead>
                       <tbody> 
                       <c:choose>
                             <c:when test="${ empty pList }">
                                   <tr>
                                         <td colspan="4">조회된 결과가 없습니다.</td>
                                   </tr>
                             </c:when>
                             <c:otherwise>
                                   <c:forEach var="p" items="${ pList }" varStatus="s">
                                   <tr>
                                         <td>${ s.count }</td>    (count: 1부터 시작)
                                         <td>${ p.name }</td>
                                         <td>${ p.age }</td>
                                         <td>${ p.gender }</td>
                                   </tr>
                                   </c:forEach>
                             </c:otherwise>
                       </c:choose>
                       </tbody>
                 </table>


    5. 반복문 - forTokens

        특정 구분자를 통해서 순차적으로 접근하고자 할 때 사용

        <c:forTokens var="변수명" items="분리하고자하는대상" delims="구분자">
        - 구분자를 통해서 분리된 각각의 값에 순차적으로 접근하여 반복문 수행
        - 콤마(,)가 아닌 다른 구분자를 사용하고자 할 때 사용
        - Java에서 문자열.split("구분자") 또는 StringTokenizer 와 비슷한 기능
        ex) movie라는 이름의 변수에 5개 저장 (구분자: / . ,)
              <c:set var="movie" value="에일리언/행복의나라.인사이드아웃2,친구.유희왕빛의피라미드" />
              영화 목록
              <ol>
                    <c:forTokens var="m" items="${ movie }" delims="/.,">
                    <li>${ m }</li>
                    </c:forTokens>
                    </ol>


    6. url, query string 관련 - c:url, c:param

        url 경로를 생성하고, query string을 정의해 둘 수 있는 태그
        <c:url var="변수명" value="요청할url">
                  <c:param name="키값" value="데이터" />
                  <c:param name="키값" value="데이터" />
        </c:url>

        <c:url var="listUrl" value="list.do">
                  <c:param name="cpage" value="1"/>
                  <c:param name="num" value="10"/>
        </c:url>