JSP/Servlet – 커스텀 액션안에 또 다른 커스텀 액션 포함하기
<tool:list>
<tool:item>테스트</tool:item>
</tool:list>
위와 같이 부모 커스텀 액션안에 자식 커스텀 액션이 들어가게 만드려면 두 개의 태그 클래스를 작성해야합니다.
부모 태그 클래스에서는 단순히 JspFragment 객체를 구한다음 invoke 메소드를 호출해주면 됩니다.
하지만 자식 커스텀 액션에서는 먼저 올바른 부모인지 확인하기 위해 다음 메소드를 사용해서 부모 태그 클래스를 가져옵니다.
JspTag parent = getParent()
위와 같이 예제 파일을 구성합니다.
ListTag.java
package tool;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ListTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspFragment body = getJspBody();
body.invoke(null);
return;
}
}
ItemTag.java
package tool;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ItemTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspTag parent = getParent();
if((parent == null) || !(parent instanceof ListTag))//부모가 ListTag가 아니면
throw new JspException("부모가 이상함");
JspContext context = getJspContext();
JspWriter out = context.getOut();
JspFragment body = getJspBody();
//바디의 내용앞에 -를 붙이게 된다.
out.print("-");
body.invoke(null);
out.println("<BR>");
return;
}
}
tools.tld
<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>tool</short-name>
<tag>
<name>list</name>
<tag-class>tool.ListTag</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>item</name>
<tag-class>tool.ItemTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ch10_jsp_tag_child</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>/taglibs/tools.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
TagTest.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@taglib prefix="tool" uri="/taglibs/tools.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=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<tool:list>
<tool:item>테스트1</tool:item>
<tool:item>테스트2</tool:item>
</tool:list>
</body>
</html>
실행 화면
자식 커스텀 액션이 제대로 실행됨을 알 수 있습니다.
부모 커스텀 액션 클래스의 데이터를 자식 커스텀 액션 클래스에서 가져오려면 다음 예제를 보시면 됩니다.
위와 같이 예제를 구성합니다.
NewListTag.java
package tool;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class NewListTag extends SimpleTagSupport{
private char var;
public void setVar(char var){
this.var = var;
}
public char getVar(){
return var;
}
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspFragment body = getJspBody();
body.invoke(null);
return;
}
}
NewItemTag.java
package tool;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class NewItemTag extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
JspTag parent = getParent();
if((parent == null) || !(parent instanceof NewListTag))
throw new JspException("부모가 이상함");
JspContext context = getJspContext();
JspWriter out = context.getOut();
JspFragment body = getJspBody();
char var = ((NewListTag)parent).getVar();//형변환을 통해서 부모클래스의 메소드 사용
out.print(var);
body.invoke(null);
out.println("<BR>");
return;
}
}
tools.tld
<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>tool</short-name>
<tag>
<name>newlist</name>
<tag-class>tool.NewListTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>var</name>
<type>java.lang.Character</type>
</attribute>
</tag>
<tag>
<name>newitem</name>
<tag-class>tool.NewItemTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
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_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ch10_jsp_tag_child2</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>/taglibs/tools.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
TagTest.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@taglib prefix="tool" uri="/taglibs/tools.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=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<tool:newlist var="!">
<tool:newitem>테스트1</tool:newitem>
<tool:newitem>테스트2</tool:newitem>
</tool:newlist>
</body>
</html>
실행 화면
부모 태그 클래스의 데이터가 자식 태그 클래스에서 가져온 것을 볼 수 있습니다.
'프로그래밍 > JSP Servlet' 카테고리의 다른 글
JSP/Servlet – 요청 래퍼 클래스 작성하기 (0) | 2016.03.21 |
---|---|
JSP/Servlet – 필터 체인의 방향 바꾸기 (0) | 2016.03.17 |
JSP/Servlet - 필터 클래스의 init 메소드와 destroy 메소드 활용 (0) | 2016.03.16 |
JSP/Servlet – 필터(Filter)의 이해 (0) | 2016.03.14 |
JSP/Servlet – 태그 클래스를 이용해서 변수 지원 커스텀 액션 만들기 (0) | 2016.03.01 |
JSP/Servlet – 태그 클래스를 이용해서 커스텀 액션의 본체 내용을 바꿔보자 (0) | 2016.03.01 |
JSP/Servlet - 태그 클래스를 이용한 본체가 있는 커스텀 액션 만들기 (0) | 2016.02.29 |
JSP/Servlet – 동적 애트리뷰트를 지원하는 태그 클래스 만들기 (0) | 2016.02.23 |