JSP

<c:choose>

<c:if>태그는 자바처럼 else 를 사용할 수 없기 때문에 두 가지 경우 중 하나를 선택할 경우에도 또 다시 조건을 제시해야 하는 번거로움이 있습니다.

<c:if> 태그에서 else 구문을 사용할 수 없기 때문에 생기는 아쉬움을 <c:choose> 태그로 해소할 수 있습니다. <c:choose>태그와 <c:if> 태그의 차이점을 살펴보기 위해서 로그인할 때 관리자인지 일반회원인지를 구분하는 조건를 <c:if>로 처리한 예를 살펴보도록 합시다.

 

<c:if test="${param.userType =='admin'}">

 ${param.id}(관리자)

</c:if>

<c:if test="${param.userType="member"}>

  ${param.id} (회원)

</c:if>

JSP 에서 자바 코드로 기술하면 또 다시 조건을 제시하지 않고도 else 문을 사용하여 다음과 같이 간단하게 처리할 수 있습니다.

  if(request.getParameter("userType").equals("admin")){

  out.print(request.getParameter("id") + "(관리자)");

}else{

  out.print(request.getParameter("id")+"(회원)");

}

 

<c:choose>태그는  <c:when>를 <c:otherwise>와 함께 사용하여 조건에 만족하지 않는 경우에 대해서도 다음과 같이 간단하게 처리 할 수 있습니다.

<c:choose>

<c:when test="${param.userType=='admin'}">

  ${param.id}(관리자)

</c:when>

<c:otherwise>

  ${param.id}(회원)

</c:otherwise>

<c:choose>태그는 자바의 switch 문처럼 다양한 조건을 제시해서 여러 경우에 대해서도 간단하게 처리할 수 있습니다. <c:choose>태그의

기본 형식은 다음과 같습니다.

<c:choose>

 <c:when test="조건1">몸체1</c:when>

 <c:when test="조건2">몸체2</c:when>

<c:othrewise>몸체3</c:otherwise>

</c:choose>

 

<c:choose>태그 내부에는 여러 개의 <c:when> 을 가질 수 있으며 순서대로 <c:when> 태그의 test 조건을 검사하여 그 결과가 참이면 <c:when>태그의 몸체 부분을 실행 합니다.

<c:choose>태그 내부의 <c:when> 중 만족한 조건을 찾지 못할 경우에는 <c:otherwise>의 몸체 부분을 실행합니다. 경우에 따라서는 <c:otherwise>태그는 생략할 수 있습니다.

 

<form action="13_fruitSelect.jsp">
 <label for="fruit">과일을 선택하세요</label>
 <select id="fruit" name="fruit">
     <option value="1">사과</option>
     <option value="2">메론</option>
     <option value="3">바나나</option>
 </select>
<input type="submit" value="전송" >
</form>
 

<c:choose>
  <c:when test="${param.fruit ==1 }">
     <span style="color: red;">사과</span>
  </c:when>
  <c:when test="${param.fruit ==2 }">
     <span style="color: green;">메론</span>
  </c:when>
    <c:when test="${param.fruit ==3 }">
     <span style="color: blue;">바나나</span>
  </c:when>

</c:choose>

 

<c:forEach>

<c:forEach>는 배열(Array) 이나 컬렉션  또는 맵 등과 같은 집합체에 저장되어 있는 값들을 순차적으로 처리할 때 사용할 수 있는 태그입니다.

기본 형식은 다음과 같습니다.

<c:forEach [var="변수 이름"] items ="배열과 같은 집합체">

 몸체

</c:forEach>

items 속성에 배열과 같은 집합체를 지정하면 이곳에 저장된 각각의 항목에 대해서 몸체 부분을 반복합니다. 이때 var 속성에 변수를 지정하면 items 속성에 저장한 집합체에 저장된 항목들이 순차적으로 var 속성에 지정한 변수에 저장됩니다. 이 변수는 반복되는 몸체 내부에서 사용할 수 있습니다.

 

 

<c:forEach var="movie" items="${movieList}">

  ${movie} <br>

</c:forEach>

 

<%
    String[] movieList ={ "타이타닉", "시네마 천국", "혹성 탈출", "킹콩"};
    pageContext.setAttribute("movieList", movieList);  

%>
<c:forEach var="movie"  items="${ movieList}">
   ${movie }<br>
</c:forEach>
 

 

=>

타이타닉
시네마 천국
혹성 탈출
킹콩

 

<c:forEach>태그에 사용할 수 있는 속성 중에는 varStatus 속성이 있습니다. varStatus 속성은 배열이나 컬렉션과 같은 집합체에서 항목의 인덱스 값을 사용해야 할 경우가 생기는데 이때 사용하게 됩니다.  varStatus 속성은 인덱스(index) 는 물론 반복 횟수(count) 등과 같은 반복 상태에 관련된 정보를 프로퍼티로 알려줍니다.

프로퍼티 설명
index items에 지정한 집합체의 현재 반복 중인 항목의 index를 알려준다. 0부터의 순서가 부여된다.
count 루핑을 돌 때 현재 몇 번째를 반복 중인지 알려준다. 1부터의 순서가 부여된다.

 

