이전글



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.xmltld파일의 경로를 설정해주어 서블릿컨테이너가 개발한 커스텀태그를 인식하도록 합니다.
  • 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


먼저 속성으로 사용할 변수를 태그 핸들러의 멤버변수로 선언하고 gettersetterJava 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를 실행하면 다음과 같이 결과가 출력됩니다.





블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!