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>
运行结果:
查看页面源码: