java 自定义标签继承_javaweb带父标签的自定义标签

本文介绍了如何在Java中实现自定义标签的继承,并展示了如何在父标签和子标签之间传递属性值。通过示例代码,解释了在自定义标签中如何获取父标签的引用以及在tld文件中的配置。此外,还讨论了一个带有父标签的条件选择标签(choose、when、otherwise)的实现,用于根据特定条件执行标签体。
摘要由CSDN通过智能技术生成

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

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">

MyTag 1.1 core library

MyTag core

1.1

c

http://java.koalatest.com/jsp/jstl/core

ParentTag

com.javaweb.tag.testParentTag

scriptless

SonTag

com.javaweb.tag.SonTag

empty

1.3 jsp调用文件,Parent.jsp

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

My JSP 'Parent.jsp' starting page

运行后输出结果:

b5c69bf926d5c633a4fba134fc3ef9fd.png

2.开发有父标签的标签

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

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

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

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

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

大学毕业

高中毕业

初中以下毕业

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

choose

com.javaweb.tag.chooseTag

scriptless

when

com.javaweb.tag.whenTag

scriptless

test

true

true

otherwise

com.javaweb.tag.otherwise

scriptless

jsp调用文件

**大学毕业

**高中毕业

**初中以下毕业

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值