티스토리 뷰

JSP

JSTL의 기본액션 — core

태로미 2023. 4. 13. 19:38

 

 

 

 

 

 

 

 

 

 

📍   JSTL   — core

–   JSTL에서 기본적인 기능 (컨트롤에 관계된 기능)들을 구현해놓은 라이브러리로서,

    문자열 출력,  반복문,  조건문 등이 포함되어 있음.

–   커스텀 태그의 장점대로 자바 코드를 사용하지 않고도 쉽게 기본 기능을 구현할 수 있음.

–   JSTL 라이브러리를 사용하기 위해서는 해당 페이지에 '태그 라이브러리' 를 등록해야 사용 가능.

 

 

 

 

 

 

 

 

 

 

▸   태그 라이브러리 등록


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

–   JSTL을 사용하려면 페이지 윗부분에 '태그 라이브러리' 를 추가해야 함.

–   prefix의 c는 태그를 사용할 때 항상 붙는 접두어.

–   uri는 태그 라이브러리가 존재하는 위치.

     →   위의 주소는 core 라이브러리가 존재하는 위치.

 

 

 

 

 

 

 

 

 

 

▸   core 라이브러리 태그

  출력 태그   <c:out>      
  변수 설정 및 삭제 태그   <c:set>   <c.remove>    
  예외 처리 태그   <c:catch>      
  조건 처리 태그   <c:if>   <c:choose>   <c:witch>   <c:otherwise>
  반복 처리 태그   <c:forEach>   <c:forTokens>     
  페이지 처리 태그   <c:import>   <c:redurect>   <c:url>   <c:param>


📃   core_out.jsp


•   여러가지 방법으로 화면에 출력하기

<h1>core_out.jsp</h1>

JSTL : <c:out value="ITWILL" /> <br>
HTML : ITWILL <br>

<%
	out.println(" JSP : ITIWILL <br>");
%>

JSP (표현식) : <%="ITIWLL" %> <br>
EL 표현식 : ${"ITWILL" } <br>

<hr>

 

–   JSTL이 표현식 필요없이 태그만 있어도 동작하므로 편리함.

   실행 결과

 

 

 

•   연산 데이터 출력하기

JSTL : <c:out value="100+200" /> <br>
JSP : <%=100+200 %> <br>
EL : ${100+200 } <br>

JSTL : <c:out value="<%=100+200 %>" /> <br>
JSTL : <c:out value="${100+200 }" /> <br>

<hr>

–   JSTL에서 연산하려면 value 값으로 연산이 가능한 '표현식' 또는 'el 표현식'을 사용하면 연산 가능.
     이제부터 연산하기 위해 JSTL의 value값으로 el 표현식을 사용할 것.
–   JSTL을 사용해서 화면에 출력하고,  EL표현식 사용하여 연산 수행함.

   실행 결과

 

 

 

•   default 값 지정하기

el : ${itwill.id } <br>

JSTL + el : <c:out value="${itwill.id }" default="출력"/> <br>

<hr>

–   itwill이라는 객체에 id라는 정보를 출력하는 코드.
     하지만 해당 데이터가 없으므로 null값이 발생하는데,  el 표현식은 null 값이 공백으로 출력됨.
     →   nullpointexception 방지 가능.
–   default 값을 지정하면 null값일 때 공백이 아닌 default 값을 출력함.

   실행 결과

 

 

 

•   <abc> 태그 출력하기

<abc>태그는 abc태그 입니다. <br>

&lt;abc&gt;태그는 abc태그 입니다. <br>
<c:out value="<abc>태그는 abc태그 입니다." /> <br>

–   &lt; 와 &gt; 를 사용하여 각각 '<' 기호와 '>' 기호를 나타낼 수 있음.

–   JSTL을 사용하여 value 값에 해당 문구를 작성하면 됨.

   실행 결과

 

 

 


📃   core_set1.jsp


•   연산 결과 출력하기

 

1.   자바 (JSP) 코드 사용

<%
	int num1 = 100;
	int num2 = 200;
	int sum = num1 + num2;
%>

결과 : <%=sum %> <br>

–   자바(JSP) 코드를 사용해서 변수 생성 → 연산결과 출력
–   내가 만든 JSP코드의 값을 화면에 출력할 때는 표현식 사용.

   실행 결과

 

 

2.   JSTL 사용

–   JSTL 사용을 위해 taglib 추가하기.

<c:set var="num1" value="300" scope="page"/>
<c:set var="num2" value="400"/>
<c:set var="sum" value="${num1 + num2 }" />

결과 : <c:out value="${sum }" /> <br>
결과 : ${num1 } + ${num2 } = ${num1 + num2 } <br>

<!-- 영역객체 확인 -->
${pageScope } <br>
${requestScope } <br>
${sessionScope } <br>
${applicationScope } <br>

