평범한 연구소

[JSP|Servlet] JSTL | Core, Fomatting, JSTL Functions 본문

Pront/Javascript

[JSP|Servlet] JSTL | Core, Fomatting, JSTL Functions

soyeonisgood 2022. 10. 4. 20:51

JSTL (JSP Standard Tag Library)

  • JSP에서는 사용자가 태그를 정의해서 사용하는 것이 가능. 이런 사용자 정의 태그를 커스텀 태그라고 하는데 이들 중 자주 사용하는 것을 표준으로 만들어 놓은 것이 JSTL.
  • JSTL은 JSP의 공통적인 핵심 기능을 캡슐화한 태그 모음.
  • JSTL은 반복(iteration) 및 조건문, XML 문서 조작을 위한 태그, 국제화 태그 및 SQL 태그와 같은 일반적인 구조 작업 지원.
  • JSTL 과 커스텀 태그 및 JSP 액션태그는 XML 기반에서 작성되었기 때문에 모든 태그는 시작 태그와 종료 태그의 쌍으로 이루어져야한다.
  • 시간, 날짜, 숫자의 포맷이나 문자열 가공 등의 처리에서 비즈니스 로직과 프러젠테이션 로직을 분리할 수 있다.
  • EL(Expression Language)를 사용하여 표현.

 

JSTL 태그 종류

  • Core tags
  • Fomatting tags
    • 기능: 지역, 메시지 형식, 숫자 및 날짜 형식 등
    • 접두어(prefix): fmt
    • 참조 구문: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • JSTL function
    • 기능: 컬렉션 처리, String 처리 등
    • 접두어(prefix): fn
    • 참조 구문: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions %>

 

JSTL Core 태그

  • 일반 프로그램 언어에서 제공하는 변수선언, 조건, 제어, 반복문 등의 기능 제공
< c:out > 수식(expression)의 결과를 출력. <%= %> 과 유사.
< c:set > JSP에서 사용할 변수 설정
< c:if > 조건에 따라 내부 코드 실행
< c:choose > 여러 조건 처리할 때 사용
< c:when > <c:choose> 하위 태그, 조건에 따라 내부 코드 실행
< c:otherwise > <c:choose> 하위 태그, <c:when> 조건 만족한 것이 없을 경우 실행
< c:forEach > 고정된 횟수 또는 컬렉션, Map의 각 항목을 처리할 때 사용하는 반복문
< c:forTokens > 제공된 구분자(delimeter)로 구분된 토큰을 반복. 문자열을 토큰으로 분할하고 각 토큰을 반복하여 출력 생성하는 데 사용
< c:param > 주로 <c:url>, <c:redirect>, <c:import> 태그와 함께 사용하며 매개변수를 추가

 

 

< JSTL Core 태그 예제 >

c:forEach

  • 고정된 횟수 또는 컬렉션에 대해 중첩 본문 컨텐츠를 반복하는 데에 사용되는 반복 태그.
  • 형식
컬랙션 내의 반복
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"]
		[end="end"] [step="step"]>
  ...
</c:forEach>

정수 범위 내의 반복
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin"
		end="end" [step="step"]>
  ...
</c:forEach>
  • 주요 속성
    • var : 사용할 변수
    • items : Collection 객체(List, Map 등), begin속성과 end속성이 없는 경우 필수
    • varStatues : 반복 상태를 알 수 있는 변수 
      • current : 현재 인덱스의 객체
      • index : 루프 실행에서의 현재 인덱스 (0부터 시작)
      • count : 루프의 실행 횟수 (1부터 시작)
      • first : 현재 실행이 첫번째인 경우 (true)
      • last : 현재 실행이 마지막이면 true
      • begin : begin 속성 값
      • end : end 속성 값
      • step : step 속성 값
    • begin : 반복 시작 인덱스. 정의되지 않을 경우 0. item속성이 없으면 필수.
    • end : 반복 종료 인덱스. items 속성이 없으면 필수.
    • step : 반복할 때마다 건너뛸 인덱스 개수.
<c:forEach var="n" begin="1" end="9" step="1"> <!-- step: 증가분. 1이면 생략 가능 -->
	${param.num} * ${n} = ${param.num * n} <br>
