티스토리 뷰

JSP

커스텀태그 작성

란텔 2016. 6. 20. 22:49

JSP는 자체적으로 지원하는 JSTL이나 jsp:로 시작하는 액션태그로 표현할 수 없는 기능을 사용하고 싶은 경우 다른 태그를 만들어서 사용할 수 있다. 이와 같이 목적에 맞게 작성한 태그를 '커스텀태그'라고 한다.



이미 알고 있는 JSTL같은 태그들도 커스텀태그에 속한다.



tag파일이라는 것을 이용해서 커스텀 태그를 만들 수 있는데 이 파일에는 다음과 같은 디렉티브(<%@  %>) 태그를 사용 가능하다.


- tag파일에서 사용할 수 있는 디렉티브 목록

tag

태그파일의 정보를 명시한다.

taglib

사용할 태그라이브러리를 지정한다.

include

태그파일에 특정파일을 포함시킬 때 사용한다.

attribute

태그파일이 커스텀태그로 사용될 때 입력 받을 속성을 명시한다.

variable

EL변수로 사용될 변수에 대한 정보를 지정한다.



간단하게 사용해보자면 다음과 같이 작성할 수 있을 것이다.

<%@ tag pageEncoding="utf-8"%>

pageEncoding속성은 말그대로 태그파일의 언어형식을 결정한다.


다음은 tag디렉티브에 선언할 수 있는 속성들이다.(속성을 설정하는 것은 선택사항이다.)

display-name : 태그파일을 도구에서 보여줄 때 사용될 이름 결정(기본 값은 확장자를 제외한 해당 파일의 이름)

body-content : 몸체 내용을 이루는 종류를 결정한다. 값으로 empty, tagdependent, scriptless(기본)

dynamic-attribute : jsp에서 커스텀태그를 사용할 때 속성=값을 담을 Map객체를 생성하면서 이 Map을 사용하기 위한 이름을 명시한다.



dynamic-attribute 속성을 사용하는 방법

test.tag

<!-- 넘어온 동적 속성=값을 담을 Map객체의 이름 정의 (dynaic-attribute)   -->
<%@ tag pageEncoding="utf-8" dynamic-attributes="dynamicObject"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


<!-- items에 동적속성의 이름을 표현식형태로 불러온다  -->
<c:forEach var="haha" items="${dynamicObject}">
    <!-- Map에 저장되어 있는 키와 밸류 확인 -->
    <div>
        <span>${haha.key}</span> <span>${haha.value}</span>
    </div>

</c:forEach>

testTag.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
 
 <%@ taglib tagdir="/WEB-INF/tags/util" prefix="tester" %> 
  
<!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=EUC-KR">
<title>커스텀태스 시범</title>
</head>
<body>


<tester:test sex="male" name="choon" age="31" />


</body>
</html>

test커스텀 태그를 호출하면서 속성과 값을 넘겨주고 있으며, 이 속성=값은 test.tag파일에 설정된 Map객체의 이름인 dynamicObject를 사용하면 키와 값을 tag파일쪽에서 확인 할 수 있다.





attribute디렉티브를 사용하는 방법(<%@ attribute %>)

attribute디렉티브를 이용하면 jsp쪽에서 커스텀태그 사용 시 속성으로 attribute속성의 name과 일치하는 속성을 지정하여 값을 전달하면 tag파일에서 그 값을 받아서 사용할 수 있다.

 

- attribute의 디렉티브는 다음과 같다.

속성

설명

기본값

description

속성의 설명

 

name

속성의 이름. 태그파일 내에서 스크립트 변수나 EL변수의 이름으로 사용한다.

필수로 적어야 하는 값

required

속성의 필수 여부를 지정

false

rtexprvalue

속성값을 표현식으로 사용할 것인지 여부

true

type

속성의 타입을 명시. java.lang.Integer와 같은 래퍼타입을 값으로 한다.

java.lang.String

fragment

jsp측에서 <jsp:attribute>액션태그로 속성값을 전달할 때 이 값을 true로 지정

 




attribute디렉티브를 사용해서 속성값을 전달하고, 전달 받는 방법

test.tag

<!-- jsp 측 -->
<%@ taglib tagdir="/WEB-INF/tags/util" prefix="tester" %> 

<tester:test sex="male" name="choon" age="31" str="안녕하세요!!" />

<!-- tag파일 측 -->
<%@ attribute name="str" %>

<%= str %><br>
${str}

tag파일 측에서 attribute디렉티브를 선언한 후 jsp에서 이 tag파일을 호출하면서 속성으로 str을 넘겨주고 있으며, 다시 tag파일 측에서는 str이라는 name을 가지고 있는 attribute의 값을 출력하고 있다.




Jsp측에서 커스텀태그를 사용하면서 이 커스텀태그의 사이에 위치하는 몸체 텍스트를 tag파일로 전달하는 방법은 2가지가 있다.

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

<!-- tag파일에 몸체 내용을 전달하는 방법 2가지  -->
<tester:test>
    <jsp:attribute name="str">yes</jsp:attribute>
    <jsp:body>jsp:body를 이용해서 이 글을 전달하고 있습니다.</jsp:body> 
</tester:test>

<tester:test str="no" >
    그냥 전달하고 잇습니다.
</tester:test>

하나는 그냥 커스텀캐그 사이에 텍스트를 두고 그냥 보내는 방법이고, 다른 하나는 <jsp:body>태그 사이에 보낼 몸체 텍스트를 보내는 방법이 그것이다.




그렇게 해서 .tag파일 측에서는 아래와 같이 <jsp:doBody>태그를 이용해서 이 몸체를 불러 올 수 있다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ attribute name="str"%>

<c:if test="${str != null and str eq 'yes'}">
    <jsp:doBody />
    <!-- jsp측의 jsp:body를 그대로 출력  -->
</c:if>

<c:if test="${str != null and str eq 'no'}">
    <jsp:doBody var="bodyText" scope="page" /> 
    ${pageScope.bodyText}
    
    <%=jspContext.getAttribute("bodyText")%>

</c:if>

<jsp:doBody />는 그냥 있는 그대로 몸체 텍스트를 출력하며, <jsp:doBody var="bodyText" scope="page" />는 우선 몸체 텍스트를 page영역에 저장하고, EL이나 스크립틀릿을 이용해서 값을 출력한다.


Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday