본문 바로가기
Programming/JSTL

JSTL 개요

by 막이 2012. 9. 13.

1. 개요

JSTL(JSP Standard Tag Libray)

JSP에서 자바의 각종 기능을 태그형태로 사용할 수 있도록 정의해서 사용할 수 있는 것을 말합니다.

쉽게 말해서 굳이 자바나JSP언어를 쓰지 않고 태그형태로 HTML상에서 불러다 쓸 수있다는 말이죠.

JSTL은 커스텀태그의 일종입니다. 그렇다면 또 커스텀 태그가 뭐란말인가요;

커스텀태그

자신이 직접 정의할수있는 태그를 말합니다. 평소에 쓰던 태그는 각각기능이 있지만 (HTML쓰시면서 태그좀 쓰신분 많이 있으실겁니다 ㅎ) 하지만 그 기능은 한정되어있고 원하는 기능이 있지만 일반적인 태그의 기능이 한정되었음을 느끼실때가 많으셨을겁니다. 그것을 대비하여 자기 자신이 새로운 태그를 만들어 자신만의 태그를 만들수 있다는거죠.

커스텀태그의 장점

라이브러리 형태로 만들어서 필요할때마다 쓰기 때문에 개발속도의 향상 업

일반 태그의 한계점 극복

자기가 직접작성한 태그이기 때문에 유지보수 및 가독성 업

반복적 기능을 쉽게 구현이 가능하기 때문에 효율적

최대한 자바코드를 줄이기 위해 거의 모든 자바 코드를 커스텀태그로 바꾸어 놓은 것을

JSTL이라고 보시면되겠습니다.

EL(Expression Language)

표현언어를 의미합니다. 자바코드를 대신하여 다른 표현식을 사용합니다.

<%=age%> ===>> ${age} 이런형식으로 바꾸어 쓸수있다는겁니다.

쉽게 말해서 저런 형태로 변경해서 쓴다는 개념입니다. 일반태그의 < >사이에 표현식을 쓰게 되면 굉장히 복잡하고 갇고성도 떨어지겠죠. < > 사이에 ${}이런형식이라면 눈에띄고 쉽게 분간이 갈수 있겠죠. EL을 쓸때는 ${변수명} 이런형태로 구성되어 있습니다.

대체 무슨말일까요. 하시는 분들은 다음 예제를 보시면서 감을 잡아가시기 바랍니다.

JSTL을 이용하여 정말 간단한 예제를 만들어 보겠습니다.

index.jsp

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action="el_test.jsp" method="post"> // 버튼을 누르면 name값을가지고 el_test.jsp로 넘어가게 설정
<table border="1">
<tr>
<td>이름 : <input type="text" name="name"></input></td>
<td><input type="submit" value="입력"></input></td>
</tr>
</table>
</form>
</body>
</html>

index,jsp에서 쓴 값을 넘겨 받습니다. 일반적으로 우리는 jsp언어를 이용하여

<%

String name = request.getParameter("name"); //앞에서 넘긴 name값을 받아서 변수에 저장

%>

이런식으로 변수에 넣고 출력시에는 html안에다가

당신의 이름은 <%=name%>입니다

라는 식으로 나타냅니다. JSTL의 EL로 바꿔서 가보도록하겠습니다

el_test.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>

당신의 이름은 ${param.name } 입니다! //EL내장객체중 자주쓰이는 객체인 param이용 index.jsp에서 name값을 바로 넘겨받아서 커스텀태그로 표현

</body>
</html>

대충 이런식으로 쓰입니다. 내장객체역시 여러종류가 있습니다. 그 내장객체를 이용하여 여러가지 값을 참조하고 사용할 수 있습니다.

2. 다운로드 및 셋팅

http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi

위 링크로 이동하여 zip파일을 다운 받습니다.

압축을 푸시고 lib폴더에 들어있는 jstl.jar 파일과 standard.jar 파일이 있는 확인합니다. 그 두개의 파일을 복사하셔서 톰캣 lib폴더 안에 혹은 생성한 프로젝트 lib폴더에 넣어두시면 셋팅이 끝납니다.

JSTL태그는 방대합니다. 가장 일반적이면서도 기초적인 라이브러리 모음이 Core Library입니다

이 코어 라이브러리는 우리가 맨처음 c언어를 하든java를 입문했던 시절 기능이 고대로 있는 라이브러리 입니다. 예를 들면 출력, 삭제, 변수지정, if문 ,for문 이라고 생각하시면 되겠습니다.

종류

* 일반

<c:out> 출력을 할때 쓰이는 태그입니다. print문이라고 생각하시면 되겠네요.

<c:set> 변수를 지정하는 태그입니다.

<c:remove> 지정된 변수를 삭제하는 태그입니다.

