개발 창고/Web

[JSTL] JSTL Function

로이제로 2020. 8. 31. 15:16
반응형

이전에 Core/Formatting에 대해서 알아보았습니다. 근데 SQL/XMl을 스킵하고 바로 JSTL Function 하는 이유는 SQL/XML 태그는 사용빈도가 적고 오히려 Core/Formatting/Function이 주로 쓰이기 때문입니다.

 

일단 이전 게시글을들은 아래의 링크에서 확인 가능합니다.

 

2020/08/26 - [개발 창고/웹 개발] - [JSTL] Core태그

 

[JSTL] Core태그

Spring에서 JSP로 개발을 하다보면 용어는 몰라도 다음과 같은 표현을 자주 쓰곤합니다. ${name} 은 html에서 제공되는 폰트를 굵게 보여주는 태그이고, 이 ${name}은 무엇일까? 실제 페이지에서는 저 ${n

royzero.tistory.com

2020/08/27 - [개발 창고/웹 개발] - [JSTL] Formatting태그(1)

 

[JSTL] Formatting태그(1)

이전에 JSTL 중 Core 태그에 대해 작성하였습니다. 오늘은 그 외에 숫자/날짜 등을 위한 Format태그에 대해 작성해볼까 합니다. 2020/08/26 - [개발 창고/웹 개발] - [JSTL] Core태그 [JSTL] Core태그 Spring에서..

royzero.tistory.com

2020/08/27 - [개발 창고/웹 개발] - [JSTL] Formatting태그(2)

 

[JSTL] Formatting태그(2)

이전 이전에는 JSTL 중 Core 그리고 Formatting태그 중 formatNumer/parseNumber/formatDate/parseDate에 대해 알아보았습니다. 이번에는 Formatting 태그 중 빈도수는 낮지만 남은 Formatting태그에 대해 알아보..

royzero.tistory.com

  JSTL 분류

  • Core 태그
  • Formatting 태그
  • SQL 태그
  • XML 태그
  • JSTL Function

 

  JSTL Function

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

JSTL function을 사용하기 위해서는 JSP 상단에 다음과 같이 선언을 해주면 function을 사용할 수 있습니다.

 

  contains

boolean contains(java.lang.String, java.lang.String)

 : 대상 텍스트에 해당 키워드가 포함되어있는지 여부

<c:set var="target" value="여기는 로이의 개발공장입니다. This is Roy's Factory"/>

<p>한글 체크 ('로이의 개발공장') : ${fn:contains(target, '로이의 개발공장')}</p>

<p>영문 체크 ('Roy's Factory') : ${fn:contains(target, 'Roy\'s Factory')}</p>

<!-- 참고로 특수문자(')는 역슬래시(\)를 써주어야 조건으로 인식합니다. -->

<p>IF문의 사용 예 :
<c:if test="${fn:contains(target, 'factory')}">'factory'를 포함합니다.</c:if>
<c:if test="${fn:contains(target, 'Factory')}">'Factory'를 포함합니다.</c:if>
</p>

 

contains를 활용한 예

target이라는 변수에 포함된 내용을 contains를 활용하여 문자 체크를 하면 다음과 같이 체크 가능합니다.

 

  containsIgnoreCase

boolean containsIgnoreCase(java.lang.String, java.lang.String)

contains에서는 Factory로 정확하게 조건 검색이 가능하지만 factory라고 대소문자 구문 없이는 false를 반환했음을 알 수 있습니다. 하지만 containsIgnoreCase를 활용하면 대소문자 구분 없이 결과가 true를 반환하게 됩니다

<c:set var="target" value="여기는 로이의 개발공장입니다. This is Roy's Factory"/>

<p>한글 체크 ('로이의 개발공장') : ${fn:containsIgnoreCase(target, '로이의 개발공장')}</p>

<p>영문 체크 ('Roy's Factory') : ${fn:containsIgnoreCase(target, 'Roy\'s Factory')}</p>

