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;
}
@Override
public 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>

javaweb带父标签的自定义标签的更多相关文章

  1. [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. 剖析html对标准标签和自定义标签闭合与不闭合渲染问题

    昨天在修改去年写的系统的时候无意中看到了当时写的一个利用标准标签未闭合在单元格内把整个单元格颜色渲染成红色的效果,如下: 当时的问题是从后台返回来的是个int整数而%是写在页面上的如图 这 时候就出现 ...

  3. Django框架(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器

    目录 模板层:变量.过滤器.标签.自定义标签和过滤器 一.模板层变量 1.语法 2.使用 二.模板层之过滤器 1.语法 2.常用过滤器 3.其他过滤器 三.模板值标签 1.for标签 2.if标签 3 ...

  4. 从零开始学spring源码之xml解析(二):默认标签和自定义标签解析

    默认标签: 上一篇说到spring的默认标签和自定义标签,发现这里面东西还蛮多的.决定还是拆开来写.今天就来好好聊聊这两块是怎么玩的,首先我们先看看默认标签: private void parseDe ...

  5. javaWeb 在jsp中 使用自定义标签输出访问者IP

    1.java类,使用简单标签,jsp2.0规范, 继承 SimpleTagSupport public class ViewIpSimpleTag extends SimpleTagSupport { ...

  6. 一、JSP标签介绍,自定义标签

    一.JSP标签介绍 1. 标签库有什么作用 自定义标签库是一种优秀的表现层技术,之前介绍的MVC模式,我们使用jsp作为表现层,但是jsp语法嵌套在html页面,美工还是很难直接参与开发,并且jsp脚 ...

  7. Jsp开发自定义标签,自定义标签将字符串转成指定的时间格式显示

    本例以将 字符串格式的时间转成指定的时间格式显示. 第一步.定义一个标签处理程序类,需要集成javax.servlet.jsp.tagext.TagSupport,代码如下: import java. ...

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

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

  9. Django框架(六)--模板层:变量、过滤器、标签、自定义标签和过滤器

    将页面的设计和Python的代码分离开会更干净简洁更容易维护. 我们可以使用 Django的 模板系统 (Template System)来实现这种模式 # django模板修改的视图函数 def c ...

随机推荐

  1. Python3.4程序异常判断

    实例代码[更多实例,请访问:www.yeayee.com] 1 #idle中按F5可以运行代码 2 #引入外部模块 import xxx 3 #random模块,randint(开始数,结束数) 产生 ...

  2. bootstrap-table教程演示

    Bootstrap Admin 效果展示 Table of contents Create Remove Update Export Tree Create 相关插件 bootstrap-valida ...

  3. java学习笔记_多态

    多态:父类的变量可以引用子类的对象 引用: Student s1 = stu; s1.setScore(200); 1.一个对象可以有多个引用,可以有多个变量操作同一个对象   2.当一个对象没有任何 ...

  4. 51nod2004 终结之时 (支配树+树剖+树链的并)

    link 我永远喜欢洛天依 给定一张图世末积雨云,你需要维护其支配树: 单点修改,子树修改,树链修改 子树求和,树链求和,多条树链的并集求和 撤销之前的操作 可以先用 Lengauer-Tarjan ...

  5. XMPP Authentication

      From: http://www.ietf.org/rfc/rfc2831.txt 2 Authentication The following sections describe how to ...

  6. CoreText 图文混排

    基本原理 https://www.cnblogs.com/purple-sweet-pottoes/p/5109413.html CoreText(一):基本用法  https://blog.csdn ...

  7. Angular material mat-icon 资源参考_File

    ul,li>ol { margin-bottom: 0 } dt { font-weight: 700 } dd { margin: 0 1.5em 1.5em } img { height: ...

  8. 洛谷 P4307 [JSOI2009]球队收益 / 球队预算(最小费用最大流)

    题面 luogu 题解 最小费用最大流 先假设剩下\(m\)场比赛,双方全输. 考虑\(i\)赢一局的贡献 \(C_i*(a_i+1)^2+D_i*(b_i-1)^2-C_i*a_i^2-D_i*b_ ...

  9. @RequestMapping的value属性

    package com.zby.controller; import javax.servlet.http.HttpServletRequest; import org.springframework ...

  10. mysql编码不统一形成的错误

    错误提示:[Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) ...