向自定义标签添加一些属性可以使我们的标签功能更加灵活和可重用。比如之前的博客使用简单的标签执行标签体的内容一定次数,所以不能在标签上指定要执行的次数,必须在标签处理器类中修改,非常不方便。如果使用带属性的标签,这个问题就可以很好的解决。
为了使简单标签具有属性,通常需要满足两个步骤:
(1)在标签处理器类中定义属性,同时为每个属性生成setter方法;
将该属性的属性标签添加到TLD文件的标签标签下,并在属性标签下定义其从属标签,其中名称从属标签为必填项。属性标签具有以下从属标签:
Name标记:用于指定标记中属性的名称。
必需的标记:指定属性是否必须为。
Rtexprvalue标记:指定属性是否支持运行时表达式,如JSP表达式(%)=value %和EL表达式(${value})。如果我们将其设置为“false”,那么这个属性只能支持字符串。
示例1:使用简单标签控制标签主体内容的执行次数(使用属性标签),并编写标签处理器类:
package com . bjpowernode . simple tag;公共类LoopTagBody扩展了SimpleTagSupport { private int count;//定义一个属性来指定公共void setcount(int count){//set setter方法this.count=此属性的计数;} @Override public void doTag()抛出JspException,IOException { JspFragment fragment=this . getjspbody();for(int I=0;我是伯爵;I) {//可以使用属性指定循环片段. invoke(null)的个数;}}}定义并描述TLD文件中的标记处理程序类,并指定标记所在的uri:
?xml版本='1.0 '编码='UTF-8 '?taglib xmlns=' http://Java . sun.com/XML/ns/J2EE ' xmlns : xsi=' http://www . w3 . org/2001/XMLSchema-instance ' xsi : schema location=' http://Java . sun.com/XML/ns/J2EE http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd'版='2.0 '描述一个使用SimpleTag处理程序的标记库。/description tlib-version 1.0/tlib-version short-name simpletaglibrary/short-name uri simpletag/uri标记name loopbody/name tag-classcom.bjpowernode.simpletag.LoopTagBody/tag-class body-contentscriptless/body-content属性name count/name Required tree/Required rtexprvaltrue/rtexprvalue/attribute/tag lib JSP页面开头的导入标记库指令:
% @ tagliburi=' simpletag '前缀=' simple'%最后,您可以将simpletag与刚刚在JSP页面正文中定义的属性一起使用,并且可以通过使用“count”属性来指定标记正文循环的次数:
Simple:loopbody count='5 '神圣的喜悦!br/浏览器中观察到的simple:loopbody:
从上面的例子中我们还可以看到,虽然标签处理器的LoopTagBody类中的“count”属性的类型是int integer,但是字符串的类型是上传到标签中的,因为JSP容器支持将标签的属性类型(字符串)转换为八种基本数据类型。如果在标记处理程序类中定义了一个不是八种基本数据类型之一的属性,上面的必须以上面的方式报告错误,因为JSP容器不能将字符串转换为其他类型。除非标签属性中使用了其他类型:
例2:
package com . bjpowernode . simple tag;公共类DateAttributeTag扩展了SimpleTagSupport {私有日期;public void setDate(Date Date Date){ this . Date=Date;} @Override public void doTag()抛出JspException,IOException { this.getJspContext()。getOut()。write(date . tostring());}}在TLD文件中有描述(此处省略开头和结尾,详情请见示例1):
标记名showtime/name标记-classcom . bjpowernode . simple tag . dateattributetag/标记类body-contentempty/body-content属性namedate/所需的名称true/必需的rtexprvalue true/rtexprvalue/属性/标记注意:此处需要rtexprvalue标记。
将taglib指令(此处省略)导入JSP页面后,使用刚刚在JSP页面正文中定义的简单标签:
Simple3360显示时间日期='%=新日期()% '/在浏览器中观察:
因为如果JSP页面属性是一个字符串,那么标签处理程序类就不是这八种基本的数据类型,所以对象只能使用JSP表达式或者EL表达式传入,所以rtexprvalue标签在TLD文件中必须设置为“true”。
简单标签的应用,包括如何使用不带属性和带属性的标签,已经学过了,剩下的可以根据你所学的进行开发。
示例3:使用简单的标签来防范连锁盗窃
如果一个JSP页面需要防止被其他网站窃取,可以在JSP页面的开头使用一个简单的标签,并且可以添加一些属性,比如指定从哪个网站浏览这个页面的内容,如果链接来自非指定的网站,指定先请求跳转到哪里。
编写标签处理程序类:
package com . bjpowernode . simple tag;公共类RefererTag扩展了SimpleTagSupport {私有String网站;//指定允许访问请求的网址私有字符串位置;//如果不指定访问请求的URL应该先跳转到哪里,public void setsite(string site){ this。站点=站点;} public void setLocation(String location){ this . location=location;} @Override public void doTag()引发JspException,IOException { page context page context=(page context)this . getjspcontext();httpersvletrequest request=(httpersvletrequest)page context . getrequest();httpersvletresponse=(httpersvletresponse)page context . getresponse();string RequestURl=request . GetHeader(' refer ');if(requestUrl==null ||!request URL . starts with(site)){ response . send redirect(request . getcontextpath(). this . location);抛出新的SkipPageException();}}}在TLD文件中有描述(此处省略了开头和结尾,详见示例1):
标记名referrer/name tag-classcom.bjpowernode.simpletag.RefererTag/tag-class body-contentempty/body-content属性name site/name required tree/必需的rtexprvaluetrue/rtexprvalue/属性属性名称位置/名称必需的true/必需的rtexprvaluetrue/rtexprvalue/属性/标记在导入taglib指令(此处省略)后,使用刚刚在JSP页面正文中定义的简单标记:
simple : refer site=' http://www . bjpowernode.com ' location='/index . JSP '/!DOCTYPE HTML html标题标题我的JSP 'simpletagdemo.jsp '起始页/标题/标题./html结果:如果要访问JSP页面,只有满足请求的URL前缀是页面属性指定的URL,才能访问。如果是另一个网页中的超链接或者直接在浏览器中输入JSP的URL,就会跳转到location属性指定的网页。
示例4:使用简单标签来逃避标签主体中的HTML过滤
编写标签处理程序类:
打包。bjpowernode。简单标签;公共类HtmlFilterTag扩展SimpleTagSupport { @ Override public void doTag()抛出JspException,IOException { JspFragment片段=this。getjspbody();StringWriter编写器=new StringWriter();碎片。invoke(writer);StringBuffer缓冲区=writer。getbuffer();字符串内容=筛选器(缓冲区。ToString());this.getJspContext().getOut().写(内容);}公共字符串筛选器(字符串消息){ if(消息==null)返回(null);char内容[]=新char[消息。length()];message.getChars(0,message.length(),content,0);StringBuilder结果=new StringBuilder(内容。长度50);for(int I=0;一。内容。长度;I){ switch(content[I]){ case ' ' :结果。追加(');打破;案例" " :结果。追加(" ");打破;案例" " :结果。追加(" ");打破;案例' ' ' :结果。追加(“”);打破;默认:结果。追加(内容[I]);} }返回(结果。tostring());} }其中过滤方法过滤器方法可以在雄猫中参考代码(位置:【雄猫】-【网络应用】-【示例】- 【WEB-INF】 -【类】-【utils】-【html过滤器。).在TLD文件中定义和描述标签:
标签名过滤器。bjpowernode。简单的标签。html筛选器标记/标记类正文-content script less/正文-内容/标记在JSP页面中的主体部分中使用刚才自定义的简单标签:
简单的:过滤器。百度。com ' rel='外部无跟随'百度/a /simple:filterhtml浏览器中观察: