본문 바로가기

IT 개념

JSTL <c:if>, <c:choose>

학원분들과 프로젝트를 하다가 이 태그를 사용했는데, 안되던 것이 있어서 찾아보았습니다.

JSTL - <c:if>, <c:choose> 태그 사용법 (tistory.com)

1. <c:if> 태그는 test 속성 내의 EL(${xxx}) 의 결과가 참이면 실행됩니다.

else 구문은 없습니다.

<c:set var ="name" value="홍길동"/>

<c:if test="${name eq '홍길동'}">

<c:out value="{str}"/>

</c:if>

위 코드는 변수 name의 값이 "홍길동"이면 출력하는 것입니다.

[<c:if> 태그 속성]

<c:if> 태그에 사용될 수 있는 속성은 다음과 같습니다.

1. test

1) 필수 속성값으로 EL 비교식을 가집니다.

2. var

1) 조건 결과를 저장할 변수를 지정합니다.

3. scope

1) 조건 결과를 지정할 변수의 저장 scope 를 지정합니다.

<c:if test="${name eq "홍길동"}" var="nameHong" scope="session">

</c:if>

위 코드는 test 속성의 결과를 nameHong 변수 이름으로 session 영역에 저장하는 것입니다.

동일세션의 다른 페이지에서 결과를 찾을 수 있습니다.

[test 속성에 사용될 비교 연산자]

1. eq(==)

1) 문자열 또는 숫자가 같으면 참입니다.

2) null 또는 빈 문자열 인지도 확인할 수 있습니다.

2. ne(!=)

1) 문자열 또는 숫자가 다르면 참입니다.

3. empty // <c:if test="${empty name}">

1) List 또는 배열이 비어있거나, 문자열이 null 도는 빈 문자열이면 참을 반환합니다.

2) 숫자 0은 eq(==)로 비교해야 합니다.

4. not empty // <c:if test="${not empty name}">

1) List 또는 배열이 비어 있지 않을 경우, 문자열이 값이 있을 경우 참을 반환합니다.

[test 속성에 사용될 논리연산자]

1. and(&&)

1) 모두 참일 때 참이 됩니다.

2. or(||)

1) 둘 중 하나라도 참이면 참이 됩니다.

3. not(!)

1) 논리를 반전합니다.

[<c:choose> 태그]

1. 조건에 따른 여러 곳으로 분기 가능하고, 조건이 맞은 것이 없을 경우 기본 분기를 제공할 수 있습니다.

(자바의 if, else if 같은 느낌이군요)

<c:choose>

<c:when test="${name eq '김철수'}">... </c:when>

<c:when test="${name eq '박영희'}">....</c:when>

<c:otherwise>...</c:otherwise>

</c:choose>

위 코드는 이름이 '김철수', '박영희' 일 경우 분기하고 그 외의 경우에는 <c:otherwise>로 분기합니다.

※ 그러면 제가 무엇이 안되었을까요?

view.jsp 에 mainList 를 넣고 foreach 로 name을 main 에 한다음 main.mainTitle 칼럼의 내용을 가져오는데,

이때 mainTitle 이 null 이면 기본타이틀이라는 링크를, null 이 아니라면 main.mainTitle의 내용과 링크를 가져오게 하고 싶었습니다. (밑에 주소분과 같은 상황입니다.)

https://okky.kr/article/410374

 

OKKY | jstl c:if 질문입니다.

c:forEach items ${arr } var list c:if test ${list null } !-- 예약없을때 날짜 생성해줘야함 -- 없다고 없다고 왜안뜨냐고 td width 5% div align center strong ${i.index } /strong /div br

okky.kr

<c:forEach var="main" items="${mainList}">

<c:if text="${main.mainTitle != null} ">

<td><a href="mainWrite.do>${main.mainTitle}<a></td>

</c:if>

<c:if text="${main.mainTitle == null} ">

<td><a href="mainWrite.do">기본 타이틀</a></td>

</c:if>

</c:forEach>

 

mainList 를 main 이름으로 하여,

main.mainTitle 이 비어있는 사용자에게는 기본 타이틀이라는 링크를

main.mainTitle이 비어있지 않은 사용자에게는 ${main.mainTitle}의 내용으로 링크를

제공하려고 했습니다.

그런데, {main.mainTitle != null} 의 경우는 잘 작동하나,

${main.mainTitle == null}인 경우는 작동하지 않는 것입니다.

구글링을 해보니 모든 로직이 <c:forEach> 이므로 특정 값에 대한 것이라면 ${empty}로 접근하고

itesm="mainList"가 있을 때와 없을 때로 따로 생각을 하여야 하므로

main.mainTitle == null 은 <c:forEach> 문을 나와야 하고

mainList에 대한 null 로 접근하여야 한다는 것입니다.

그래서 코드를 다음과 같이 분리했더니 잘 작동합니다!

'IT 개념' 카테고리의 다른 글

Spring, ResponeseEntity  (0) 2021.06.15
jQuery .val() (javascript)  (0) 2021.06.15
AJAX..?비동기처리방식..?  (0) 2021.06.15
스프링 REST  (0) 2021.06.13
스프링 @Controller  (0) 2021.06.10