Preface
이번 장에선JSP의 라이브러리인 JSTL을 공부했다.
기본적인 HTML 태그 형태에 EL을 추가한 느낌이라 특별히 어려운 부분은 없었다.
액션 태그 부분에서도 언급했지만, JSP의 특성상 스크립틀릿을 사용하면 코드가 지저분해지는 탓인지
JSP는 다른 언어에 비해 가독성을 높이기 위한 부가적인 기능이 많이 있는 것 같다.
JSP를 제대로 사용하려면 적어도 Core 태그 하위의 태그들 정도는 확실히 익히고 있어야 하지 않을까 싶다.
- 라이브러리 다운로드: https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
1. JSTL이란?
- JSTL(JSP Standard Tag Library): JSP에서 자주 사용하는 조건문, 반복문 등을 처리해주는 태그를 모아 표준으로 만들어둔 라이브러리
→ 스크립틀릿 없이 태그만으로 작성할 수 있다.
- JSTL 태그의 종류
1) Function 태그와 SQL 태그는 거의 사용하지 않는다.
2) JSTL을 사용하려는 JSP 파일에선 taglib 지시어를 추가해야 한다.
→ 접두어와 RUI가 사용된다.
<%@ taglib prefix="접두어" uri="URI 링크" %>
종류 | 기능 | 접두어 | URI |
Core 태그 | 변수 선언, 조건문/반복문, URL 처리 | c | https://java.sun.com/jsp/jstl/core |
Formatting 태그 | 숫자, 날짜, 시간 포맷 지정 | fmt | https://java.sun.com/jsp/jstl/fmt |
XML 태그 | XML 파싱 | x | https://java.sun.com/jsp/jstl/xml |
Function 태그 | 컬렉션, 문자열 처리 | fn | https://java.sun.com/jsp/jstl/functions |
SQL 태그 | DB 연결 및 쿼리 실행 | sql | https://java.sun.com/jsp/jstl/sql |
2. 코어(Core) 태그
- Core 태그: 변수 선언, 조건문, 반복문 등을 대체하는 태그
→ 접두어로 "c"를 사용한다.
태그명 | 기능 |
set | EL에서 사용할 변수를 설정한다. setAttrubute( )와 동일한 기능이다. |
remove | 설정한 변수를 제거한다. removeAttribute( )와 동일한 기능이다. |
if | 단일 조건문을 주로 처리한다. else문이 없다. |
choose | 다중 조건을 처리할 때 사용한다. 하위에 when~otherwise 태그가 있다. |
forEach | 반복문을 처리할 때 사용한다. 일반 for문과 향상된 for문 두 가지 형태로 사용할 수 있다. |
forTokens | 구분자로 분리된 각각의 토큰을 처리할 때 사용한다. StringTokenizer 클래스와 동일한 기능이다. |
import | 외부 페이지를 삽입할 때 사용한다. |
redirect | 지정한 경로로 이동한다. sendRedirect( )와 동일한 기능이다. |
url | 경로를 설정할 때 사용한다. |
out | 내용을 출력할 때 사용한다. |
catch | 예외 처리에 사용한다. |
1. <c:set> 태그: EL에서 사용할 변수나 자바빈즈를 생성할 때 사용한다.
- 형식
<c:set var="변수명" value="값" scope="영역" /> <!-- or --> <c:set var="변수명" scope="영역"> value 속성에 들어갈 값 </c:set>
- 속성
속성명 기능 var 변수명을 설정한다. value 변수에 할당할 값이다. scope 변수를 생성할 영역을 지정한다. page가 기본값이다. target 자바빈즈를 설정한다. property 자바빈즈의 속성(멤버 변수) 값을 지정한다.
- 변수와 자바빈즈 사용<%@ page import="java.util.Date"%> <%@ page import="common.Person"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="directVar" value="100" /> <c:set var="elVar" value="${ directVar mod 5 }" /> <c:set var="expVar" value="<%=new Date()%>" /> <c:set var="betweenVar">변수값 요렇게 설정</c:set> <h4>EL을 이용해 변수 출력</h4> <ul> <li>directVar : ${ pageScope.directVar }</li> <li>elVar : ${ elVar }</li> <li>expVar : ${ expVar }</li> <li>betweenVar : ${ betweenVar }</li> </ul> <h4>자바빈즈 생성 1 - 생성자 사용</h4> <c:set var="personVar1" value='<%=new Person("Kim", 50)%>' scope="request" /> <ul> <li>이름 : ${ requestScope.personVar1.name }</li> <li>나이 : ${ personVar1.age }</li> </ul> <h4>자바빈즈 생성 2 - target, property 사용</h4> <c:set var="personVar2" value="<%=new Person()%>" scope="request" /> <c:set target="${ personVar2 }" property="name" value="Park" /> <c:set target="${ personVar2 }" property="age" value="60" /> <ul> <li>이름 : ${ requestScope.personVar2.name }</li> <li>나이 : ${ personVar2.age }</li> </ul> </body> </html>
- 컬렉션을 변수로 설정<%@ page import="common.Person"%> <%@ page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h4>List 컬렉션 이용하기</h4> <% ArrayList<Person> pList = new ArrayList<Person>(); pList.add(new Person("Lee", 55)); pList.add(new Person("Choi", 60)); %> <c:set var="personList" value="<%=pList%>" scope="request" /> <ul> <li>이름 : ${ requestScope.personList[0].name }</li> <li>나이 : ${ personList[0].age }</li> </ul> <h4>Map 컬렉션 이용하기</h4> <% Map<String, Person> pMap = new HashMap<String, Person>(); pMap.put("personArgs1", new Person("Kim", 65)); pMap.put("personArgs2", new Person("Kang", 67)); %> <c:set var="personMap" value="<%=pMap%>" scope="request" /> <ul> <li>이름 : ${ requestScope.personMap.personArgs2.name }</li> <li>나이 : ${ personMap.personArgs2.age }</li> </ul> </body> </html>
2. <c:remove> 태그: <c:set> 태그로 설정한 변수를 제거할 때 사용한다.
- 형식<c:remove var="변수명" scope="영역" />
- 속성
→ 이름이 같은 변수를 사용할 땐 영역을 지정한 후 삭제해야 한다.
속성명 기능 var 삭제할 변수명을 설정한다. scope 삭제할 변수의 영역을 지정한다. 지정하지 않으면 모든 영역의 변수가 삭제된다.
- 사용 예시<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:set var="scopeVar" value="Page Value" /> <c:set var="scopeVar" value="Request Value" scope="request" /> <c:set var="scopeVar" value="Session Value" scope="session" /> <c:set var="scopeVar" value="Application Value" scope="application" /> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h4>출력하기</h4> <ul> <li>scopeVar: ${ scopeVar }</li> <li>requestScope.scopeVar: ${ requestScope.scopeVar }</li> <li>sessionScope.scopeVar: ${ sessionScope.scopeVar }</li> <li>applicationScope.scopeVar: ${ applicationScope.scopeVar }</li> </ul> <h4>session 영역에서 삭제하기</h4> <c:remove var="scopeVar" scope="session" /> <ul> <li>sessionScope.scopeVar: ${ sessionScope.scopeVar }</li> </ul> <h4>scope 지정 없이 삭제하기</h4> <c:remove var="scopeVar" /> <ul> <li>scopeVar: ${ scopeVar }</li> <li>requestScope.scopeVar: ${ requestScope.scopeVar }</li> <li>applicationScope.scopeVar: ${ applicationScope.scopeVar }</li> </ul> </body> </html>
3. <c:if> 태그: 자바의 if와 동일하게 제어 구문을 작성할 때 사용한다.
- 형식<c:if test="조건" var="변수명" scope="영역"> 조건이 true일 때 출력할 문장 </c:if>
- 속성
속성명 기능 test if문에서 사용할 조건을 지정한다. var 조건의 결과를 저장할 변수명을 지정한다. scope 변수가 저장될 영역을 지정한다.
- 사용 예시
1) EL이 아닌 일반 값이 오면 무조건 false를 반환한다.
→ 일반 값으로 true가 사용되는 것은 예외이다.
2) 문자열 'tRuE'는 대소문자에 상관없이 항상 true를 반환한다.
3) test 속성에 EL을 통해 조건식을 쓸 때 공백이 삽입되면 무조건 flase를 반환한다.
→ 공백은 조건식이 기술되는 큰따옴표와 EL식 사이를 의미한다.<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="number" value="100" /> <c:set var="string" value="JSP" /> <h4>JSTL의 if 태그로 짝수/홀수 판단하기</h4> <c:if test="${ number mod 2 eq 0 }" var="result"> ${ number }는 짝수입니다. <br> </c:if> result: ${ result } <br> <h4>문자열 비교와 else 구문 흉내내기</h4> <c:if test="${ string eq 'Java' }" var="result2"> 문자열은 Java입니다. <br> </c:if> <c:if test="${ not result2 }"> 'Java'가 아닙니다. <br> </c:if> <h4>조건식 주의사항</h4> <c:if test="100" var="result3"> EL이 아닌 정수를 지정하면 false </c:if> result3 : ${ result3 } <br> <c:if test="tRuE" var="result4"> 대소문자 구분 없이 "tRuE"인 경우 true <br> </c:if> result4 : ${ result4 } <br> <c:if test=" ${ true } " var="result5"> EL 양쪽에 빈 공백이 있는 경우 false <br> </c:if> result5 : ${ result5 } <br> </body> </html>
4. <c:choose>, <c:when>, <c:otherwise> 태그: 다중 조건을 통해 판단해야 할 때 사용한다.
- 형식<c:choose> <c:when test="조건1">조건1을 만족하는 경우</c:when> <c:when test="조건2">조건2을 만족하는 경우</c:when> <c:otherwise>아무 조건도 만족하지 않는 경우</c:otherwise> </c:choose>
- 사용 예시<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="number" value="100" /> <h4>choose 태그로 홀짝 판단하기</h4> <c:choose> <c:when test="${ number % 2 == 0 }"> ${ number }는 짝수입니다. </c:when> <c:otherwise> ${ number }는 홀수입니다. </c:otherwise> </c:choose> <h4>국, 영, 수 점수를 입력하면 평균을 내어 학점 출력</h4> <form> 국어: <input type="text" name="kor" /><br> 영어: <input type="text" name="eng" /><br> 수학: <input type="text" name="math" /><br> <input type="submit" value="학점 구하기" /> </form> <c:if test="${ not (empty param.kor || empty param.eng || empty param.math) }"> <c:set var="avg" value="${ (param.kor + param.eng + param.math) / 3 }" /> 평균 점수는 ${ avg }으로 <c:choose> <c:when test="${ avg >= 90 }">A 학점</c:when> <c:when test="${ avg >= 80 }">B 학점</c:when> <c:when test="${ avg >= 70 }">C 학점</c:when> <c:when test="${ avg >= 60 }">D 학점</c:when> <c:otherwise>F 학점</c:otherwise> </c:choose> 입니다. </c:if> </body> </html>
- 전송 방식과 URL을 입력하지 않으면 폼값은 현재 페이지로 쿼리스트링을 통해 전송된다.
5. <c:forEach> 태그: 반복을 위해 사용한다.
- 형식<!-- 일반 for문 --> <c:forEach var="변수명" begin="시작값" end="마지막값" step="증가값" /> <!-- 향상된 for문 --> <c:forEach var="변수명" items="컬렉션 혹은 배열" />
- 속성
속성명 기능 var 변수명을 지정한다. items 반복을 위한 객체를 지정한다. 배열, 컬렉션 등을 지정할 수 있따. begin 시작값을 지정한다. end 종료값을 지정한다. step 증가할 값을 지정한다. varStatus 루프의 현재 상태를 알려주는 변수의 이름을 지정한다.
- varStatus를 지정하면 <c:forEach> 루프의 상태 정보를 확인할 수 있다.
→ 반복의 시작과 끝을 쉽게 알 수 있다.
속성명 일반 for문 향상된 for문 current var에 지정한 현재 루프의 변숫값 반환 현재 루프의 실제 요소를 반환 index var에 지정한 현재 루프의 변숫값 반환 현재 루프의 인덱스를 표시(0~마지막) count 실제 반복 횟수(1~마지막) 일반 for문과 동일 first 루프의 처음일 때 ture 반환 일반 for문과 동일 last 루프의 마지막일 때 true 반환 일반 for문과 동일
6. <c:forTokens> 태그: 자바의 StringTokenizer 클래스처럼 구분자를 기준으로 문자열을 나눠 토큰의 개수만큼 반복한다.
- 형식<c:forTokens items="문자열" delims="문자열 구분자" var="변수명" />
7. <c:import> 태그: <jsp:include> 액션 태그처럼 외부 파일을 현재 위치에 삽입할 때 사용한다.
→ 같은 웹 애플리케이션에 속하지 않은 외부 페이지도 삽입할 수 있다.
- 형식
→ 매개변수로 전달할 값이 있다면 url에 쿼리스트링으로 직접 추가하거나 <c:param> 태그를 사용하면 된다.<c:import url="페이지 경로 혹은 URL" scope="영역" /> <!-- or --> <c:import url="페이지 경로 혹은 URL" var="변수명" scope="영역" /> ${ 변수명 } <!-- 선언과 삽입을 분리 -->
- 사용 예시<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <h4>OtherPage.jsp</h4> <ul> <li>저장된 값: ${ requestVar }</li> <li>매개변수 1: ${ param.user_param1 }</li> <li>매개변수 2: ${ param.user_param2 }</li> </ul>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:import url="https://goldenrabbit.co.kr/" />
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="requestVar" value="MustHave" scope="request" /> <c:import url="../inc/OtherPage.jsp" var="contents"> <c:param name="user_param1" value="JSP" /> <c:param name="user_param2" value="기본서" /> </c:import> <h4>다른 문서 삽입하기</h4> ${ contents } <h4>외부 자원 삽입하기</h4> <iframe src="../inc/GoldPage.jsp" style="width: 100%; height: 600px;"></iframe> </body> </html>
8. <c:redirect> 태그: response 내장 객체의 sendRedirect( )와 동일하게 페이지 이동을 처리한다.
- 형식
1) 매개변수를 전달하고 싶다면 <c:import> 태그와 동일하게 <c:param> 태그를 이용하거나 영역을 이용하면 된다.
2) 리다이렉트는 포워드와 달리 request 영역이 공유되지 않는다.<c:redirect url="이동할 경로 및 URL" />
9. <c:url> 태그: 지정한 경로와 매개변수를 이용해서 컨텍스트 루트를 포함한 URL을 생성한다.
→ 생성한 URL을 <a> 태그의 href 속성이나 <form> 태그의 action 속성에 사용할 수 있다.
- 형식<c:url value="설정한 경로" scope="영역" /> <!-- or --> <c:url value="설정한 경로" scope="영역" var="변수명" /> ${ 변수명 }
10. <c:out> 태그: JSP의 표현식처럼 변수를 출력할 때 사용한다.
→ 표현식과 달리 출력할 변수가 null일 때 default 속성에 지정한 기본값이 출력된다.
- 형식<c:out value="출력할 변수" default="기본값" escapeXml="특수문자 처리 유무" />
- 속성
속성명 기능 value 출력할 변수를 지정한다. escapeXml 특수 문자를 반환할지 여부를 결정한다. 기본값은 true로 특수 기호를 그대로 출력한다. default value 속성에 값을 지정하지 않을 경우 출력할 값을 지정한다.
→ 빈 문자열도 값이다.
11. <c:catch> 태그: 발생한 예외를 잡아 처리하며, 지정한 변수에 에러 메시지가 저장되어 전달된다.
- 형식<c:catch var="변수명" 실행 코드 </c:catch>
3. 국제화(Formatting) 태그
- Formatting 태그: 국제화 태그로 국가별로 다양한 언어, 날짜, 시간, 숫자 형식을 설정할 때 사용한다.
→ 접두어로 "fmt"를 사용한다.
- 태그의 종류
분류 | 태그명 | 기능 |
숫자 포맷 | formatNumber | 숫자 포맷을 설정한다. |
parseNumber | 문자열을 숫자 포맷으로 변환한다. | |
날짜 포맷 | formatDate | 날짜나 시간의 포맷을 설정한다. |
parseDate | 문자열을 날짜 포맷으로 변환한다. | |
타임존 설정 | setTimeZone | 시간대 설정 정보를 변수에 저장한다. |
timeZone | 시간대를 설정한다. | |
로케일 설정 | setLocale | 통화 기호나 시간대를 설정한 지역에 맞게 표시한다. |
requestEncoding | 요청 매개변수의 문자셋을 설정한다. |
4. XML 태그
- xml 태그: XML 문서를 처리하기 위한 태그로, XML 파싱 및 출력, 흐름 제어 등의 기능을 제공한다.
→ 접두어로 "x"를 사용한다.
- 태그의 종류
태그명 | 기능 |
out | select 속성에 지정한 XPath 표현식의 결과를 출력한다. |
parse | XML을 파싱할 때 사용한다. |
forEach | select 속성에 지정한 반복되는 노드를 파싱한다. |
if | select 속성에 지정한 XPath 표현식의 값을 하나의 조건으로 결정한다. |
choose | select 속성에 지정한 XPath 표현식의 값을 다중 조건으로 결정한다.(when, otherwise 사용) |
- 파싱(parsing): 주어진 데이터를 분석하여 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것
- XML 태그는 XML 문서의 요소에 접근하기 위해 XPath를 사용한다.
→ XPath: XML 문서의 노드를 식별하고 탐색
- 외부의 XML 문서는 <c:import> 태그를 통해 가져올 수 있다.
- 참고 사항
1) 외부 파일을 가져올 때는 한글 깨짐 현상을 방지하기 위해 charEncoding 속성을 사용해야 한다.
2) 슬래시(/)로 노드를 찾아 들어가는 형태로 작성한다.
3) XML 파싱에 조건문이나 반복문을 사용할 수 있다.
'JSP > 성낙현의 JSP 자바 웹 프로그래밍' 카테고리의 다른 글
서블릿(Servlet) (0) | 2023.06.26 |
---|---|
파일 업로드 및 다운로드 (0) | 2023.06.23 |
표현 언어(EL: Expression Language) (0) | 2023.06.19 |
JSP, Oracle을 사용한 회원제 게시판(페이징 O) (0) | 2023.06.19 |
JSP, Oracle을 사용한 회원제 게시판(페이징 X) (0) | 2023.06.16 |
댓글