본문 바로가기
ㆍSpring & JSP

[JSP] EL표현식 / c:forEach 문 ㅡ 자바for문과 비교하기

by 매이슨 2021. 9. 5.

 

<hide/>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL표현식 forEach 로 알아보기</title>
<style>
table {
	border-collapse: collapse;
}
td { width: 300px; }
</style>
</head>
<body>
<br>
  <table border="1">
    <tr>
      <td>
        <h3> * 스크립틀릿 for문 </h3>
        <% for(int i=0;i<5;i++){ %>
          <h4> Hello~! 스크립트릿</h4>
        <% } %>
      </td>
      <td>
        <h3> * JSTL - forEach구문 </h3>
        <c:forEach begin="1" end="5" step="1">
          <h4> Hello~! JSTL forEach </h4>
        </c:forEach>
      </td>
    </tr>
  </table>
<br> 
  <hr>
<br>
  <table border="1">
	<tr>
	  <td>
        <h3>* 1~9 홀수만 출력(forEach)</h3> 
          <!-- forEach문에서 반복에 사용되는 값은 var 변수를 사용해서 저장가능
          값을 사용할때는 el 표현식을 사용해야한다(html) --> 
        <c:forEach begin="1" end="10" step="2" var="i">
          ${i } <br>
        </c:forEach>
      </td>
      <td>
        <h3>* 0~9 홀수만 출력(자바for)</h3>
        <%
        List<Integer> lst = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
          lst.add(i); 
        }
        // 자바 for문으로 0~9까지 리스트에 index = 값 동일하게 넣기
        for (int i = 1; i < lst.size(); i+=2) {
          out.println(lst.get(i) + "<br>");
        }
        %>
      </td>
    </tr>
  </table>

  <hr>

  <h4>* 자바에도 foreach(향상된 for문)이 있다. </h4><br>
<pre>
  for(Object a:lst){
	out.println(a);
  }
</pre>
  <%
    for(Object a:lst){
    	out.println(a);
    }
    // 영역객체에 저장
    pageContext.setAttribute("lst", lst);    
  %>

  <hr>
  <h4>* el표현식으로 lst 출력</h4><br> ${lst }
  <hr>
  <h4>* el표현식 </h4><br>
  'fromList'변수선언 'lst'를 'items'으로받음, 'forEach'를 이용하여 '홀수' 출력 <br>
  <c:forEach var="fromList" items="${lst }" begin="1" end="10" step="2">
	${fromList}&nbsp;
  </c:forEach>
<br>
  <hr>
<br>
  <h4>* 'string'변수선언 / 값="a,b,c,d,e,f" '구분자'=',' </h4><br>
  → forTokens / delims 이용하여 출력(자바의 StringTokenizer와 비슷)<br>
  <c:set var="string" value="a,b,c,d,e,f" scope="page" />
  <c:forTokens var="token" items="${string}" delims=",">
	${token}&nbsp;
  </c:forTokens>
<br>
  <hr>
<br>
  <h4>* 'str'변수선언 / 값="부산광역시 동래구 사직동 사직 야구장 홍 길 동" '구분자'=' '(공백) </h4><br>
  <c:set value="부산광역시 동래구 사직동 사직 야구장 홍 길 동" var="str"></c:set>
  <c:forTokens items="${str }" delims=" " var="parse">
     "${parse }"&nbsp;
  </c:forTokens>
  <hr>
  </body>
</html>

↑ ↑ ↑ 원본 코드 전체 ㅡ 보시고 싶으시면 '펼치기' 클릭 !


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

↑ ↑ ↑ [EL표현식]과 [JSTL] 사용하기 위해 <html> 태그 시작전 추가하기 (맨위원본코드 3번째줄)


  <table border="1">
    <tr>
      <td>
        <h3> * 스크립틀릿 for문 </h3>
        <% for(int i=0;i<5;i++){ %>
          <h4> Hello~! 스크립트릿</h4>
        <% } %>
      </td>
      <td>
        <h3> * JSTL - forEach구문 </h3>
        <c:forEach begin="1" end="5" step="1">
          <h4> Hello~! JSTL forEach </h4>
        </c:forEach>
      </td>
    </tr>
  </table>

 

<% %> 스크립트릿 시작태그는 색깔이 바뀌는데 닫히는거는 색깔이 안바뀌고 있다.. 하이라이터를 바꿔야하나..
좌측이 자바<for>문 // 우측이 <c:forEach>문
처음 시작했을때는 이렇게 긴걸 왜써 이랬는데 아래내용을 진행하면서 써야겠구먼 이라는 생각이 들었다.


  <table border="1">
    <tr>
      <td>
        <h3>* 1~9 홀수만 출력(forEach)</h3> 
          <!-- forEach문에서 반복에 사용되는 값은 var 변수를 사용해서 저장가능
          값을 사용할때는 el 표현식을 사용해야한다(html) --> 
        <c:forEach begin="1" end="10" step="2" var="i">
          ${i } <br>
        </c:forEach>
      </td>
      <td>
        <h3>* 0~9 홀수만 출력(자바for))</h3>
        <% 
        List<Integer> lst = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
          lst.add(i); 
        }
        // 자바 for문으로 0~9까지 리스트에 index = 값 동일하게 넣기
        for (int i = 1; i < lst.size(); i+=2) {
          out.println(lst.get(i) + "<br>");
        }
        %>
      </td>
    </tr>
  </table>

익숙해진 자바for문대신 <c:forEach> 적응기...
시작값 "1" (begin="1" step="2") 자바for문 'i=i+2'와 같은역할로 같은 출력을 보여줌


  <h4>* 자바에도 foreach(향상된 for문)이 있다. </h4><br>
  <pre>
    for(Object a:lst){
      out.println(a);
    }
  </pre>
  <%
    for(Object a:lst){
    	out.println(a);
    }
    // 영역객체에 저장
    pageContext.setAttribute("lst", lst);    
  %>

영역객체 설정은 아래 el표현식  <c:forEach> 활용위해 설정

  <h4>* el표현식으로 lst 출력</h4><br> ${lst }
  <hr>
  <h4>* el표현식 </h4><br>
  'fromList'변수선언 'lst'를 'items'으로받음, 'forEach'를 이용하여 '홀수' 출력 <br>
  <c:forEach var="fromList" items="${lst }" begin="1" end="10" step="2">
	${fromList}&nbsp;
  </c:forEach>
<br>
  <hr>
<br>
  <h4>* 'string'변수선언 / 값="a,b,c,d,e,f" '구분자'=',' </h4><br>
  → forTokens / delims 이용하여 출력(자바의 StringTokenizer와 비슷)<br>
  <c:set var="string" value="a,b,c,d,e,f" scope="page" />
  <c:forTokens var="token" items="${string}" delims=",">
	${token}&nbsp;
  </c:forTokens>
<br>
  <hr>
<br>
  <h4>* 'str'변수선언 / 값="부산광역시 동래구 사직동 사직 야구장 홍 길 동" '구분자'=' '(공백) </h4><br>
  <c:set value="부산광역시 동래구 사직동 사직 야구장 홍 길 동" var="str"></c:set>
  <c:forTokens items="${str }" delims=" " var="parse">
     "${parse }"&nbsp;
  </c:forTokens>

StringTokenizer stk = new StringTokenizer(str, " ");

delims는 자바의 StringTokenizer와 같은 기능을가진다. 물론 split() 메소드도 마찬가지이다.
var="str" 이 자바변수라면 위와같은 코드와 동일하다.