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. php运行环境学习

    web服务器,负责响应客户端请求.对于静态页面请求,会立即返回相应页面给客户端:如果是动态页面,web服务器会根据 httpd.conf中的AddType配置,提交给合适的动态脚本解析程序预处理,然后 ...

  2. Linux下的信号量

    首先,什么是信号量? 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识.信号量在此过程中负责操作的互 ...

  3. php中模拟post,get请求和接受请求详细讲解

    在php中我们经常用到curl拓展来进行模拟post.get请求,下面就来具体说说怎么模拟: 一.首先模拟post请求: function http_post_data($url, $query_da ...

  4. thinkphp3.2.3----图片上传并生成缩率图

    public function uploadify(){ if(!IS_POST){ $this->error('非法!'); } $upload = $this->_upload(); ...

  5. 关于使用Google Analyse导入库文件编译出错的解决办法.

    (最新解决办法):因为要通过cocoapod链接库,那么直接在Podfile上面加上 pod 'GoogleAnalytics-iOS-SDK', '~> 3.0.9',然后在pod insta ...

  6. origin显示三维曲面

    准备数据并选中数据: 这里如果只关心z<1部分的趋势,可以对Z轴范围进行调整,双击Z轴的数字: 然后修改显色条的范围,双击曲面: 最后让曲面最上面部分clip掉: 成功了:

  7. 2019 CCPC-Wannafly Winter Camp Day2(Div2, onsite)

    solve 4/11 A Erase Numbers II Code:KK Thinking :KK 用ans表示当前最优答案,maxx表示遍历到的最大数字,一开始ans肯定等于a[ 1 ]+a[ 2 ...

  8. nginx(四)-负载均衡

    负载均衡,我认为是nginx最重要的功能了.那什么是负载均衡呢. 比如有一个服务,它访问量很大,一台机器吃不消了,怎么办,我们准备两台.分一部分的请求出来.现在有两台服务器提供这个服务.我们访问其中一 ...

  9. [转] Ansible 系列之 Playbooks 剧本

    [From] https://www.cnblogs.com/hanyifeng/p/6435875.html 一.Playbooks 介绍 1.Playbooks是Ansible的配置,部署和编排语 ...

  10. Linux Shell脚本编程基础

    1. 脚本是一个包含一系列命令序列的文本文件,当运行这个脚本文件时,文件中包含的命令序列将得到执行. 2. 脚本主要由两部分组成:脚本解释器和命令序列 注:#!/bin/bash 指明脚本解释器为Ba ...