实现嵌套的自定义标签

1.使用简单标记处理器实现一个嵌套的自定义标签,模拟HTML中的<table>标签

<t:table var="item" items="${users}">
    <t:showUserInfo user="${item}"/>
</t:table>

父标签的items属性接受一个List参数,用来存放对象的集合,子标签使用父标签的var属性,依次输出List中集合的对象。

2.先建立实体类UserInfo

public class UserInfo {
    private String userName;
    private int age;
    private String email;

    public UserInfo(String userName,int age, String email) {
        this.age = age;
        this.email = email;
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3.建立外层标签处理类TableTag

public class TableTag extends SimpleTagSupport{
    private List items;
    private String var;
    public void doTag() throws JspException,IOException{
        JspWriter out = getJspContext().getOut();
        out.println("<table>");
        for(Object item: items){
            out.println("<tr>");
            getJspContext().setAttribute(var,item);
            getJspBody().invoke(null);
            out.println("</tr>");
        }
        out.println("</table>");
    }

    public String getVar() {
        return var;
    }

    public void setVar(String var) {
        this.var = var;
    }

    public void setItems(List items) {
        this.items = items;
    }
    public List getItems(){
        return this.items;
    }
}

外层标签有两个属性:var和items,需要设置他们对应的bean方法,在doTag()的for循环中,每次循环都设置var值为items中的下一项,然后通过调用体调用子标签。

4.建立内层标签处理类UserInfoTag

public class UserInfoTag extends SimpleTagSupport{
    private UserInfo user;
    public void doTag()throws JspException,IOException{
        String content = "<td>"+user.getUserName()+"</td>";
        content +="<td>"+user.getAge()+"</td>";
        content +="<td>"+user.getEmail()+"</td>";
        getJspContext().getOut().println(content);
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }

    public UserInfo getUser(){
        return this.user;
    }
}

5.在TLD中配置嵌套标签

    <tlib-version>1.0</tlib-version>
    <short-name>myshortname</short-name>
    <uri>http://tabletags.juaner.com</uri>
    <tag>
        <name>table</name>
        <tag-class>com.juaner.web.ch12.TableTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>var</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    <tag>
        <name>showUserInfo</name>
        <tag-class>com.juaner.web.ch12.UserInfoTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>user</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

6.测试标签嵌套的运行效果

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.List" %>
<%@ page import="com.juaner.web.ch12.UserInfo" %>
<%@ page import="java.util.ArrayList" %>
<%@taglib prefix="t" uri="http://tabletags.juaner.com" %>
<html>
<body>
<%
    List<UserInfo> users = new ArrayList<UserInfo>();
    users.add(new UserInfo("张三",20,"zhangsan@163.com"));
    users.add(new UserInfo("李四",20,"lisi@163.com"));
    users.add(new UserInfo("王五",20,"wangwu@163.com"));
    pageContext.setAttribute("users",users);
%>
<t:table var="item" items="${users}">
    <t:showUserInfo user="${item}"/>
</t:table>
</body>
</html>

运行结果:

查看页面源码:

原文地址:https://www.cnblogs.com/juaner767/p/5513233.html