처음부터 차근차근
jstl 본문
jstl
자바서버 페이지 표준 태그 라이브러리(JavaServerPages(JSP) Standard Tag Library)
jstl이란 for문이나 if문 등의 여러 자바 코드들을 태그 형식으로 사용할 수 있게 하는 라이브러리 이다.
jstl은 스파게티 코드를 해결하기 위해 만들어졌다.
스파게티 코드란 웹 문서 여러군데에 java 코드가 끼워져 있어서 전체적으로 복잡하고, 한 번에코드 수정하기 어려운 코드 상태를 말한다.
db에서 가져온 데이터로 list를 출력해야하는 경우 어쩔 수 없이 while문이나 for문을 써야하는데 여기서 쓰이는 java 코드를 태그화 시키기 위해 만든 것이라고 생각하면 편하다.
jstl 다운로드 및 사용 방법
https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
1. 링크로 들어가서 jar 버튼을 클릭하여 다운받는다.
2. 다운받은 jar 파일을 WEB-INF / lib 아래에 넣는다.
3. jsp 파일 맨 위에 jstl 페이지 지시자를 넣는다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
앞으로 c라는 이름으로 jstl core 라이브러리 기능을 쓰겠다는 뜻이다.
이름은 변경해도 되는데 보편적으로 c라는 이름을 쓴다.
이렇게 하면 jstl 라이브러리의 core 기능을 사용할 수 있다.
+ 접두사 c를 사용하는 이유
jsp는 jstl이 접두사를 사용하지 않으면 그 코드를 인식하지 못한다.
jstl 페이지 지시자의 uri는 tag를 식별하는 식별자 역할을 한다.
그래서 원래 <foreach>이런 코드 앞에다 저 기다란 uri를 다 적어야하는데 너무 길기 때문에 이름을 따로 정해서 저 c라는 이름을 앞에다 붙이는 것이다.
jsp가 일을 처리하다가 태그 안에 c라는 키워드를 보면 이 태그가 taglib임을 그제서야 인식한다.
jstl 태그 라이브러리 종류
core : 제어 행위 (for, if...)
formating : 날짜, 숫자 등 포맷 설정
function : 문자열 쪼개기, 소문자 대문자로 바꾸기 등
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!--core-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!--format-->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <!--funtion-->
<c:foreach>
<c:foreach var="a" items="${list}" begin="3" end="5" varStatus="status">
${a.name}
</c:foreach>
request 저장 객체에 담긴 list값을 하나씩 a라는 변수에 넣어 반복한다.
3번째 인덱스 부터 5번째 인덱스까지만
==
<%
List<People> list = (List<People>)request.getAttribute("list");
for (People a : list) {
pageContext.setAttribute("a", a);
}
%>
${a.name}
varStatus
${status.current} : 현재 객체
${status.index} : 현재 인덱스(0부터)
${status.count} : 현재 순서(1부터), 반복 횟수를 의미함
${status.first} : 현재 루프가 처음이면 true
${status.last} : 현재 루프가 마지막이면 true
${status.begin} : 설정한 begin 값
${status.end} : 설정한 end 값
${status.step} : 증가값(여기다 5를 넣으면 반복할 때마다 5씩 증가)
+
<c:foreach var="a" begin="3" end="5">
${a}
</c:foreach>
이러면 3, 4, 5 출력됨.
<c:if>
<c:if test="${people.name ne ''}">
${people.name}
</c:if>
people.name이 ''가 아니면 출력한다는 뜻
<c:set>
<c:set var="number" value="${10*10}"/>
${number}
pageContext 저장객체에 number이라는 이름으로 100이라는 값을 넣는다.
<c:forTockens>
지정한 구분자를 기준으로 문자열을 끊어주는 기능을 한다.
<c:forTockens var="people_file" items="${people.file}" delims="," varStatus="status">
${people_file}
<c:if test="${!status.last}">
,
</c:if>
</c:forTockens>
people.file 문자열을 , 로 쪼개고 쪼갠값을 하나 당 한 번 반복한다.
<fmt:formatDate>
<fmt:formatDate pattern="yyyy-MM-dd hh:mm:ss" value="${writeday}" />
writeday의 값을 yyyy-MM-dd hh:mm:ss 형식으로 출력한다.
<fmt:formatNumber>
<fmt:formatNumber value="${price}" />
<fmt:formatNumber value="${price}" type="currency" currencySymbol="₩" /></p>
<fmt:formatNumber type="number" groupingUsed="true" value="${price}" /></p>
<fmt:formatNumber type="number" maxIntegerDigits="3" value="${price}" /></p>
<fmt:formatNumber type="number" maxFractionDigits="6" value="${price}" /></p>
<fmt:formatNumber type="percent" maxIntegerDigits="4" value="${price}" /></p>
<fmt:formatNumber type="number" pattern="#,###원" value="${price}" /></p>
1. price의 값을 세자리마다 ,를 찍는다.
ex) 2,500
2. \2,500
${fn:toUppercase(file_name)}
file_name의 값(문자열)을 모두 대문자로 바꾼다.
${fn:endsWith(file_name, '.png')}
file_name의 값(문자열)이 .png로 끝나면 true 아니면 false를 반환한다.
Pagination
현재페이지로 페이지 블럭의 시작 숫자 구하기 : 현재 페이지 - (현재 페이지 - 1) % 페이지에서 한 번에 보여질 페이지 개수
ex) startNum = page - (page - 1) % 5
시작 숫자로 다음 페이지 블럭 첫 숫자 구하기 : 시작 숫자 + 페이지에서 한 번에 보여질 페이지 개수
ex) startNum + 5
if (startNum + 5 < lastNum) 다음;
else if (startNum + 5 >= lastNum) alert('다음 페이지 없음');
시작 숫자로 다음 페이지 블럭 첫 숫자 구하기 : 시작 페이지 - 1
ex) startNum - 1
if (startNum > 1) 이전;
else if (startNum <= 1) alert('이전 페이지 없음');
심화 : tag library 직접 만들기
WEB-INF / 파일명.tld
<taglib>
<tlib-version>2.1</tlib-version>
<jspversion>1.1</jspversion>
<short-name>mytags</short-name>
<uri>http://dddd/dddd/dd/d</uri>
<tag>
<name>formatNumber</name>
<tag-class>tk.itstory.jsp.customtags.NumberFormatterTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
src / com.ksy.web.taglib 아래다 Tag class 새로 만들기
public class Tag extends TagSupport {
private String format;
private String number;
@Override
public void doStartTag() throws JspException { // 태그가 시작할 때 실행 ex) <c:foreach>
}
@Override
public void doEndTag() throws JspException { // 태그가 끝났을 때 실행 ex) </c:foreach>
}
@Override
public void doAfterTag() throws JspException { // 태그 사이의 body가 끝났을 때 실행 ex) </td>
}
}
사용
<%@ taglib prefix="my" uri="http://dddd/dddd/dd/d"%>
출처 : https://www.youtube.com/playlist?list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd 변형 및 요약
'프로그래밍 > JSP' 카테고리의 다른 글
JDBC (0) | 2022.01.12 |
---|---|
기업형 mvc 모델과 파일 업로드, String.join() (0) | 2022.01.11 |
model1과 model2 방식 특징, 라이브러리의 위치, View 페이지 은닉 (0) | 2022.01.09 |
EL (0) | 2022.01.08 |
JSP (0) | 2022.01.06 |