<c:catch> 예외를 처리하는 태그입니다.

* 조건

<c:if>

<c:choose>

<c:when>

<c:otherwise>

* URL

<c:import>

<c:url>

<c:redirect>

<c:param>

* 반복

<c:forEach>

<c:forEachToken>

지금 알아볼 태그입니다만, 대충 저 태그가 어떤 기능을 하는지 예측을 하신분들도 계실겁니다.

그 예측이 맞다면 정말 여러분들은 대단하신 분들이죠~

우선 JSTL 1편에서 다운로드 및 셋팅을 제대로 하셨다면 위의 태그가 잘 먹힐겁니다. 예제도 하나씩 만들면서 느껴볼 것인데, 셋팅은 안하신 분들은 1편을 참고하시어 다운로드및 셋팅을 해주시면 이 글을 보면서 이해하시는데 수월하실겁니다.

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

위를 해석해 보자면 c라는 별명을 주고 core태그를 사용하겠다 라는 뜻이 됩니다. uri 하고 웹주소가 적혀져서 으잉? 저 사이트에뭔가 불러다 쓰는건가? 인터넷연결안되면 설마;; 사용안되는건가? 라고 생각하시는분도 혹시 계셨을까요?(저는 처음보는순간 그랬습니다 --;) 하지만 저 뜻을 찾아보니 uri형태를 띄는 태그의 이름이었던 것이었습니다.

