06. JSTL
JSTL(Jsp Standard Tag Library)
1
2
🔸JSP에서 자주 사용되거나 공통적으로 사용되는 Java 코드를 표기법을 간단히 태그화 하여 표준으로 제공하는 것
(if, for, 배열/컬렉션 길이, 문자열 치환, 숫자 데이터 형식 변경, 데이터 파싱, scope 변수 선언 등)
- JSTL 라이브러리 등록 방법
Jar Files → Impl, Spec, EL 다운로드
webapp/WEB-INF/lib 폴더에 추가하기
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>