Post on 30-Dec-2015
description
뇌를 자극하는 JSP & Servlet
커스텀 액션 만들기
2/86
Contents
학습목표
이장에서는 커스텀 액션을 직접 만들어서 사용하는 방법과 , 커스텀 액션을
모아서 태그 라이브러리를 만들어 배포하는 방법을 배워보자 .
내용 커스텀 액션을 만드는 방법 태그 파일을 이용해서 커스텀 액션을 만드는 방법 태그 클래스를 이용해서 커스텀 액션을 만드는 방법 태그 라이브러리를 만드는 방법
3/91
커스텀 액션을 만드는 방법 커스텀 액션을 만드는 방법은 크게 두 가지로 나눠진다 .
• 태그 파일을 작성해서 만드는 방법
• 태그 클래스를 작성해서 만드는 방법
태그 파일 (tag file) 이란 JSP 페이지와 비슷한 문법으로 작성하는 텍스트 파일이다 .
1. 커스텀 액션을 만드는 방법
<%@tag body-content= “scriptless ” %><TABLE border=1 cellpadding=20> <TR> <TD> <jsp:doBody/> </TD> </TR></TABLE>
[ 그림 10-2] 태그 파일의 예
JSP 페이지와 유사한 문법
4/91
커스텀 액션을 만드는 방법 태그 파일도 JSP 페이지처럼 웹 컨테이너의 특정 디렉터리에 저장해 놓기만 하면 바로
사용할 수 있다 . 이렇게 간단한 설치 방법은 태그 파일의 장점이라고 할 수 있다 .
1. 커스텀 액션을 만드는 방법
[ 그림 10-3] 태그 파일을 개발할 때 해야 할 일
5/91
커스텀 액션을 만드는 방법 태그 클래스 (tag class) 는 태그 파일과 달리 자바 프로그래밍 언어의 문법에 따라 완전한
자바 클래스 형태로 작성해야 한다 .
1. 커스텀 액션을 만드는 방법
package util;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class BoxTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspContext context = getJspContext(); JspWriter out = context.getOut(); JspFragment body = getJspBody(); out.println( “<TABLE border=1 cellpadding=20><TR><TD> ”); body.invoke(out); out.println( “</TD></TR></TABLE> ”); return; }}
태그 클래스가 상속받아야 하는 슈퍼클래스
커스텀 액션이 실행될 때 호출되는 메서드
커스텀 액션의 기능을 구현하는 코드
6/91
커스텀 액션을 만드는 방법 태그 클래스는 태그 파일과 달리 설치 방법이 상당히 복잡하다 .
1. 커스텀 액션을 만드는 방법
[ 그림 10-5] 태그 클래스를 개발할 때 해야 할 일
7/91
아주 간단한 태그 파일 다음과 같이 웹 페이지에 선을 출력하는 태그 파일을 만들어보자 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 그림 10-6] 아주 간단한 커스텀 액션의 예
<util:line/>
[ 예제 10-1] 선을 출력하는 커스텀 액션의 태그 파일 – 미완성
--------------------------------------------------------------<BR>
8/91
아주 간단한 태그 파일 태그 파일을 이용해서 만든 커스텀 액션은 기본적으로 본체를 가질 수 있다 .
커스텀 액션의 본체란 시작 태그와 끝 태그 사이에 오는 부분을 말한다 .
커스텀 액션이 본체를 갖기 않도록 만들기 위해서는 태그 파일에 다음과 같은 tag
지시자를 써야 한다 .
위와 같은 tag 지시자가 있으면 커스텀 액션을 사용할 때 다음과 같이 처리된다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<util:box> 야유회가 취소되었습니다 .</util:box>
커스텀 액션의 본체 (body)
<%@tag body-content= “empty ” %>
커스텀 액션이 본체를 가질 수 없음을 표시합니다 .
<util:line> 절취선 </util:line>
문법 에러가 발생합니다 .
<util:line/>
정상 처리됩니다
9/91
아주 간단한 태그 파일 태그 파일에는 몇 가지 지시자를 더 사용할 수 있다 .
include 지시자와 taglib 지시자는 JSP 페이지에서와 똑같은 역할을 하고 나머지 세
지시자는 태그 파일에서만 사용될 수 있는 것들이다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
이 름 역 할tag 지시자 웹 컨테이너가 태그 파일을 처리할 때 필요한 정보를 기술
include 지시자 다른 태그 파일을 포함
taglib 지시자 태그 파일에서 사용할 다른 커스텀 액션의 태그 라이브러리 (tag library) 에 대한 정보를 기술
attribute 지시자 커스텀 액션의 애트리뷰트에 대한 정보를 기술
variable 지시자 커스텀 액션의 변수에 대한 정보를 기술
[ 표 10-1] 태그 파일에서 사용할 수 있는 지시자
10/91
아주 간단한 태그 파일
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-2] 선을 출력하는 커스텀 액션의 태그 파일 - 완성
<%@tag body-content= “empty ” %>--------------------------------------------------------------<BR>
① 이번 장의 예제를 위한 brain10 웹 애플 리케이션 디렉터리를 만드세요 .
② 그리고 그 아래에 WEB-INF/tags서브디렉터리를 만드세요
③ 그 디렉터리 안에[ 예제 10-2] 의 태그파일을 저장하세요
11/91
아주 간단한 태그 파일 JSP 페이지에서 커스텀 액션을 사용하려면 taglib 지시자를 써야 한다 .
태그 파일을 이용해서 만든 커스텀 액션일 경우에는 taglib 지시자에 앞 장에서 배웠던
uri 애트리뷰트 대신 tagdir 애트리뷰트를 써야 한다 .
tablib 지시자를 쓴 다음에는 접두어와 커스텀 액션의 이름을 이용해서 커스텀 액션을
사용할 수 있다 . 커스텀 액션의 이름은 태그 파일의 이름에서 .tag 를 제외한 나머지
부분이다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<%@taglib prefix= “util ” tagdir= “/WEB-INF/tags ” %>
접두어
태그 파일이 있는 디렉터리의 경로명
<util:line/>
접두어
커스텀 액션의 이름
12/91
아주 간단한 태그 파일
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-3] 예제 10-2 가 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags ” %><HTML> <HEAD><TITLE> 오늘의 메뉴 </TITLE></HEAD> <BODY> <H3> 오늘의 점심 메뉴입니다 .</H3> <util:line/> 삼계탕 <BR> 볶음밥 <BR> 튀김우동 <BR> <util:line/> </BODY></HTML>
[ 그림 10-8] 예제 10-3 의 실행 결과
13/91
애트리뷰트를 지원하는 태그 파일 다음과 같은 애트리뷰트가 있는 커스텀 액션을 만들어보자 .
애트리뷰트가 있는 커스텀 액션을 만들기 위해서는 태그 파일에 각각의 애트리뷰트를
위한 attribute 지시자를 써야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<util:newLine color= “red ” size= ”20 ” />
20 개의 마이너스 기호로이루어진 빨간색 선을출력합니다
[ 그림 10-9] 애트리뷰트가 있는 커스텀 액션의 예
14/91
애트리뷰트를 지원하는 태그 파일 attribute 지시자의 name 애트리뷰트는 커스텀 액션의 애트리뷰트 이름을 지정하는
역할을 한다 .
커스텀 액션의 애트리뷰트 값은 태그 파일은 태그 파일로 전달되며 , 그 값을 사용하는
방법은 두 가지이다 . 하나는 스크립팅 요소 안에서 자바 변수처럼 사용하는 방법이고 ,
다른 하나는 익스프레션 언어의 EL 식 안에서 데이터 이름으로 사용하는 방법이다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<%@attribute name= “color ” %>
애트리뷰트의 이름
<%= color %>
애트리뷰트의 이름
${color}
애트리뷰트의 이름
15/91
애트리뷰트를 지원하는 태그 파일
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-4] 애트리뷰트를 지원하는 태그 파일
<%@tag body-content= “empty ” %><%@attribute name= “color ”%><%@attribute name= “size ” type= “java.lang.Integer ” %><FONT color=${color} ><% for (int cnt = 0; cnt < size; cnt++) out.print( “- ”);%></FONT><BR>
[ 예제 10-5] 예제 10-4 가 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE> 오늘의 메뉴 </TITLE></HEAD> <BODY> <util:newLine color= “blue ” size= “25 ” /> 저녁 메뉴 <BR> <util:newLine color= “red ” size= “20 ” /> 불고기 덮밥 <BR> 카레라이스 <BR> 쫄면 <BR> <util:newLine color= “blue ” size= “25 ” /> </BODY></HTML>
[ 그림 10-11] 예제 10-5 의 실행 결과
16/91
애트리뷰트를 지원하는 태그 파일 [ 예제 10-4] 태그 파일의 문제점 - <util:newLine> 커스텀 액션은 color 와 size
애트리뷰트를 모두 썼을 때는 정상적으로 작동하지만 , size 애트리뷰트를 쓰지 않으면
선이 전혀 출력되지 않는다 .
이런 문제는 size 애트리뷰트를 필수 애트리뷰트로 만들어서 해결할 수 있다 . 방법은
[ 예제 10-4] 의 attribute 지시자에 required 애트리뷰트를 추가하고 그 값으로 true 를
지정하는 것이다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<%@attribute name= “size ” type= “java.lang.Integer ” required= “true ” %>
필수 애트리뷰트임을 표시합니다
17/91
동적 애트리뷰트를 지원하는 태그 파일 애트리뷰트 각각을 위해 attribute 지시자를 쓰는 대신 모든 애트리뷰트를 한꺼번에
선언하려면 동적 애트리뷰트를 선언하면 된다 .
동적 애트리뷰트를 선언하려면 태그 파일의 tag 지시자에 dynamic-attributes
애트리뷰트를 쓰고 , 그 값으로 커스텀 액션의 모든 애트리뷰트를 대표할 이름을 쓰면
된다 .
태그 파일 안에서 다음과 같은 EL 식을 사용하면 커스텀 액션에서 사용된 특정
애트리뷰트 값을 가져올 수 있다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<%@tag dynamic-attributes= “attrs ”%>
동적 애트리뷰트의 대표 이름
${attrs.color}
동적 애트리뷰트의 대표 이름
실제로 사용된 애트리뷰트의 이름
18/91
동적 애트리뷰트를 지원하는 태그 파일 커스텀 액션의 애트리뷰트를 담고 있는 Map 객체는 page 데이터 영역을 통해 태그
파일에 전달되는데 , 그 객체는 jspContext 내장 변수에 대해 getAttribute 라는
메서드를 호출해서 가져올 수 있다 .
동적 애트리뷰트의 경우에는 모든 애트리뷰트의 값이 문자열 형태로 저장되므로 , Map
객체에 대해 get 메서드를 호출할 때 리턴값을 String 타입으로 변환해서 받아야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
Map attrs = (Map) jspContext.getAttribute( “attrs ”);
동적 애트리뷰트의 대표 이름
String str = (String) attrs.get( “size ”);
개별적인 애트리뷰트 이름
19/91
동적 애트리뷰트를 지원하는 태그 파일 문자열 형태의 애트리뷰트 값은 다음과 같은 방법을 이용해서 다른 데이터 타입으로
변환해서 사용할 수도 있다 .
• 위의 태그 파일을 톰캣의 webapps/brain10/WEB-INF/tags/util 디렉터리에 doubleLine.tag 라는
이름으로 저장한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
int size = Integer.parseInt(str);
필요하다면 가져온 애트리뷰트 값의 타입을변환하세요
[ 예제 10-6] 동적 애트리뷰트를 지원하는 태그 파일
<%@tag body-content= “empty ” %><%@tag dynamic-attributes= “attrs ”%><FONT color=${attrs.color} ><% java.util.Map attrs = (java.util.Map) jspContext.getAttribute( “attrs ”); String str = (String) attrs.get( “size ”); int size = Integer.parseInt(str); for (int cnt = 0; cnt < size; cnt++) { out.print( “= ”); }%></FONT><BR>
20/91
동적 애트리뷰트를 지원하는 태그 파일
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-7] 예제 10-6 이 만드는 커스텀 액션을 사용하는 JSP 페이지 ( 1 )
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE> 오늘의 메뉴 </TITLE></HEAD> <BODY> <H3> 오늘의 토요일이므로 간단한 분식만 제공합니다 .</H3> <util:doubleLine color= “green ” size= “30 ” /> 샌드위치 <BR> 우동 <BR> <util:doubleLine color= “purple ” size= “50 ” /> </BODY></HTML>
21/91
동적 애트리뷰트를 지원하는 태그 파일 동적 애트리뷰트를 지원하는 커스텀 액션은 유효한 애트리뷰트와 그렇지 못한
애트리뷰트를 일일이 확인하지 않는다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-8] 예제 10-6 이 만드는 커스텀 액션을 사용하는 JSP 페이지 (2)
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE> 일요일의 메뉴 </TITLE></HEAD> <BODY> <H3> 일요일에는 급식을 하지 않습니다 .<H3> <util:doubleLine color= “pink ” size= “40 ” style= “bold ”/> </BODY></HTML>
[ 그림 10-14] 예제 10-8 의 실행 결과
22/91
동적 애트리뷰트를 지원하는 태그 파일
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 그림 10-15] 태그 파일에 정의되지 않은 애트리뷰트를 사용했을 때 발생하는 에러
23/91
커스텀 액션의 본체를 처리하는 태그 파일 커스텀 액션의 시작 태그와 끝 태그 사이에 오는 내용을 커스텀 액션의 본체 (body) 라고
한다 .
본체가 있는 커스텀 액션을 만들기 위해서는 태그 파일의 tag 지시자에 있는 body-con-
tent 애트리뷰트에 empty 라는 값 대신 scriptless 나 tagdependent 라는 값을 써야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<util:box> 안녕하세요 , 여러분 ! <BR> 홈페이지를 오픈했습니다 .</util:box>
[ 그림 10-16] 본체가 있는 커스텀 액션의 예
<%@tag body-content= “scriptless ” %>
커스텀 액션의 본체에 스크립틀릿을쓸 수 없음을 표시합니다 .
24/91
커스텀 액션의 본체를 처리하는 태그 파일
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-9] 본체를 지원하는 태그 파일
<%@tag body-content= “scriptless ” %><TABLE border=1 cellpadding=20> <TR> <TD> <jsp:doBody/> </TD> </TR></TABLE>
[ 예제 10-10] 예제 10-9 가 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE>공지사항 </TITLE></HEAD> <BODY> 구내 식당에서 알려드립니다 . <util:box> 공사 관계로 급식을 일시 중단합니다 . <BR> </util:box> </BODY></HTML>
[ 그림 10-11] 예제 10-5 의 실행 결과
25/91
변수를 지원하는 커스텀 액션 변수를 지원하는 커스텀 액션을 만들려면 태그 파일에 variable 지시자를 써야 한다 .
variable 지시자를 기술하는 방법은 다음과 같다 .
String 타입이 아닌 다른 타입의 변수를 선언하려면 variable 지시자에 variable-class
라는 애트리뷰트를 추가해서 타입을 지정하면 된다 .
• 주의할 점 - variable-class 애트리뷰트에는 프리미티브 타입을 지정할 수 없으므로 , 래퍼
클래스타입을 대신 사용해야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<%@variable name-given= “result ”%>
변수의 이름
<%@variable name-given= “result ” variable-class= “java.lang.Integer ”%>
변수의 타입
26/91
변수를 지원하는 커스텀 액션
• 위 그림처럼 작동하는 커스텀 액션을 만들기 위해서는 커스텀 액션이 끝난 다음에 maximum
이라는 변수를 사용할 수 있도록 만들어야 한다 . 그런 일은 variable 지시자에 scope 라는
애트리뷰트를 추가해서 할 수 있다 .
scope 애트리뷰트는 변수의 사용 범위를 지정하는 역할을 하며 , NESTED, AT_BEGIN,
AT_END 중 한 값을 지정할 수 있다 .
• 단독으로 사용되는 태그 다음에 변수를 사용할 수 있도록 만들려면 AT_END 값을 지정하는 것이
가장 적합하다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<tool:max num1= “45 ” num2= “32 ” />...${maximum}
JSP 페이지 태그 파일
[ 그림 10-18] 변수를 이용해서 데이터를 리턴하는 커스텀 액션의 예
<%@variable name-given= “result ” variable-class= “java.lang.Integer ” scope= “AT_END ” %>
변수의 사용 범위
입력출력
num1, num2 애트리뷰트의 값
maximum 변수의 값
27/91
변수를 지원하는 커스텀 액션 variable 지시자를 이용해서 선언한 변수에 값을 대입하려면 앞 장에서 배웠던 <c:set>
커스텀 액션을 사용해야 한다 .
태그 파일 안에서 변수에 저장한 값은 JSP 페이지로 전달되고 , JSP 페이지에서 그 값을
가져다가 사용할 수 있다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<c:set var= “result ” value= “100 ” />
변수의 이름
변수에 대입할 값
28/91
변수를 지원하는 커스텀 액션
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-11] 변수를 지원하는 태그 파일 ( 1 )
<%@tag pageEncoding= “euc-kr ”%><%@tag body-content= “empty ” %><%@taglib prefix= “c ” uri= “http://java.sun.com/jsp/jstl/core ” %><%@attribute name= “num1 ” type= “java.lang.Integer ”%><%@attribute name= “num2 ” type= “java.lang.Integer ”%><%@variable name-given= “maximum ” variable-class= “java.lang.Integer ” scope= “AT_END ”%><% int result; if (num1 > num2) result = num1; Else result = num2;%><c:set var= “maximum ” value= “<%= result %> ” />
[ 예제 10-12] 예제 10-11 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE>최대값 구하기 </TITLE></HEAD> <BODY> <H3>최대값 구하기 </H3> <util:max num1= “${param.NUM1} ” num2= “${param.NUM2} ” /> 최대값 : ${maximum} </BODY></HTML>
[ 그림 10-20] 예제 10-12 의 실행 결과
29/91
변수를 지원하는 커스텀 액션 앞 예제의 단점 - 커스텀 액션의 결과를 리턴하는 maximum 변수의 이름이 태그 파일
안에 고정되어 있다 . 이 문제를 해결하기 위해 다음과 같이 애트리뷰트를 이용해서
변수의 이름을 지정하도록 만들어보자 .
변수 이름을 저장할 애트리뷰트를 선언할 때는 지켜야 하는 규칙
• 첫째 , 필수 애트리뷰트로 만들어야 한다 .
• 둘째 , 애트리뷰트 값에 스크립팅 요소나 익스프레션 언어를 사용할 수 없도록 만들어야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<util:max var= “maximum ” num1= “37 ” num2= “42 ” />
변수의 이름
<%@attribute name= “var ” required= “true ” rtexprvalue= “false ”%>
애트리뷰트 이름
필수 애트리뷰트임을 표시
애트리뷰트 값으로 스크립팅 요소나익스프레션 언어를 사용할 수 없음을 표시
30/91
변수를 지원하는 커스텀 액션 애트리뷰트를 이용해서 변수 이름을 지정할 때는 variable 지시자도 다르게 기술해야
한다 .
• 첫째 , name-given 애트리뷰트를 이용해서 변수의 이름을 지정하는 것이 아니라 , name-from-at-
tribute 애트리뷰트를 이용해서 변수의 이름을 지정할 애트리뷰트의 이름을 지정해야 한다 .
• 둘째 , 태그 파일 안에서 사용할 변수 이름을 따로 선언해야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<%@variable name-from-attribute= “var ” alias= “maximum ” variable-class= “java.lang.Integer ” scope= “AT_END ”%>
변수 이름을 지정하기 위해사용할 애트리뷰트 이름
태그 파일 안에서 사용할변수 이름
31/91
변수를 지원하는 커스텀 액션
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-13] 변수를 지원하는 태그 파일 (2)
<%@tag pageEncoding= “euc-kr ”%><%@tag body-content= “empty ” %><%@taglib prefix= “c ” uri= “http://java.sun.com/jsp/jstl/core ” %><%@attribute name= “var ” required= “true ” rtexprvalue= “false ”%><%@attribute name= “num1 ” type= “java.lang.Integer ”%><%@attribute name= “num2 ” type= “java.lang.Integer ”%><%@variable name-from-attribute= “var ” alias= “maximum ” variable-class= “java.lang.Integer ” scope= “AT_END ”%><% int result; if (num1 > num2) result = num1; else result = num2;%><c:set var= “maximum ” value= “<%= result %> ” />
[ 예제 10-14] 예제 10-13 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE>최대값 구하기 </TITLE></HEAD> <BODY> <H3>최대값 구하기 </H3> <util:newMax var= “MAX ” num1= “${param.NUM1} ” num2= “${param.NUM2} ” /> 최대값 : ${MAX} </BODY></HTML>
[ 그림 10-21] 예제 10-14 의 실행 결과
32/91
변수를 지원하는 커스텀 액션 이번에는 다음과 같이 커스텀 액션의 본체 안에서 변수를 사용하는 예제를 작성해보자 .
이 커스텀 액션은 start 애트리뷰트부터 end 애트리뷰트까지 변화하는 값을 본체
안에서 사용할 수 있도록 만들어야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
<util:compute var= “num ” start= “1 ” end= “5 ”> ${num} 의 제곱은 ? ${num * num} <BR></util:compute>
[ 그림 10-22] 커스텀 액션의 본체 안에서 변수를 사용하는 커스텀 액션의 예
33/91
변수를 지원하는 커스텀 액션 이 경우에는 variable 지시자의 scope 애트리뷰트 값을 NATED 로 지정해야 한다 .
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-15] 변수를 지원하는 태그 파일 (3)
<%@tag pageEncoding= “euc-kr ”%><%@tag body-content= “scriptless ” %><%@taglib prefix= “c ” uri= “http://java.sun.com/jsp/jstl/core ” %><%@attribute name= “var ” required= “true ” rtexprvalue= “false ”%><%@attribute name= “start ” type= “java.lang.Integer ”%><%@attribute name= “end ” type= “java.lang.Integer ”%><%@variable name-from-attribute= “var ” alias= “number ” variable-class= “java.lang.Integer ” scope= “NESTED ”%><% for (int cnt=start; cnt <= end; cnt++) { %> <c:set var= “number ” value= “<%= cnt %> ” /> <jsp:doBody/><% } %>
34/91
변수를 지원하는 커스텀 액션
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-16] 예제 10-15 가 만드는 커스텀 액션을 사용하는 JSP 페이지 ( 1 )
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE> 제곱표 </TITLE></HEAD> <BODY> <H3>1 부터 5까지의 제곱표 </H3> <util:compute var= “num ” start= “1 ” end= “5 ”> ${num} 의 제곱은 ? ${num * num} <BR> </util:compute> </BODY></HTML>
[ 그림 10-23] 예제 10-16 의 실행 결과
35/91
변수를 지원하는 커스텀 액션
2. 태그 파일을 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-17] 예제 10-15 가 만드는 커스텀 액션을 사용하는 JSP 페이지 (2)
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” tagdir= “/WEB-INF/tags/util ” %><HTML> <HEAD><TITLE> 세제곱표 </TITLE></HEAD> <BODY> <H3>1 부터 5까지의 세제곱표 </H3> <util:compute var= “num ” start= “1 ” end= “7 ”> ${num} 의 세제곱은 ? ${num * num * num} <BR> </util:compute> </BODY></HTML>
[ 그림 10-24] 예제 10-17 의 실행 결과
36/91
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 그림 10-25] 태그 클래스를 만드는 방법
태그 클래스를 만드는 방법
37/91
SimpleTag 인터페이스를 구현하는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
38/91
SimpleTag 인터페이스를 구현하는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
39/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법 SimpleTagSupport 클래스를 이용해서 태그 클래스를 만들 때는 반드시 다음과 같은
형식의 doTag 메서드를 작성해야 한다 .
웹 브라우저로 HTML 코드를 출력하기 위해서는 우선 다음과 같은 방법으로 JspCon-
text 객체를 구해야 한다 .
JspContext 객체에 대해 print 나 println 메서드를 호출하면 웹 브라우저로 HTML 을
출력할 수 있다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
public void doTag() throws JspException, IOException {
}
JspContext context = getJspContext();JspWriter out = context.getOut(); JSP 페이지에 관한 여러 가지 정보가 들어
있는 JspContext 객체를 리턴하는 메서드JspWriter 객체를 리턴하는 메서드
out.println( “-----------------------<BR> ”); 웹 브라우저로 선을 출력합니다
이 위치에 커스텀 액션이 해야 할 일을 기술해야 합니다 .
40/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법 다음은 선을 출력하는 커스텀 액션을 구현하는 태그 클래스이다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-18] 아주 간단한 태그 클래스
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class StarLineTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspContext context = getJspContext(); JspWriter out = context.getOut(); out.println( “************************************<BR> ”); return; }}
41/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
① 톰캣의 lib 디렉터리에있는 이 파일을
[ 그림 10-29] jsp-api.jar 파일을 JDK 의 확장 라이브러리 디렉터리에 설치하기
42/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
② JDK 의 jre\lib\ext 디렉터리로복사합니다 .
43/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 그림 10-30] 태그 클래스를 컴파일하는 방법
① brain10/WEB-INF디렉터리 아래에 classes디렉터리를 만드세요 .
② [ 예제 10-18] 의 클래스는tool 패키지에 속하므로tool 서브디렉터리를만드세요
③ 작업 디렉터리 (C:\src\ch10)에있는 컴파일 결과물을 tool서브디렉터리에 복사하세요
[ 그림 10-31] 예제 10-18 의 태그 클래스를 설치하는 방법
44/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법 태그 클래스를 설치한 다음에는 등록을 해야 한다 . ( 앞의 [ 그림 10-5] 참고 )
TLD 파일에 태그 클래스를 등록하기 위해서는 다음과 같은 형식의 <tag> 엘리먼트를
추가해야 한다 .
<tag> 엘리먼트는 TLD 파일의 루트 엘리먼트인 <tablib> 엘리먼트의 바로 아래에
위치해야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> <name>starLine</name> <tag-class>tool.StarLineTag</tag-class> <body-content>empty</body-content></tag>
커스텀 액션의 이름태그 클래스의 이름본체의 형태
<taglib xmlns= “http://java.sun.com/xml/ns/javaee ” version= “2.1 ”> <tlib-version>1.0</tlib-version> <short-name>tool</short-name> <tag> <name>starLine</name> <tag-class>tool.StarLineTag</tag-class> <body-content>empty</body-content> </tag></taglib>
TLD 파일의 버전TLD 파일의 이름
45/91
SimpleTagSupport 클래스를 이용해서 태그 클래스를 작성하는 방법
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-19] 예제 10-18 의 태그 클래스가 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE> 자료실 공지사항 </TITLE></HEAD> <BODY> <H3> 이달의 신착 도서 </H3> <tool:starLine/> 멀티프로세서 프로그래밍 <BR> 트와일라잇 <BR> 회사에서 바로 통하는 관리 회계 <BR> <tool:starLine/> </BODY></HTML>
[ 그림 10-34] 예제 10-19 의 실행 결과
46/91
애트리뷰트가 있는 커스텀 액션을 만드는 태그 클래스 태그 클래스를 이용해서 애트리뷰트가 있는 커스텀 액션을 구현하는 방법
• 애트리뷰트 값을 받는 public 메서드를 선언해야 한다 .
• 이 메서드의 이름은 set 으로 시작해야 하고 , 그 다음에 애트리뷰트의 본래 이름에서 첫 글자를
대문자로 바꾼 이름을 붙여서 만들어야 한다 .
set- 메서드가 받은 애트리뷰트 값은 필드 (field, 클래스의 멤버 변수 ) 에 저장해 놓는다 .
• 저장된 애트리뷰트 값은 나중에 doTag 메서드 안에서 사용되는 것이 보통이다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
public void setColor(String color) {
}
color 애트리뷰트 값을 받는 메서드의 이름
이 파라미터 변수를 통해 애트리뷰트 값이 전달됩니다
public class NewLineTag extends SimpleTagSupport { private String color; ... public void setColor(String color) { this.color = color; }}
애트리뷰트 값을필드에 저장합니다 .
47/91
애트리뷰트가 있는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-20] 애트리뷰트를 지원하는 태그 클래스
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class NewLineTag extends SimpleTagSupport { private int size; private String color; public void setSize(Integer size) { this.size = size; } public void setColor(String color) { this.color = color; } public void doTag() throws JspException, IOException { JspContext context = getJspContext(); JspWriter out = context.getOut(); out.println( “<FONT color= ” + color + “> ”); for (int cnt = 0; cnt < size; cnt++) { out.print( “* ”); } out.println( “</FONT><BR> ”); return; }}
size 애트리뷰트를 받는 메서드
color 애트리뷰트를 받는 메서드
48/91
애트리뷰트가 있는 커스텀 액션을 만드는 태그 클래스 애트리뷰트를 지원하는 태그 클래스를 TLD 파일에 등록할 때는 <tag> 엘리먼트
안에 <attribute> 라는 서브엘리먼트를 써야 한다 .
<attribute> 엘리먼트 안에는 <name> 와 <type> 라는 두 개의 서브엘리먼트를 써야
하고 , 그 안에 각각 애트리뷰트의 이름과 타입을 표시해야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> <name>newLine</name> <tag-class>tool.NewLineTag</tag-class> <body-content>empty</body-content>
</tag>
이 위치에 <attribute>엘리먼트를 추가해야 합니다 .
<attribute> <name>size</name> <type>java.lang.Integer</type></attribute>
애트리뷰트의 이름애트리뷰트의 타입
49/91
애트리뷰트가 있는 커스텀 액션을 만드는 태그 클래스 [ 예제 10-20] 의 setColor 메서드가 구현하는 color 애트리뷰트를 위해서는 다음과 같은
attribute 엘리먼트를 기술해야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<attribute> <name>color</name> <type>java.lang.String</type></attribute>
애트리뷰트의 이름애트리뷰트의 타입
[ 그림 10-35] 예제 10-20 의 태그 클래스를 TLD 파일에 등록하는 방법
50/91
애트리뷰트가 있는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-21] 예제 10-20 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE> 전자정보실 공지사항 </TITLE></HEAD> <BODY> <H3> 이달의 신착 자료 </H3> <tool:newLine color= “red ” size= “40 ” /> 카르멘 ( 오페라 ) DVD<BR> 돈키호테 ( 발레 ) DVD<BR> 시간을 달리는 소녀 ( 애니메이션 ) DVD<BR> <tool:newLine color= “red ” size= “40 ” /> 전자정보실에서만 감상하실 수 있습니다 .<BR> <tool:newLine color= “blue ” size= “50 ” /> </BODY></HTML>
[ 그림 10-36] 예제 10-21 의 실행 결과
51/91
동적 애트리뷰트를 지원하는 태그 클래스 동적 애트리뷰트를 지원하는 태그 클래스를 만들기 위해서는 setDynamicAttribute 라는
이름의 메서드 하나만 선언하면 된다 . 이 메서드는 다음과 같은 3 개의 파라미터를
받는다 .
• 네임스페이스 (namespace) 란 똑같은 이름의 충돌을 방지하기 위해서 만들어 놓은 이름 공간이
다 .
• 특정 네임스페이스에 속하지 않는 애트리뷰트일 경우에 이 메서드의 첫 번째 파라미터 값은 null
이 된다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
}
애트리뷰트의 이름이 속하는
네임스페이스의 URI
애트리뷰트의 이름 애트리뷰트의 값
52/91
동적 애트리뷰트를 지원하는 태그 클래스 애트리뷰트의 네임스페이스는 잘 사용되지 않으므로 , 대개의 경우 setDynamicAttribute
메서드 안에서는 첫 번째 파라미터 값을 무시하고 두 번째와 세 번째 파마리터 값만
저장해 놓아도 충분하다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
public class NewerLineTag extends SimpleTagSupport implements DynamicAttributes { private Map<String,Object> attrs = new HashMap<String,Object>(); ... public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { attrs.put(localName, value); }}
애트리뷰트의 이름과 값을 Map 객체에 저장합니다
public class NewerLineTag extends SimpleTagSupport implementsDynamicAttributes { private Map<String,Object> attrs = new HashMap<String,Object>(); ... public void doTag() throws JspException, IOException { ... String color = (String) attrs.get( “color ”); ... }}
Map 객체에 저장되어 있는애트리뷰트 값을 가져옵니다
53/91
동적 애트리뷰트를 지원하는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-22] 동적 애트리뷰트를 지원하는 태그 클래스
package tool;import java.io.*;import java.util.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class NewerLineTag extends SimpleTagSupport implements DynamicAttributes { private Map<String,Object> attrs = new HashMap<String,Object>(); public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { attrs.put(localName, value); } public void doTag() throws JspException, IOException { String color = (String) attrs.get( “color ”); int size = Integer.parseInt((String) attrs.get( “size ”)); JspContext context = getJspContext(); JspWriter out = context.getOut(); out.println( “<FONT color= ” + color + “> ”); for (int cnt = 0; cnt < size; cnt++) { out.print( “* ”); } out.println( “</FONT><BR> ”); return; }}
54/91
동적 애트리뷰트를 지원하는 태그 클래스 TLD 파일에 동적 애트리뷰트를 지원하는 태그 클래스를 등록할 때는 <tage>
엘리먼트안에 <dynamic-attributes> 서브엘리먼트를 쓰고 , 그 안에 true 라는 값을
쓰면 된다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> <name>newerLine</name> <tag-class>tool.NewerLineTag</tag-class> <body-content>empty</body-content> <dynamic-attributes>true</dynamic-attributes></tag>
동적 애트리뷰트를지원한다는 표시
[ 예제 10-22] 의 태그 클래스를등록하는 <tag> 엘리먼트
[ 그림 10-37] 예제 10-22 의 태그 클래스를 TLD 파일에 등록하는 방법
55/91
동적 애트리뷰트를 지원하는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-23] 예제 10-22 가 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE> 시청각실 공지사항 </TITLE></HEAD> <BODY> <H3>무료 영화 상영 안내 </H3> <tool:newerLine color= “red ” size= “40 ” background= “black ”/> 제목 : 폴라 익스프레스 <BR> 일시 : 2009년 7월 4 일 (토 ) 오후 5:00<BR> <tool:newerLine color= “blue ” size= “45 ” height= “3 ” /> </BODY></HTML>
[ 그림 10-38] 예제 10-23 의 실행 결과
56/91
본체가 있는 커스텀 액션을 만드는 태그 클래스 태그 클래스를 이용해서 본체가 있는 커스텀 액션을 만들기 위해서는 다음과 같은 두
단계의 작업을 해야 한다 .
• 첫째 , getJspBody 메서드를 이용해서 커스텀 액션의 본체 내용을 가져온다 .
• 둘째 , JspFragment 객체를 이용해서 본체의 내용을 출력한다 .
invoke 메서드를 호출할 때는 파라미터로 null 값을 넘겨줄 수도 있다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
JspFragment body = getJspBody();
커스텀 액션의 본체를 가져오는 메서드
body.invoke(out);
JspFragment 객체의 내용을 출력하는 메서드
body.invoke(null);
null 을 넘겨주면 JSP 페이지와 동일한 출력 스트림을통해 본체의 내용이 출력됩니다 .
57/91
본체가 있는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-24] 본체를 지원하는 태그 클래스
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class BoxTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspContext context = getJspContext(); JspWriter out = context.getOut(); JspFragment body = getJspBody(); out.println( “<TABLE border=1 cellpadding=20><TR><TD> ”); body.invoke(out); out.println( “</TD></TR></TABLE> ”); return; }}
58/91
본체가 있는 커스텀 액션을 만드는 태그 클래스 TLD 파일에 본체가 있는 커스텀 액션을 등록할 때는 <tag> 엘리먼트의 <body-con-
tent> 서브엘리먼트 안에 scriptless 나 tagdependant 라는 값을 써야 한다
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> <name>box</name> <tag-class>tool.BoxTag</tag-class> <body-content>scriptless</body-content></tag>
커스텀 액션이 본체에 스크립팅요소를 쓸 수 없다는 표시
[ 그림 10-39] 예제 10-24 의 태그 클래스를 TLD 파일에 등록하는 방법
[ 예제 10-24] 의 태그 클래스를등록하는 <tag> 엘리먼트
59/91
본체가 있는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-25] 예제 10-24 가 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE> 자료실 공지사항 </TITLE></HEAD> <BODY> <tool:box> 다음달 1 일부터 구입 희망 도서를 신청 받습니다 . <BR> 많은 참여 바랍니다 . <BR> </tool:box> </BODY></HTML>
[ 그림 10-40] 예제 10-25 의 실행 결과
60/91
커스텀 액션의 본체 내용을 조작하는 태그 클래스 이번에는 다음 그림처럼 커스텀 액션의 본체 내용을 조작해서 출력하는 커스텀 액션을
만들어보자 .
이런 커스텀 액션을 만들기 위해서는 태그 클래스 안에서 커스텀 액션의 본체 내용을
가져다가 문자열로 만든 다음 , 그 문자열을 조작해서 출력하면 된다 . 이런 일은 자바
표준 라이브러리의 java.io.StringWriter 클래스를 이용해서 할 수 있다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<util:replace oldWord= “ 비행기 ” newWord= “ 제트기 ” > 떴다 떴다 비행기 날아라 날아라 <BR> 높이 높이 날아라 우리 비행기 <BR></util:replace>
[ 그림 10-41] 본체의 내용을 조작하는 커스텀 액션의 예
61/91
커스텀 액션의 본체 내용을 조작하는 태그 클래스 첫째 , getJspBody 메서드를 호출해서 커스텀 액션의 본체 내용을 가져온다 .
둘째 , JspFragment 객체에 대해 invoke 메서드를 호출할 때 파라미터로 StringWriter
객체를 넘겨준다 .
셋째 , toString 메서드를 이용해서 StringWriter 객체 안의 내용을 문자열로 만든다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
JspFragment body = getJspBody();
커스텀 액션의 본체를 가져옵니다 .
StringWriter writer = new StringWriter();
body.invoke(writer);
StringWriter 객체를 생성합니다본체의 내용을 StringWriter 객체안으로 출력합니다 .
String str = writer.toString();
StringWriter 객체 안에 있는 내용을 문자열로 만듭니다
62/91
커스텀 액션의 본체 내용을 조작하는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-26] 커스텀 액션의 본체 내용을 조작하는 태그 클래스
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class ReplaceTag extends SimpleTagSupport { private String oldWord, newWord; public void setOldWord(String oldWord) { this.oldWord = oldWord; } public void setNewWord(String newWord) { this.newWord = newWord; } public void doTag() throws JspException, IOException { JspContext context = getJspContext(); JspWriter out = context.getOut(); JspFragment body = getJspBody(); StringWriter writer = new StringWriter(); body.invoke(writer); String str = writer.toString(); String newStr = str.replaceAll(oldWord, newWord); out.print(newStr); return; }}
63/91
커스텀 액션의 본체 내용을 조작하는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-27] 예제 10-26 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE>노래 바꿔 부르기 </TITLE></HEAD> <BODY> <tool:replace oldWord= “ 비행기 ” newWord= “ 제트기 ” > 떴다 떴다 비행기 날아라 날아라 <BR> 높이 높이 날아라 우리 비행기 <BR> </tool:replace> </BODY></HTML>
[ 그림 10-43] 예제 10-27 의 실행 결과
64/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스
태그 클래스가 변수를 지원하도록 만들려면 해당 변수의 이름과 값을 page 데이터
영역에 저장해 놓아야 한다 .
page 데이터 영역에 데이터를 저장하기 위해서는 우선 getJspContext 메서드를
호출해서 JspContext 객체를 구해야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<util:min num1= “45” num2= “32”/>...${minimum}
JSP 페이지
태그 클래스
num1 과 num2 중 작은 값을minimum 변수에 담아서 리턴합니다
num1, num2 애트리뷰트의 값
maximum 변수의 값
[ 그림 10-44] 변수를 이용해서 데이터를 리턴하는 태그 클래스의 예
JspContext context = getJspContext();
page 데이터 영역에데이터를 저장할 수 있는 객체
context.setAttribute(“minimum”, num1)
변수 이름
변수 값
65/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-28] 변수를 지원하는 태그 클래스 ( 1 )
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class MinimumTag extends SimpleTagSupport { private int num1, num2; public void setNum1(Integer num1) { this.num1 = num1; } public void setNum2(Integer num2) { this.num2 = num2; } public void doTag() throws JspException, IOException { JspContext context = getJspContext(); if (num1 < num2) context.setAttribute( “minimum ”, num1); Else context.setAttribute( “minimum ”, num2); return; }}
66/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스 TLD 파일에 변수를 지원하는 태그 클래스를 등록할 때는 <tag> 엘리먼트 안에
<variable> 이라는 서브엘리먼트를 쓰고 , 다시 그 안에 변수에 대한 정보를 기술하는 몇
가지 서브엘리먼트를 다음과 같은 형식으로 써야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> ... <variable> <name-given>minimum</name-given> <variable-class>java.lang.Integer</variable-class> <scope>AT_END</scope> </variable> ...</tag>
변수의 이름
변수의 타입변수의 사용 범위
[ 예제 10-28] 의 태그 클래스를등록하는 <tag> 엘리먼트
67/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-29] 예제 10-28 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE>최소값 구하기 </TITLE></HEAD> <BODY> <tool:min num1= “${param.NUM1} ” num2= “${param.NUM2} ” /> 최소값 : ${minimum} </BODY></HTML>
[ 그림 10-46] 예제 10-29 의 실행 결과
URL 뒤에 이런 식으로 입력데이터 값을 직접 쓰세요
68/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스 앞에서 만든 커스텀 액션에는 변수의 이름이 고정되어 있다는 단점이 있다 . 이런 단점을
제거하기 위해서는 커스텀 액션을 사용할 때 다음과 같이 애트리뷰트를 이용해서 변수의
이름을 바꿀 수 있도록 만들어야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tool:min var= “minimum ” num1= “12 ” num2= “35 ” />
변수의 이름
69/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-30] 변수를 지원하는 태그 클래스 (2)
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class NewMinimumTag extends SimpleTagSupport { private String var; private int num1, num2; public void setVar(String var) { this.var = var; } public void setNum1(Integer num1) { this.num1 = num1; } public void setNum2(Integer num2) { this.num2 = num2; } public void doTag() throws JspException, IOException { JspContext context = getJspContext(); if (num1 < num2) context.setAttribute(var, num1); Else context.setAttribute(var, num2); return; }}
70/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스 애트리뷰트를 통해 변수의 이름을 지정하는 커스텀 액션을 TLD 파일을 등록할 때는
<variable> 엘리먼트 안에 <name-given> 서브엘리먼트 대신 <name-from-attribute>
라는 서브엘리먼트를 쓰고 , 그 안에 변수의 이름 지정에 사용되는 애트리뷰트의 이름을
써야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> ... <variable> <name-from-attribute>var</name-from-attribute> <variable-class>java.lang.Integer</variable-class> <scope>AT_END</scope> </variable> ...</tag>
변수 이름의 지정에 사용할 애트리뷰트의 이름
변수의 타입
변수의 사용 범위
71/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스 TLD 파일에 변수의 이름 지정에 사용되는 애트리뷰트를 추가할 때는 필수
애트리뷰트로 만들어야 하고 , 애트리뷰트 값에 익스프레션이나 EL 식을 사용할 수
없도록 만들어야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tag> ... <attribute> <name>var</name> <type>java.lang.String</type> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> ...</tag>
애트리뷰트의 이름 애트리뷰트의
타입
필수 애트리뷰트임을 표시
익스프레션이나 EL 식을 애트리뷰트 값으로사용할 수 없도록 만드는 표시
72/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-30] 의 태그 클래스를등록하는 <tag> 엘리먼트
[ 그림 10-47] 예제 10-30 의 태그 클래스를 TLD 파일에 등록하는 방법
73/91
변수를 지원하는 커스텀 액션을 만드는 태그 클래스
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-31] 예제 10-30 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefi x= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE>최소값 구하기 (New)</TITLE></HEAD> <BODY> <tool:newMin var= “MIN ” num1= “${param.NUM1}” num2= “${param.NUM2}” /> 최소값 : ${MIN} </BODY></HTML>
URL 뒤에 이런 식으로 입력 데이터값을 직접 쓰세요
[ 그림 10-48] 예제 10-31 의 실행 결과
74/91
차일드 커스텀 액션 이번에는 부모 - 자식 관계의 커스텀 액션을 태그 클래스를 이용해서 구현하는 방법을
알아보기로 하자 .
위 그림처럼 작동하는 커스텀 액션을 만들기 위해서는 두 개의 태그 클래스를 작성해야
한다 . 하나는 바깥쪽에 있는 <tool:list> 커스텀 액션을 위한 태그 클래스이고 , 다른
하나는 안쪽에 있는 <tool:item> 커스텀 액션을 위한 태그 클래스이다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
<tool:list> <tool:item> 오렌지 쥬스 </tool:item> <tool:item>키위 스무디 </tool:item> <tool:item>딸기 아이스크림 </tool:item></tool:list>
[ 그림 10-49] 부모 - 자식 관계를 갖는 커스텀 액션의 예 (1)
75/91
차일드 커스텀 액션 부모 커스텀 액션을 구현하기 위해서는 getJspBody 메서드를 이용해서 JspFragment
객체를 구한 다음에 그 객체에 대해 invoke 메서드를 호출하기만 하면 된다 .
invoke 메서드는 내부적으로 부모 커스텀 액션에 포함된 자식 커스텀 액션의 태그
클래스를 호출한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-32] 부모 커스텀 액션을 구현하는 태그 클래스
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class ListTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspFragment body = getJspBody(); body.invoke(null); return; }}
76/91
차일드 커스텀 액션 자식 커스텀 액션을 구현하는 태그 클래스에서는 그 커스텀 액션이 올바른 부모 클래스
안에서 사용되고 있는지 확인해야 한다 .
태그 클래스가 슈퍼클래스인 SimpleTagSupport 로부터 상속받은 getParent 메서드를
이용하면 부모 커스텀 액션의 태그 클래스 객체를 가져올 수 있다 .
• 위 메서드가 리턴하는 객체의 타입을 자바 연산자인 instanceof 를 사용해서 확인하면 부모 커스텀
액션이 올바른 타입인지 알 수 있다 .
• 부모 커스텀 액션이 아예 없을 경우를 대비해서 getParent 메서드의 리턴값이 null인지도 확인해
보아야 한다 .
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
if ((parent == null) || !(parent instanceof ListTag))
throw new JspException( “잘못된 부모 커스텀 액션입니다 . ”);
부모 커스텀 액션이 없는지 확인
부모 커스텀 액션이올바른 타입인지 확인
부모 커스텀 액션의 타입이 올바르지 않으면 JspException 객체를 생성해서 던집니다 .
JspTag parent = getParent();
부모 커스텀 액션의 태그 클래스 객체를 리턴하는 메서드
77/91
차일드 커스텀 액션
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-33] 자식 커스텀 액션을 구현하는 태그 클래스
package tool;import java.io.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;public class ItemTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspTag parent = getParent(); if ((parent == null) || !(parent instanceof ListTag)) throw new JspException( “The Parent is not ListTag ”); JspContext context = getJspContext(); JspWriter out = context.getOut(); JspFragment body = getJspBody(); out.print( “- ”); body.invoke(null); out.println( “<BR> ”); return; }}
[ 예제 10-32] 의 태그 클래스를등록하는 <tag> 엘리먼트
[ 예제 10-33] 의 태그 클래스를등록하는 <tag> 엘리먼트
78/91
차일드 커스텀 액션
3. 태그 클래스를 이용해서 커스텀 액션을 만드는 방법
[ 예제 10-34] 예제 10-32, 예제 10-33 이 만드는 커스텀 액션을 사용하는 JSP 페이지
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE> 과일 나라 </TITLE></HEAD> <BODY> <H3> 오늘의 메뉴 </H3> <tool:list> <tool:item> 오렌지 쥬스 </tool:item> <tool:item>키위 스무디 </tool:item> <tool:item>딸기 아이스크림 </tool:item> </tool:list> </BODY></HTML>
[ 그림 10-51] 예제 10-34 의 실행 결과
79/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법 태그 라이브러리를 만들기 위해서는 크게 세 가지 일을 해야 한다 .
1. 디렉터리 계층 구조를 만들고 라이브러리를 구성하는 파일들을 그곳에 저장한다 .
2. TLD 파일을 수정한다 .
3. 디렉터리의 계층 구조 전체를 JAR 파일로 만든다 .
JSP 규격서에 따르면 태그 라이브러리를 구성하는 파일들은 다음과 같은 디렉터리 계층
구조에 저장해야 한다 .
4. 태그 라이브러리를 만드는 방법
[ 그림 10-55] 태그 라이브러리를 위한 디렉터리 계층 구조 만들기
작업용 디렉터리 TLD 파일은 이 디렉터리 안에 저장해야
합니다 .WEB-INF/classes 디렉터리 아래에 있던 패키지 디렉터리를 통째로 복사하세요 .
80/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법 태그 라이브러리에는 web.xml 파일을 포함시키지 말아야 한다 .
TLD 파일의 URI 는 TLD 파일 안에 직접 써 넣어야 한다 .
4. 태그 라이브러리를 만드는 방법
<uri> 엘리먼트 안에 TLD 파일의 URI 를 기술합니다
[ 그림 10-56] TLD 파일에 URI 직접 기술하기
81/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법 태그 라이브러리는 JAR 파일 형태로 만들어야 하며 , JAR 파일은 JDK 의 bin
디렉터리에 있는 jar.exe 프로그램을 이용해서 만들 수 있다 .
jar.exe 프로그램을 실행할 때는 옵션 , 생성할 JAR 파일의 이름 , JAR 파일에 들어갈
파일들의 이름을 다음과 같은 순서로 써야 한다 .
• 위 명령에서 사용한 와일드카드 문자 (*) 는 현재 디렉터리에 있는 모든 파일과 서브디렉터리 ,
그리고 그 아래에 있는 모든 파일과 서브디렉터리를 의미한다 .
4. 태그 라이브러리를 만드는 방법
jar cvf0 tool.jar *
옵션 생성할 JAR 파일의
이름
JAR 파일에 들어갈 파일들
82/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법
4. 태그 라이브러리를 만드는 방법
[ 그림 10-57] jar 명령으로 태그 라이브러리를 만드는 방법
1) jar 명령을 입력하고 Enter 키를 누르세요 .
JAR 파일에 저장되는 파일의 목록
2) jar 명령이 끝나면 작업 디렉터리에 JAR 파일이 생성됩니다 .
83/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법
4. 태그 라이브러리를 만드는 방법
[ 그림 10-58] 태그 라이브러리를 설치하는 방법
1) brain10T 웹 애플리케이션 디렉터리를 만드세요 .
3) 그 디렉터리에 tool.jar 파일을 저장하세요 .
2) 그 아래에 WEB-INF/lib 서브디렉터리를 만드세요 .
84/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법
4. 태그 라이브러리를 만드는 방법
[ 예제 10-37] 태그 라이브러리의 테스트를 위한 JSP 페이지 ( 1 )
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “tool ” uri= “/taglibs/tools.tld ” %><HTML> <HEAD><TITLE>샐러드 나라 </TITLE></HEAD> <BODY> <H3> 오늘의 메뉴 </H3> <tool:newList bullet= “# ”> <tool:newItem> 야채 샐러드 </tool:newItem> <tool:newItem> 고구마 샐러드 </tool:newItem> <tool:newItem>감자 샐러드 </tool:newItem> </tool:newList> </BODY></HTML>
[ 그림 10-59] 예제 10-37 의 실행 결과
85/91
태그 파일을 모아서 태그 라이브러리를 만드는 방법 태그 파일을 포함하는 태그 라이브러리를 만들기 위해서는 다음 세 가지 단계의 작업이
필요하다 .
• 디렉터리 계층 구조를 만들고 파일들을 그곳에 저장한다 .
• TLD 파일을 생성해서 태그 파일을 등록한다 .
• 디렉터리 계층 구조 전체를 JAR 파일로 만든다 .
4. 태그 라이브러리를 만드는 방법
[ 그림 10-60] 태그 라이브러리를 만들기 위한 태그 파일의 배치 방법
1) META-INF 디렉터리를 만드세요 .2) 그 아래에 tags 디렉터리를 통째로 복사하세요 .
10-2 절에서 만들었던 태그 파일과 태그 파일이 포함된 서브디렉터리
86/91
태그 파일을 모아서 태그 라이브러리를 만드는 방법 TLD 파일에 태그 파일을 등록하려면 우선 루트 엘리먼트 안에 <tag-file> 이라는
서브엘리먼트를 쓰고 , 그 안에 다시 커스텀 액션의 이름과 태그 파일의 경로명을
포함하는 <name> 과 <path> 라는 서브엘리먼트를 쓰면 된다 .
4. 태그 라이브러리를 만드는 방법
<tag-file> <name>line</name> <path>/META-INF/tags/line.tag</path></tag-file>
커스텀 액션의 이름
태그 파일의 경로명
87/91
태그 파일을 모아서 태그 라이브러리를 만드는 방법 앞에서 작성한 모든 태그 파일을 TLD 파일에 등록해 놓은 모습
4. 태그 라이브러리를 만드는 방법
[ 그림 10-61] 태그 파일을 등록한 TLD 파일
88/91
태그 파일을 모아서 태그 라이브러리를 만드는 방법 TLD 파일은 META-INF 디렉터리나 그 아래의 서브디렉터리에 저장해야 한다 . 단 ,
tags 디렉터리 안에는 저장하면 안 된다 .
4. 태그 라이브러리를 만드는 방법
[ 그림 10-62] TLD 파일을 저장하는 방법
[ 그림 10-61] 의 TLD 파일을저장하세요 .
89/91
태그 파일을 모아서 태그 라이브러리를 만드는 방법 jar.exe 프로그램을 이용해서 태그 라이브러리를 만드는 방법은 앞에서와 동일하다 .
4. 태그 라이브러리를 만드는 방법
[ 그림 10-63] jar 명령으로 태그 라이브러리를 만드는 방법
1) jar 명령을 입력하고 Enter 키를 누르세요 .
JAR 파일에 저장되는 파일의 목록
2) jar 명령이 끝나면 작업 디렉터리에 JAR 파일이 생성됩니다 .
90/91
태그 클래스를 모아서 태그 라이브러리를 만드는 방법
4. 태그 라이브러리를 만드는 방법
[ 그림 10-64] 태그 라이브러리를 설치하는 방법
1) brain10T 웹 애플리케이션의 WEB-INF/lib 디렉터리로 가세요 .
2) 그 디렉터리에 util.jar 파일을 저장하세요 .
91/91
태그 파일을 모아서 태그 라이브러리를 만드는 방법
4. 태그 라이브러리를 만드는 방법
[ 예제 10-38] 태그 라이브러리의 테스트를 위한 JSP 페이지 (2)
<%@page contentType= “text/html; charset=euc-kr ”%><%@taglib prefix= “util ” uri= “/taglibs/util.tld ” %><HTML> <HEAD><TITLE>10 장의 마지막 예제 </TITLE></HEAD> <BODY> <H3>10 장의 마지막 예제입니다 .</H3> <util:box> 커스텀 액션 만들기에 대한 공부를 마쳤습니다 . <BR> 여러분 모두 수고하셨습니다 . </util:box> </BODY></HTML>
[ 그림 10-65] 예제 10-38 의 실행 결과
뇌를 자극하는 JSP & Servlet