프로그래밍/JSP Servlet

JSP/Servlet – 커스텀 액션안에 또 다른 커스텀 액션 포함하기

가카리 2016. 3. 6. 22:06
반응형

 

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>

 

 

실행 화면

부모 태그 클래스의 데이터가 자식 태그 클래스에서 가져온 것을 볼 수 있습니다.

 

반응형