当前位置: 首页 > news >正文

JSP2.0自定义标签

---| SimpleTag 接口

定义了标签处理类的生命周期方法。doTag()

-----| SimpleTagSupport 类

全部实现了SimpleTag接口的方法,因此后面我们只需要继承并重写该类即可。

实现自己的if….else标签

目标:

 1    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 2 
 3    <c:choose>
 4 
 5      <c:when test="<%= 12>1 %>">
 6 
 7             大于
 8 
 9      </c:when>
10 
11      <c:otherwise>
12 
13             小于
14 
15      </c:otherwise>
16 
17    </c:choose>

分析:

1. ChooseTag.java,必须定义一个标记字段属性

 1 public class ChooseTag extends SimpleTagSupport {
 2     private boolean tag = true;
 3     public boolean isTag() {
 4         return tag;
 5     }
 6     public void setTag(boolean tag) {
 7         this.tag = tag;
 8     }
 9     // 遇到标签自动执行
10     public void doTag() throws JspException, IOException {
11         // 获取标签体对象
12         JspFragment body = this.getJspBody();
13         // 执行标签体
14         body.invoke(null);
15         super.doTag();
16     }
17 }

2. WhenTag.java

 1 public class WhenTag extends SimpleTagSupport {
 2     private boolean test;
 3     public boolean isTest() {
 4         return test;
 5     }
 6     public void setTest(boolean test) {
 7         this.test = test;
 8     }
 9     // 遇到标签自动执行
10     public void doTag() throws JspException, IOException {
11         // 获取父元素
12         ChooseTag choose = (ChooseTag)this.getParent();
13         // 获取父元素的标记变量值
14         boolean parent = choose.isTag();
15         // 判断
16         if( parent && this.isTest() ){
17             // 设置父元素的标记变量
18             choose.setTag(false);
19             // 执行标签体
20             JspFragment body = this.getJspBody();
21             body.invoke(null);
22         }
23         super.doTag();
24     }
25 }

3. Otherwise.java

 1 public class OtherwiseTag extends SimpleTagSupport {
 2     
 3     // 遇到标签自动执行
 4     public void doTag() throws JspException, IOException {
 5         // 获取父元素
 6         ChooseTag choose = (ChooseTag)this.getParent();
 7         // 获取父元素的标记变量值
 8         boolean parent = choose.isTag();
 9         // 判断
10         if(parent){
11             // 执行标签体
12             JspFragment body = this.getJspBody();
13             body.invoke(null);
14         }
15         super.doTag();
16     }
17 }

4. 描述文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <taglib 
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
 6     version="2.1">
 7   <!-- 2. 编写标签库描述文件 -->  
 8   <tlib-version>1.0</tlib-version>
 9   <short-name>jnb</short-name>
10    <tag>  
11     <name>choose</name>
12     <tag-class>cn.itcast.tags.ChooseTag</tag-class>
13     <body-content>scriptless</body-content>     JSP2.0方式
14   </tag>
15   <tag>  
16     <name>when</name>
17     <tag-class>cn.itcast.tags.WhenTag</tag-class>
18     <body-content>scriptless</body-content>
19     <attribute>
20         <name>test</name>
21         <required>true</required>
22         <rtexprvalue>true</rtexprvalue>
23     </attribute>
24   </tag>
25    
26    <tag>  
27     <name>otherwise</name>
28     <tag-class>cn.itcast.tags.OtherwiseTag</tag-class>
29     <body-content>scriptless</body-content>
30   </tag>
31 </taglib>    

 

5. 引入和使用

1 <%@taglib uri="/WEB-INF/ifelse.tld" prefix="jnb"%>
2      <jnb:choose>
3         <jnb:when test="<%= 1>2 %>">
4                 小于
5         </jnb:when>
6         <jnb:otherwise>
7                   大于
8         </jnb:otherwise>
9      </jnb:choose>

打包自定义标签库

  1. 建立一个taglibs文件夹
  2. 将所有的标签处理类对应的class文件连同包拷贝到1中的目录中
  3. 在1中的文件夹中建立一个META-INF文件夹
  4. 将tld文件拷贝到META-INF目录
  5. 编辑tld文件引入uri元素

   <uri>http://www.jnb.com</uri>             ->提供引入的url路径

如果提早在tld文件中写入uri 然后在*.jsp中引入www.jnb.com会报错,uri 用于打包的时候用

      6.使用jar命令进行打包

   D:\mytaglibs>jar cvf jnb.jar *

相关文章:

  • oracle用户名被锁定
  • hdu2084 DP
  • React中props.children和React.Children的区别
  • Java中 return 和finally
  • IT架构师绝对不能错过的34张史上最全技术知识图谱
  • 磁盘管理命令
  • 华信Sybase ASE数据库恢复软件 3.0
  • 复杂网络的统计描述
  • 复兴号动车组甲醛超标?中国铁路北京局:报道不实
  • YUM+NTP服务器的搭建 (RHEL6.1搭建) 纯文本
  • 组复制官方翻译四、Monitoring Group Replication
  • 在这里,你终究会真正地失败
  • JavaScript Array 的方法 (笔记)
  • python的抽象编程思想
  • YY的GCD
  • 【Leetcode】101. 对称二叉树
  • #Java异常处理
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Android开源项目规范总结
  • ComponentOne 2017 V2版本正式发布
  • Cookie 在前端中的实践
  • HomeBrew常规使用教程
  • JAVA之继承和多态
  • node 版本过低
  • 当SetTimeout遇到了字符串
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 浏览器缓存机制分析
  • 目录与文件属性:编写ls
  • 我感觉这是史上最牛的防sql注入方法类
  • # 计算机视觉入门
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (C#)获取字符编码的类
  • (C语言)二分查找 超详细
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)德国人的记事本
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .mysql secret在哪_MYSQL基本操作(上)
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net core控制台应用程序初识
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NetCore项目nginx发布
  • .NET框架设计—常被忽视的C#设计技巧