..열심히 공부하세../MVC

[03] 커스텀태그

댄스댄스 2012. 6. 19. 14:24

[ 자바 커스텀태그]
- 커스텀태그란 자신이 직접 정의할 수 있는 태그를 의미한다
- 일반적으로 태그들은 모두 각각의 기능이 있지만 그 기능들로는 자신이 원하는 내용을 구현하지 못할수 있다
- 현재 존재하는 태그 외에도 새로운 태그를 만들어내어 자신만이 원하는 기능을 구현할 수 있다
- 커스텀태그는 라이브러리 형태로 만들어두고 필요할 때마다 가져다가 쓰는것이 일반적이다.
- 커스텀태그를 만들어서 프로그래밍을 하면 개발 속도는 빨라지고 효율적으로 개발할 수 있다.
- 바디가 없는 태그 <  />
- 바디가 있는 태그 < >  </ >
- 커스텀태그는 바디가 있는 태그를 사용자가 임의적으로 만들어서 쓰는 태그

 

* 커스텀태그 사용의 장점
- 자신이 직접 원하는 기능을 구현하여 작성할 수 있는 태그이기 때문에
  일반 태그로 구현하지 못했던 한계점을 극복할 수 있다.
- 작성한 커스텀태그를 라이브러리로 작성해 둔다면 다음 개발 할때에
  가져다 사용하기 매우 편리한 프로그래밍 기능이다.
- 직접 작성한 태그이므로 가독성이 높고 유지보수가 쉽다
- 반복적인 기능을 쉽게 구현할 수 있으므로 코딩 시간이 짧아질수 있다

 

* 커스텀 태그의 구조 및 작동원리
- 커스텀태그가 작동하기 위해서는 실제로 커스텀 태그의 기능을 하는
  클래스파일이 존재해야 한다. 이 클래스 파일을 태그 핸들러 한다.
- 태그 핸들러가 존재한다면 그 다음으로는 태그 핸들러에 대한
  TLD파일이 존재해야 한다.
- TLD파일 : 태그핸들러의 기능을 JSP페이지에서 태그로 사용할 수 있게
  만들어 주는 기능이다
- 작성한 커스텀태그를 JSP페이지에서 태그 라이브러리로 등록하여 사용한다

 

[사용자 정의 태그 사용하기]
- 커스텀 태그를 사용하려면 javax.servlet.jsp.tagext패키지 필요
  tomcat\lib\jsp-api.jar 복사
 C:\Program Files\Java\jdk1.6.0_29\lib 붙여넣기
 내컴퓨터->속성->고급->환경변수
 CLASSPATH  .;C:\Program Files\Java\jdk1.6.0_29\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_29\lib\servlet-api.jar;C:\Program Files\Java\jdk1.6.0_29\lib\jsp-api.jar
 JAVA_HOME  C:\Program Files\Java\jdk1.6.0_29

 

- 작성순서
  1) 자바 클래스 파일 .class
     커스텀 태그 정의 (구조,로직)
  2) TLD파일 .tld
     자바클래스 파일을 태그로 사용할 수 있도록 등록
  3) web.xml
     JSP페이지에서 사용할 수 있도록 TLD파일 등록
  4) JSP페이지 .jsp
     커스텀 태그 사용

- 커스텀태그를 정의하고 처리하는 태그핸들러
  . 태그 핸들러를 만들기 위한 클래스
    TagSupport          body 내용을 처리하지 않는 경우
    BodyTagSupport   body 내용을 처리하는 경우

  . body의 유무 구분
    body가 없는 경우  <tag:welcome/>
    body가 있는 경우  <tag:welcome>홍길동</tag:welcome>

 


예제1) body가 없는 경우=================================

 

WelcomeTag.java-----------------------
package part.custom;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class WelcomeTag extends TagSupport {
    public int doStartTag() throws JspException {
        try {
            pageContext.getOut().print("Welcome to My Custom Tag");
        } catch (Exception ex) {
            throw new JspTagException("WelcomeTag: " + ex.getMessage());
        }
        return SKIP_BODY;
    }
}

 

doStartTag() 시작태그를 만날때 실행 <tag:welcome부분을 만나면 자동실행
pageContext.getOut() out객체 리턴
SKIP_BODY body가 없음을 알리며 태그명 뒤에 />처리를 한다.


/WEB-INF/tlds/welcomeTag.tld------------------------
<?xml version="1.0" encoding="euc-kr" ?>

<taglib
   xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
     http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
     version="2.0"
>
      
    <description>JSP1.2 커스텀 태그 예제</description>
    <display-name>간단한 JSP1.2 커스텀 태그 예제</display-name>
    <tlib-version>1.0</tlib-version>
    <short-name>welcomeTag</short-name>

  <tag>
 <name>welcome</name>
 <tag-class>part.custom.WelcomeTag</tag-class>
 <body-content>empty</body-content>
  </tag>
</taglib>

<body-content>empty</body-content>
커스텀 태그의 body가 존재하지 않을 경우 empty로 입력해야함. 필수요소


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"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
              
  <display-name>mvc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <jsp-config>
    <taglib>
        <taglib-uri>mycomputeadd</taglib-uri>
        <taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location>
    </taglib>

    <taglib>
        <taglib-uri>/WEB-INF/tlds/welcomeTag.tld</taglib-uri>
        <taglib-location>/WEB-INF/tlds/welcomeTag.tld</taglib-location>
    </taglib>
  </jsp-config> 
 
</web-app>

 

custom/WelcomeTag.jsp-----------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="tag" uri="/WEB-INF/tlds/welcomeTag.tld" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>JSP1.2의 커스텀태그 작성 1</h3>
<font color="red">
<tag:welcome/>
</font>
</body>
</html>

=========================================


예제2) body가 있는 경우

 

WelcomeBodyTag.java------------------------------------------
package part.custom;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class WelcomeBodyTag extends TagSupport {
   
    public int doStartTag() throws JspException {
        try {
            pageContext.getOut().print("환영합니다 <b>");
        } catch (Exception ex) {
            throw new JspTagException("WelcomeBodyTag: " + ex.getMessage());
        }
        return EVAL_BODY_INCLUDE;
    }
}

EVAL_BODY_INCLUDE body부분이 그대로 출력되기를 원할때

 

welcomeTag.tld-------------------------------------------------
  <tag>
 <name>welcomeBody</name>
 <tag-class>part.custom.WelcomeBodyTag</tag-class>
 <body-content>JSP</body-content>
  </tag>

커스텀태그의 body가 존재할 경우 JSP로 입력. 필수 요소

 

welcomeBodyTag.jsp-------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="tag" uri="/WEB-INF/tlds/welcomeTag.tld" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>JSP1.2의 커스텀태그 작성 2-body있는 태그</h3>
<font color="blue">
<tag:welcomeBody>홍길동</tag:welcomeBody>
</font>
</body>
</html>