<hr>
코드 분석
1~3
  –   <c:set var="변수명" value="변수값"/> 으로 영역에서 공유되는 데이터인 '속성'을 만드는 것.
  –   JSTL에서 변수를 만든다는것은 영역객체에서의 속성을 생성하는 것.
  –   표현식은 내가 만든 JSP코드의 값을 화면에 출력할 때 사용하고,  el표현식은 영역객체를 출력함.


5, 6
  –   el표현식은 영역객체를 출력함.
       원래 el 표현식의 형태는 ${영역객체명.변수명 } 이지만 영역객체명 생략 가능함.
       →   그렇다보니 해당 데이터가 어느 영역객체에 저장이 되었는지 알기 힘듬.

9~12
  –   모든 영역객체를 출력해본 결과,  pageScope 객체에 해당 데이터들이 저장되어 있음.
  –   즉,  내가 따로 저장할 영역객체를 지정하지 않으면 기본값으로 'page' 영역객체에 저장됨을 알 수 있음.

   실행 결과

 

 

 

•   영역객체에 따른 데이터 사용 가능 범위

 

1 )   데이터 생성

<c:set var="MODEL" value="S23" scope="request" />
<c:set var="NAME" value="삼성갤럭시" scope="session" />
<c:set var="PRICE" value="200" scope="session" />

–   scope를 지정하지 않으면 기본적으로 pageScope 영역객체에 저장되므로 현재 페이지에서만 사용 가능.
     다른 페이지에서도 사용 가능한 데이터를 생성할 것이므로 request 영역객체를 사용함.
     →   request 영역객체 사용 시,  다음 페이지까지 데이터 사용 가능.
     →   session 영역객체 사용 시,  브라우저 종료때까지 (= 서버) 데이터 사용 가능.

 

 

2 )   페이지 이동

<jsp:forward page="core_set2.jsp"></jsp:forward>

–   액션태그를 사용하여 forward 방식으로 페이지 이동함.

     →    request 객체 안의 정보도 전달하면서 페이지 이동하는 방법.

–   forward 방식으로 페이지 이동 시,  파라미터,  request,  session,  application의 데이터 모두 전달 가능.

 

 

3 )   실행하기

–   현재 페이지인 core_set1.jsp 에서 실행하면,  위의 정보들을 모두 전달하면서 core_set2.jsp 페이지로 이동함. 

 

 

 


📃   core_set2.jsp


•   forward 방식으로 전달한 정보 출력하기

모델명 : ${requestScope.MODEL } <br>
이름 : ${NAME } <br>
가격 : ${PRICE } <br>

–   페이지 이동하면서 넘어온 정보들을 출력하기 위해 el 표현식 사용.

–   포워딩 방식은 request영역과 session영역 모두 데이터 전달 가능하므로 모든 데이터가 출력됨.
–   영역객체명이 생략된 이름과 가격 정보는 앞서 scope를 session으로 지정했으므로 session 객체에서 가져온 것.
–   사실상 session보다는 request를 많이 사용함.
     →   어차피 core_set1과 core_set2 페이지에서만 사용할거라 굳이 session을 쓸 필요 없음.
     →   항상 서버에서 유지되야하는 데이터들만 session에 저장함.
     →   용도에 맞게 데이터를 저장하여 사용하는 것이 불필요한 메모리낭비 없이 효율적인 코드.

   실행 결과

 

 

 

•   core_set2.jsp 페이지에서 실행하기

–   위의 결과는 실제로 데이터가 존재하는 core_set1.jsp 페이지에서 실행했기 때문에

     해당 데이터들이 전달되며 페이지가 이동했고,  이에 core_set2.jsp 페이지에서 출력이 가능했던 것.

–   만약 처음부터 core_set2.jsp 페이지에서 실행했다면 전달된 데이터가 없으므로 아무것도 출력 안됨.

     →   그러나 앞서 우리는 NAME과 PRICE 정보를 session 영역에 저장했음.

     →   session 영역에 저장된 정보들은 브라우저가 종료되지 않는 이상 계속 존재함.

     →   따라서 request 영역에 저장했던 MODEL 정보만 출력이 안됨.

   실행 결과

 

 

•   영역객체 데이터 삭제

<c:remove var="NAME" scope="session" />

모델명 : ${requestScope.MODEL } <br>
이름 : ${NAME } <br>
가격 : ${PRICE } <br>

<hr>

 

–   session 영역에 저장된 NAME 정보를 삭제함.

–   scope 영역 지정을 하지 않으면 page부터 application까지 순차적으로 찾아서 삭제함.

–   remove 속성으로 실제로 삭제되었는지 확인하기 위해 core_set1.jsp 페이지에서 실행함.

     →   core_set1.jsp 페이지에서 실행했으므로 다시 데이터들이 전달되어 MODEL 정보가 출력됨.

   실행 결과

 

 

 


