1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java 自定义循环标签_Jsp2.0自定义标签(第二天)——自定义循环标签

java 自定义循环标签_Jsp2.0自定义标签(第二天)——自定义循环标签

时间:2020-11-03 08:27:33

相关推荐

java 自定义循环标签_Jsp2.0自定义标签(第二天)——自定义循环标签

今天是学习自定义标签的第二天,主要是写一个自定义的循环标签。

先看效果图:

前台页面Jsp代码

String[]array = new String[]{"one","two","three","four","five"};

pageContext.setAttribute("arr",array);%>

我的测试页面

array数组里对应的英文数字:${item}

跟第一篇一样,还是分四部分讲解:

第一部分:自定义标签文件(*tld)

具体内容:

/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0">

1.0

myout

/demo

Foreach

com.tag.support.TagDemo

scriptless

items

true

true

var

true

true

这个地方要注意一点:关于 是如何找到demo.tld文件的?

两种方式:

第一种方式:就如同上面这样配置,在demo.tld文件中加上/demo ,指定uri,

但是这种方式demo.tld必须放在WEB-INF下,不然容器找不到

第二种方式:在web.xml中配置,这种方式是通过显示的指定demo.tld的位置,可以不放在WEB-INF只要指向正确就好

/demo

/WEB-INF/lirui.tld

新增一种方式:其实在jsp页面引用自定义标签还可以另一种方式(指定*.tld文件所在路径),只是这种方式不灵活。

@taglib prefix="myout"uri="/WEB-INF/demo.tld" %

第二部分:标签具体业务实现类。

自定义的类要继承(extends)SimpleTagSupport

importjava.io.IOException;importjavax.servlet.jsp.JspContext;importjavax.servlet.jsp.JspException;importjavax.servlet.jsp.tagext.SimpleTagSupport;public class TagDemo extendsSimpleTagSupport {//注意:这个属性要与tld文件中定义的属性一致,并提供get和set方法

privateString items;privateString var;publicString getItems() {returnitems;

}public voidsetItems(String items) {this.items =items;

}publicString getVar() {returnvar;

}public voidsetVar(String var) {this.var =var;

}//具体业务实现类

@Overridepublic void doTag() throwsJspException, IOException {//this.getJspContext()获得JspContext对象也就是前台页面的PageContext//可以看出页面输出Hello World注意是这里的write方法实现的

JspContext jspContext = this.getJspContext();

String[] arr=(String[])jspContext.getAttribute(items);for(String s: arr){

jspContext.setAttribute(var, s);this.getJspBody().invoke(null);

}

}

}

注意一点:this.getJspBody().invoke(null); 这行代码表示把标签体的内容的内容输入到浏览器,如果没有调用该方法,则忽略标签体

我一开始做的时候没有加这一行代码,

直接导致前台页面array数组里对应的英文数字:${item}

标签体内同显示不出来,当时查了下资料才知道这里没有加this.getJspBody().invoke(null); 这一行代码。

扩充一下知识点:JspFragment是个抽象类,这个类代码很简单,具体如下:

importjava.io.IOException;importjava.io.Writer;importjavax.servlet.jsp.JspContext;importjavax.servlet.jsp.JspException;public abstract classJspFragment

{public abstract voidinvoke(Writer paramWriter)throwsJspException, IOException;public abstractJspContext getJspContext();

}

这个类的实例通过SimpleTagSupport类中的getJspBody()方法获得的。

该类实例封装了标签体的内容,主要方法就是invoke方法,该方法具体有两种用法:

第一种:this.getJspBody().invoke(null);表示输出到浏览器,这是原样输出的

第二种:当需要对标签体进行修改时,需要用到第二种,this.getJspBody().invoke(Writer out);

假设:我希望上面显示的页面效果使所有字母大写,效果如图

代码如下:

//具体业务实现类

@Overridepublic void doTag() throwsJspException, IOException {

JspContext jspContext= this.getJspContext();

String[] arr=(String[])jspContext.getAttribute(items);for(String s: arr){

jspContext.setAttribute(var, s);//定义一个缓冲区,把内容先输入到缓存区中,然后在打印到浏览器

StringWriter sw = newStringWriter();this.getJspBody().invoke(sw);

String str=sw.toString().toUpperCase();//打印的具体操作

this.getJspContext().getOut().write(str);

}

}

这就是这两种方式的区别。

第三部分:Jsp页面引用自定义标签。

关于引用自定义标签,上面第二部分已说的很清楚,这里就不多说了。

第四部分:关于定义uri的几种方式。

两种方式:(第一部分好像也说了,这里再重复一遍)

第一种方式:就如同上面这样配置,在demo.tld文件中加上/demo ,指定uri,

但是这种方式demo.tld必须放在WEB-INF下,不然容器找不到

第二种方式:在web.xml中配置,这种方式是通过显示的指定demo.tld的位置,可以不放在WEB-INF只要指向正确就好

/demo

/WEB-INF/lirui.tld

今天是学习Jsp自定义标签的第二天,刚开始写博客,如果有什么问题欢迎各位网友及时提出,谢谢。

技术的提高在于分享,而不是闭门造车。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。