포스트

06. JSTL

JSTL(Jsp Standard Tag Library)

1
2
🔸JSP에서 자주 사용되거나 공통적으로 사용되는 Java 코드를 표기법을 간단히 태그화 하여 표준으로 제공하는 것 
(if, for, 배열/컬렉션 길이, 문자열 치환, 숫자 데이터 형식 변경, 데이터 파싱, scope 변수 선언 등)
1
2
3
🔸JSTL 사용을 위한 선언 방법
- JSP 파일 최상단에 추가하고자 하는 JSTL taglib를 추가
ex) <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 1) index.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    <ul>
      <li>
        <a href="jstl">3. JSTL</a><!-- 상대 경로 주소 -->
      </li>
    </ul>
    <!--
      현재 페이지 주소 : /JSPProject2/index.html
      목표 페이지 주소 : /JSPProject2/student/selectAll
    -->
    

  • 2) servlet

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    @WebServlet("/jstl")
    public class JSTLServlet extends HttpServlet {
      
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
        RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/jstl.jsp");
        
        dispatcher.forward(req, resp);
      }
    }
    
  • 3) JSP

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    💡 상단에 작성
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!--
      prefix : 접두사
      uri(Uniform Resource Identivier) : 자원을 구분하는 식별자(주소 형태)
    -->
      
    ----------------------------- 생략 -----------------------------
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    ✔️ 1. 변수 선언 ( c:set 태그 )
      - 변수를 선언하고 값을 초기화하는 태그 (원하는 scope의 내장 객체에 값을 세팅)
      - c:set 속성
      1) var : 변수명(setAttribute의 key 값)
      2) value : 대입될 값
      3) scope : 내장 객체 범위 (기본값 : page)
      
    <!-- scriptlet 작성법 -->
    <% pageContext.setAttribute("num1", 10); %>
      
    <!-- JSTL 작성법 -->
    <c:set var="num2" value="20" />
      
    ${ num1 } / ${ num2 }
      
    <!-- request scope에 num2 세팅 -->
    <c:set var="num2" value="300" scope="request" />
      
    <h4>${num2}</h4> <!-- 20, 우선순위 -->
    <h4>${requestScope.num2}</h4> <!-- 300 -->
      
    <c:set var"temp" value="임시 값" scope="session" />
    <h4>temp : ${temp}</h4>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    ✔️ 2. 변수 삭제 ( c:remove )
      - c:set / setAttribute()로 추가된 값 제거
      
      - c:remove 속성
      1) var : 삭제할 변수명(key)
      2) scope : 삭제할 내장 객체 범위(기본값 : 모든 범위)
      
    <c:remove var="temp">
    temp 삭제 확인 : ${temp} <br>
      
    <c:set var="test" value="page" scope="page" />
    <c:set var="test" value="request" scope="request" />
    <c:set var="test" value="session" scope="session" />
    <c:set var="test" value="application" scope="application" />
      
    <!-- 모든 범위 삭제 -->
    <%-- <c:remove var="tset" /> --%>
      
    <c:remove var="test" scope="request" />
      
    ${pageScope.test} / ${requestScope.test} / ${sessionScope.test} / ${applicationScope.test}
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    ✔️ 3. 조건문 - if ( c:if 태그 )
      - 단독 if문 (else 없음)
      
      * 주의사항 *
      1) test 속성 값 작성은 무조건 EL 구문이어야만 한다
      2) test 속성값 "" 안에는 공백이 존재해서는 안된다
      
    <%-- scriptlet 작성법 --%>
    <% if(1 == 1){ %>
      출력됩니다.
    <% } %>
      
    <%-- JSTL 작성법 --%>
    <c:if test="${1 == 1}">
      JSTL 작성법
    </c:if>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    <%-- session 범위에 세팅된 test의 값이 "session"인 경우 --%>
    <%--
      - 문자열 비교시 (==) 비교연산자 사용 가능
      - 문자열임을 표기하는 리터럴 == ''(홑따옴표) / "" (쌍따옴표)
    --%>
      
    <c:if test='${ sessionScope.test == "session"}'>
      <h4>sessionScope.test == 'session'</h4>
    </c:if>
      
    <c:if test='${ sessionScope.test != "session"}'>
      <h4>sessionScope.test != 'session'</h4>
    </c:if>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    ✔️ 4. 조건문 - if ~ else if ~ else ( c:choose, c:when, c:otherwise )
    - c:choose : when, otherwise를 감싸는 태그
                (현재 태그 내부에 if ~ else if ~ else를 작성하겠다)
    - c:when : if/else if를 나타내는 태그
              속성은 test 밖에 없음(조건 작성 속성)
    - c:otherwise : else를 나타내는 태그
                    아무런 속성도 존재하지 않음
      
    <c:set var="temp2" value="100" />
      
    <c:choose>
      
      <c:when test="${temp2 > 100}">
        100보다 크다
      </c:when>
        
      <c:when test="${temp2 < 100}">
        100보다 작다
      </c:when>
      
      <c:otherwise>
        100과 같다
      </c:otherwise>
      
    </c:choose>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    ✔️ 5. 반복문 ( c:forEach 태그 )
    - 일반 for + 추가 기능
    - 속성
      1) var	: 현재 반복 횟수에 해당하는 변수 (int i)
      2) begin  : 반복 시 var 시작 값
      3) end	: 반복이 종료될 var 값
      4) step	: 반복 시 마다 var의 증가 값 (기본값 1)
      5) items	: 반복 접근한 객체(배열, 컬렉션 객체)
        
      6) varStatus : 현재 반복 상태와 관련된 정보를 제공하는 변수 선언	
        
        varStatus="변수명"
        -> c:forEach 구문 내에서 "변수명"을 통해 원하는 값을 얻을 수 있다
          
        * varStatus에서 제공되는 값
        - current : 현재 반복 횟수(현재 var 값)
                    또는 현재 반복 접근 중인 객체(컬렉션/배열 요소)
        - index : 현재 인덱스 값 반환 (0부터 시작)
        - count : 현재 몇 바퀴인지 반복 횟수 반환 (1부터 시작)
        - first : 첫 번째 반복이면 true, 아니면 false
        - last : 마지막 반복이면 true, 아니면 false
    
    1
    2
    3
    4
    
    ✔️ 일반 for문 형식으로 사용
    <c:forEach var="i" begin="1" end="6" step="1">
      <h${i}> 현재 i 값 : ${i} <h${i}>
    </c:forEach>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    ✔️ 일반 for문 + varStatus
    <table border="1">
      <c:forEach var="n" begin="1" end="10" varStatus="vs">
        <c:choose>
          <%-- choose 내부에는 무조건 JSP 주석만 작성 --%>
          <%-- 첫번째 반복일 경우 --%>
          <c:when test="${vs.first}">
            <tr>
              <th class="first"> ${n} </th>
              <th class="first"> ${n}번 게시글 입니다 </th>
            </tr>
          </c:when>
          
          <c:when test="${vs.last}">
            <tr>
              <th class="last"> ${n} </th>
              <th class="last"> ${n}번 게시글 입니다 </th>
            </tr>
          </c:when>
      
          <c:otherwise>
            <tr>
              <th> ${n} </th>
              <th> ${n}번 게시글 입니다 </th>
            </tr>
          <c:otherwise>
        </c:choose>
      </forEach>
    </table>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    ✔️ 향상된 for문 형식으로 사용
    <form action="forEach" method="get">
      <input type="checkbox" name="lang" value="java"> java <br>
      <input type="checkbox" name="lang" value="sql"> sql <br>
      <input type="checkbox" name="lang" value="jdbc"> jdbc <br>
      <input type="checkbox" name="lang" value="html"> html <br>
      <input type="checkbox" name="lang" value="css"> css <br>
      <input type="checkbox" name="lang" value="javascript"> javascript <br>
      <input type="checkbox" name="lang" value="jQuery"> jQuery <br>
      <input type="checkbox" name="lang" value="servlet"> servlet <br>
      <input type="checkbox" name="lang" value="jsp"> jsp <br>
      
      <button>제출</button>
    </form>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    [servlet]
      
    @WebServlet("/forEach")
    public class ForEachServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
        List<Person> pList = new ArrayList<>();
        
        pList.add(new Person("홍길동", 25, "서울시 중구"));
        pList.add(new Person("고길동", 26, "서울시 강북구"));
        pList.add(new Person("박길동", 45, "서울시 성동구"));
        pList.add(new Person("강길동", 17, "서울시 서대문구"));
        pList.add(new Person("김길동", 35, "서울시 성북구"));
        
        req.setAttribute("pList", pList);
        
        // 요청위임
        RequestDispatcher dispatcher = req.getRequestDispatcher("WEB-INF/views/forEach.jsp");
        
        dispatcher.forward(req, resp);
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    [JSP]
      
    param.lang : 파라미터 중 lang의 값을 얻어와 출력 단, lang 이름의 파라미터가 여러개면 첫번째만 얻어온다
      
    paramValues.lang : lang이라는 이름의 파라미터를 모두 얻어와 배열로 반환
      
    ${param.lang} / ${paramValues.lang[0]} / ${paramValues.lang[1]}
      
    <c:choose>
      <c:when test="${empty paramValues.lang}">
        <h1 style="color:orangered"> 체크된 값이 없습니다 </h1>
      </c:when>
      
      <c:otherwise>
        <ul>
          <c:forEach var="chk" itesm="${paramValue.lang}" varStatus="vs">
            <li>
              index : ${vs.index} <br>
              count : ${vs.count} <br>
              current : ${vs.current} <br>
              first : ${vs.first} <br>
              last : ${vs.last}
            </li>
          </c:forEach>
        </ul>
      </c:otherwise>
    </c:choose>
    

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    ✔️ 객체 배열 / 컬렉션 반복 접근하기
      
    [JSP]
      
    <table>
      <c:forEach var="person" items="${requestScope.pList}">
        <tr>
          <th>${person.name}</th>
          <td>#{person.age}</td>
          <td>#{person.address}</td>
        </tr>
      </c:forEach>
    </table>