기본 콘텐츠로 건너뛰기

2022 08 26 회사 워크샵

코어태그 목록 및 예제

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>

댓글