<!-- 참고로 특수문자(')는 역슬래시(\)를 써주어야 조건으로 인식합니다. -->

<p>IF문의 사용 예 :
<c:if test="${fn:containsIgnoreCase(target, 'factory')}">'factory'를 포함합니다.</c:if>
<c:if test="${fn:containsIgnoreCase(target, 'Factory')}">'Factory'를 포함합니다.</c:if>
</p>

 

containsIgnoreCase를 활용한 HTML의 결과화면

 

  startsWith

boolean startsWith(java.lang.String, java.lang.String)

startsWith는 target텍스트의 첫 부분이 해당 키워드로 끝나는지 여부를 체크합니다.

<c:set var="target" value="여기는 로이의 개발공장입니다. This is Roy's Factory"/>

<p>한글 체크 ('여기는') : ${fn:startsWith(target, '여기는')}</p>

<p>영문 체크 ('This is') : ${fn:startsWith(target, 'This is')}</p>

<p>IF문의 사용 예 :
<c:if test="${fn:startsWith(target, '여기는')}">한글이 먼저입니다.</c:if>
<c:if test="${fn:startsWith(target, 'This is')}">영문이 먼저입니다.</c:if>
</p>

 

startsWith를 활용한 HTML의 결과화면

 

  endsWith

boolean endsWith(java.lang.String, java.lang.String)

endsWith는 target텍스트의 끝 부분이 해당 키워드로 끝나는지 여부를 체크합니다.

<c:set var="target" value="여기는 로이의 개발공장입니다. This is Roy's Factory"/>

<p>한글 체크 ('로이의 개발공장') : ${fn:endsWith(target, '로이의 개발공장')}</p>

<p>영문 체크 ('Roy's Factory') : ${fn:endsWith(target, 'Roy\'s Factory')}</p>

