Jsp

[jsp] JSTL

쟈근꿈틀이 2022. 5. 21. 10:25
728x90

JSTLJSP에서 사용 가능한 표준 태그 라이브러리이다.

HTML 코드와 스크립트릿을 함께 사용하게 되면 코드가 복잡하고 가독성이 떨어진다.

JSTL은 다양한 태그를 제공함으로써 코드의 가독성을 좋게 한다.

 

JSTL을 사용하기 위해 필요한 JAR 파일은 jstl.jar standard.jar이다.

파일은 http://jakarta.apache.org Apache Standard Taglib를 클릭한 후, jakarta-taglibs-standard-1.1.2.zip을 다운로드 받아 압축을 풀고 이클립스 프로젝트의 lib에 2개의 파일을 복사하면 사용할 수 있다.

 

 


JSTL tag

출처: https://andamiro25.tistory.com/172님의 블로그

 


JSTL tag 사용 방법

 

<%@ taglib uri="사용할 태그 라이브러리 URI" prefix="접두사"%>
*url, prefix는 필수 속성

 

<접두사: 속성=값 ... />

JSTL을 사용하려면 JSP 페이지에 taglib 지시자(directive)를 추가하여 URI와 접두사를 지정해야 한다.

jstl의 core 태그를 사용할 때 prefix="core"로 지정하면, <core: 속성=값 />형식의 태그를 통해 해당 기능을 사용할 수 있다.

태그별로 자주 사용하는 접두사가 있으니 이를 따르도록 하자!

 


JSTL core tag 

<c:out> 태그

c:out 태그를 사용하여 value 속성에 지정한 값을 출력할 수 있다.

 

<c:out value="hello"/><br>
<%="표현식으로 출력" %><br>
<% out.print("메소드로 출력"); %><br>
${"표현 언어로 출력"}<br>

 


<c:set> 태그

 

<c:set var="변수명" [value="저장할 값"] [scope="page/request/session/application"]/>

OR

<c:set var="변수명" [scope="page/request/session/application"]>저장할 값</c:set>(단일 태그)

 

c:set태그는 시작과 끝 태그의 형식과 단일 태그 형식을 모두 쓸 수 있다.

scope속성이 생략되었을 때는 scope가 기본 값인 page로 설정되어 page의 속성으로 저장된다.

 

var 속성으로 지정한 변수가 이미 존재한다면 변수의 값을 value속성의 값으로 변경하고, 존재하지 않다면 변수를 새로 만든 후에 value속성의 값으로 초기화한다.

value 속성으로는 일반 문자열이나 EL이 가능하다. 

scope 속성은 변수가 사용되는 범위로, 이 속성을 생략할 경우 기본 값인 page로 설정되어서 page의 속성으로 저장된다.

 

<c:set var="data1" value="test" />
<c:set var="data2">
	test2
</c:set>
data1: <c:out value="${data1 }"/>, ${data1 }<br>
data2: ${data2 }<br>

 

결과

 


<c:remove> 태그

<c:remove var="변수명" [scope="page/request/session/application"] />

c:remove는 var 속성에 지정된 변수를 제거한다.

 

<c:set var="test" value="value" />
삭제 전 \${test }: <c:out value="${test }" /><br>
<c:remove var="test" />
삭제 후 \${test } is null?: <c:out value="${empty test }" />

 


<c:if> 태그

<c:if test="${ 조건식 }">
종속 문장
</c:if>

 

조건식의 결과는 참 또는 거짓으로, 조건식이 참이면 c:if태그의 종속 문장을 실행한다.

else문과 같은 태그가 없기 때문에, 상단에 작성된 c:if태그의 조건식의 반대인 c:if태그를 작성해서 else문을 구현할 수 있다. 

 

	<c:set var="data" value="홍길순" />
	<c:if test="${data eq '홍길동' }">
		<h3>홍길동님 환영합니다!</h3>
	</c:if>
	<c:if test="${data ne '홍길동' }">
		<h3>${data }님 환영합니다!</h3>
	</c:if>


<c:forEach> 태그

<c:for var="변수명" items="배열/리스트명" begin="시작idx" end="끝idx" [step="증가폭"]>
반복할 코드
</c:for>

 

c:forEach태그는 for문의 기능을 제공한다.

step속성의 값을 지정하지 않으면 기본 값인 1로 설정된다.

 

	<%
	String data[] = {"김변수", "이상수", "박객체"};
	%>
	<c:set var="names" value="<%=data %>"/>
	이름 목록: ${names[0] }, ${names[1] }, ${names[2] }<br>
	 
	이름 목록: 
	<c:forEach var="i" begin="0" end="<%=data.length-1 %>" step="1">
		${names[i] },
	</c:forEach>
	<br>
	
	이름 목록: 
	<c:forEach var="name" items="${names }">
		${name },
	</c:forEach>

 

