[JSP] JSTL contains 만들어 사용하기

 

해당 코드가 필요한 상황

JSTL을 사용하여 리스트 안에 해당 원소가 들어있는지 비교가 필요할 때 


JSTL 에서 제공하는 functions 안에 indexOf 함수가 있다. 이 indexOf 는 단순히 비교대상인 문자열이 있다면 시작 index 를 반환한다. 그리하여 이 indexOf 를 사용할 때는 fn:indexOf(A, B) > -1 과 비슷한 형태로 사용한다.  

indexOf 를 주의해서 사용해야하는 것은 단순 문자열 비교라는 것이다.  아래 경우에서의 indexOf 는 문제없이 돌아갈 것이다.

A : "1,2,3"
B: "1"

하지만 이 경우를 생각해보자. 아래의 경우는 A의 원소 안에 B 의 원소가 들어있지 않지만 indexOf 를 사용하게 된다면 123 의 시작 index 를 반환하게 될 것이다. 그리하여 이러한 것보다 더 명확한 contains 를 구현하려한다.

A: "1,15,123"
B: "12"


필자의 상황은 A 의 원소가 B 의 원소 안에도 있는 것이라면 다른 액션을 취해줘야하는 상황이다.
A : "1,2,3,4,5,6,7,8"
B : "1,4,8"

일단 이 문제를 해결하기 위해서는 A, B 문자열을 ',' 를 구분하여 List 로 변환해야한다. 이 코드는 아래와 같다.

<c:forEach var="item" items="${fn:split(A, ',')}">


위의 forEach 문 안에서 B 의 원소가 있는지를 봐야한다. 안타깝게도 jstl 의 functions 에서는 List contains 를 제공하지 않는다. 그리하여 아래 코드와 같이 직접 contains 를 구현해야한다.  참고

<c:forEach var="A_ELEMENT" items="${fn:split(A, ',')}" varStatus="status">
    <c:set var="contains" value="false" />
    <c:forEach var="B_ELEMENT" items="${fn:split(B, ',')}">
         <c:if test="${A_ELEMENT eq B_ELEMENT}">
             <c:set var="contains" value="true" />
         </c:if>
     </c:forEach>
</c:forEach>


위 구문을 지나게되면 jstl 변수인 contains 가 true 일 경우 A 원소안의 B 원소도 포함되어 있다는 것을 알 수 있게 된다. 만약 List Contains 가 많은 곳에 필요하다면 중복을 싫어하는 독자들은 다른 방법을 찾아볼 것이다. 물론 더 번거롭지만 Java Class 를 만들어 jsp 안에서 사용할 수 있도록 하는 방법이 있다. 참고

블로그를 꽤 오래 게시 않았던 것은 거창하지 않은 내용들이라 작성하지 않았다. 작은 것도 못하면 큰 것 또한 못한다는 것을 깨닫고 작은 글들을 꾸준히 쓰며 토이 프로젝트를 진행하며 규모있는 글들도 써보려한다.




댓글

이 블로그의 인기 게시물

[INTELLIJ] 인텔리제이 폴더 안 보이고 파일만 보이는 버그 해결 방법

[생활] 짝눈(부동시)로 신체검사 4급(공익) 받은 방법.

[스프링부트] @Mapper import 실패시(빨간줄) 해결 방법