</c:forEach>

<c:forEach var="dan" begin="2" end="9">
	<p> ** ${dan} 단 ** </p>
	<c:forEach var="n" begin="1" end="9">
		${dan} * ${n} = ${dan * n} <br>
	</c:forEach>
	<p> --------------------- </p>
</c:forEach>
ex15.jsp
<%
	request.setCharacterEncoding("utf-8");

	List<String> list = new ArrayList<>();
	list.add("서울");
	list.add("부산");
	list.add("대구");
	
	request.setAttribute("list", list);
	request.setAttribute("subject", "자바,스프링,HTML,CSS,서블릿");
%>

...

ex15_ok.jsp
<h3>forEach : Collection 객체 반복</h3>
<!-- items는 향상된 for문과 유사. -->
<c:forEach var="a" items="${list}">
	<p>${a}</p>
</c:forEach>

<h3>forEach : 메소드 사용</h3>
<p>${subject}</p>
<c:forEach var="a" items="${subject.split(',')}"> 
	<p>${a}</p>
</c:forEach>

 

ex16.jsp
<%
	request.setCharacterEncoding("utf-8");

	List<User> list = new ArrayList<>();
	
	list.add(new User("홍길동", 20,"010-1111-1111","자바"));
	list.add(new User("너너너", 21,"010-1111-2222","HTML"));
	list.add(new User("도도도", 21,"010-1111-3333","CSS"));
	list.add(new User("가가가", 20,"010-1111-1000","servlet"));
	list.add(new User("후후후", 23,"010-1111-2000","oracle"));
	
	request.setAttribute("list", list);
	
%>

...

ex16_ok.jsp
<h3>forEach : Collection 객체 반복 출력</h3>

<h3>forEach와 EL을 이용한 출력</h3>
<c:forEach var="vo" items="${list}">
	<p> ${vo.name} | ${vo.age} | ${vo.tel} | ${vo.subject}
</c:forEach>
<hr>

<h3>반복 상태 확인: varStatus 속성</h3>
<!-- index:0부터 순서, count:1부터 순서, first:처음여부, last:마지막여부 -->
<c:forEach var="vo" items="${list}" varStatus="status">
	<p>
		${vo.name} | ${vo.age} | ${vo.tel} | ${vo.subject} |
		${status.index } | ${status.count } | ${status.first} | ${status.last }
	</p>
</c:forEach>
  • Map 접근 가능
ex17.jsp
<%
	Map<String, Object> m = new HashMap<>();
	m.put("name", "이이이");
	m.put("age", 20);
	m.put("subject", "servlet");
	
	List<Map<String, Object>> list = new ArrayList<>();
	Map<String, Object> a;
	
	a = new HashMap<>();
	a.put("name", "가나다");
	a.put("city", "서울");
	list.add(a);
	
	a = new HashMap<>();
	a.put("name", "누누누");
	a.put("city", "경기");
	list.add(a);
	
	a = new HashMap<>();
	a.put("name", "마마마");
	a.put("city", "인천");
	list.add(a);
	
	request.setAttribute("map", m);
	request.setAttribute("list", list);
%>

...

ex17_ok.jsp
<h2> EL 및 JSTL에서 Map 접근</h2>

<h3>EL에서 Map 접근</h3>
<p> ${map.name} | ${map.age} | ${map.subject}</p>
<hr>

<h3>JSTL에서 Map 접근</h3>
<c:forEach var="a" items="${map}">
	<p> ${a.key} : ${a.value} </p>
</c:forEach>

<h3>JSTL에서 List의 Map 접근</h3>
<c:forEach var="m" items="${list}">
	<p> ${m.name} | ${m.city} </p>
</c:forEach>

 

 

 

c:out

  • 표현식의 결과 출력.
  • 형식
body가 없는 경우
<c:out value="value" [escapeXml="{true|false}"] [dafault="기본값"]/>

body가 있는 경우
<c:out value="value" [escapeXml="{true|false}"]>
  • 주요 속성
    • value : 출력할 값
    • default : 변수가 null일 경우 대체 출력되는 값
    • escapeXml : "<", ">", 및 "&" 와 같은 문자의 사용 여부를 제어. true로 설정된 경우 이런 문자는 자동으로 해당 XML로 변환. (&lt;, &gt;, &amp; 등)
    •  
