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>
運行結果:
查看頁面源碼: