四、案例
1.模拟c标签中if标签
编写助手类
package c; import javax.servlet.jsp.tagext.BodyTagSupport; /**自定义标签继承BodyTagSupport 作用:用于jsp页面进行if判断 * @author Java方文山 * */ public class IfTag extends BodyTagSupport{ private boolean test;//if标签的比较值属性 public void setTest(boolean test) { this.test = test; } //重写doStartTag方法 @Override public int doStartTag() { //判断传进来的的值是不是true if(this.test) { //是true输出主体内容 return EVAL_BODY_INCLUDE; } //是false跳过主体内容 return SKIP_BODY; } }
编写tld文件
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <uri>/xw</uri> <tag> <!-- 标签名 --> <name>if</name> <!-- 标签助手类 --> <tag-class>c.IfTag</tag-class> <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --> <body-content>jsp</body-content> <attribute> <!-- 属性名, OutTag类中的val属性相匹配 --> <name>test</name> <!-- 表示该属性是否为必要的属性 --> <required>true</required> <!-- 该属性是否可以接受EL表示式的值 --> <rtexprvalue>true</rtexprvalue> <!-- 标签描述,用于说明标签的作用 --> <description>if标签test属性,用于比较该属性的内容是否一致,如果一致则输出主体内容,不一致不输出</description> </attribute> </tag> </taglib>
页面引入标签
<%@page import="c.TestForeach"%> <%@page import="c.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="xw" uri="/xw" %> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>自定义标签</title> </head> <body> <!--自定义out标签输出 --> <xw:out val="你好我是自定义标签out,val属性输出"/> <br> <!--自定义out标签EL表达式使用 --> <% request.setAttribute("name", "我是在作用域的文件,利用EL表达式获取"); %> <xw:out val="${name }"/> <br> <!--自定义out标签defaultVal属性输出 --> <% request.setAttribute("x", null); %> <xw:out val="${x}" defaultVal="我是out标签的默认值输出1"/> <xw:out val="" defaultVal="我是out标签的默认值输出2"/> <br> <hr> <!-------------------------------------------------------------------------------------> <!--自定义if标签 --> <xw:if test="${1==1 }"> if判断成立,主体内容输出 </xw:if> <xw:if test="${1==2 }"> if判断成立,主体内容输出 </xw:if> <hr> </body> </html> </body> </html>
浏览器显示结果
2.模拟c标签中的foreach标签
编写助手类
package c; import java.util.Iterator; import java.util.List; import java.util.Objects; import javax.servlet.jsp.tagext.BodyTagSupport; /** * 自定义标签继承BodyTagSupport 作用:用于jsp页面进行对集合进行遍历输出 * * @author Java方文山 * */ public class ForeachTag extends BodyTagSupport { private List<Object> items;// 存放数据源 private String var;// 利用El表达式取出该对象的属性,域对象保存数据源的值 public void setItems(List<Object> items) { this.items = items; } public void setVar(String var) { this.var = var; } //重写doStartTag方法 @Override public int doStartTag() { //判断数据源是否有数据 if(this.items.size()==0 ||Objects.isNull(this.items)) { //数据源为空跳过主体 return SKIP_BODY; } //将数据源转换为迭代器 Iterator<Object> iterator = this.items.iterator(); //将数据源中的下一个返回 Object next = iterator.next(); //将刚刚拿到的值赋值给pageContext域对象并取值为var this.pageContext.setAttribute(var, next); //将迭代器也存入域对象并继续计算主体 this.pageContext.setAttribute("iterator", iterator); //计算主体内容然后输出 return EVAL_BODY_INCLUDE; } //重写doAfterBody方法,对数据源的数据进行迭代读取处理 @Override public int doAfterBody() { //拿到域对象保存的迭代器 Iterator<Object> ite = (Iterator<Object>) this.pageContext.getAttribute("iterator"); //判断迭代器对象的下一个有没有值 if(ite.hasNext()) { //有值,继续放入pageContext域对象并取值为var this.pageContext.setAttribute("var", ite.next()); //再次计算主体 return EVAL_BODY_AGAIN; } //迭代器下一个没有值直接跳过主体 return SKIP_BODY; } }
编写tld文件
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <!-- 标签库描述符 --> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor"> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Simple Tags</short-name> <uri>/xw</uri> <tag> <!-- 标签名 --> <name>foreach</name> <!-- 标签助手类 --> <tag-class>c.ForeachTag</tag-class> <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 --> <body-content>jsp</body-content> <attribute> <!-- 属性名, OutTag类中的val属性相匹配 --> <name>items</name> <!-- 表示该属性是否为必要的属性 --> <required>true</required> <!-- 该属性是否可以接受EL表示式的值 --> <rtexprvalue>true</rtexprvalue> <!-- 标签描述,用于说明标签的作用 --> <description>foreach标签items属性,用于保存数据源</description> </attribute> <attribute> <!-- 属性名, OutTag类中的val属性相匹配 --> <name>var</name> <!-- 表示该属性是否为必要的属性 --> <required>true</required> <!-- 该属性是否可以接受EL表示式的值 --> <rtexprvalue>true</rtexprvalue> <!-- 标签描述,用于说明标签的作用 --> <description>foreach标签var属性,用于保存数据源的值,以便于el表达式获取内容</description> </attribute> </tag> </taglib>
编写模拟实体类和初始化数据类
package c; /** * 用于测试自定义标签foreach * * @author Java方文山 * */ public class Student { private int sid; private String sname; public Student() { // TODO Auto-generated constructor stub } public Student(int sid, String sname) { super(); this.sid = sid; this.sname = sname; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } }
package c; import java.util.ArrayList; import java.util.List; /** * 初始化Student数据 * * @author Java方文山 * */ public class TestForeach { public static List<Student> AddStudent() { List<Student> list = new ArrayList<Student>(); Student s1 = new Student(1, "xw"); Student s2 = new Student(2, "wh"); Student s3 = new Student(3, "sb"); list.add(s1); list.add(s2); list.add(s3); return list; } }
页面引用标签
<%@page import="c.TestForeach"%> <%@page import="c.Student"%> <%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="xw" uri="/xw" %> <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>自定义标签</title> </head> <body> <!--自定义out标签输出 --> <xw:out val="你好我是自定义标签out,val属性输出"/> <br> <!--自定义out标签EL表达式使用 --> <% request.setAttribute("name", "我是在作用域的文件,利用EL表达式获取"); %> <xw:out val="${name }"/> <br> <!--自定义out标签defaultVal属性输出 --> <% request.setAttribute("x", null); %> <xw:out val="${x}" defaultVal="我是out标签的默认值输出1"/> <xw:out val="" defaultVal="我是out标签的默认值输出2"/> <br> <hr> <!-------------------------------------------------------------------------------------> <!--自定义if标签 --> <xw:if test="${1==1 }"> if判断成立,主体内容输出 </xw:if> <xw:if test="${1==2 }"> if判断成立,主体内容输出 </xw:if> <hr> <!-------------------------------------------------------------------------------------> <!--自定义foreach标签 --> <% //测试数据 List<Student> stu=TestForeach.AddStudent(); //将数据保存在request对象中 request.setAttribute("stu", stu); %> <xw:foreach items="${stu }" var="stu"> <xw:out val="${stu.sid }"/> <xw:out val="${stu.sname }"/> </xw:foreach> </body> </html> </body> </html>
浏览器显示结果
至此这篇自定义标签就讲解到这里,如果有不足之处欢迎评论区留言讨论!!