개발자가 원하는 기능을 수행하는 액션태그를 직접 개발할 수 있는 방법
커스텀 태그를 자바 클래로 구현, 액션태그를 JSP문서에 생성해 사용
커스텀 태그의 기능을 구현하는 자바클래스
simpleTagSupport 클래스를 상속받아 구현
/* 태그 핸들러 클래스 구조 */
public class 클래스이름 extends SimpleTagSupport {
/* doTag()는 인자를 가질 수 없음 */
public void doTag() throws JspException, IOException{
//커스텀 태그 기능
}
}
JspContext context = this.getJspContext();
JspWriter out = context.getOut();
Jspfragment 객체
: 커스텀태그의 몸체 처리를 위한 객체
SimpleTagSupport 객체의 getJspBody() 메서드에 의해 생성
invoke() 메서드
: 커스텀태그의 몸체를 읽어들이는 기능
invoke 인자로 StringWriter 객체가 주로 사용
JspFragment body = this.getJspBody();
StringWriter stringWriter = new StringWriter();
body.invoke(stringWriter); //JspFragment가 제공
태그 핸들러클래스와 액션태그 이름을 연결해 주는 XML파일
<tag>
<name> 태그 이름 </name>
<tag-class> 태그 핸들러 클래스 </tag-class>
<body-content> 몸체 존재 여부 </body-content>
<attribute>
<name> 속성 이름 </name>
<required> 필수 여부 </required>
<rtexprvalue> 동정 데이터 사용 여부 </rtexprvalue>
<type> 속성 값의 클래스 타입 </type>
</attribute>
</tag>
커스텀태그의 prefix와 TLD를 연결
<%@ taglib prefix = "prefix 이름" uri = "TLD 이름" %>
prefix : 커스텀 태그의 prefix 이름을 지정 (임의 지정0)
uri : TLD의 위치와 이름 지정
/* 태그 핸들러 클래스 */
public class ClassCustomTag2 extends SimpleTagSupport{
public void doTag() throws JspException, IOException{
//문서 정보를 포함하는 객체와 출력을 위한 객체 생성
JspContext context = this.getJspContext();
JspWriter out = context.getOut();
//몸체 처리를 위해 객체 생성
JspFragment body = this.getJspBody();
//몸체의 문자열 읽어 stringWriter에 출력
StringWriter stringWriter = new StringWriter();
body.invoke(stringWriter);
//stringWriter 객체에 출력된 내용 문자열로 반환
String str = stringWriter.toString();
//커스텀 태그 기능 구현
String UpperStr = str.toUpperCase();
for(int i=0; i<3; i++) {
out.println("" + UpperStr + " ");
}
out.println("<br>");
}
}
<!-- 태그 라이브 디스크립터 -->
<tag>
<name>upper</name>
<tag-class>chapter11.ClassCustomTag2</tag-class>
<!-- 몸체가 있으므로 scriptless로 지정 -->
<body-content>scriptless</body-content>
</tag>
<!-- jsp 파일 -->
<b> upper 커스텀 태그 실행 </b> <br>
<my:upper> custom tag </my:upper>
<%@ taglib tagdir = "태그 파일의 위치" prefix = "prefix 이름" %>
tag 지시문의 body-content 속성
: scriptless ( 몸체 내 EL만 사용 가능 ), tagdependent ( 모두 문자열로 간주 )
<jsp:doBody> 태그
: 몸체를 읽어 들이기 위해 사용