varStauts ="status" =>반복 상태 정보를 위한 변수

<%
    String[] movieList ={ "타이타닉", "시네마 천국", "혹성 탈출", "킹콩"};
    pageContext.setAttribute("movieList", movieList);  

%>
<table border="1"  style="width:100%; text-align: center;">

<tr>
<th>index</th><th> count</th> <th> title</th>  

</tr>

<c:forEach var="movie"  items="${ movieList}" varStatus="status">
<tr>
 <td>${status.index }</td>
 <td>${status.count }</td>
 <td>${movie }</td>
</tr>    
   
</c:forEach>

</table>


<ul>
<c:forEach var ="movie" items="${movieList }" varStatus="status">
<c:choose>
  <c:when test="${status.first }">
      <li style="font-weight: bold; color: red;">${movie }</li>
  </c:when>
  <c:otherwise>
     <li>${movie }</li>
  </c:otherwise>
</c:choose>

</c:forEach>

</ul>

<c:forEach var="movie" items="${movieList }" varStatus="status">
 ${movie } <c:if test="${ not status.last }" > ,</c:if>
</c:forEach>

--------------------------------------------------------------------------------------------------------------------

 

index count title
0 1 타이타닉
1 2 시네마 천국
2 3 혹성 탈출
3 4 킹콩
  • 타이타닉
  • 시네마 천국
  • 혹성 탈출
  • 킹콩

타이타닉 , 시네마 천국 , 혹성 탈출 , 킹콩

 

<c:forEach>태그는 여러 가지로 활용이 가능합니다. 객체를 받아와서 그 객체의 길이만큼 반복할 수도 있지만, begin, end 속성에 시작 번호와

끝 번호를 지정하고, step 속성을 이용해서 증가 구간을 정하여 원하는 만큼 반복 수행할 수 있습니다. 마치 자바의 for문과 같이 지정한 횟수만큼 

반복하는 용도로 사용할 수 있습니다.

 

<c:forEach [var ="변수 이름"] begin="시작 값" end="끝 값" [step="중가치"]>

 몸체

</c:forEach>

 

속성 설명
begin 반복에 사용될 것 중 첫 번째 항목의 index
end 반복에 사용될 것 중 마지막 항목의 index

다음은 1 부터 10까지 자연수를 출력하는 예입니다.

<c:forEach var="cnt" begin="1" end="10">

 ${cnt}

</c:forEach>

 

varStatus 속성의 index 와 count 프로퍼티의 차이가 index 는 시작 값이 0, count는 시작 값이 1일 것이라고 생각할 수도 있습니다.

하지만 begin 을 7로 하게 되면 index 7, 8,9,10 이 됩니다.

 

 step 값 2로 주면 index 값이 2,4, 6,8,10 이 됩니다. 하지만 count 는 여전히 1, 2,3,4, 5가 됩니다.

 

<c:forEach var="cnt" begin="1" end="10" varStatus="status">
 ${cnt } <c:if test="${not status.last }">, </c:if>
</c:forEach>

<br><br>

<table border="1" style="width:100%; text-align: center;">
<tr>
 <th>index</th> <th>count</th><th>cnt</th>
</tr>

<c:forEach var="cnt" begin="7" end="10" varStatus="status">
 <tr>
  <td>${status.index }</td>
  <td>${status.count }</td>
  <td>${ cnt }</td>
 </tr>
</c:forEach>

</table>
<br><br>
<table border="1" style="width:100%; text-align: center;">
<tr>
 <th>index</th><th>count</th><th>cnt</th>
</tr>    
<c:forEach var="cnt" begin="1" end="10" varStatus="status" step="2">
 <tr>
   <td>${status.index }</td>
   <td>${status.count }</td>
   <td>${cnt }</td>
 
 </tr>

</c:forEach>    
    
</table>

 

이번에는 동일한 이름의 체크 박스가 여러 개 있는 HTML 문서에서 여러 개의 항목을 선택하여 전송된 정보를 얻어오도록 합시다. 이를 위해서는 표현 언어에서는  paramValues 를 사용합니다. paramValues 는 지정한 이름을 가진 파라미터의 모든 값을 배열 형태로 얻어오기 때문에 동일한 이름으로 여러 번 값이 전송되어도 이를 처리할 수 있습니다.

배열로 얻어진 값은 JSTL 의 <c:forEach>태그를 사용하면 쉽게 화면에 출력할 수 있습니다.

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

나의 오늘이 있는 것은 모두가 아내의 덕분이다. 연애 시절의 그녀는 나의 가장 친한 친구였으며, 마음 약한 나를 언제나 격려해 주었다. 결혼 후에는 저축에 힘을 썼으며 투자를 잘 해서 재산을 만들어 주었다. 우리에게는 5명의 자녀가 있으며, 아내의 덕분으로 우리집은 언제나 행복하다. 나에게 조금이라도 명성이 있다면 그것은 모두가 아내의 덕분이다. -데일 카

댓글 ( 4)

댓글 남기기

작성

JSP 목록    more