이전글
JSP 1.2 방식으로 태그 속성 및 커스텀 태그 몸체 처리하기
이전글에서는 JSP 1.2 방식으로 커스텀태그를 개발하는 방법에 대해 간단히 알아보았습니다. 이번글에서는 이전글에 이어서 속성과 본문의 텍스트를 사용하는 커스텀태그를 개발해 보도록 하겠습니다.
실습 예제
실습 예제를 통해 어떤식으로 커스텀태그에서 속성과 본문을 처리하는지 알아보도록 하겠습니다. 아래의
toSpan
태그는 이번 실습에서 개발할 커스텀 태그입니다.<body> <dololak:toSpan color="blueviolet" iterNum="5"> hello </dololak:toSpan> </body> | cs |
위의 코드와 같이 사용하면 아래와 같이 원하는 색상을 속성으로 지정해 배경으로 들어가고 태그의 몸체로 입력한 텍스트를 원하는 수만큼 반복해서 출력해주는 태그를 구현해보도록 할것입니다.
예제 프로젝트
프로젝트 구성은 아래와 같습니다. 모든 코드는 다음 주소에 있습니다. -> 예제 GIT 주소
이번 예제에서 필요한 파일은 사실상 아래 네개의 파일뿐입니다.
CustomTagBody.java
- 실질적인 처리를 하는 태그 핸들러 클래스로 태그의 기능을 구현합니다.WEB-INF/tld/custTagBody.tld
- 개발한CustomTagBody.java
에 대한 태그 설정 정의파일WEB-INF/web.xml
-tld
파일의 경로를 설정해주어 서블릿컨테이너가 개발한 커스텀태그를 인식하도록 합니다.customTagBodyTest.jsp
- 테스트를 실행해볼 JSP
태그 핸들러 CustomTagBody.java 작성
JSP 1.2
방식으로 커스텀태그를 개발할때 본문을 직접 처리하는 경우 BodyTagSupport
태그 핸들러를 상속받아 구현합니다.다음과 같이
BodyTagSupport
태그 핸들러를 상속받고 doStartTag()
, doAfterBody()
, doEndTag()
메서드를 오버라이딩합니다.package tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; public class CustomTagBody extends BodyTagSupport{ private String color; private int iterNum; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getIterNum() { return iterNum; } public void setIterNum(int iterNum) { this.iterNum = iterNum; } @Override public int doStartTag() throws JspException { System.out.println("시작 태그"); return EVAL_BODY_BUFFERED; } @Override public int doAfterBody() throws JspException { System.out.println("바디 처리 완료"); String color = this.getColor(); int iterNum = this.getIterNum(); String body = bodyContent.getString(); JspWriter out = bodyContent.getEnclosingWriter(); try { for(int i=0; i<iterNum; i++) { out.print("<span style=\" background-color: "+ color + "; \">"); out.print("♥" + body + "♥"); out.print("</span>"); } } catch (IOException e) { throw new JspException(e); } return super.doAfterBody(); } @Override public int doEndTag() throws JspException { System.out.println("끝태그"); return EVAL_PAGE; } } | cs |
먼저 속성으로 사용할 변수를 태그 핸들러의 멤버변수로 선언하고
getter
와 setter
를 Java Bean 규약에 맞는 형식으로 작성해 주어야 합니다. (메서드의 get또는 set 다음 변수명의 첫글자를 대문자로 하는 규칙) 나중에 서블릿 컨테이너가 태그가 호출되었을때 속성값을 전달시 해당 메서드를 사용하기 때문입니다. private String color; private int iterNum; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getIterNum() { return iterNum; } public void setIterNum(int iterNum) { this.iterNum = iterNum; } | cs |
커스텀태그에서 본문을 직접 처리하여 출력할시에는
doStartTag()
메서드의 반환값으로 EVAL_BODY_BUFFERED
를 리턴합니다. @Override public int doStartTag() throws JspException { System.out.println("시작 태그"); return EVAL_BODY_BUFFERED; } | cs |
doAfterBody()
메서드에서 본문을 처리합니다. doAfterBody()
메서드가 실행되는 시점에는 JSP에서 태그 사용시 넘겨주었던 속성값이 멤버변수로 저장되어 있습니다. 또한 상속받은 상위클래스의 bodyContent
라는 멤버변수에 태그 호출시 넘겨주었던 태그 몸체에 대한 내용이 담겨있습니다. @Override public int doAfterBody() throws JspException { System.out.println("바디 처리 완료"); String color = this.getColor(); int iterNum = this.getIterNum(); String body = bodyContent.getString(); JspWriter out = bodyContent.getEnclosingWriter(); try { for(int i=0; i<iterNum; i++) { out.print("<span style=\" background-color: "+ color + "; \">"); out.print("♥" + body + "♥"); out.print("</span>"); } } catch (IOException e) { throw new JspException(e); } return super.doAfterBody(); } | cs |
bodyContent.getEnclosingWriter()
를 통해 출력스트림을 얻어 태그 몸체로 넘겨준 텍스트를 직접 원하는 내용으로 출력할 수 있습니다. 태그 호출시 넘겨준 color
속성값을 span
태그의 배경색으로 사용하고 iterNum
속성값 만큼 반복하고 하트문자를 붙여 출력하고 있습니다. out.print()
메서드가 IOException
을 던지기 때문에 예외처리를 해주어야 합니다. JspWriter out = bodyContent.getEnclosingWriter(); try { for(int i=0; i<iterNum; i++) { out.print("<span style=\" background-color: "+ color + "; \">"); out.print("♥" + body + "♥"); out.print("</span>"); } } catch (IOException e) { throw new JspException(e); } | cs |
태그 설정 정의를 위한 custTag.tld 작성
이번에는
WEB-INF/tld
디렉터리에 tld 파일을 작성합니다. tld 파일은 *.tld
라는 확장자를 가진 파일로 Tag Library Descriptor의 약자입니다. 개발한 태그라이브러리에 쓰이는 속성이나 태그명, 처리방식 등 개발한 태그핸들러 클래스에 대한 설정을 정의합니다.파일명을
custTagBody.tld
로 하여 다음과 같이 작성하도록 합니다.<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd" > <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>myTags2</short-name> <tag> <name>toSpan</name> <tag-class>tag.CustomTagBody</tag-class> <body-content>JSP</body-content> <attribute> <name>color</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>iterNum</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.Integer</type> </attribute> </tag> </taglib> | cs |
<tag>
태그 하위에 <attribute>
태그를 추가하여 태그핸들러의 멤버변수를 속성으로 인식시켜줍니다. tld에서 사용되는 태그들에 대한 설명은 포스팅 상단의 이전글 링크를 참고 부탁드립니다.web.xml에 tld 파일 경로 설정
tld 파일을 통해 태그에 대한 내용을 정의했습니다. 이제 작성한 tld 파일의 위치를 서블릿컨테이너에 인식시켜주어야 합니다. 이 설정은
web.xml
파일에 등록합니다.<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <jsp-config> <taglib> <taglib-uri>http://customTagBody.com</taglib-uri> <taglib-location>/WEB-INF/tld/custTagBody.tld</taglib-location> </taglib> </jsp-config> </web-app> | cs |
테스트 JSP 파일 작성
개발한 태그를 테스트하기 위한
customTagBodyTest.jsp
페이지를 작성합니다.<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="dololak" uri="http://customTagBody.com" %> <html> <head> <title>커스텀 태그 테스트</title> </head> <body> <dololak:toSpan color="blueviolet" iterNum="5"> hello </dololak:toSpan> </body> </html> | cs |
테스트
customTagBodyTest.jsp를 실행하면 다음과 같이 결과가 출력됩니다.
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] JSP 1.2 버전 커스텀 태그 만들기 (0) | 2019.08.29 |
---|---|
[서블릿/JSP] *.tag 태그 파일내부에서 사용한 attribute name과 scope 객체의 attribute name 겹치는 경우 (0) | 2019.08.11 |
[서블릿/JSP] *.tag 태그파일에서 동적 속성 사용하는 방법 (0) | 2019.08.11 |
[서블릿/JSP] *.tag 태그 파일 내부에서 사용한 변수를 호출한 JSP로 넘기기 (0) | 2019.08.10 |
[서블릿/JSP] 태그파일 방식으로 커스텀 태그 만들기 (0) | 2019.08.10 |