實現嵌套的自定義標簽


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>

運行結果:

查看頁面源碼:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM