自定义标签的详细使用讲解【上】(二)

简介: 自定义标签的详细使用讲解【上】(二)

四、案例

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>

浏览器显示结果

至此这篇自定义标签就讲解到这里,如果有不足之处欢迎评论区留言讨论!!

9b68a312061748109259de7e63142774.gif




相关文章
|
19天前
|
Python
模板标签if
【2月更文挑战第21天】模板(Template)标签if。
21 2
|
7月前
|
Java
自定义标签(下)
自定义标签(下)
|
6月前
标签模板
标签模板
61 0
|
8月前
|
XML Java 数据格式
自定义标签
自定义标签
|
8月前
|
Java 程序员 开发者
自定义标签-下
自定义标签-下
22 0
|
9月前
|
Java 数据库
自定义标签的详细使用讲解【下】
自定义标签的详细使用讲解【下】
20 0
|
9月前
|
XML 设计模式 Java
自定义标签的详细使用讲解【上】(一)
自定义标签的详细使用讲解【上】
73 0
自定义标签属性
自定义标签属性
45 0
14. 表单标签及其应用实例
14. 表单标签及其应用实例
67 0
14. 表单标签及其应用实例
|
XML Java 应用服务中间件
自定义标签 | 学习笔记
快速学习自定义标签