<c:forEach var="i" begin="0" end="<%=data.length-1 %>" step="1">
      ${names[i] },
</c:forEach>

==

for(int i = 0; i <= data.length-1; i++){
     data[i];
}

위에서 c:forEach태그를 통해 작성한 반복문은 == 아래에 작성된 자바 코드와 동일한 기능을 수행한다.

변수 var에 0부터 data.length-1까지 차례대로 대입된다는 점을 유의하자! 

 

<c:forEach var="name" items="${names }">
   ${name },
</c:forEach>

==

for(String data: datas){
   data;
}

c:forEach태그를 통해 향상된 for문을 사용할 수도 있다.

items 속성 값인 배열이나 리스트의 길이만큼 동일한 코드를 반복한다.


<c:choose>, <c:when>, <c:otherwise> 태그

 

<c:choose>는 Java 언어의 switch~ case처럼 여러 조건 중에 하나를 선택하여 수행한다. 

<c:when>는 case문과, <c:otherwise>는 default문과 동일한 기능이다.

 

	<c:set var="name" value="김변수"/>
	<c:choose>
		<c:when test="${name == '김변수' }">
			<h3>이름은 김변수입니다.</h3>
		</c:when>
		<c:when test="${name == '이상수' }">
			<h3>이름은 이상수입니다.</h3>
		</c:when>
		<c:otherwise>
			<h3>이름은 홍길동입니다.</h3>
		</c:otherwise>
	</c:choose>

 


<c:import> 태그

<c:import url=“URL” [var=“변수명”]
[scope="page/request/session/application"] [charEncoding=“인코딩 방식”] />

 

c:import태그와 <jsp:include>태그의 작동 방식은 같다.

c:import태그도 컴파일된 URL의 리소스(jsp 파일)의 결과를 이를 포함한 jsp파일에서 사용하는 것이므로, c:import를 통해 불려진 jsp 파일의 변수를 사용할 수 없다.

 

include1.jsp
	<%
		String data1 = "include1_data1";
	%>
	<c:set var="data2" value="include1_data2" />

 

include2.jsp
	<c:import url="include1.jsp" />
	data1: ${data1 }<br>
	data2: ${data2 }<br>

 

 

include2.jsp에서 c:import태그로 불러온 include1.jsp파일의 변수는 사용할 수 없다.

따라서 ${null }로 표현되므로 화면에는 공백이 띄워진다.

 

 


<c:redirect> 태그

<c:redirect url="URL" context="컨텍스트 경로" />

url 속성에 지정된 리소스로 리다이렉트한다.

<jsp:redirect>액션 태그와 response.redirect()메서드와 동일한 기능이다. 

context 속성을 지정하면 콘텍스트 경로/url경로와 같은 형식으로 리다이렉트된다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<fmt:requestEncoding value="utf-8" />    
<c:choose>
	<c:when test="${empty param.id or empty param.pw}">
		<script>
			alert('아이디와 비밀번호는 필수 값입니다');
			location.href = 'ex7_login.jsp';
		</script>
	</c:when>  
	<c:when test="${param.id eq 'admin' and param.pw eq '1234' }">
		<c:set var="id" value="${param.id }" scope="session" />
		<c:redirect url="ex7_login.jsp" />
	</c:when>
	<c:otherwise>
		<script>
			alert('아이디 또는 비밀번호를 확인 후 입력하세요');
			location.href = 'ex7_login.jsp';
		</script>
	</c:otherwise>
</c:choose>

 

전달받은 아이디가 admin이고 비밀번호가 1234이면 로그인에 성공하였으므로, 클라이언트가 c:redirect태그를 통해

로그인 페이지를 웹 서버에게 새롭게 요청하여 해당 페이지로 이동한다.


<c:url> 태그

<c:url value = "URL" [var = "변수명"] [scope="page/request/session/application"] />
          

c:url태그는 URL를 생성한다.

생성한 uri를 변수에 담아 지정된 범위의 속성으로써 저장할 수도 있다.

 

<c:url var="root" value="/" />
web context root: ${root}<br>
<c:url var="jstl" value="/jstl" />
jstl path: ${jstl}

 

/는 최상위 경로를 뜻한다. 즉 해당 프로젝트의 Context root와 동일하다.


다른 프로젝트에서 현재 프로젝트 내부의 코드들을 복사하여 사용할 수 있다.

c:url태그를 사용하여 프로젝트의 Context root를 직접 적지 않고 ${root }로 사용하면,

다른 프로젝트에서 동일한 코드를 사용할 때 ${root }의 값에 각 프로젝트의 Context root으로 설정되기 때문에 코드의 재사용성이 높아진다.

728x90
댓글수0