[태그 핸들러클래스 기반의 커스텀태그] 는 .tld + TagHandler.java 가 한세트임
태그 핸들러클래스 ( .java )
+
태그라이브러리 기술자 ( .tld 파일 ) 디스트럭터
→ tld 파일 만드는 방법
1. WEB-INF 폴더에 tld 폴더 생성 == WEB-INF / tld
2. tld 폴더 우클릭 후 new → other → xml 검색 후 선택 ( xml = 설정과 관련 된 파일 )
3. xml 파일 안에 tld가 있는 것임 그러니,
xml 파일 생성할 당시 확장자명을 .tld로 바꾼 후
Finish가 아닌 Next 를 선택
4. 기본적으로 template 파일로 생성에 체크되어있지만, DTD or XML Schema file로 만들기 선택후 Next
5. Workspace 혹은 기본적으로 XML에 지정되어있는 형식을 불러올 수 있는데 ,
XML tatalog entry 체크 후 java.sun.com /... j2ee / web-jsptaglibary 를 선택 후 Next
6. 기본적으로 j2ee로 Prefix 되어있는데, 우리는 태그명 또한 바꿀 것이기 때문에 j2ee를 클릭 후 edit을 눌러 값을 지워줌
j2ee가 지워지고 <no prefix>로 변경되었으면 Finish로 추가하면 끝
사용예제 1 ) 단순출력
위에서 언급했듯 .java와 .tld는 한쌍임을 기억!
.java 코드
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
// 핸들러 클래스를 만들고 싶다
// "핸들러" 클래스가 어딘가에 존재한다고 함!
// "상속"
public class MsgTagHandler extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
// 시작태그를 만나면 자동으로 호출되어 수행되는 메서드
JspWriter out=getJspContext().getOut(); // 현재 이 파일은 서블릿이 아니고 .java 파일이기 때문에 out.을 쓰기 위해
out.println("핸들러클래스 기반으로 출력하는 메세지");
}
}
핸들러 클래스를 사용하기 위해 SimpeTagSupport를 상속함
doTag 메서드는 태그를 시작할 당시 자동으로 호출되어 수행됨
Java에서 Jsp 문구를 사용하기 위해 JspWriter out = getJspContext().getOut(); 를 선언
MsgTag.tld 코드
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xml="http://www.w3.org/XML/1998/namespace" 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 ">
<tlib-version>0.0</tlib-version>
<short-name>MsgTag</short-name> <!-- 파일에 대한 간략한 설명 -->
<tag>
<name>msg</name>
<tag-class>test.MsgTagHandler</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
위에 생성법대로 했다면 링크같은 것들이 자동으로 import 되어있을 것임.
<name> 태그명 </name> 에 태그명을 정의해주고,
<tag-class>핸들러.java</tag-class> 에 java 파일 경로.파일명 을 써주고
<body-content> </body-content> 에 바디에 들어갈 내용을 적어주면 되는데 아무것도 적어주지 않을거면 비어있다는 뜻인
empty를 적어주면 됨
mytag.jsp 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/MsgTag.tld" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1><mytag:msg/></h1>
</body>
</html>
.jsp 파일에서는 핸들러기반이기 때문에 <%@ taglib uri="경로" 를 써주고, prefix="재정의할 태그명" %> 을 작성
<prefix에 적은이름 : 사용할 태그명 /> 을 호출하여 쓰면 된다. 즉
<mytag : msg/> 을 적으면 tld 파일에 <name> msg </name> 이라는 이름을 가진 태그를 사용하는 것이다.
수행결과
사용예제 2 ) 핸들러 클래스기반의 태그 또한 속성을 다음과 같은 방법으로 재정의 할 수 있다.
우선 Test.java 코드를 다음과 같이 작성하고
package test;
public class Test {
private String[] datas= {"appple","banana","kiwi"};
private int num1=10; // 값을 이미 넣었기 때문에 세터 안할것임!
private int num2=20;
public String[] getDatas() {
return datas;
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
}
핸들러를 사용하기 위한 TestTagHandler.java 코드를 작성
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class TestTagHandler extends SimpleTagSupport {
// 태그 속성을 저장하기 위한 멤버변수
private String border;
private String bgcolor;
@Override
public void doTag() throws JspException, IOException {
JspWriter out=getJspContext().getOut();
JspFragment body=getJspBody();
// == getJspBody(); // 서포트에 내장 , 외부에 작성한 바디에 값을 받아온다
// <jsp:doBody />
if(body!=null) {
out.println("<h1>");
body.invoke(null);
out.println("</h1>");
}
out.println("<table border="+border+" bgcolor="+bgcolor+">");
for(String v: new Test().getDatas()) {
out.println("<tr><td>"+v+"</td></tr>");
}
out.println("</table>");
}
public String getBorder() {
return border;
}
public void setBorder(String border) {
this.border = border;
}
public String getBgcolor() {
return bgcolor;
}
public void setBgcolor(String bgcolor) {
this.bgcolor = bgcolor;
}
}
- 태그의 속성을 저장하기 위한 멤버변수 선언
private String border;
private String bgcolor;
doTag() 메서드를 오버라이딩하여
- java 코드에서 jsp메서드를 사용하기 위해 JspWriter out=getJspContext().getOut(); 선언
- 태그를 호출 할 당시 body에 적은 내용을 가져오기 위한 JspFragment body=getJspBody(); 선언
- Test.Java의 생성자를 사용하기 위해 for each문 안에 new Test()로 객체생성하고 .getDatas()를 사용하여 datas를 가져옴
→ for(String v: new Test().getDatas()) {
- private 되어있으니 , getter / setter 를 추가해줌
TestTag.tld 코드
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xml="http://www.w3.org/XML/1998/namespace" 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 ">
<tlib-version>0.0</tlib-version>
<short-name>NMTOKEN</short-name>
<tag>
<name>test</name>
<tag-class>test.TestTagHandler</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>border</name>
<required>true</required>
</attribute>
<attribute>
<name>bgcolor</name>
<required>true</required>
</attribute>
</tag>
</taglib>
위와 비슷하지만 <attribute> 가 추가 된 것을 볼 수 있는데, 속성을 정의해주기 위해 사용된다.
<attribute> 안에 <name>에 재정의 할 멤버변수명들을 적어주고, <required>true</required> 를 사용해,
태그가 호출 될 당시 강제성을 부여해줌
Mytag.jsp 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/TestTag.tld" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<mytag:test bgcolor="lightblue" border="1">목록</mytag:test>
</body>
</html>
.tld 코드에 requird 속성을 걸어놓아서 자동완성 될 당시 bgcolor=" " border=" " 값이 자동으로 추가 됨
수행결과
'개발자노트 > 웹' 카테고리의 다른 글
[리스너 클래스] + 커스텀태그 set / set target (0) | 2022.08.16 |
---|---|
[ 리스너 클래스 ] (0) | 2022.08.16 |
HTML - JSP - 커스텀태그 사용 (0) | 2022.08.12 |
HTML - JSP - 커스텀 태그 종류와 기본설명 (0) | 2022.08.12 |
HTML - JSP - EL 표현식 사용예제 (0) | 2022.08.12 |