처음부터 차근차근

jstl 본문

프로그래밍/JSP

jstl

_soyoung 2022. 1. 10. 01:46
반응형

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
Comments