prefix="c" 의 경우에는 태그를 쓸때 <c:out> 맨앞에 정해주는 닉네임같은걸로 보시면되겠습니다.(물론 저기에 적힌 c를 z나 x 다른 알파벳으로 써도 태그를 쓰실때 똑같이 잘써주신다면 먹히지만 표준상 Core를 쓸때는 Core의 c를 따서 저런형식으로 약속(?)을 한거죠. 그럼 다른것도 알아보겠습니다.

태그

URI

Profix

Core

http://java.sun.com/jsp/jstl/core

c

XML

http://java.sun.com/jstl/xml

x

formating

http://java.sun.com/jstl/fmt

fmt

DB

http://java.sun.com/jstl/sql

sql

지금 2편에서 알아볼 태그는 일반적인 코어 태그이기 때문에 코어태그를 쓰기 위해서는 태그라이브러리를 해주어야 겠죠.

이클립스 기준으로 JSP 파일을 하나 생성합니다. 그리고 HTML위쪽으로 JSP범위에

태그라이브러리를 다음과 같이 선언합니다.

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

그럼 본격적으로 각 태그들을 어떻게 쓰는지 어떤 기능이 있는지 예제를 통해서 알아보도록하겠습니다.

<조건부 태그>

1. <c:out>

지정된 값을 출력하는 태그입니다.

<c:out value="출력값" default="기본값" escapeXml="true 또는 false">

보통우리는 가져온값을 출력할때 <%=변수이름%> 이런형식으로 썼었습니다. 태그를 이용해서 출력 해보겠습니다.

당신의 이름은 <c:out value='${name}' default="jung"> 입니다 //값이 없어도 디폴트값을 지정해서 출력이 가능합니다

결과 -> 당신의 이름은 jung 입니다

디폴트 값을 주어서 출력을 해보았습니다. 쇼핑몰이나 타 사이트에 들어가면 로그인하지 않은 상태를 나타내었을때 'guest 어서오세요' 라고 쓰여진 걸 보셨을 겁니다. 디폴트값을 지정하여 이렇게 써먹을수도 있겠더라구요.

escapeXml 이것은 boolean타입으로 참과 거짓으로 나뉩니다.

true경우는 html을 xml로 취급하여 태그가 먹히지 않고 그대로 화면상에 노출됩니다.

또한 소스에는 각각 아래와 같이 문자 엔티티 코드로 변환됩니다.

문자

문자 엔티티코드

<

&lt;

>

&gt;

&

&amp;

'

&#039;

"

&#034;

escapeXml='true' 경우

<jstl-test.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>

<%@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=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<c:out value="<h1>jstl<h1>,<,/" escapeXml='true'/>
</body>
</html>

결과값을보시면 value값 그대로 화면에 뿌려집니다. 이화면에서 오른쪽버튼을 클릭하시고 '소스보기'를 누르시고 확인을 해보면

소스는 각각 아래와 같이 문자 엔티티 코드로 변환됩니다.

반대로 escapeXml='false' 로 주어보겠습니다.

이제는 html태그가 먹히는군요

2. <c:set>

변수지원태그입니다.

기존의 액션태그인<jsp:setProperty>와 비슷한 계열이라고 생각하시면되겠습니다. 그러나 이 액션태그는 오직 빈의 프로퍼티를 설정하는 일밖에 못하죠. 속성을 추가하거나 빈이 아니라 맵을추가 할때

<c:set>을 사용하게 됩니다. 방식은 두가지 입니다 EL변수를 생성하는 것과 객체의 프로퍼티 값을 설정하는 방식입니다.

<c:set> EL변수 생성

기본형식은

몸체가 없는 형태 <c:set var="변수네임" value="값" scope="영역" />

몸체가 있는 형태 <c:set var="변수네임">값</c:set>

var : 값을 지정할 EL변수의 이름

value : 변수값을 지정. 표현식 ,EL 정적 텍스트를 지정할 수 있음(ex:"aa",%{aa},<%=aa>)

scope : 변수를 저장할 영역을 선택 page,session,application,request 가 올수있습니다. 기본값은 page값을 가집니다.

<c:set> 프로퍼티값 생성

몸체가 없는 형태 <c:set target="대상" property="프로퍼티이름" value="값" />

몸체가 있는 형태 <c:set target="대상" property="프로퍼티이름">값</c:set>

target : 프로퍼티의 값을 설정할 대상객체 표현식,EL변수 지정. 대상객체는 빈이나 Map이어야 합니다. 또한 절대 null값이어선 안됩니다. 속성id값도 안됩니다.

property : target 빈일경우 프로퍼티이름은 set메소드를 제공해야한다.

예를 들면 target ="setAge()" property="age" 이런형식

value : 설정할 프로퍼티의 값

예제를 보면서 이해해 보겠습니다.

우선 빈파일을 하나 만들어야 합니다. 간단하게 이름과 나이값을 get,set하는 부분을 만들어보겠습니다. jung이라는 패키지 안에 클래스 네임 'Info'를 생성합니다

<Info.java>

package jung;

public class Info {

private String name;
private String age;

public void setName(String name){
this.name=name;
}

public void setAage(String age){
this.age=age;
}

public String getName(){
return name;
}
public String getAge(){
return age;
}

}

다음은 test_result.jsp 파일입니다.(각각 주석을 달아놓았습니다.)

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="jung.Info" %> <!--jung이라는 패키지안에 Info.java를 포함 -->
<%@ page import="java.util.HashMap" %><!--HashMap기능을 포함 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!--코어태그를쓰기 위해! -->
<%
Info info = new Info(); //프로퍼티를 사용하기 위해 미리 만들어놓은 빈파일을 객체화
HashMap<String, String> hmap = new HashMap<String, String>(); //해시맵쓸준비
%>
<html>
<body>

<c:set var="info" value="<%= info %>" /> <!--c:set으로 info라는 변수명지정 값은 위쪽에 생성한 빈파일 객체 -->
<c:set target="${info}" property="name" value="살라딘" /> <!--프로퍼티기능으로 info에는 살라딘 라는 값이 등록됨 -->

<c:set var="hmap" value="<%= hmap %>" />
<c:set var="Youage" value="#{hmap.age}" /> <!--Youage라는 변수지정 값은 해시맵객체의 age값 -->

회원 이름: ${info.name} <br></br> <!--빈파일을 통해 등록된 이름을 출력 -->

나이: ${Youage}<Br></Br><!--등록된 나이를 출력(현재는 등록된 값이 없어서 null값임 -->

<c:set target="${hmap}" property="age" value="20" /> <!-- 나이값 지정 -->
나이 값 지정시 출력: ${Youage} 세

</body>
</html>

<결과화면>

회원이름 : 살라딘

나이 :

나이값 지정시 출력 : 20세

3. <c:remove>

지정된 변수를 삭제하는 태그입니다. 위쪽에서 속성을 지정했던 것을 제거 하기 위한 태그입니다.

위의 태그에 다음과 같은 삭제 태그를 써보고 한번더 출력해 보세요.

<c:remove var= "info"/>
<c:remove var ="hmap"/>

변수명이 info , hmap의 속성을 지운다는 뜻입니다. set했던 값이 뜨지 않는다면 성공적으로 태그가 적용된 것입니다.

4.<c:catch>

예외를 처리하는 태그입니다. 자바에서 예외처리를 하신 기억이 나시나요. 마찬가지고 이 태그는 예외처리를 해서 에러메시지를 출력하는 태그입니다.

간단한 예제를 보겠습니다

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<body>
<c:catch var="myerr"> <!-- 변수지정-->

<%int x = 10/0; %> <!-- 10으로 0을 나눴습니다;; -->

</c:catch>

<c:if test="${myerr !=null}">
${ myerr.message} <!-- 메시지 출력-->
</c:if>
</body>
</html>

*조건태그

<c:if>

사용방법

<c:if test="조건>

조건이 참일시 실행되는 부분

</c:if>

if문을 아신다면 그냥 뭐 쉽게 아실겁니다

다음은 if태그를 이용하여 숫자를 비교하는 예제입니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

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

<% int a =10; %> <!--비교할 숫자를 넣어줌 -->

<!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=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<c:set var="age" value="<%=a %>"/> <!--앞서배운 set을이용하여 age변수에 10을 넣어줍니다 -->

${age}

<c:if test="${age}==20"> <!--여기서 값을 비교합니다. -->

숫자가 맞습니다.

</c:if>

숫자가 틀립니다.

</body>

</html>

<c:choose>

<c:when>

<c:otherwise>

choose태그는 자바의 switch 구문과 if - else부분을 혼합한 형태를 띄고 있습니다.

일단 예제를 보실까요. 간단하게 임의의 숫자를 지정하고 성별을 출력하도록 만들어 보았습니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

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

<% int a =1; %>

<!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=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<c:set var="sex" value="<%=a %>"/>

<c:choose>

<c:when test="${sex==1}">

당신은 남자

</c:when>

<c:when test="${sex==2}">

당신은 여자

</c:when>

<c:otherwise>

그 외? 중성인가용?

</c:otherwise>

</c:choose>

</body>

</html>

예제를 보시면 바로바로 이해가 되시죠? ㅎㅎ

URL태그

<c:import>

URL결과를 읽어와서 현재위치에 삽입이 가능합니다 간단하게 한번 알아보죠

<jsp:include>와 비슷한 개념이지만 이 액션태그는 jsp의 동적인 자원을 포함하기 위해 만든것이기에 페이지라고 이해하시면되겠습니다. 가장 두드러지는 차이점은 include의 경우에는 현재 컨테이너 안에 있는 자원만 포함할 수 있지만, import 의 경우에는 외부자원도 가능하다는 겁니다.

<c:import url ="http://www.naver.com"/>

위와 같이쓰고 태그를 실행하면 네이버의 메인페이지가 뜨게 됩니다. 물론 페이지 뿐만아니라 외부적인 그림들도 다뜨죠.

<c:url>

url의 경우는 하이퍼 링크에 관련된 기능이라고 보시면되겠습니다. url을 재작성합니다

<a href=" <c:url value="test.jsp"/>"> test로가기</a>

jsp쪽에도 url액션태그가 있지만 import할 수있는url은 같은 도메인상에 있지 않아도 됩니다. 굳이 http가 아닌 ftp형식도 사용이 가능합니다

<c:redirect>

jsp의 sendRedirect()와 같은 기능을 가집니다.

이 액션은 HTTP 리다이렉트 응답을 사용자 브라우저로 보내는데 사용되며, JSTL의 javax.servlet.http.HttpServletResponse의 sendRedirect() 메소드와 같습니다.

<c:redirect url="test.jsp"/>

<c:param>

말그대로 파라메터 값을 넘기느 태그입니다.

<c:param name="파라미터 명" value="파라미터 값" />

<c:url var="nameSend" value="/test.jsp">

<c:param name="name" value="jung" />

</c:url>

<a href =<c:out value="${nameSend}" />>url</a>

위 소스를 해석해보면 test.jsp에 name값을 함께 파라메터 값을 보내겠다고 해석이 됩니다. 때문에 test.jsp에서는 request.getParameter로 name값을 받을 수 있습니다.

반복태그

<c:forEach>

이 태그는 for문이라고 생각하시면 되겠습니다. 이 태그를 잘 사용하면 배열과 컬렉션데이터를 루프로 돌리는 작업을 간단하게 처리할 수 있습니다.

JSP를 이용해서 포문부분을 먼저 보고 다음 태그부분을 보겠습니다.

String[] items = (String[]) request.getAttribute("tList"); //tList를 속성지정

for(int i=0; i<items.length; I++) { //포문시작

String mo = items[i];

out.println(mo);

<%@ page contentType = "text/html; charset=euc-kr" %>

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

<%

String[] tList ={"aa","bb","cc"} //배열생성

request.setAttribute("tlist",tList); //배열을쓰기위해 속성지정

%>

<html>

<body>

<table border="1">

<c:forEach var="mo" items="${tlist}"><!-- 반복태그지정-->

<tr>

<td> ${mo} </td>

<td> ${mo} </td>

</tr>

</c:forEach>

</table>

</body>

</html>


'Programming > JSTL' 카테고리의 다른 글

JSTL Library  (0) 2013.10.01
JSTL 포맷 fmt  (0) 2013.06.28
eq, ne, empty 사용  (0) 2012.11.30
EL&JSTL  (0) 2012.09.13
jstl <c:choose>,<c:when>,<c:otherwise>테그 사용 예제  (0) 2012.09.12