自定义标签实现


学习的小知识点,有时间就记录下来,相信慢慢就会有收获吧!!!开发自定义标签的一般步骤为:创建一个标签助手类-----》创建标签库描述文件----》在jsp页面通过taglib指令导入标签库描述文件,并通过指定后缀访问此自定义标签;
作用:标准标签库JSTL,只能实现基本的标签操作
不同的公司,根据自己的业务需求,可以制作出复杂的标签,从而加快项目开发,的速度,实现项目开发的标准化和模块化,增加代码的重用性.
(代码重用性:一些代码可以运用于很多的地方,这样是可以提高工作效率的
!)
通过自定义标签技术,可以编写出功能非常强大的标签.使用时,直接将标签在放在页面上,就可以实现非常复杂的功能!

一、创建标签助手类

①:创建标签助手类:只要创建一个普通的类,然后使自己创建的这个·类去继承BodyTagSupport,这个现在就可以把它放在一边,等创建了具体的tld文件后,根据tld文件中的中的对应属性在这个类里面创建属性,并且给他set/get方法;并且让这个类重写doAfterBody,doEndTag,doStartTag这三个方法。

(这个可以等到将上面这个例子完成之后再来了解)
②:标签助手类中的返回值
doStartTag的返回值:1:EVAL_BODY_INCLUDE 计算开始标签后的主体内容(一般用的是这个)
2:SKIP_BODY 跳过标签主体的内容
doEndTag的返回值:1:EVAL_PAGE 计算结束标签的后面内容(一般用的是这个) 2:SKIP_PAGE 跳过结束标签后面的所用的内容,直接跳到body的结束标签,不再计算
doAafterBody返回值:1:EAVL_BODY_AGAIN 再一次计算主体标签的内容
2:SKIP_BODY 跳过标签主题内容

注:无论是哪个方法的返回值要根据他们对应要实现的效果相对应

二、创建标签库描述文件

可以自行到网上下载,比自己直接用手敲来得快
比如说forEach,具体的tld文件里面有具体的说明,可自行下载查看

<tag>
	<name>forEach</name>
	<tag-class>com.temp.forEachTag</tag-class>
	<body-content>jsp</body-content>
	<attribute>
		<name>items</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>var</name>
		<required>true</required>
		<rtexprvalue>fales</rtexprvalue>
	</attribute>
</tag>

tag:每定义一个自定义标签建一个tag
name:自定义标签的标签名
tag-class:自己建得那个标签助手类的全限定吗
bady-content:标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素
abttribute:标签的属性,给一个标签每定义一个属性就要建一个attribute
`name:标签名·
required:是否必填
rtexpralvalue:是否支持el表达式

三、在jsp页面调用自定义标签

跟我们调用c标签的是差不多的,也分为可写和必写

	<%
	  List<String> list=new ArrayList();
		for(int i=1;i<10;i++){
			list.add("zs"+i);
		}
		session.setAttribute("list", list);
	%>		
     <z:forEach items="${list }" var="a">
    ${a }
    </z:forEach>

四、具体代码演示

项目的类分布
按照就可以写出一个初步的forEach标签
在这里插入图片描述

1、ForEach类演示:(也就是标签助手类)

private List<Object> items;
private String var;


public List<Object> getItems() {
	return items;
}

public void setItems(List<Object> items) {
	this.items = items;
}

public String getVar() {
	return var;
}

public void setVar(String var) {
	this.var = var;
}

@Override
public int doAfterBody() throws JspException {
	//得到作用域中的数据集
	Iterator<Object> it = (Iterator<Object>)pageContext.getAttribute("it");
	//再次得到这个数据集中有没有下一个数据
	if(it.hasNext()) {
		//得到下一个数据
		Object o = it.next();
		//将得到的值放到作用域中
		pageContext.setAttribute(var, o);
		//再将剩余的数据集放入到作用域中
		pageContext.setAttribute("it", it);
		return EVAL_BODY_AGAIN;
	}
	return SKIP_BODY;
}

@Override
public int doEndTag() throws JspException {
	// TODO Auto-generated method stub
	return super.doEndTag();
}

@Override
public int doStartTag() throws JspException {
	//判断items中是否有值
	if(null!=items) {
		//得到迭代器
		Iterator<Object> it = items.iterator();
		//得到第一个值
		Object o = it.next();
		//将第一个值放入到作用域中
		pageContext.setAttribute(var, o);
		//将剩余的数据放到作用域中
		pageContext.setAttribute("it", it);
		return EVAL_BODY_INCLUDE;
	}
	return SKIP_BODY;
}

2、创建标签库描述文件
在这里插入图片描述
3、在jsp页面调用

		<%
	  List<String> list=new ArrayList();
		for(int i=1;i<10;i++){
			list.add("zs"+i);
		}
		session.setAttribute("list", list);
	%>		
     <z:forEach items="${list }" var="a">
    ${a }
    </z:forEach>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值