📃   TestServlet4.java


•   서블릿 작성

–   HttpServlet 상속,  doGet() 메서드 오버라이딩,  어노테이션 사용하여 서블릿 매핑까지 함.

@WebServlet("/set2")
public class TestServlet4 extends HttpServlet{

	// http://localhost:8088/JSP7/set2
	
	@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("TestServlet4_doGet() 호출");
		
	}
}

 

 

•   전달할 데이터   — 객체 정보 생성 및 저장

@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("TestServlet4_doGet() 호출");
		
		// 객체 정보 생성
		Person p = new Person();
		p.setName("아이티윌");
		Person p1 = new Person();
		p1.setName("부산");
		
		// 객체 정보 저장 (request)
		request.setAttribute("person", p);

		// ArrayList를 사용하여 회원정보 2개 생성
		ArrayList memberList = new ArrayList();
		memberList.add(p);
		memberList.add(p1);
		
		// 회원정보 저장
		request.setAttribute("memberList", memberList);
코드 분석
9, 11
  –   Person 객체의 변수 Name에 "아이티윌",  "부산" 데이터를 각각 참조변수에 저장함.

14
  –   request 영역 안에 person이라는 정보가 있고 그 안에는 참조변수 p의 데이터가 담겨 있음.
       →   참조변수 p에는 변수 Name에 "아이티윌" 데이터가 저장되어 있음.

17~19
  –   사실상 데이터가 2개밖에 없으면 setAttribute() 메서드로 정보 전달하는게 간단함.
  –   많은 양의 데이터를 전달해야 할 경우 ArrayList를 사용하게 되는데,  그때 사용할 수 있게 미리 연습함.
  –   ArrayList의 add() 메서드로 ArrayList에 데이터 추가함.

22
  –   request 영역에 memberList라는 이름으로 위에서 생성한 ArrayList인 memberList 데이터 저장.

 

 

•   페이지 이동

		// 페이지 이동 (core_set2.jsp)
		RequestDispatcher dis
		= request.getRequestDispatcher("./jstl/core_set2.jsp");
		
		dis.forward(request, response);
		
	}

–   doGet() 메서드의 제일 아래에 코드 작성.

–   RequestDispatcher 인터페이스를 사용하여 forward 방식으로 core_set2.jsp 페이지로 이동함.

 

 

 


📃   core_set2.jsp


•   TestServlet4에서 전달된 정보 저장 & 출력

 

1.   Person 데이터

이름 : ${requestScope.person } <br>
이름 : ${person.name } <br>

<!-- JSTL 사용 -->
<c:set var="name" value="${requestScope.person.name }" /> 
이름 : ${name } <br>

<hr>

–   TestServlet4.java 페이지에서 request 영역에 저장한 person 데이터를 출력함.  

–   Person 데이터 안에 있는 name 값도 출력함.  (영역객체명 생략 가능)

–   JSTL을 사용하면 el 표현식에 var의 값,  변수 이름만 적으면 출력되므로 코드가 간략해짐을 알 수 있음.

   실행 결과

 

 

2.   ArrayList 데이터

${requestScope.memberList } <br>

첫번째 사용자의 이름을 출력 : ${requestScope.memberList[0].name } <br>
두번째 사용자의 이름을 출력 : ${requestScope.memberList[1].name } <br>

<c:set var="p" value="${memberList[0] }" />
첫번째 사용자의 이름을 출력 : ${p.name } <br>

<c:set var="p" value="${memberList }" />
첫번째 사용자의 이름을 출력 : ${p[0].name } <br>

–   첫번째 사용자의 이름을 출력하기 위해 ${memberlist[0] } 입력함.
     →   여기서 배열의 0번째 요소는 'p' 객체!  아까 배열에 데이터 추가할 때 add(p) 했음.
     →   ${memberlist[0].name } ==  ${person.name } 같은 의미.
–   JSTL을 사용하여 변수 생성,  데이터를 입력하여 저장함.
     →   어떻게 뭘 저장하느냐에 따라 el 표현식의 코드가 간결해짐.

   실행 결과

 

 

 


📃   core_if.jsp


•   if문   — JSTL


< c:if test="${조건문}" >
        조건문이 참일때 실행
</c:if>

 

 

•   변수 i의 값이 itwill일 때 "아이티윌" 출력

 

1.   JSP 코드로 작성

<!-- 변수 i 생성 -->
<c:set var="i" value="itwill" />


<%
	String i = (String) pageContext.getAttribute("i");
%>

i : <%=i %> <br>

<%
	if(i.equals("itwill")){
		out.println("아이티윌");
	}
%>
코드 분석
2
  –   JSTL에서 변수를 만든다는것은 영역객체에서의 속성 (= 데이터)을 생성하는 것.
  –   scope를 따로 지정하지 않았으므로 변수 i의 데이터는 기본 값인 pageScope에 저장됨.

       →   page에 있는 데이터를 가져올때는 pageContext로 가져옴.

6
  –   String타입으로 다운캐스팅 함.

9
  –   표현식으로 정보를 출력해봄 → 확인 작업

11~15
  –   스크립틀릿으로 if문사용하여 .equals() 메서드로 문자열을 비교하여 결과 도출.

   실행 결과

 

 

2.   JSTL을 사용하여 작성

<c:set var="i" value="itwill" />
i : ${pageScope.i } <br>

<!-- 방법1 -->
<c:if test="${i == 'itwill' }" >
	<h2>아이티윌@@@</h2>
</c:if>

<!-- 방법2 -->
<c:if test="${i.equals('itwill') }" >
	<h2>아이티윌@@@</h2>
</c:if>
코드 분석
2
  –   정보가 page에 저장되어 있으므로 pageScope 객체에서 정보를 불러와 el 표현식으로 출력.

4~12
  –   동등비교연산자 또는 .equals() 둘 다 사용 가능.
       →   큰따옴표가 이미 사용중이므로 문자열일 경우 '작은따옴표' 사용.

   실행 결과

 

 

•   홀 & 짝 구분하기

–   JSTL에서는 if문의 기능만 있으므로 여러 조건이 필요하다면 그냥 if문을 여러개 사용함.

<c:set var="number" value="1000" />

<!-- if문 1 -->
<c:if test="${number % 2 != 0 }" >
	<h2>홀수</h2>
</c:if>

<!-- if문 2 -->
<c:if test="${number % 2 eq 0 }" >
	<h2>짝수</h2>
</c:if>

   실행 결과

 

 

•   choose 태그 사용

–   switch-case와 비슷함.

<!-- 방법1 -->
<c:choose>
	<c:when test="${number%2 eq 0 }">
		짝수 (choose) <br>
	</c:when>
	
	<c:when test="${number%2 ne 0 }">
		홀수 (choose) <br>
	</c:when>
</c:choose>


<!-- 방법2 -->
<c:choose>	
	<c:when test="${number%2 ne 0 }">
		홀수 (choose) <br>
	</c:when>
	
	<c:otherwise>
		짝수 (choose) <br>
	</c:otherwise>
</c:choose>

 

–   <c:otherwise>는 default랑 비슷한 기능이라 '그 외 나머지 전부'를 뜻함.
     →   정확하게 사용하자면 홀짝 구분할때는 <c:when>으로 구분하는게 맞음.

–   조건을 개별적으로 비교할때는 <c:if> 여러개를 비교할때는 <c:choose> 사용.

 

 

 


📃   core_forEach.jsp


•   forEach문   — JSP코드


for (변수 : str ) { }                                                    1 )   뒤칸부터 채움
for (String s : str ) { }                                               2 )   str 데이터를 저장할 변수 생성
for (변수 : 배열 / 컬렉션 (ArrayList) ) { }


<%
	String[] str = {"a", "b", "c", "d", "e", "g"};

	for(String s : str){
		System.out.println(s);
	}
	
	// page영역에 str 배열 저장
	pageContext.setAttribute("str", str);
%>

–   String타입의 배열을 생성하여 참조변수 str에 데이터를 저장함.

–   참조변수 str을 page 영역에 저장함.

     →   해당 페이지 내에서 str 배열 데이터 사용 가능.

 

 

 

•   forEach문   — JSP코드 & JSTL & el 표현식

<%
	for(int i=1; i<=5; i++){
%>
		forEach<%=i %> <br>
<%
	}
%>

<hr>


<c:forEach begin="1" end="5" step="1">
	forEach <br>
</c:forEach>

<hr>


<c:forEach var="i" begin="1" end="5" step="1">
	forEach${i } <br>
</c:forEach>

–   셋 다 같은 동작을 하는 코드.

–   가볍게 원리만 짚고 넘어가기 위해 간단하게 1부터 5까지 반복하는 코드를 작성함.

   실행 결과

 

 

•   str 배열 출력하기   — JSTL의 forEach문


<c : forEach  var="변수명"  items= " $ { 출력할데이터 (=배열명) } " >
           반복 : $ { 변수명 } <br>
</c : forEach>
<c:forEach var="s" items="${str }">
	반복 : ${s } <br>
</c:forEach>

–   위에서 page 영역에 str 배열을 저장 (pageContext 객체 사용)했으므로 el표현식도 사용 가능.
–   만약 저장안했다면 스크립틀릿에 자바 코드로도 저장했으니까 표현식으로 str 출력하기.

   실행 결과

 

 

 

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함