1.完整的示例代码:要实现的功能是父标签中有name属性,子标签将父标签的name属性值打印到jsp页面上。

1.1 父类和子类的标签处理器类

testParentTag.java

package com.javaweb.tag;import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class testParentTag extends SimpleTagSupport {private String name="koala";public String getName(){return name;}@Overridepublic void doTag() throws JspException,IOException{System.out.println("父标签name:"+name);getJspBody().invoke(null);}
}

SonTag.java

package com.javaweb.tag;import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class SonTag extends SimpleTagSupport {public void doTag() throws JspException,IOException {//1.得到父标签的引用JspTag parent=getParent();//2.获取父标签的name属性//只有testParentTag才有name属性,所以需要将父标签的引用parent强转为testParentTag类testParentTag parentTag=(testParentTag)parent;String name=parentTag.getName();//3.把name值打印到jsp页面上getJspContext().getOut().print("子标签输出name:"+name);  }
}

1.2 描述属性的tld文件,testParentTag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><description>MyTag 1.1 core library</description><display-name>MyTag core</display-name><tlib-version>1.1</tlib-version><short-name>c</short-name><uri>http://java.koalatest.com/jsp/jstl/core</uri><tag><name>ParentTag</name><tag-class>com.javaweb.tag.testParentTag</tag-class><body-content>scriptless</body-content></tag><tag><name>SonTag</name><tag-class>com.javaweb.tag.SonTag</tag-class><body-content>empty</body-content></tag></taglib>

1.3 jsp调用文件,Parent.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.koalatest.com/jsp/jstl/core" prefix="koala"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'Parent.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><!-- 父标签打印name到控制台 --><koala:ParentTag><!-- 子标签以父标签的标签体存在,子标签把父标签的name属性打印到jsp页面上 --><koala:SonTag/></koala:ParentTag></body>
</html>

运行后输出结果:

2.开发有父标签的标签

2.1 父标签无法获取子标签的引用,父标签仅把子标签作为标签体来使用,在jsp页面的调用可以看出。

<body><koala:ParentTag><koala:SonTag/></koala:ParentTag>
</body>

2.2 子标签可以通过getParent()方法来获取父标签的引用(需要继承SimpleTagSupport或实现SimpleTag接口的方法):若子标签的确有父标签,jsp引擎会把代表父标签的引用通过setParent(JspTag parent)赋给标签处理器。

2.3 注意:父标签的类型是JspTag类型,该接口是一个空接口,是用来统一SimplleTag和Tag的,实际使用需要进行类型的强制转换。

2.4 在tld配置文件中,无需为父标签有额外的配置,但子标签是以标签体的形式存在的,所以父标签的<body-content></body-content>需设置为scriptless。

3.自己开发带有父标签choose的标签when和otherwise实现以下功能:

<c:choose><c:when test="${param.age>22}">大学毕业</c:when><c:when test="${param.age>18}">高中毕业</c:when>    <c:otherwise>初中以下毕业</c:otherwise>
</c:choose>

3.1 需求实现思路

①开发三个标签:choose,when,otherwise

②其中when标签有一个boolean类型的属性:test

③choose是when和otherwise的父标签,when在otherwise之前使用

④在父标签choose中定义一个全局的"boolean"类型的flag,用来判断字标签在满足条件的情况下是否执行

若when的test为true,且choose的flag类型为true,则执行when的标签体(正常输出标签体的内容),同时把flag设置为false;

若when的test为true,且choose的flag类型为false,则不执行标签体;

若flag为true,otherwise执行标签体。

3.2 实现代码

标签处理器类:

chooseTag.java

package com.javaweb.tag;import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class otherwiseTag extends SimpleTagSupport {public void doTag() throws JspException,IOException {chooseTag choosetag=(chooseTag)getParent();if (choosetag.isFlag()){getJspBody().invoke(null);}}
}

whenTag.java

package com.javaweb.tag;import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class whenTag extends SimpleTagSupport {private boolean test;public void setTest(boolean test){this.test=test;}public whenTag() throws JspException,IOException {if(test){chooseTag choosetag=(chooseTag)getParent();boolean flag=choosetag.isFlag();if(flag){//用于把代表标签体的JspFragment对象传递给标签处理器对象getJspBody().invoke(null);choosetag.setFlag(false);}}}}

otherwiseTag.java

package com.javaweb.tag;import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class otherwiseTag extends SimpleTagSupport {public void doTag() throws JspException,IOException {chooseTag choosetag=(chooseTag)getParent();if (choosetag.isFlag()){getJspBody().invoke(null);}}}

描述属性的tld文件:

testParentTag.tld

  <tag><name>choose</name><tag-class>com.javaweb.tag.chooseTag</tag-class><body-content>scriptless</body-content></tag><tag><name>when</name><tag-class>com.javaweb.tag.whenTag</tag-class><body-content>scriptless</body-content><attribute><name>test</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag><tag><name>otherwise</name><tag-class>com.javaweb.tag.otherwise</tag-class><body-content>scriptless</body-content></tag>

jsp调用文件

<koala:choose><koala:when test="${param.age>22}">**大学毕业</koala:when><koala:when test="${param.age>18}">**高中毕业</koala:when><koala:otherwise>**初中以下毕业</koala:otherwise>
</koala:choose>

转载于:https://www.cnblogs.com/naihuangbao/p/9905921.html

javaweb带父标签的自定义标签相关推荐

  1. java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-3(学学Spring源码呗:默认的标签和自定义标签是咋解析的)~整起

    Part3:上一次说到了Spring的DefaultBeanDefinitionDocumentReader类中的parseBeanDefinitions(Element root, BeanDefi ...

  2. java jsp 自定义标签_JSP自定义标签

    在本章中,我们将讨论JSP中的自定义标签.自定义标签是用户定义的JSP语言元素.当包含自定义标签的JSP页面被转换成一个servlet时,标签被转换为一个名为标签处理程序的对象的操作. 然后,Web容 ...

  3. 18、EL表达式、JSP标签、JSTL标签、自定义标签

    EL表达式 jsp的核心语法: jsp表达式 <%=%>和 jsp脚本<% %>. 以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码. 使用EL表达式替换掉j ...

  4. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)

    velocity本身支持自定义标签和指令的扩展,我们看看扩展指令的步骤及searchweb2的应用场景, 1.使用方法 在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用 ...

  5. JSP标签:jsp内置标签、jstl标签、自定义标签

     一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签    1 ...

  6. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构

    JSTL标准标签库简介与环境搭建 EL表达式与EL隐式对象 out标签 set标签 remove标签 catch标签 if标签 choose.when.otherwise配合标签 foreach标签 ...

  7. java 自定义标签_Java自定义标签用法实例分析

    本文实例讲述了Java自定义标签用法.分享给大家供大家参考,具体如下: 简单例子 实现一个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现一个控制器(2)创建一个描述 ...

  8. php框架标签,CMF5自定义标签

    自定义标签 自定义函数里做的标签云功能函数我们下面来将这个函数做成标签首先选择你的标签作用范围应用级/app/portal/taglib/Portal.php全局级/simplewind/cmf/li ...

  9. beetl 页面标签_Beetl 自定义标签的使用笔记

    http://www.ibeetl.com,  Beetl对自定义标签有很友好的支持: 使用自定义标签只需3步: 1)继承Tag类(或GeneralVarTagBinding类)实现render方法; ...

最新文章

  1. 04 集成学习 - Boosting - AdaBoost算法构建
  2. jquery extend函数
  3. MyBatis_1 简介
  4. python psutil替代_Python2.7 psutil模块
  5. C语言中多维数组的内存分配和释放(malloc与free)(转)
  6. 推荐一个下载中国城市统计年鉴的地址
  7. ubuntu中安装pdf虚拟打印机
  8. OpenGL学习之旅(三)——Bezier曲线理论与OpenGL实现
  9. excel转word_excel怎么转换成word格式手机?骨灰级方法确定不收藏吗?
  10. 互斥锁、自旋锁、读写锁和文件锁
  11. 基于Python OpenCV的车牌识别智能计费系统设计
  12. java正则表达式多行匹配,正则表达式多行匹配 - Wangle_OP的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. 爬虫(7):忽略安全证书爬取12306数据
  14. 天津专升本往届生学信网学历证书电子注册备案表查询下载操作步骤
  15. 前后端分离研究,以及接口规范
  16. 循环语句—for/while/do...while
  17. 阿里云IoTStudio中的“移动可视化开发”不见了
  18. Taro 项目里面添加 Mock 数据
  19. SuperMap GIS的TIN地形数据优化
  20. 河南ISO14001环境管理体系认证流程是什么?

热门文章

  1. (最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法
  2. 循环链表(约瑟夫环)的建立及C语言实现
  3. 堆排序最坏时间复杂度
  4. (1)搞一搞 seata 之 基础环境搭建
  5. (5.0) Tomcat 8 源码, 初始化 bootstrap
  6. 网络营销——网络营销专员如何加强企业网站推广能力
  7. 以营销型网站为例,网站建设过程中需要注意哪些问题?
  8. 浅析简易网页制作的准备工作
  9. 浅析充分挖掘网站外链发挥SEO优化作用的4点技巧!
  10. mysql导入sql文件限制,Mysql导入大容量SQL文件数据有关问题