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