<h3>EL을 이용한 출력(글자는 red로 출력)</h3>
<p> ${msg} </p>
<hr>

<h3>c:out를 이용한 출력, 기본 escapeXml 이 true로 태그 문자는 그대로 태그 문자로 출력</h3>
<p> <c:out value="${msg}"/>
<hr>

<h3>c:out를 이용한 출력</h3>
<p> <c:out value="${msg}" escapeXml="false"/>

 

c:if

  • 조건문. else 구문이 없다.
  • 형식
<c:if test="condition" [var="varName"] [scope="{page|request|session|application}"]>
  • 주요 속성
    • test : 본문 내용의 실행 여부를 결정하는 조건식. true이면 본문 실행.
    • var : 테스트 조건 결과를 저장할 boolean형 변수.
    • scope : 조건 결과를 저장할 변수(var에 선언된 변수)의 scope
<c:if test="${not empty param.num}">
	<p>
		${param.num} : ${ param.num % 2 == 0 ? "짝수" : "홀수" }
	</p>
</c:if>
<hr>

<c:if test="${not empty param.num}">
	<p>
		${param.num} : 
		<c:if test="${param.num % 2 == 0}">
			짝수
		</c:if>
		<c:if test="${param.num % 2 == 1}">
			홀수
		</c:if>
	</p>
</c:if>

 

c:choose, c:when, c:otherwise

  • 여러 조건 중 하나의 조건을 선택하여 실행
  • <c:when> 조건에 만족하는 것이 없으면, <c:otherwise> 태그 내의 본문을 실행한다.
  • 주요 속성
    • test : 본문 내용의 실행 여부를 결정하는 조건식. true이면 본문 실행.
<c:if test="${not empty param.num }">
<p>
	${param.num} : 
	<c:choose>
		<c:when test="${param.num%3==0 && param.num%4==0}">
			3과 4의 배수
		</c:when>
		<c:when test="${param.num%3==0}">
			3의 배수
		</c:when>
		<c:when test="${param.num%4==0}">
			4의 배수
		</c:when>
		<c:otherwise>
			3 또는 4의 배수가 아님
		</c:otherwise>
	</c:choose>
</p>
</c:if>

 

c:set

  • <jsp:setProperty> 액션 태그와 유사. 표현식의 결과를 특정 범위(scope)에 저장한다.
  • 형식
<c:set [var="varName"] [value="value"] [target="target" property="propertyName"] 
		[scope="{page|request|session|application"]/>}
  • 주요 속성
    • value : 저장할 값 또는 수식
    • var : 값을 저장할 변수 이름
    • target : JavaBean 또는 java.util.Map의 경우, 속성을 설정할 객체의 이름. JavaBean인 경우에는 해당 setter 속성이 있어야한다.
    • property : JavaBean 또는 java.util.Map의 경우, 값을 설정하는 객체의 속성.
    • scope : 값을 저장할 변수(var에 선언된 변수)의 scope
<c:set var="n" value="2"/>
<c:set var="result" value="1"/>
<c:forEach var="a" begin="1" end="10">
	<c:set var="result" value="${n*result}"/>
	<p> ${n} ** ${a} = ${result } </p>
</c:forEach>

 

c:url

  • url을 만들어 URL 인코딩 또는 URL 형식 지정에 사용
  • context 속성이 지정된 경우, value와 context의 값은 / 로 시작해야한다.
  • context path가 자동으로 추가.
  • response.encodeURL() 에 대한 호출 작성의 대체 방법으로 사용된다.
  • 형식
<c:url value="value" [context="context"] [var="varName"] 
			[scope="{page|request|session|application"]/>}
  • 주요 속성
    • value : 기본 URL
    • context : / 다음에 오는 로컬 어플리케이션의 이름. 기본값은 컨텍스트.
    • var : 처리된 URL을 표시할 변수명. 기본값은 표시되는 페이지
    • scope : 값(url)을 저장할 변수의 scope

