커스텀액션 JSP & Servlet
2/94 Contents 학습목표 커스텀액션을직접만들어서사용하는방법과커스텀액션을모아서태 그라이브러리를만들어배포하는방법을배워보자. 내용 커스텀액션작성방법 태그파일을이용한커스텀액션작성방법 태그클래스를이용한커스텀액션작성방법 태그라이브러리작성방법
3/94 1. 커스텀액션구현 커스텀액션구현 커스텀액션구현방법 태그파일 (Tag File) 태그클래스 심플태그 (Simple Tag) 클래스 클래식태그 (Classic Tag) 클래스 태그파일 (tag file) JSP 페이지와비슷한문법으로작성하는텍스트파일 커스텀태그의동작을기술 <%@tag body-content= scriptless %> <TABLE border=1 cellpadding=20> <TR> <TD> <jsp:dobody/> </TD> </TR> </TABLE> JSP 페이지와유사한문법 [ 그림 10-2] 태그파일의예
4/94 1. 커스텀액션구현 커스텀액션구현 태그파일 JSP 페이지처럼웹컨테이너의특정디렉터리에저장해놓기만하면바로사용가능 간단한설치방법은태그파일의장점 [ 그림 10-3] 태그파일을개발할때해야할일
5/94 1. 커스텀액션구현 커스텀액션구현 태그클래스 (tag class) 자바프로그래밍언어의문법에따라완전한자바클래스형태로작성 태그의속성및동작을구현 태그클래스가상속받아야하는슈퍼클래스 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/94 1. 커스텀액션구현 커스텀액션구현 태그클래스 태그파일과달리설치방법이상당히복잡 [ 그림 10-5] 태그클래스를개발할때해야할일
7/94 2. 태그파일 아주간단한태그파일 태그파일 태그의동작을구현한일련의 JSP 파일 파일확장자 : jsp tag 특정배포위치에배포하여야웹컨테이너가검색하여실행가능 다음과같이웹페이지에선을출력하는태그파일을만들어보자. <util:line/> [ 그림 10-6] 아주간단한커스텀액션의예 [ 예제 10-1] 선을출력하는커스텀액션의태그파일 미완성 --------------------------------------------------------------<BR>
8/94 2. 태그파일 아주간단한태그파일 태그파일에서사용가능한지시자 이름 tag 지시자 include 지시자 taglib 지시자 attribute 지시자 variable 지시자 역할 웹컨테이너가태그파일을처리할때필요한정보를기술 다른태그파일을포함 태그파일에서사용할다른커스텀액션의태그라이브러리 (tag library) 에대한정보를기술 커스텀액션의애트리뷰트에대한정보를기술 커스텀액션의변수에대한정보를기술 [ 표 10-1] 태그파일에서사용할수있는지시자 include / taglib 지시자 - JSP 페이지에서와똑같은역할을수행 나머지지시자는태그파일에서만사용
2. 태그파일 아주간단한태그파일 태그파일을이용해서만든커스텀액션은기본적으로본체를가질수있다. 커스텀액션의본체 - 시작태그와끝태그사이에오는부분 <util:box> 야유회가취소되었습니다.</util:box> 커스텀액션의본체 (body) 커스텀액션이본체를갖지않는경우는태그파일에 tag 지시자의옵션을이용하여설정 <%@tag body-content= empty %> 커스텀액션이본체를가질수없음을표시합니다. 위와같이 tag 지시자의 body-content 옵션을정의하는경우, 커스텀액션을사용할 때다음과같이처리된다. <util:line> 절취선 </util:line> <util:line/> 문법에러가발생합니다. 정상처리됩니다 9/94
2. 태그파일 아주간단한태그파일 [ 예제 10-2] 선을출력하는커스텀액션의태그파일 line.tag <%@tag body-content= empty %> --------------------------------------------------------------<BR> 3 그디렉터리안에 [ 예제 10-2] 의태그파일을저장하세요 1 이번장의예제를위한 brain10 웹애플리케이션디렉터리를만드세요. 2 그리고그아래에 WEB-INF/tags 서브디렉터리를만드세요 10/94
11/94 2. 태그파일 아주간단한태그파일 웹컨테이너에서의태그파일위치
2. 태그파일 아주간단한태그파일 JSP 페이지에서커스텀액션을사용하려면 taglib 지시자로지정 taglib 지시자에 uri 애트리뷰트대신 tagdir 애트리뷰트를사용 <%@taglib prefix= util tagdir= /WEB-INF/tags %> 접두어 태그파일이있는디렉터리의경로명 tablib 지시자로지정한다음에는접두어와커스텀액션의이름을이용해서커 스텀액션을사용 커스텀액션의이름은태그파일의이름에서.tag 를제외한나머지부분 <util:line/> 접두어 커스텀액션의이름 12/94
13/94 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 의실행결과
2. 태그파일 애트리뷰트를지원하는태그파일 다음과같은애트리뷰트가있는커스텀액션을만들어보자. <util:newline color= red size= 20 /> 20 개의마이너스기호로이루어진빨간색선을출력합니다 애트리뷰트가있는커스텀액션을만들기위해서는태그파일에각각의애트리뷰트를 attribute 지시자를사용하여정의하여야함. Attribute 지시자옵션 name type required rtexprvalue [ 그림 10-9] 애트리뷰트가있는커스텀액션의예 14/94
15/94 2. 태그파일 애트리뷰트를지원하는태그파일 attribute 지시자의 name 옵션은커스텀액션의애트리뷰트이름을지정 <%@attribute name= color %> 애트리뷰트의이름 커스텀액션의애트리뷰트접근 스크립팅요소안에서자바변수처럼사용 표현식언어의 EL 식안에서데이터이름으로사용 <%= color %> ${color} 애트리뷰트의이름 애트리뷰트의이름
16/94 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 의실행결과
2. 태그파일 애트리뷰트를지원하는태그파일 [ 예제 10-4] 태그파일의문제점 <util:newline> 커스텀액션은 color 와 size 애트리뷰트를모두지정하였을때는정상 적으로작동하지만, size 애트리뷰트를쓰지않으면선이전혀출력되지않는다. size 애트리뷰트를필수애트리뷰트로지정하여해결 [ 예제 10-4] 의 attribute 지시자에 required 애트리뷰트를추가하고그값으로 true 를 지정 <%@attribute name= size type= java.lang.integer required= true %> 필수애트리뷰트임을표시합니다 17/94
2. 태그파일 동적애트리뷰트를지원하는태그파일 애트리뷰트각각을위해 attribute 지시자를쓰는대신모든애트리뷰트를한꺼 번에선언하려면동적애트리뷰트를선언하면된다. 태그파일의 tag 지시자에 dynamic-attributes 애트리뷰트를쓰고, 그값으로커 스텀액션의모든애트리뷰트를대표할이름을지정 <%@tag dynamic-attributes= attrs %> 동적애트리뷰트의대표이름 태그파일안에서다음과같은 EL 식을사용하면커스텀액션에서사용된특 정애트리뷰트값을가져올수있다. ${attrs.color} 동적애트리뷰트의대표이름 실제로사용된애트리뷰트의이름 18/94
2. 태그파일 동적애트리뷰트를지원하는태그파일 커스텀액션의애트리뷰트를담고있는 Map 객체는 page 데이터영역을통해 태그파일에전달되는데, 그객체는 jspcontext 내장변수에대해 getattribute 라는메서드를호출해서가져올수있다. Map attrs = (Map) jspcontext.getattribute( attrs ); 동적애트리뷰트의대표이름 동적애트리뷰트의경우에는모든애트리뷰트의값이문자열형태로저장되므 로, Map 객체에대해 get 메서드를호출할때리턴값을 String 타입으로변환 해서받아야한다. String str = (String) attrs.get( size ); 개별적인애트리뷰트이름 19/94
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> WEB-INF/tags/util 디렉터리에 doubleline.tag 라는이름으로저장 20/94
21/94 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>
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/94
23/94 2. 태그파일 동적애트리뷰트를지원하는태그파일 [ 그림 10-15] 태그파일에정의되지않은애트리뷰트를사용했을때발생하는에러
2. 태그파일 커스텀액션의본체를처리하는태그파일 커스텀액션의시작태그와끝태그사이에오는내용을커스텀액션의본체 (body) 라고한다. <util:box> 안녕하세요, 여러분! <BR> 홈페이지를오픈했습니다. </util:box> [ 그림 10-16] 본체가있는커스텀액션의예 본체가있는커스텀액션을만들기위해서는태그파일의 tag 지시자에있는 body-content 애트리뷰트에 empty 라는값대신 scriptless 나 tagdependent 라는 값을써야한다. <%@tag body-content= scriptless %> 커스텀액션의본체에스크립틀릿을쓸수없음을표시합니다. 24/94
25/94 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 의실행결과
2. 태그파일 변수를지원하는커스텀액션 변수를지원하는커스텀액션을만들려면태그파일에 variable 지시자를써야 한다. variable 지시자를기술하는방법은다음과같다. <%@variable name-given= result %> 변수의이름 String 타입이아닌다른타입의변수를선언하려면 variable 지시자에 variable-class 라는애트리뷰트를추가해서타입을지정하면된다. <%@variable name-given= result variable-class= java.lang.integer %> 변수의타입 주의할점 - variable-class 애트리뷰트에는프리미티브타입을지정할수없으므로, 래퍼클래스타입을대신사용해야한다. 26/94
2. 태그파일 변수를지원하는커스텀액션 JSP 페이지 <tool:max num1= 45 num2= 32 />... ${maximum} num1, num2 애트리뷰트의값 maximum 변수의값 태그파일 입력 출력 위그림처럼작동하는커스텀액션을만들기위해서는커스텀액션이끝난다음에 maximum이라는변수를사용할수있도록만들어야한다. variable 지시자에 scope 애트리뷰트를추가하여지정 scope 애트리뷰트 [ 그림 10-18] 변수를이용해서데이터를리턴하는커스텀액션의예 변수의사용범위를지정하는역할 NESTED, AT_BEGIN, AT_END 중한값을지정 <%@variable name-given= result variable-class= java.lang.integer scope= AT_END %> 변수의사용범위 단독으로사용되는태그다음에변수를사용할수있도록만들려면 AT_END 값을지정하는것이가장적합 27/94
2. 태그파일 변수를지원하는커스텀액션 variable 지시자를이용해서선언한변수에값을대입하려면 <c:set> 커스텀액 션을사용해야한다. <c:set var= result value= 100 /> 변수의이름 변수에대입할값 태그파일안에서변수에저장한값은 JSP 페이지로전달되고, JSP 페이지에 서그값을가져다가사용할수있다. 28/94
29/94 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 페이지 [ 그림 10-20] 예제 10-12 의실행결과 <%@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>
2. 태그파일 변수를지원하는커스텀액션 앞예제의단점 결과를반환하는 maximum 변수의이름이태그파일안에고정되어있다. 해결책 - 별도의애트리뷰트를이용하여변수의이름을지정 <util:max var= maximum num1= 37 num2= 42 /> 변수의이름 변수이름을저장할애트리뷰트를선언할때는지켜야하는규칙 첫째, 필수애트리뷰트로만들어야한다. 둘째, 애트리뷰트값에스크립팅요소나익스프레션언어를사용할수없도록만들어야한다. <%@attribute name= var required= true rtexprvalue= false %> 애트리뷰트이름 필수애트리뷰트임을표시 애트리뷰트값으로스크립팅요소나 익스프레션언어를사용할수없음을표시 30/94
2. 태그파일 변수를지원하는커스텀액션 애트리뷰트를이용해서변수이름을지정할때는 variable 지시자도다르게기 술해야한다. 첫째, name-given 애트리뷰트를이용해서변수의이름을지정하는것이아니라, name-from-attribute 애트리뷰트를이용해서변수의이름을지정할애트리뷰트의이 름을지정해야한다. 둘째, 태그파일안에서사용할변수이름을따로선언해야한다. 변수이름을지정하기위해사용할애트리뷰트이름 태그파일안에서사용할변수이름 <%@variable name-from-attribute= var alias= maximum variable-class= java.lang.integer scope= AT_END %> 31/94
32/94 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 의실행결과
2. 태그파일 변수를지원하는커스텀액션 다음과같이커스텀액션의본체안에서변수를사용하는예제를작성해보자. <util:compute var= num start= 1 end= 5 > ${num} 의제곱은? ${num * num} <BR> </util:compute> [ 그림 10-22] 커스텀액션의본체안에서변수를사용하는커스텀액션의예 start 애트리뷰트부터 end 애트리뷰트까지변화하는값을본체안에서사용할 수있도록만들어야한다. 33/94
34/94 2. 태그파일 변수를지원하는커스텀액션 variable 지시자의 scope 애트리뷰트값을 NATED 로지정해야한다. [ 예제 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/> <% } %>
35/94 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 의실행결과
36/94 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 의실행결과
37/94 3. 태그클래스 태그클래스종류 [ 그림 10-25] 태그클래스를만드는방법
38/94 3. 태그클래스 SimpleTag 인터페이스를구현하는태그클래스
39/94 3. 태그클래스 SimpleTag 인터페이스를구현하는태그클래스
40/94 3. 태그클래스 심플태그핸들러클래스구현
3. 태그클래스 SimpleTagSupport 태그클래스 SimpleTagSupport 클래스를이용해서태그클래스를만들때는반드시다음과같은형식의 dotag 메서드를작성해야한다. public void dotag() throws JspException, IOException { } 이위치에커스텀액션이해야할일을기술해야합니다. 웹브라우저로 HTML 코드를출력하기위해서는우선다음과같은방법으로 JspContext 객체를구해야한다. JspContext context = getjspcontext(); JspWriter out = context.getout(); JSP 페이지에관한여러가지정보가들어있는 JspContext 객체를리턴하는메서드 JspContext 객체에대해 print 나 println 메서드를호출하면웹브라우저로 HTML 을출력할수있다. JspWriter 객체를리턴하는메서드 out.println( -----------------------<BR> ); 웹브라우저로선을출력합니다 41/94
42/94 3. 태그클래스 SimpleTagSupport 태그클래스 다음은선을출력하는커스텀액션을구현하는태그클래스이다. [ 예제 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; } }
43/94 3. 태그클래스 SimpleTagSupport 태그클래스 1 톰캣의 lib 디렉터리에있는이파일을 [ 그림 10-29] jsp-api.jar 파일을 JDK 의확장라이브러리디렉터리에설치하기
44/94 3. 태그클래스 SimpleTagSupport 태그클래스 2 JDK 의 jre\lib\ext 디렉터리로복사합니다.
3. 태그클래스 SimpleTagSupport 태그클래스 [ 그림 10-30] 태그클래스를컴파일하는방법 3 작업디렉터리 (C:\src\ch10) 에있는컴파일결과물을 tool 서브디렉터리에복사하세요 1 brain10/web-inf 디렉터리아래에 classes 디렉터리를만드세요. 2 [ 예제 10-18] 의클래스는 tool 패키지에속하므로 tool 서브디렉터리를만드세요 [ 그림 10-31] 예제 10-18 의태그클래스를설치하는방법 45/94
46/94 3. 태그클래스 SimpleTagSupport 태그클래스 태그클래스를설치한다음에는등록을해야한다. ( 앞의 [ 그림 10-5] 참고 ) TLD 파일에태그클래스를등록하기위해서는다음과같은형식의 <tag> 엘리먼트를추가해야한다. <tag> <name>starline</name> <tag-class>tool.starlinetag</tag-class> <body-content>empty</body-content> </tag> 커스텀액션의이름 태그클래스의이름 본체의형태 <tag> 엘리먼트는 TLD 파일의루트엘리먼트인 <tablib> 엘리먼트의바로아 래에위치해야한다. <taglib xmlns= http://java.sun.com/xml/ns/javaee version= 2.1 > <tlib-version>1.0</tlib-version> <short-name>tool</short-name> TLD 파일의버전 <tag> TLD 파일의이름 <name>starline</name> <tag-class>tool.starlinetag</tag-class> <body-content>empty</body-content> </tag> </taglib>
47/94 3. 태그클래스 SimpleTagSupport 태그클래스 [ 예제 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 의실행결과
48/94 3. 태그클래스 애트리뷰트가있는심플태그클래스 태그클래스를이용하여애트리뷰트가있는커스텀액션을구현하는방법 애트리뷰트값을받는 public 메서드를선언해야한다. 메서드의이름은 set 으로시작해야하고, 그다음에애트리뷰트의본래이름에서첫 글자를대문자로바꾼이름을붙여서만들어야한다. color 애트리뷰트값을받는메서드의이름 이파라미터변수를통해애트리뷰트값이전달됩니다 public void setcolor(string color) { } set- 메서드가받은애트리뷰트값은필드 (field, 클래스의멤버변수 ) 에저장 public class NewLineTag extends SimpleTagSupport { private String color; }... public void setcolor(string color) { this.color = color; } 애트리뷰트값을필드에저장합니다. 저장된애트리뷰트값은나중에 dotag 메서드안에서사용
49/94 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) { size 애트리뷰트를받는메서드 this.size = size; } public void setcolor(string color) { this.color = 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; } }
3. 태그클래스 애트리뷰트가있는심플태그클래스 애트리뷰트를지원여부를 TLD 파일에등록 <tag> 엘리먼트안에 <attribute> 라는서브엘리먼트를사용 <tag> <name>newline</name> <tag-class>tool.newlinetag</tag-class> <body-content>empty</body-content> </tag> 이위치에 <attribute> 엘리먼트를추가해야합니다. <attribute> 엘리먼트안에는 <name> 와 <type> 라는두개의서브엘리먼트를 사용하여각각애트리뷰트의이름과타입을표시 <attribute> <name>size</name> <type>java.lang.integer</type> </attribute> 애트리뷰트의이름 애트리뷰트의타입 50/94
3. 태그클래스 애트리뷰트가있는심플태그클래스 [ 예제 10-20] 의 setcolor 메서드가구현하는 color 애트리뷰트를위해서는다음 과같은 attribute 엘리먼트를기술해야한다. <attribute> <name>color</name> <type>java.lang.string</type> </attribute> 애트리뷰트의이름 애트리뷰트의타입 [ 그림 10-35] 예제 10-20 의태그클래스를 TLD 파일에등록하는방법 51/94
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 의실행결과 52/94
3. 태그클래스 동적애트리뷰트를지원하는심플태그클래스 동적애트리뷰트를지원하기위해 setdynamicattribute 메서드를선언 다음과같은 3 개의파라미터를지정 애트리뷰트의이름이속하는네임스페이스의 URI 애트리뷰트의이름 애트리뷰트의값 public void setdynamicattribute(string uri, String localname, Object value) throws JspException { } 네임스페이스 (namespace) 란똑같은이름의충돌을방지하기위해서만들어놓은이름공간이다. 특정네임스페이스에속하지않는애트리뷰트일경우에이메서드의첫번째파라미터값은 null이된다. 53/94
3. 태그클래스 동적애트리뷰트를지원하는심플태그클래스 애트리뷰트의네임스페이스는잘사용되지않으므로, 대개의경우 setdynamicattribute 메서드안에서는첫번째파라미터값을무시하고두번 째와세번째파마리터값만저장해놓아도충분하다. 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 implements DynamicAttributes { private Map<String,Object> attrs = new HashMap<String,Object>();... public void dotag() throws JspException, IOException {... String color = (String) attrs.get( color );... } } Map 객체에저장되어있는애트리뷰트값을가져옵니다 54/94
55/94 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; } }
3. 태그클래스 동적애트리뷰트를지원하는심플태그클래스 TLD 파일에동적애트리뷰트를지원하는태그클래스를등록할때는 <tage> 엘리먼트안에 <dynamic-attributes> 서브엘리먼트를쓰고, 그안에 true 라는값 을쓰면된다. <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 파일에등록하는방법 56/94
57/94 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 의실행결과
58/94 3. 태그클래스 본체를갖는심플태그클래스 태그클래스를이용해서본체가있는커스텀액션을만들기위해서는다음과 같은두단계의작업을해야한다. 첫째, getjspbody 메서드를이용해서커스텀액션의본체내용을가져온다. JspFragment body = getjspbody(); 커스텀액션의본체를가져오는메서드 둘째, JspFragment 객체를이용해서본체의내용을출력한다. body.invoke(out); JspFragment 객체의내용을출력하는메서드 invoke 메서드를호출할때는파라미터로 null 값을넘겨줄수도있다. body.invoke(null); null 을넘겨주면 JSP 페이지와동일한출력스트림을통해본체의내용이출력됩니다.
59/94 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; } }
3. 태그클래스 본체를갖는심플태그클래스 TLD 파일에본체가있는커스텀액션을등록할때는 <tag> 엘리먼트의 <body-content> 서브엘리먼트안에 scriptless 나 tagdependant 라는값을지정 <tag> <name>box</name> <tag-class>tool.boxtag</tag-class> <body-content>scriptless</body-content> </tag> 커스텀액션이본체에스크립팅요소를쓸수없다는표시 [ 예제 10-24] 의태그클래스를등록하는 <tag> 엘리먼트 [ 그림 10-39] 예제 10-24 의태그클래스를 TLD 파일에등록하는방법 60/94
61/94 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 의실행결과
3. 태그클래스 커스텀액션의본체내용을조작하는심플태그클래스 다음그림처럼커스텀액션의본체내용을조작해서출력하는커스텀액션을 만들어보자. <util:replace oldword= 비행기 newword= 제트기 > 떴다떴다비행기날아라날아라 <BR> 높이높이날아라우리비행기 <BR> </util:replace> [ 그림 10-41] 본체의내용을조작하는커스텀액션의예 태그클래스안에서커스텀액션의본체내용을가져다가문자열로만든다음, 그문자열을조작해서출력하면된다. 자바표준라이브러리의 java.io.stringwriter 클래스를이용하여동작수행 62/94
63/94 3. 태그클래스 커스텀액션의본체내용을조작하는심플태그클래스 첫째, getjspbody 메서드를호출해서커스텀액션의본체내용을가져온다. JspFragment body = getjspbody(); 커스텀액션의본체를가져옵니다. 둘째, JspFragment 객체에대해 invoke 메서드를호출할때파라미터로 StringWriter 객체를넘겨준다. StringWriter writer = new StringWriter(); body.invoke(writer); StringWriter 객체를생성합니다 본체의내용을 StringWriter 객체안으로출력합니다. 셋째, tostring 메서드를이용해서 StringWriter 객체안의내용을문자열로만 든다. String str = writer.tostring(); StringWriter 객체안에있는내용을문자열로만듭니다
64/94 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; } }
65/94 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 의실행결과
3. 태그클래스 변수를지원하는심플태그클래스 JSP 페이지 <util:min num1= 45 num2= 32 />... ${minimum} num1, num2 애트리뷰트의값 maximum 변수의값 태그클래스 num1 과 num2 중작은값을 minimum 변수에담아서리턴합니다 [ 그림 10-44] 변수를이용해서데이터를리턴하는태그클래스의예 태그클래스가변수를지원하도록만들려면해당변수의이름과값을 page 데이터영역에저장해놓아야한다. page 데이터영역에데이터를저장하기위해서는우선 getjspcontext 메서드를호출해서 JspContext 객체를구해야한다. JspContext context = getjspcontext(); page 데이터영역에데이터를저장할수있는객체 context.setattribute( minimum, num1) 변수이름 변수값 66/94
67/94 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; } }
68/94 3. 태그클래스 변수를지원하는심플태그클래스 TLD 파일에변수를지원하는태그클래스를등록할때는 <tag> 엘리먼트안 에 <variable> 이라는서브엘리먼트를쓰고, 다시그안에변수에대한정보를 기술하는몇가지서브엘리먼트를다음과같은형식으로작성 <tag>... 변수의이름 <variable> <name-given>minimum</name-given> <variable-class>java.lang.integer</variable-class> <scope>at_end</scope> </variable> 변수의사용범위... </tag> 변수의타입 [ 예제 10-28] 의태그클래스를등록하는 <tag> 엘리먼트
69/94 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> URL 뒤에이런식으로입력데이터값을직접쓰세요 [ 그림 10-46] 예제 10-29 의실행결과
70/94 3. 태그클래스 변수를지원하는심플태그클래스 별도의애트리뷰트를이용하여변수의이름을바꿀수있도록작성 <tool:min var= minimum num1= 12 num2= 35 /> 변수의이름
71/94 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; } }
72/94 3. 태그클래스 변수를지원하는심플태그클래스 애트리뷰트를통해변수의이름을지정하는커스텀액션을 TLD 파일을등록 할때는 <variable> 엘리먼트안에 <name-given> 서브엘리먼트대신 <namefrom-attribute> 라는서브엘리먼트를쓰고, 그안에변수의이름지정에사용되 는애트리뷰트의이름을써야한다. <tag>... 변수이름의지정에사용할애트리뷰트의이름 <variable> <name-from-attribute>var</name-from-attribute> <variable-class>java.lang.integer</variable-class> <scope>at_end</scope> 변수의타입 </variable>... 변수의사용범위 </tag>
3. 태그클래스 변수를지원하는심플태그클래스 TLD 파일에변수의이름지정에사용되는애트리뷰트를추가할때는필수애 트리뷰트로만들어야하고, 애트리뷰트값에익스프레션이나 EL 식을사용할 수없도록만들어야한다. <tag>... 애트리뷰트의이름 <attribute> <name>var</name> <type>java.lang.string</type> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute>... </tag> 애트리뷰트의타입 필수애트리뷰트임을표시 익스프레션이나 EL 식을애트리뷰트값으로사용할수없도록만드는표시 73/94
74/94 3. 태그클래스 변수를지원하는심플태그클래스 [ 예제 10-30] 의태그클래스를등록하는 <tag> 엘리먼트 [ 그림 10-47] 예제 10-30 의태그클래스를 TLD 파일에등록하는방법
75/94 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 의실행결과
76/94 3. 태그클래스 차일드커스텀액션 부모 - 자식관계의커스텀액션을태그클래스를이용해서구현하는방법 <tool:list> <tool:item> 오렌지쥬스 </tool:item> <tool:item> 키위스무디 </tool:item> <tool:item> 딸기아이스크림 </tool:item> </tool:list> 위와같은커스텀액션을만들기위해서는두개의태그클래스를작성 바깥쪽에있는 <tool:list> 커스텀액션을위한태그클래스 안쪽에있는 <tool:item> 커스텀액션을위한태그클래스 [ 그림 10-49] 부모 - 자식관계를갖는커스텀액션의예 (1)
3. 태그클래스 차일드커스텀액션 부모커스텀액션구현에서는 getjspbody 메서드를이용하여 JspFragment 객 체를구한다음에그객체에대해 invoke 메서드를호출 [ 예제 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; } } invoke 메서드는내부적으로부모커스텀액션에포함된자식커스텀액션의 태그클래스를호출한다. 77/94
3. 태그클래스 차일드커스텀액션 자식커스텀액션을구현하는태그클래스에서는그커스텀액션이올바른부 모클래스안에서사용되고있는지확인해야한다. 태그클래스가슈퍼클래스인 SimpleTagSupport 로부터상속받은 getparent 메 서드를이용하면부모커스텀액션의태그클래스객체를가져올수있다. JspTag parent = getparent(); 부모커스텀액션의태그클래스객체를리턴하는메서드 위메서드가반환하는객체의타입을자바연산자인 instanceof를사용해서확인하면부모커스텀액션이올바른타입인지알수있다. 부모커스텀액션이아예없을경우를대비해서 getparent 메서드의반환값이 null인지도확인해보아야한다. 부모커스텀액션이없는지확인 부모커스텀액션이올바른타입인지확인 if ((parent == null)!(parent instanceof ListTag)) throw new JspException( 잘못된부모커스텀액션입니다. ); 부모커스텀액션의타입이올바르지않으면 JspException 객체를생성해서던집니다. 78/94
79/94 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> 엘리먼트
80/94 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 의실행결과
4. 태그라이브러리작성 태그라이브러리작성방법 태그라이브러리를만들기위해서는크게세가지일을해야한다. 1. 디렉터리계층구조를만들고라이브러리를구성하는파일들을그곳에저장한다. 2. TLD 파일을수정한다. 3. 디렉터리의계층구조전체를 JAR 파일로만든다. JSP 규격서에따르면태그라이브러리를구성하는파일들은다음과같은디 렉터리계층구조에저장해야한다. 작업용디렉터리 TLD 파일은이디렉터리안에저장해야합니다. WEB-INF/classes 디렉터리아래에있던패키지디렉터리를통째로복사하세요. [ 그림 10-55] 태그라이브러리를위한디렉터리계층구조만들기 81/94
82/94 4. 태그라이브러리작성 태그라이브러리작성방법 태그라이브러리에는 web.xml 파일을포함시키지말아야한다. TLD 파일의 URI 는 TLD 파일안에직접써넣어야한다. <uri> 엘리먼트안에 TLD 파일의 URI 를기술합니다 [ 그림 10-56] TLD 파일에 URI 직접기술하기
4. 태그라이브러리작성 태그라이브러리작성방법 태그라이브러리는 JAR 파일형태로만들어야하며, JAR 파일은 JDK 의 bin 디렉터리에있는 jar.exe 프로그램을이용해서만들수있다. jar.exe 프로그램을실행할때는옵션, 생성할 JAR 파일의이름, JAR 파일에 들어갈파일들의이름을다음과같은순서로써야한다. jar cvf0 tool.jar * 옵션 생성할 JAR 파일의이름 JAR 파일에들어갈파일들 위명령에서사용한와일드카드문자 (*) 는현재디렉터리에있는모든파일과서브디 렉터리, 그리고그아래에있는모든파일과서브디렉터리를의미한다. 83/94
84/94 4. 태그라이브러리작성 태그라이브러리작성방법 1) jar 명령을입력하고 Enter 키를누르세요. JAR 파일에저장되는파일의목록 2) jar 명령이끝나면작업디렉터리에 JAR 파일이생성됩니다. [ 그림 10-57] jar 명령으로태그라이브러리를만드는방법
85/94 4. 태그라이브러리작성 태그라이브러리작성방법 3) 그디렉터리에 tool.jar 파일을저장하세요. 1) brain10t 웹애플리케이션디렉터리를만드세요. 2) 그아래에 WEB-INF/lib 서브디렉터리를만드세요. [ 그림 10-58] 태그라이브러리를설치하는방법
86/94 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 의실행결과
4. 태그라이브러리작성 태그라이브러리작성방법 태그파일을포함하는태그라이브러리를만들기위해서는다음세가지단계 의작업이필요하다. 디렉터리계층구조를만들고파일들을그곳에저장한다. TLD 파일을생성해서태그파일을등록한다. 디렉터리계층구조전체를 JAR 파일로만든다. 1) META-INF 디렉터리를만드세요. 10-2 절에서만들었던태그파일과태그파일이포함된서브디렉터리 2) 그아래에 tags 디렉터리를통째로복사하세요. [ 그림 10-60] 태그라이브러리를만들기위한태그파일의배치방법 87/94
4. 태그라이브러리작성 태그라이브러리작성방법 TLD 파일에태그파일을등록하려면우선루트엘리먼트안에 <tag-file> 이라 는서브엘리먼트를쓰고, 그안에다시커스텀액션의이름과태그파일의경 로명을포함하는 <name> 과 <path> 라는서브엘리먼트를쓰면된다. <tag-file> <name>line</name> <path>/meta-inf/tags/line.tag</path> </tag-file> 커스텀액션의이름 태그파일의경로명 88/94
89/94 4. 태그라이브러리작성 태그라이브러리작성방법 앞에서작성한모든태그파일을 TLD 파일에등록해놓은모습 [ 그림 10-61] 태그파일을등록한 TLD 파일
4. 태그라이브러리작성 태그라이브러리작성방법 TLD 파일은 META-INF 디렉터리나아래의서브디렉터리에저장해야한다. 단, tags 디렉터리안에는저장하면안된다. [ 그림 10-61] 의 TLD 파일을저장하세요. [ 그림 10-62] TLD 파일을저장하는방법 90/94
91/94 4. 태그라이브러리작성 태그라이브러리작성방법 jar.exe 프로그램을이용해서태그라이브러리를만드는방법은앞에서와동일 1) jar 명령을입력하고 Enter 키를누르세요. JAR 파일에저장되는파일의목록 2) jar 명령이끝나면작업디렉터리에 JAR 파일이생성됩니다. [ 그림 10-63] jar 명령으로태그라이브러리를만드는방법
92/94 4. 태그라이브러리작성 태그라이브러리작성방법 2) 그디렉터리에 util.jar 파일을저장하세요. 1) brain10t 웹애플리케이션의 WEB-INF/lib 디렉터리로가세요. [ 그림 10-64] 태그라이브러리를설치하는방법
93/94 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