본문 바로가기

JAVA/JSP

JSP - 사용자 정의 태그 (커스텀 태그) 정의 및 만드는 방법

반응형

** 사용자 정의 태그 (커스텀 태그)

 : 전통적인 jsp는 사용자가 어떤 서비스를 원하는지 파악하고, 사용자의 요청에 따른 기능을 수행하고 또 사용자에게 보여줄

html을 생성하는 모든 역할을 수행하였다. 그러나 점점 사용자의 요구가 복잡해 지고, 또 수정에 대한 요구가 빈번해 짐에 따라 더이상 하나의 jsp만으로는 웹프로그래밍 하기에는 무리가 있다.

따라서 사용자 요청을 파악하는 것은 controller가 그에 따른 일 처리는 model이 jsp은 view의 역할만 수행하도록 MVC패턴을 적용하는 것이 일반적이다.


이것을 해결하기 위해 자바문법(반복 수행하도록) 태그를 만들어 사용한다.

(원래 html이 갖고 있는 태그가 아니라 특정 기능을 수행하도록 새로 만들어진 태그를 말한다)

==> 이것을 '사용자 정의 태그(커스텀 태그)' 라 한다.


** 태그라고 하는 것은 

어떤 태그는 태그 몸통이 있는 태그가 있고, 몸통이 없는 태그도 있다.

<h2> 안녕 </h2> ==> 몸통이 있는 태그

<hr> ==> 몸통이 없는 태그


또, 어떤 태그는 속성이 있을 수 있고 속성이 없을 수도 있다.

<img src=""> ==> 속성 있는 태그

<table></table> ==> 속성이 있어도 없어도 되는 태그



** 커스텀 태그 만드는 방법

1) tag파일 기반으로 만들기

: 기능이 간단하고, 내부용으로 사용할 때 적합


실습

 : 파일명이 태그이름이 된다

 파일 - new - other - web - jsp tag - print.tag


tag파일의 작성은 jsp의 작성과 동일

필요하다면 jstl 쓸수도 있다.


tag 파일의 위치는 WEB-INF 밑에 폴더 하나 생성하여 둔다

예) WEB-INF/tags


이렇게 작성한 사용자 정의 태그(print)를 사용하는 jsp를 작성해보기

<%@ taglib prefix="hanb" tagdir="/WEB-INF/tags" %>


실습

 : 몸통이 있고, 속성이 있는 태그를 실습

구매율이 높은 상품 5개를 출력하는 태그를 정의하기

테이블 형태로 출력

<hanb:goodsList color="red">상품 목록</hanb:goodsList>


//태그 파일

태그파일에서 속성 받아오려면

<%@attribute name="속성명" %>

<%@attribute name="color" %>


속성을 사용하려면

${속성명}


<h2><jsp:doBody/></h2>

<table borderColor=${color>

</table>


2) 클래스 기반으로 만들기

: 기능이 복잡하고, 외부용으로 사용할 때 적합


==> SimpleTagSupport를 상속받아 클래스를 정의한다.


맨처음 실습했던

우리회사이름을 출력하는 사용자의 정의 태그를 클래스 기반으로 만든다.


public class HanbTag extends SimpleTagSupport {


}


doTag를 재정의 하여 그안에 해야할 일을 기술한다.


브라우저에 출력을 위해서는 다음을 이용한다.

JspWriter out = getJspContext().getOut();


만들어진 HanbTag를 어떤 tag이름을 사용할것인지 설정파일을 만든다.

(tld)


** tld 폴더 만드는방법

WEB-INF/tlds 폴더에

파일 - new - xml - 파일명 : a.tld (끝나는건 .tld) - (두번째꺼) Create XML file from an XML schema file - 

select XML Catalog entry - http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd 택 -

javaee 누른 후 edit 누른 다음 Prefic 를 지운다 - 그러면 <no prefix> 라고 뜸 - 


만들어진 파일안에

<tlib-version>token</tlib-version> -> <tlib-version>1.0</tlib-version> 변경

<short-name> 밑에다가

<tag>

<name></name>

<tag-class></tag-class>

<body-content></body-content>

</tag>

이 세개가 꼭있어야함

예)

<tag>

<name>my</name> // 태그 이름 정하는것

<tag-class>com.hanb.tag.HanbTag</tag-class> // 태그가 수행할 클래스명(경로지정)

<body-content>empty</body-content> // 태그가 body가 있는지 여부를 설정

//태그가 바디가 없으면 empty, 있으면 scriptless

</tag>


결과를 확인하는 jsp를 작성한다.


태그기반 파일일 때의 지시자는 tagdir="";

클래스기반 파일일 때의 지시자는 uri="tld가 있는 경로";


<%@ taglib prefix="my" uri="/WEB-INF/tlds/my.tld" %>


실습

 : 클래스기반에서 몸통이 있고, 속성이 있는 사용자정의 태그를 실습해보자

<my:print2 color="green" size="7">최진수</my:print2>


다음과 같이 태그클래스를 정의한다.

public class HanbTag2 extends SimpleTagSupport{

private String color;

private String size;


//setter

//getter

}


받을 속성명을 멤버변수로 둔다.

setter getter를 정의한다.


태그의 바디를 받아오기 위하여

getJspBody()를 이용한다.


==> tld 파일을 작성한다.

<tag>

<name>print2</name>

<tag-class>com.hanb.tag.HanbTag2</tag-class>

<body-content>scriptless</body-content>

<attribute>

<name>color</name>

<required>true</required>

</attribute>

</tag>


** 하위노드들의 순서를 지켜야 함

반응형