学习的小知识点,有时间就记录下来,相信慢慢就会有收获吧!!!开发自定义标签的一般步骤为:创建一个标签助手类-----》创建标签库描述文件----》在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>