c:param

  • c:import, c:url 태그에 파라미터를 전달하기 위한 태그.
  • 형식
<c:param name="name" value="value"/>
  • 주요 속성
    • name : 파라미터 이름
    • value : 파라미터 값
<!-- 파라미터를 인코딩하여 주소를 만든다. -->
<c:url var="a" value="ex20_ok.jsp">
	<c:param name="name" value="홍길동"/>
	<c:param name="age" value="20"/>
</c:url>

...

<%
	request.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String age = request.getParameter("age");		
	
	name = URLDecoder.decode(name, "utf-8");
%>
<p>이름 : <%=name %></p>
<p>나이 : <%=age %></p>

 

c:import

  • jsp:include 액션 태그와 유사
  • 서버 내부 및 서버 외부 자원의 내용을 포함하는 추가 기능이 있다.
  • 형식
파라미터를 추가하지 않는 경우
<c:import url="url" [context="context"] [var="varName"] [varReader="varReaderName"] 
	[scope="{page|request|session|application"] [charEncoding="charEncoding"]/>
    
파라미터 추가    
<c:import url="url" [context="context"] [var="varName"] [varReader="varReaderName"] 
	[scope="{page|request|session|application"] [charEncoding="charEncoding"]>
  <c:param name="name" value="value"/>
</c:import>
<h3> 내부 자원 포함 </h3>
<c:set var="a" value="ex11.jsp"/>
<c:import var="u" url="${a}"></c:import>
<p> <c:out value="${a}"/> 소스 보기 </p>
<c:out value="${u}"/>
<hr>

<p> <c:out value="${a}"/> 소스 실행 결과 보기 </p>
<c:out value="${u}" escapeXml="false"/>
<hr>

<p> c:import 에서 var 속성을 지정하지 않으면 바로 실행 결과 출력 </p>
<c:import url="ex19.jsp"/>

<h3> 외부 자원 포함 </h3>
<c:set var="a" value="https://www.naver.com"/>
<c:import var="u" url="${a}"/>
<p>네이버 홈페이지</p>
<c:out value="${u}" escapeXml="false"></c:out>
<hr>

<p>네이버 소스보기</p>
<c:out value="${u}"/>
<hr>

 

c:forTokens

  • 제공된 delimeter로 구분된 토큰을 반복한다.
  • 문자열을 토큰으로 분할하고 각 토큰을 반복하여 출력을 생성하는 데 사용된다.
  • 형식
<c:forTokens items="stringOfTokens" delims="delimiter" [var="varName"] [varStatus="varstatusName"]
	[begin="begin"] [end="end"] [step="step"]>
...
</c:forTokens>
  • 주요 속성
    • varStatus : 반복 상태를 알 수 있는 변수
    • delims : 문자열을 분류하는 기호
    • begin : 지정된 인덱스에 있는 초큰에서 반복 시작. 첫번째 토큰의 인덱스는 0.
    • end : 지정된 인덱스의 토큰에서 반복 종료.
<!-- 제공된 구분자로 구분된 토큰을 반복 출력 -->
<c:forTokens var="color" items="red,blue,green" delims=",">
	색상명 : <c:out value="${color}"/><br>
</c:forTokens>

 

 

JSTL Formatting 태그

  • 숫자, 날짜, 시간을 포맷팅하는 기능과 국제화, 다국어 지원 기능 제공.
< fmt:formatNumber > 특정 형식이나 정밀도로 숫자 값을 형식화하여 출력.
< fmt:formatDate > 날짜 정보를 담고 있는 객체를 포맷팅하여 출력
< fmt:setLocale > 로케일 지정.

 

< JSTL Fomatting 태그 예제 >

<p> default local : <%= response.getLocale() %> </p>
<p> default local : ${pageContext.response.locale }</p>
<hr>

<h3>통화기호</h3>
<p> 디폴트 : <fmt:formatNumber value="12345.6789" type="currency"/> </p> <!-- ₩12,346 -->

<p>
	<fmt:setLocale value="en_US"/>
	en_US 통화 : <fmt:formatNumber value="12345.6789" type="currency"/>
</p>	  <!-- $12,345.68 -->

<p>
	<fmt:setLocale value="ko_KR"/>
	kr_KO 통화 : <fmt:formatNumber value="12345.6789" type="currency"/>
</p>
<hr>

<h3>숫자</h3>
<p> number : <fmt:formatNumber value="12345.67890" type="number"/> </p>
<p> currency : <fmt:formatNumber value="12345.6789" type="currency"/> </p>
<p> currency : <fmt:formatNumber value="12345.6789" type="currency" currencySymbol="W"/> </p>
<p> percent : <fmt:formatNumber value="0.756" type="percent"/> </p>
<p> pattern=".0" : <fmt:formatNumber value="123455.6789" pattern=".0"/> </p>
<p> pattern : <fmt:formatNumber value="123455.6789" pattern="#,##0.0"/> </p>
<p> pattern : <fmt:formatNumber value="0.6789" pattern="#,##0.0"/> </p>
<p> pattern : <fmt:formatNumber value="0.6789" pattern="#,###.0"/> </p>
<p> pattern : <fmt:formatNumber value="12455.6789" pattern="₩#,##0.0"/> </p>

<h3>날짜</h3>
<c:set var="now" value="<%= new java.util.Date() %>"/>
<p> ${now } </p>
<p> date : <fmt:formatDate value="${now}" type="date"/> </p>
<p> time : <fmt:formatDate value="${now}" type="time"/> </p>
<p> both : <fmt:formatDate value="${now}" type="both"/> </p>

 

JSTL function 태그

  • 문자열을 처리하는 함수를 제공.
fn:contains(A, B) 문자열A에 문자열B가 포함된 경우 true 반환.(대소문자 구분)
fn:containsIgnoreCase(A, B) 문자열A에 문자열B가 포함된 경우 true 반환.(대소문자 구분X)
fn:startsWith(A, B) 문자열A의 시작이 B로 시작하는지 확인
fn:endsWith(A, B) 문자열A의 끝이 B로 끝나는 경우 true 반환
fn:indexOf(A, B) 문자열A에서 B가 처음 위치하는 인덱스 반환. 없으면 -1.
fn:length(A) 문자열A 길이
fn.replace(A, B) 문자열A에서 B에 해당하는 문자를 찾아 C로 변환
fn:substring(A, B, C) A에서 인덱스번호 B부터 C까지 해당하는 문자열 반환
fn.substringAfter(A, B) A에서 B가 나타내는 이후의 문자열 반환
fn.substringBefore(A, B) A에서 B가 나타내는 이전의 문자열 반환
fn.toUpperCase(A) A를 모두 대문자로 반환

 

< JSTL function 태그 예제 >

<c:set var="str" value="seoul korea"/>

<p> ${fn:contains(str, "kor") ? "kor존재" : "kor없음" } </p>
<p> ${fn:containsIgnoreCase(str, "KOR") ? "kor 존재" : "kor 없음" } </p>
<p> ${fn:startsWith(str, "seoul") ? "seoul 로 시작" : "seoul로 시작하지 않음" } </p>
<p> ${fn:endsWith(str, "korea") ? "korea 로 끝남" : "korea로 끝나지 않음" } </p>
<p> kor의 위치 : ${fn:indexOf(str, "kor") } </p>
<p> substring(str, 6, 9) : ${fn:substring(str, 6, 9) } </p>
<p> substringAfter(str, "seoul") : ${fn:substringAfter(str, "seoul") } </p>
<p> substringBefore(str, "korea") : ${fn:substringBefore(str, "korea") } </p>
<p> length(str) : ${fn:length(str) } </p>
<p> replace(str, "korea", "한국") : ${fn:replace(str, "korea", "한국") }</p>
<p> 대문자로 : ${fn:toUpperCase(str) }

 

'Pront > Javascript' 카테고리의 다른 글

[Javascript] 쿠키와 세션  (0) 2022.10.08
[Javascript] 간단한 유효성 검사  (0) 2022.10.05
[JSP|Servlet] 표현언어(EL)  (0) 2022.10.04
[JSP|Servlet] JDBC  (0) 2022.10.02
[JSP|Servlet] 에러 페이지  (0) 2022.10.02