Core Tag
Table of contents
Core Tag
Core Tag Basic
변수설정이나 if-else와같은 논리 처리에 사용되는 스크립트 코드를 대체하는 태그를 제공
코어 태그 라이브러리를 사용하려면 아래 디렉티브를 추가해야지 사용할 수 있음
syntax
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>
▸ prefix : JSP코드에서 코어 태그 라이브러리를 호출할 때 사용할 접두어
Core Tag Library
기능 | 태그 | 설명 |
---|---|---|
변수지원 | set | JSP에서 사용할 변수를 선언 |
remove | 설정변수를 삭제 | |
흐름제어 | if | 조건에 따라 흐름을 제어 |
choose | 다중조건을 처리 | |
forEach | 컬렉션이나 Map의 각 항목을 처리할 때 사용 | |
forTokens | 구분자로 분리된 토큰을 처리 | |
URL처리 | import | URL에 해당되는 자원을 삽입 |
redirect | 지정된 경로로 리다이렉트 실행 | |
url | URL을 재작성 | |
기타태그 | catch | 익셉션처리 |
out | JspWriter에 내용을 출력 |
Variable Support Tag
<c:set>
EL 변수의 값이나 EL 변수의 프로퍼티 값을 지정할 때 사용
1. Create an EL Variable
1. EL변수를 생성할 때 사용함
scope속성에서 지정한 영역에 값을 저장함, 예를들어 pageContext.setAttrubute(변수명, 변수값, scope)를 호출해서 지정한 영역의 속성으로 설정
syntax
<c:set var=”변수명” value=”값” [scope=”영역”] />
<c:set var=”변수명” [scope=”영역”] />값</c:set>
▸ var : 값을 저장할 EL변수의 이름을 지정
▸ value : 변수의 값을 지정. 표현식, EL, 정적인 텍스트를 사용해서 값을 지정
▸ scope : 변수를 저장할 영역을 지정. page(기본값), request, session, application중 하나가 옴
<!--set 태그를 이용해서 el변수를 설정하는 다양한 예-->
<!--1. value 속성 사용의 예-->
<c:set var="name" value="가은" />
<c:set var="name" value="<%= m.getFirstName() %>" scope="request" />
<c:set var="name" value="${m.lastName} ${m.firstName}" />
<!--2. 태그의 몸체를 값으로 사용하는 예-->
<c:set var="name">가은</c:set>
<c:set var="name"><%= m.getLastName() %> <%= m.getFirstName() %></c:set>
<c:set var="name">${m.lastName} ${m.firstName}</c:set>
2. Setting the Property Value of an Object
2. 객체의 프로퍼티 값을 설정할 때
주의! : target대상이 EL변수인 경우 target속성의 값을 ${member}와 같이 EL을 이용해서 설정해야 함
syntax
값</c:set>
▸ target : 프로퍼티 값을 설정할 대상 객체를 지정(자바빈 객체나 Map). 표현식이나 EL변수를 사용할 수 있음
▸ property : 설정할 프로퍼티 이름을 지정. target이 자바빈 객체일경우 프로퍼티 이름에 해당하는 set메서드를 제공해야 함
▸ value : 프로퍼티의 값을 지정
<!--프로퍼티 값을 설정하기 위한 c:set 태그 사용의 예-->
<% Member member = new Member(); %>
<c:set target="<%= member%>" property="name" value="가은1" /> <!--member.setName("가은1")과 동일-->
<%= member.getName() %> <!--값 가은1 출력-->
<c:set var="m" value="<%= member %>" />
<c:set target ="%{m}" property="name" value="가은2" /> <!--member.setName("가은2")과 동일-->
${m.name} <!--값 가은2 출력-->
<%Map<String, String> prop = new HashMap<String, String>();%>
<c:set target="<%=prop%>" property="host" value="localhost"/> <!--prop.set("host", "localhost")와 동일-->
<%=prop.get("host")%> <!--값 localhost 출력-->
Note!
c:set 태그에서 value속성의 값을 null로 설정할 수 있음
이 경우, 변수이 값을 설정하는 c:set태그는 PageContext.removeAttribute를 이용해서 변수를 삭제함
프로퍼티의 값을 설정하는 c:set태그는 자바빈 객체인 경우 프로퍼티 값을 null로 처리하고 Map인 경우 프로퍼티 이름에 해당하는 키를 Map에서 삭제함
Summary of attributes of c:set
c:set 태그의 속성 설명요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
var | 사용불가 | String | EL 변수 이름 |
value | 사용가능 | Object | 변수에 할당할 값 |
scope | 사용불가 | String | 변수를 생성할 영역, 기본값은 page |
target | 사용가능 | Object | 프로퍼티 값을 설정할 객체 지정 |
property | 사용가능 | String | 프로퍼티 이름 |
<c:remove>
set 태그로 지정한 변수를 삭제할 때 사용
▸ var속성과 scope 속성은 set태그의 두 속성과 동일한 의미를 갖음
▸ 주의할 점은 삭제할 변수의 scope를 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수를 삭제함
→ 따라서 서로 다른 영역에 동일한 이름을 갖는 변수가 존재하고 특정 영역에 속한 변수만 제거하고 싶다면 scope속성으로 명확하게 영역을 지정해줘야 함
syntax
<c:remove var=”varName” [scope=”영역”] />
Summary of attributes of c:remove
c:remove 태그의 속성 설명요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
var | 사용불가 | String | 삭제할 EL 변수 이름 |
scope | 사용불가 | String | 삭제할 변수가 포함된 영역 |
Flow Control Tag
코드의 복잡함을 없애기 위해 존재하는 흐름제어 태그는 if, choose, forEach, forTokens가 있음
<c:if>
자바의 if블록과 비슷한 기능을 제공
if-else블럭과 같은 효과를 낼 순 없지만 쉽게 대체하기 때문에 많이 사용
syntax
<c:if test=”조건” [var=”testResult”]/>
…
</c:if>
${testResult}
var : 계산 결과를 EL변수에 저장할 수 있음
test 속성으로 올 수 있는것들 : EL또는 정적 문자열
<c:if test="true">
<p>항상 true</p>
</c:if>
<c:if test="some txt">
<p>항상 false</p>
</c:if>
<c:if test="${expr}"> EL의 결과값이 true인 경우 몸체 내용 실행 </c:if>
<c:if test="<%= expr %>"> 표현식의 결과 값이 true인 경우 몸체 내용 실행</c:if>
Summary of attributes of c:if
c:if 태그의 속성 설명요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
test | 사용가능 | Boolean | 검사 조건 |
var | 사용불가 | String | 검사 조건의 계산 결과값을 저장할 EL변수 |
scope | 사용불가 | String | 삭제할 변수가 포함된 영역 |
<c:choose> / <c:when> / <c:otherwise>
<c:choose> : 자바의 switch구문과 if-else블록을 혼합한 형태로서 다수의 조건문을 하나의 블록에서 수행할 때 사용
<c:when> : test속성이 true일 때 내부 블록을 수행, 첫번째 true만 수행하고 나머지는 실행되지 않음
<c:otherwise> : test속성이 모두 false라면 c:otherwise가 실행됨, c:otherwise 태그는 필수는 아니고 필요한 경우에만 추가함
예제
<ul>
<c:choose>
<c:when test="${param.id == 'sohyang'}">
<li>아이디는 ${param.id} 입니다 (JSTL / EL)</li>
</c:when>
<c:when test="${param.age > 18}">
<li>나이는 성인, ${param.age} 입니다 (JSTL / EL)</li>
</c:when>
<c:otherwise>
<li>당신의 아이디와 나이에 대한 정보가 없습니다</li>
</c:otherwise>
</c:choose>
</ul>
<c:forEach>
배열, Collection 또는 Map에 저장되어 있는 값들을 순차적으로 처리할 때 사용
▸ for나 do-while을 대신해서 사용할 수 있음
▸ items 속성에는 Map, 배열, Collection이 올 수 있음
▸ 배열의 경우는 객체의 배열 뿐만 아니라 기본 데이터 타입의 배열에 댕해서도 알맞게 처리를 함
→ 기본 데이터 타입은 Integer나 Double과 같은 래퍼 클래스를 사용하여 처리
→ begin, end, step 속성을 사용해서 조건을 변경할 수 있음
syntax
<c:forEach> with Map Object
Map 사용하기
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
Map<String, Object> map = new HashMap<>();
map.put("id", "sohyang");
map.put("pw", "12345");
map.put("name", "소향");
map.put("addr", "경기 성남");
%>
<c:set var="data" value="<%= map %>"/>
...
<h3>Collection(Map) 계열</h3>
<c:forEach var="i" items="${data}">
${i.key} = ${i.value} <br>
</c:forEach>
<c:forEach> with Array
Array 사용하기 : 기본
<h3>Array</h3>
<c:set var="arr" value="<%= new int[]{1,2,3,4,5} %>"/>
<c:forEach var="i" items="${arr}">
${i},
</c:forEach>
Array 사용하기 : begin, end
<h3>1~100까지의 홀수의 합</h3>
<c:forEach var="i" begin="1" end="100" step="2">
<c:set var="sum" value="${sum + i}"/>
</c:forEach>
<p>1~100까지 홀수의 합 = ${sum}</p>
Array 사용하기 : varStatus
<h3>Array</h3>
<c:set var="arr" value="<%= new int[]{1,2,3,4,5} %>"/>
<c:forEach var="i" items="${arr}" begin="2" end="4" varStatus="status">
${status.index} - ${status.count} - [${i}] <br>
</c:forEach>
Summary of attributes of c:forEach
c:forEach 태그 설명 요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
var | 사용불가 | String | 몸체에서 사용할 EL변수 이름 |
items | 사용가능 | Collection, Iterator, Enumeration, Map, 배열 | 반복처리할 데이터 |
varStatus | 사용불가 | String | 루프 상태를 저장할 EL변수 이름 |
begin | 사용가능 | int | 시작 인덱스 값 |
end | 사용가능 | int | 끝 인덱스 값 |
step | 사용가능 | int | 인덱스 증분 값 |
varStatus property
루프 정보를 담는 객체를 저장할 변수 명을 값으로 갖음
c:forEach 태그 몸체에서는 varStatus 속성에 명시한 변수를 이용해서 현재 처리중인 인덱스, begin 속성값, end 속성값 등을 구할 수 있음
index : 루프 실행에서 현재 인덱스
count : 루프 실행 횟수
begin : begin 속성 값
end : end 속성값
step : step 속성 값
first : 현재 실행이 첫번 째 실행인 경우 true
last : 현재 실행이 루프의 마지막 실행인 경우 true
current : 컬렉션 중 현재 루프에서 사용할 객체
Example
구구단 출력하기
<h3>구구단 출력하기</h3>
<c:forEach var="i" begin="2" end="9" step="1">
<p>구구단 ${i}단 출력</p>
<c:forEach var="j" begin="2" end="9" step="1">
<ul>
<li>
${i} * ${j} = ${i*j}
</li>
</ul>
</c:forEach>
</c:forEach>
<c:forTokens>
items 속성으로 전달 받은 문자열을 구분자를 이용해서 나누고, 구분한 각 문자열을 var 속성에 명시한 변수에 저장함
▸ java.util.StringTokenizer 클래스와 같은 기능을 제공하는 태그
▸ forEach 태그와 동일하게 begin, end, step, varStatus 속성을 제공
▸ items의 속성값이 String이라는 것을 제외하면, 나머지 태그의 속성은 c:ForEach태그의 속성과 동일함
syntax
<h3>forTokens - 컴마(,)와 점(.)을 구분자로 사용</h3>
<c:forTokens var="value" items="빨,주,노,초.파,남.보" delims=",.">
${value}
</c:forTokens>
Handling URL Tag
url 생성 (c:url) 태그와, 리다이렉트 처리(c:redirect)태그가 존재함
<c:url>
URL을 생성해주는 기능
▸ var 속성을 지정하지 않으면 현재 위치에 생성한 URL을 출력, 지정하면 해당 변수에 생성한 URL을 저장
▸ param태그를 이용해서 파라미터를 URL에 추가할 수 있음
▸ value 속성은 절대URL(http://…)와 상대URL(/view…)로 지정함
syntax
<c:url value=”URL” [var=”varName” scope=”영역”]>
</c:url>
<c:url value="http://search.daum.net/search" var="searchUrl">
<c:param name="w" value="blog" />
<c:param name="q" value="공원" />
</c:url>
<ul>
<li>${searchUrl}</li> <!--http://search.daum.net/search?w=blog&q=공원-->
<li><c:url value="jsp11_01_if.jsp" /></li><!--/chap12/"jsp11_01_if.jsp-->
<li><c:url value="./jsp11_01_if.jsp" /></li><!--"./jsp11_01_if.jsp-->
</ul>
Summary of attributes of c:url
c:url 태그의 속성 설명요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
value | 사용 가능 | String | 읽어올 URL |
var | 사용불가 | String | 읽어온 결과를 저장할 변수 이름 |
scope | 사용 불가 | String | 변수를 저장할 영역 |
<c:redirect>
response.sendRedirect()처럼 지정한 페이지로 리다이렉트 시켜주는 기능을 제공
▸ url속성 값이 슬래시로 시작할 경우 리다이렉트 URL에 컨텍스트 경로가 추가됨 (/a.jsp = chap12/a.jsp)
▸ 다른 컨텍스트 경로에 포함된 URL로 리다이렉트 하고 싶다면 context 속성에 다른 컨텍스트의 경로를 적어주면 됨 (context=”/chap15”)
▸ redirect 태그를 실행하면 그 이후 코드는 실행되지 않음
▸ param 태그를 이용해서 파라미터를 설정할 수 있음
syntax
<c:redirect value=”URL” [context=”컨텍스트경로”]>
</c:redirect>
<c:redirect url="http://www.google.com" />
Summary of attributes of c:redirect
c:redirect태그의 속성 설명요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
url | 사용가능 | String | 리다이렉트할 URL |
context | 사용가능 | String | 컨텍스트 경로 |
Other Core Tag
<c:out>
JspWriter에 데이터를 출력할 때 사용되는 태그
syntax
<c:out value=”value” [escapeXml=”(true | false)”] [default=”기본값”] /> |
<c:out value=”value” [escapeXml=”(true | false)”] > 기본값 </c:out> |
▸ value : JspWriter에 출력할 값을 지정, 일반적으로 value의 속성타입은 String
▸ escapeXML : 이 속성값이 true일 경우 특수문자를 유니코드로 변경, 생략 가능, 기본값은 True
▸ default : value속성에 값을 지정하지 않았을 경우 default에 지정한 값이 출력
<%
FileReader reader = null;
try{
String path = request.getParameter("path");
reader = new FileReader(getServletContext().getRealPath(path));
}
%>
...
<c:out value="<%=reader%>" escapeXml="true"%/> <!--그 파일의 모든 코드를 가져옴-->
Summary of attributes of c:out
c:out 태그의 속성 설명요약
속성 | 표현식/EL | 타입 | 설명 |
---|---|---|---|
value | 사용가능 | Object | 출력할 값 |
escapeXml | 사용가능 | boolean | 특수 문자를 변환할지의 여부 |
default | 사용가능 | Object | value의 결과값이 null인 경우 출력할 값 |
<c:catch>
그 이후 exName객체가 있을 경우에는 익셉션 처리를 할 수가 있음
syntax
${exName} 사용
<h3>c:catch</h3>
<c:catch var="e">
name 파라미터의 값 = <%= request.getParameter("name") %> <br>
<%
if(request.getParameter("name").equals("test")){
%>
${param.name}은 test입니다 <br>
<%
}
%>
</c:catch>
<c:if test="${e!=null}">
익셉션이 발생했습니다<br>
${e}
</c:if>