<!-- 참고로 특수문자(')는 역슬래시(\)를 써주어야 조건으로 인식합니다. -->

<p>IF문의 사용 예 :
<c:if test="${fn:endsWith(target, 'factory')}">'factory'를 포함합니다.</c:if>
<c:if test="${fn:endsWith(target, 'Factory')}">'Factory'를 포함합니다.</c:if>
</p>

 

endsWith를 활용한 HTML의 결과화면

 

  escapeXml

boolean escapeXml(java.lang.String)

XML 마크업 태그가 HTML에 적용되지 않고 그대로 표현되도록 표현됩니다.

<c:set var="target" value="여기는 <u>로이</u>의 개발공장입니다. This is Roy's Factory"/>

<p>XML태그 제거 전: ${target}</p>
<p>XML태그 제거 후: ${fn:escapeXml(target)}</p>

 

escapeXml이 적용된 HTML

밑줄 태그인  <u> 태그가 excapeXml 전에는 적용되고 후에는 그대로 <u>로 표현됨을 알 수 있습니다. 이는 쇼핑몰 같은 경우 상품 상세의 내용의 태그가 쇼핑몰에 적용되는것을 막을 때 많이 사용됩니다.

 

  indexOf

int indexOf(java.lang.String, java.lang.String)

indexOf는 target 텍스트에서 해당 키워드가 어디에 위치하는지에 대한 INDEX값을 반환합니다.

<c:set var="target" value="여기는 로이의 개발공장입니다. This is Roy's Factory"/>

<p>없는 경우: ${fn:indexOf(target, '저기는')}</p>
<p>맨 처음: ${fn:indexOf(target, '여기는')}</p>
<p>중간: ${fn:indexOf(target, '로이의')}</p>

 

indexOf를 활용한 HTML 결과

 

  join

String join(java.lang.String[], java.lang.String)

String 배열을 한개의 String으로 Join 시켜주는 기능입니다. 첫 번째 변수는 Join 할 String Array이고 , 두 번째 변수는 Join시 중간에 삽입할 문자열입니다. 만약 ""공란으로 입력 시 중간 문자열 없이 이어 붙여지게 됩니다.

<%
// {"가나다", "라마바사", "아자차"}로 구성된 String 배열을 request에 담아서 보내줍니다.
String[] target = new String[]{"가나다", "라마바사", "아자차"};
request.setAttribute("target", target);
%>

<!-- 전달된 String Array를 (,) 기준으로 Join해줍니다. -->
<p>JOIN: ${fn:join(target, ',')}</p>

 

String Array의 Join된 결과 HTML

이는 뒤에 나오는 split와 주로 같이 쓰이는 경우가 많습니다.

 

  split

String[] split(java.lang.String, java.lang.String)

String문자열을 지시자 기준으로 분리하여 String Array로 반환합니다. 첫 번째 변수가 분리할 String문자열이고, 두 번째 변수가 분리에 사용될 지시다 문자열입니다.

<c:set var="target" value="나는 여기서 분리를 당할겁니다."/>

<c:forEach items="${fn:split(target, ' ')}" var="value">
<p>${value}</p>
</c:forEach>

 

공란 기준으로 split한 결과 HTML

 

다음은 target의 문자열을 공란(' ')을 기준으로 split하여 core태그의 forEach문 활용하여 한 줄씩 표현한 예입니다.

 

  length

int length(java.lang.Object)

length는 크게 두가지로 사용되는데, 일반적으로 문자열(java.lang.String)인 경우엔 글자 수를 보여주기도 하고, 배열을 length 한 경우엔 해당 배열에 포함된 항목의 개수를 보여줍니다.

<c:set var="target" value="나는 여기서 분리를 당할겁니다."/>

<p>문자수 : ${fn:length(target)}</p>
<p>단어수 : ${fn:length(fn:split(target, ' '))}</p>

 

length 결과에 따른 HTML

다음에서 보이듯이 target의 문자수는 띄어쓰기 포함 총 17자이고, 공란(' ')기준으로 split 된 배열을 통해 총 단어수는 4개가 됨을 알 수 있습니다.

 

  replace

boolean replace(java.lang.String, java.lang.String, java.lang.String)

target의 문자열중 특정 문자열을 다른 문자열로 치환하는 함수입니다.

<c:set var="target" value="로이의 개발공장에 오신것을 환영합니다.로이의 개발공장에 오신것을 환영합니다."/>

<!-- 문자열내 포함된 모든 '로이'를 '조이'로 변환 -->
<p>${fn:replace(target, '로이', '조이')}</p>

replace를 한 결과에 따른 HTML

두번두 번 반복해서 입력한 이유는 보통 개발하다 보면 언어별로 repalce가 첫 번째 매칭 단어만 치환되는 경우가 있기 때문에, 이를 좀 더 확실히 보여주기 위해 두 번 반복해서 적어 변환을 시켜보았습니다. 이 결과에서 알 수 있듯이, 해당 문자열에 포함된 모든 '로이'가 '조이'로 치환되었음을 알 수 있습니다. 

 

  substring

java.lang.String substring(java.lang.String, int, int)

해당 인덱스 만큼의 문자열을 반환합니다.

<c:set var="target" value="로이의 개발공장에 오신것을 환영합니다.로이의 개발공장에 오신것을 환영합니다."/>

<!-- 첫 번째 인덱스는 0입니다. -->
<p>${fn:substring(target, 0, 10)}</p>

<!-- -1부터 해도 맨 처음 자리수 부터 반환함을 알 수 있습니다. -->
<p>${fn:substring(target, -1, 10)}</p>

<!-- 1부터 시작 시 두 번째 글자부터 반환함을 알 수 있습니다. -->
<p>${fn:substring(target, 1, 10)}</p>

<!-- max값은 기존 글자수 보다 높아도 정상적으로 표현됨을 알 수 있습니다. -->
<p>${fn:substring(target, 0, 100)}</p>

<!-- length 함수를 활용해서 마지막까지로 표현할 수 있습니다. -->
<p>${fn:substring(target, 10, fn:length(target))}</p>

 

substring에 따른 결과 HTML

 

  substringAfter

java.lang.String substringAfter(java.lang.String, java.lang.String)

해당 키워드와 일치하는 부분부터 반환하게 됩니다.

<c:set var="target" value="로이의 개발공장에 오신것을 환영합니다.로이의 개발공장에 오신것을 환영합니다."/>

<!-- 처음으로 매칭되는 키워드부터 반환합니다. -->
<p>${fn:substringAfter(target, '개발공장에')}</p>

<!-- -없으면 전체를 반환하지 않습니다. -->
<p>${fn:substringAfter(target, '조이의')}</p>

substringAfter에 따른 결과 HTML

 

  substringBefore

java.lang.String substringBefore(java.lang.String, java.lang.String)

해당 키워드와 일치하는 부분 이전까지만 반환합니다.

<c:set var="target" value="로이의 개발공장에 오신것을 환영합니다.로이의 개발공장에 오신것을 환영합니다."/>

<!-- 처음으로 매칭되는 키워드 이전 까지만 반환합니다. -->
<p>${fn:substringBefore(target, '개발공장에')}</p>

<!-- -없으면 전체를 반환하지 않습니다. -->
<p>${fn:substringBefore(target, '조이의')}</p>

substringBefore에 따른 결과 HTML

 

  toLowerCase

java.lang.String toLowerCase(java.lang.String)

소문자로 반환합니다.

<c:set var="target" value="This is the Roy's Factory"/>

<p>${fn:toLowerCase(target)}</p>

toLowerCase에 따른 결과 HTML

 

  toUpperCase

java.lang.String toUpperCase(java.lang.String)

대문자로 반환합니다.

<c:set var="target" value="This is the Roy's Factory"/>

<p>${fn:toUpperCase(target)}</p>

toUpperCase에 따른 결과 HTML

 

  trim

java.lang.String trim(java.lang.String)

해당 문자열의 앞, 뒤 공란을 제거해줍니다.

<c:set var="target" value="     This is the Roy's Factory     "/>

<p>제거 전: [${target}]</p>
<p>제거 후: [${fn:trim(target)}]</p>

trim에 따른 결과 HTML

반응형

'개발 창고 > Web' 카테고리의 다른 글

[Spring] 전자정부 표준 프레임워크(eGovFrame)란?  (0) 2020.09.02
[Javascript] 사업자등록번호 체크  (0) 2020.08.31
[JSTL] Formatting태그(2)  (0) 2020.08.27
[JSTL] Formatting태그(1)  (0) 2020.08.27
[JSTL] Core태그  (0) 2020.08.26