티스토리 뷰
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이나 스크립틀릿을 이용해서 값을 출력한다.
'JSP' 카테고리의 다른 글
JSP로 웹어플리케이션 이벤트(웹어플리케이션 실행시,종료시 작업) 처리 (0) | 2014.04.27 |
---|---|
서버단에서 한글 파라미터가 깨질 때 (0) | 2014.04.16 |
글쓰기 form 네이버 오픈소스 스마트 에디터 적용 (0) | 2013.12.14 |
EUC-KR캐릭터 형식을 사용하였을 때 response객체로 리다이렉트시 한글 경고창 물음표뜨는 문제 해결방법 (0) | 2013.12.06 |
웹서버? 웹어플리케이션서버? 웹컨테이너? (0) | 2013.11.03 |