说实话,没做过WEB开发,我也不知道自定义标签这一块在开发中是否用的比较多,但我觉得既然有它的存在,那么就一定有它存在的道理,反反复复不知道看了多少遍了,没办法,没有项目实战,只有温故温故再温故,既然复习了,索性就做一个简单的笔记吧。
我所谓的理解是,固有的标签满足不了我们实际的开发需要,所以才出现了自定义,举一个很常见的例子,有一个东西实现起来要很多代码,并且有很多地方都要用到,我们当然可以哪个地方用到就写一遍代码,这样的繁琐是我们不希望看到的,那么抽取就来了,也许抽取多种多样,自定义标签就是其中一个。
我们先看一个简单的例子:
要创建自定义的JSP标签,首先必须创建处理标签的Java类。所以,先创建一个AbnerTag类,如下所示:
public classAbnerTagextendsSimpleTagSupport{
@Override
public voiddoTag()throwsJspException,IOException {
super.doTag();
JspWriter out=getJspContext().getOut();
out.print("没错,我就是AbnerMing");
}
}
创建好了标签类,在WEB-INF下创建一个tld文件:
abner.tld就是我们创建的tld文件,在文件里记录我们刚才创建的标签类
1.0
2.0
Example TLD
Abner
com.abner.ming.AbnerTag
empty
在jsp用到的地方,使用taglib进行引入:
浏览器查看,标签类的内容,就被打印出来了:
自定义标签主体:也许我们不想这样应用,想让自己定义的标签,可以输入内容,如div,p,h等正常标签一样,那么我们就要修改标签主体了:
public classAbnerTagextendsSimpleTagSupport{
@Override
public voiddoTag()throwsJspException,IOException {
super.doTag();
StringWriter sw =newStringWriter();
getJspBody().invoke(sw);
getJspContext().getOut().println(""
+sw.toString()+"");
}
}
tld文件里有一个地方更改:
scriptless
没错!我就是AbnerMing
在用户输入的内容,我添加了颜色,可以看到效果如下:
自定义标签属性:
也许,我们希望通过属性的方式把内容呈现出来,那么我们就可以如下操作:
public classAbnerTagextendsSimpleTagSupport{
privateStringabnermsg;
publicStringgetAbnermsg() {
returnabnermsg;
}
public voidsetAbnermsg(String abnermsg) {
this.abnermsg= abnermsg;
}
@Override
public voiddoTag()throwsJspException,IOException {
super.doTag();
StringWriter sw =newStringWriter();
if(abnermsg!=null){
JspWriter out = getJspContext().getOut();
out.println(abnermsg);
}else{
getJspBody().invoke(sw);
getJspContext().getOut().println(""
+sw.toString()+"");
}
}
}
1.0
2.0
Example TLD
Abner
com.abner.ming.AbnerTag
scriptless
abnermsg
流程就是这么一个流程,也很简单,继承SimpleTagSupport或者是继承TagSupport ,又或者是继承其它,无非就是实现的方法不一样,但是逻辑是相通的。
自定义标签的原理:
1、当服务器打开时,就会加载WEB-INF下的资源文件,包括web.xml 和 tld文件,把它们加载到内存
2、我们在浏览器输入http://lenovo-pc:8080/AbnerMing/index.jsp来访问jsp页面
3、服务器读取index.jsp里的内容,当读到
这一句的时候,就会在内存中找是否存在uri为WEB-INF/abner.tld的tld文件,找不到就会报错
4、继续读取jsp页面,读到 这个标签的时候,就会通过uri去找到tld文件,在tld文件中找到Abner是否被定义,是的话就得到它的tag-class的内容,然后去找到它对应的标签处理程序
5、实例化标签处理程序,利用生成的对象调用它里面的方法这里服务器对标签处理程序里的方法也有一定的调用顺序
A、void setPageContext(PageContext pc) --传入pageContext对象
B、void setParent(Tag t) --如果有父标签,传入父标签对象,如果没有,则传入null
C、int doStartTag() --开始执行标签时调用。
D、int doEndTag() --结束标签时调用
E、void release() --释放资源
自定义标签基本的实现方式就是以上,要实现更为复杂的,只是代码的改变,基本逻辑是不动的,比较简单,可能大家一看就会明白吧,好了,就分享到这里吧。
领取专属 10元无门槛券
私享最新 技术干货