13JSTL和自定义标签_第1页
13JSTL和自定义标签_第2页
13JSTL和自定义标签_第3页
13JSTL和自定义标签_第4页
13JSTL和自定义标签_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

13JSTL和自定义标签第一页,共45页。成都传智播客什么是自定义标签自定义标签是指JSP自定义标签。自定义标签在功能上逻辑上与javaBean类似,都封装Java代码。自定义标签是可重用的组件代码,并且允许开发人员为复杂的操作提供逻辑名称。

自定义标签是在JSP1.1规范里最早提出的

从标签的来源上看,JSP中的标签库可以分为两种类型:一种是JSP标准标签库(JSPStandardTagLibrary,JSTL),它是JSP开发环境供应商开发的;另一种是JSP开发环境的使用者(即用户)自己定义的标签。

通过使用标签库,可以简化JSP和Web应用程序的开发,减少JSP中的java脚本代码量,大大降低JSP页面的复杂度,并且使代码最大程度地重用第二页,共45页。成都传智播客标签库的接口和类的继承关系标签库API定义在javax.servlet.jsp.tagext包中第三页,共45页。成都传智播客标签库的接口和类的继承关系开发自定义标签,其核心就是要编写处理器类,一个标签对应一个标签处理器类,而一个标签库则是很多标签处理器的集合。JSP所有的标签处理器类都实javax.servlet.jsp.tagext.JspTag接口。这个接口是一个标记接口,它有两个直接子接口:简单标签:标签处理类实现SimpleTag接口,它是JSP2.0新增加的接口,代表简单的标签;经典标签:jsp2.0以前标签处理类实现Tag接口,它是经典的、必须实现的接口,它有一个直接子接口IterationTag。第四页,共45页。成都传智播客自定义标签的分类分类说明范例正常标签(StandardTag)包含起始标签、标签体、结束标签<myTag:sqlconnection=xxusername=xxpassword=xx>Select*fromemp</myTag:sql>空标签(EmptyTag)没有标签体,但可包含标签的属性<ATMjsp:ATM/><myTag:headingfontsize=5/>嵌套标签(NestedTag)自定义标签内包含其他自定义标签<myTagA>

<myTagB></myTagB>

</myTagA>第五页,共45页。成都传智播客开发自定义标签的步骤根据业务要求确定标签形式编写标签处理器类(TagHandlerClass)编写标签的描述文件tld(TagLibraryDesscriptorFile)web.xml文件(在其中指定tld的位置)(在servlet2.4,jsp2.0以上的版本不用配置此项)JSP页面导入和使用标签第六页,共45页。成都传智播客自定义标签的执行流程浏览器JSP引擎(碰到JSP文件中的标签指令)TLD文件标签处理类请求应答查找调用处理结果第七页,共45页。成都传智播客SimpleTag接口优点JSP2.0中加入了新的创建自制标记的APIjavax.servlet.jsp.tagext.SimpleTag,该API定义了用来实现简单标记的接口。1、和JSP1.2中的已有接口不同的是,SimpleTag接口不使用doStartTag()和doEndTag()方法,而提供了一个简单的doTag()方法。这个方法在调用该标记时只被使用一次。而需要在一个自制标记中实现的所有逻辑过程、循环和对标记体的评估等都在这个方法中实现。从这个方面来讲,SimpleTag可以和IterationTag达到同等的作用。但SimpleTag的方法和处理周期要简单得多。2、在SimpleTag中还有用来设置JSP内容的setJspBody()和getJspBody()方法。Web容器会使用setJspBody()方法定义一个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTag方法中根据需要多次调用getJspBody().invoke()方法以处理JSP内容。

3、对于前台WEB页面制作人员:在JSP1.2时代,Taglib页面调用实际上是比较复杂的,SimpleTag+EL表达式语言极大的简化了Taglib调用,真正达到不懂JAVA的人员也可以轻松编写JSP页面的目的。第八页,共45页。成都传智播客SimpleTag接口setJspContext方法:该方法把代表JSP页面的pageContext对象传递给标签处理器对象。setParent方法:该方法把父标签处理器对象传递给当前标签处理器对象getParent方法:该方法用于获得标签的父标签处理器对象setJspBody方法:该方法用于把代表标签体的JspFragment对象传递给标签处理器对象doTag方法:该方法用于完成所有的标签逻辑。该方法可以抛出javax.servlet.jsp.SkipPageException异常,用于通知web容器不再执行JSP页面中位于结束标记后面的内容。第九页,共45页。成都传智播客实现SimpleTag接口的标签处理器类的生命周期setJspContextsetParentsetXXXsetJspBodydoTag1.Jsp引擎将代表JSP页面的pageContext对象传递给标签处理器对象2.Jsp引擎将父标签处理器对象传递给当前标签处理器对象。只有存在父标签时,jsp引擎才会调用该方法3.设置标签属性。只有定义属性才调用该方法4.若存在标签体,JSP引擎将把标签体封装成一个JspFragment对象,调用setJsddpBody方法将JspFragment对象传递给标签处理器对象。若标签体为空,这setJspBody将不会被JSP引擎调用5.容器调用标签处理器对象的doTag方法执行标签逻辑第十页,共45页。成都传智播客JspFragment类该类的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段不能包含JSP脚本元素(<%…%>)JSP引擎在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJspBody方法把JspFragment对象传递给标签处理器对象。得到代表标签体的JspFragment对象后,标签开发者就可以在标签处理器中根据需要调用JspFragment对象的方法,进而决定如何处理标签体。第十一页,共45页。成都传智播客JspFragment类getJspContext方法:该方法用于返回代表调用页面的JspContext对象Invoke方法(java.io.Writerout):该方法用于执行JspFragment对象所代表的JSP代码片段。在doTag()方法中可以根据需要调用该方法。该方法的参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中。若传递参数out的值为null,则将执行结果写入到JspContext.geOut()方法返回的输出流对象中。若想在标签处理器中修改标签体内容:需在调用invoke方法时指定一个可取出结果数据的输出流对象(如:StringWriter),让标签体的执行结果输出到该输出流中,然后从该输出流对象中取出数据进行修改后再输出到目标设备第十二页,共45页。成都传智播客SimpleTagSupport为简化简单标签处理器的编写工作,JSPAPI中提供了SimpleTag接口的一个实现类SimpleTagSupport。SimpleTagSupport实现了SimpleTag接口中的方法,它内部以成员变量的形式保存了setJspContext方法和setJspBody方法传递进来的参数。此外,它还定义了如下两个方法、来返回这两个参数:getJspContext方法:该方法用于返回代表调用页面的JspContext对象getJspBody方法:该方法用于得到代表标签体的JspFragment对象,第十三页,共45页。成都传智播客标签库描述文件标签库描述(TagLibraryDescription)文件简称为tld文件,其扩展名为.tld多个标签的集合就形成了一个标签库,标签库中的所有标签都必须在标签文件中进行描述Tld文件可以放置在web应用程序的WEB-INF目录及其子目录中,但不能放置在WEB-INF目录下的classes和lib子目录中。tld文件也可以放置在WEB-INF\lib目录下的jar包的META-INF目录及其子目录中服务器启动时查找的顺序:第十四页,共45页。成都传智播客标签库描述文件<body-content>:指定标签体的类型。可能取值有3种:empty:没有标签体 scriptless:标签体可以包含el表达式和JSP动作元素,但不能包含JSP的脚本元素tagdependent:表示标签体交由标签本身去解析处理。若指定tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器第十五页,共45页。成都传智播客在JSP页面引用自定义标签在JSP页面使用taglib指令引入标签库描述文件:<%@taglibprefix=“”uri=“”%>uri:属性用于指定所引入的标签库描述(tld)文件中所定义的<uri>元素的内容;prefix属性用于为引入的tld文件指定一个”引用代号”。Prefix属性可以由jsp文件的作者任意指定,只要与其他taglib指令的prefix属性值不同就可以。第十六页,共45页。成都传智播客自定义标签1定制一个标签<Date>,输出当前的日期<itcast:Date/>第十七页,共45页。成都传智播客自定义标签例子2定制一个带有两个属性的标签<maxValue>,用于计算并输出两个数的最大值<itcast:maxValuenum1=“34"num2=“56"/>第十八页,共45页。成都传智播客自定义标签例子<?xmlversion="1.0"encoding="UTF-8"?><taglibxmlns=""xmlns:xsi=""xsi:schemaLocation=""version="2.0"><!--标签库的描述不是必须的--><description>itcast0.1corelibrary</description><!--标签库的概述不是必须的--><display-name>itcastcore</display-name><!--标签库的版本必须的--><tlib-version>0.1</tlib-version><!--当前tld文件在jsp页面引用时建议使用的前缀必须的--><short-name>itcast</short-name><!--表示当前tld文件的uri该节点不能与其他tld文件的节点相同,因为在jsp页面可以通过该标识应用当前的tld文件不是必须的--><uri></uri>第十九页,共45页。成都传智播客自定义标签例子<!--具体的tag标签的配置不是必须的--><tag>

<!--指定自定义标签的名称必须的--><name>maxValue</name>

<!--指定当前标签关联java类必须的--><tag-class>com.itcast.mytag.MaxValueTag</tag-class>

<!--指定标签体的类型empty表示标签体为空必须的值可选--><body-content>empty</body-content><!--*******************************************************************-->

<!--描述当前标签的属性不是必须的--><attribute><!--标签中属性的名称,该属性名称要与对应的标签处理类中的属性名称相同--><name>num1</name>

<!--定义该属性是否必须,true表示必须,false表示不必须--><required>true</required>

<!--该属性是否可以接受动态表达式的值runtimeexpressionvalue(rtexprvalue)--><rtexprvalue>true</rtexprvalue></attribute></tag>第二十页,共45页。成都传智播客自定义标签例子3定制一个带有三个属性的标签<circle>,用于按指定的步长输出值<itcast:circlebegin="1"end="100"step="2"/>第二十一页,共45页。成都传智播客自定义标签例子4定制一个带有一个属性的标签<itcast:read“”>,用于输出指定文件的内容<itcast:read"/WEB-INF/"/>第二十二页,共45页。成都传智播客自定义标签例子6定制一个用于迭代输出集合(List)中所有元素的标签:<itcast:listitems="${stus}"var="stu">${}********${stu.age}<br></itcast:list>第二十三页,共45页。成都传智播客自定义标签例子7定制一个用于迭代输出集合(Set)中所有元素的标签:<itcast:setitems="${stus}"var="stu">${}********${stu.age}<br></itcast:list>第二十四页,共45页。成都传智播客自定义标签例子8定制一个用于迭代输出数组中所有元素的标签:<itcast:objectArrayitems="${stus}"var="stu">~~~~~${}********${stu.age}<br></itcast:objectArray>第二十五页,共45页。成都传智播客自定义标签例子9定制一个用于迭代输出(数组、List、set)中所有元素的标签:<itcast:collectionitems="${stus}"var="stu">List:${}********${stu.age}<br></itcast:collection>第二十六页,共45页。成都传智播客自定义标签例子10定制一个用于迭代输出(Map)中所有元素的标签:

<itcast:mapitems="${pageScope.stusMap}"var="stu">${stu.key}****${stu.value}****${stu.value.age}*********${}<br></itcast:map>第二十七页,共45页。成都传智播客自定义标签例子11定制一个用于迭代输出(数组、List、set、Map)中所有元素的标签:<itcast:forEachitems="${stusArray}"var="stu">${}********${stu.age}<br></itcast:forEach>map处理<itcast:forEachitems="${stusMap}"var="stu">${stu.key}********${stu.value}*******${stu.value.age}*********${}<br></itcast:forEach>第二十八页,共45页。成都传智播客JSTL简介JSP支持自定义标签库太自由了,为了能尽量统一页面中使用的标签库,于是产生了JSTL。JSTL标签库由标签库和EL表达式语言两个部分组成。EL在JSTL1.0规范中被引入,当时用来作为Java表达式来工作,而该表达式必须配合JSTL的标签库才能得到需要的结果。官方网址:说明:在JSTL1.1规范中,JSP2.0容器已经能够独立的理解任何EL表达式。EL可以独立出现在JSP页面的任何角落。本文随后的内容将以JSTL1.1规范作为介绍的重点。JSTL1.2已经作为JavaEE5的一个部分,成为真正JSP标准标签库。第二十九页,共45页。成都传智播客JSTL标签库core标签库,URI地址前缀:cXML处理标签,URI地址,,前缀xi18n多国语言标签,URI地址,前缀fmt数据库访问标签,URI地址,前缀sql函数标签,URI地址,前缀fn第三十页,共45页。成都传智播客JSTL核心标签库-core的使用基本标签:<c:out>:显示指定的值,配置EL使用。示例:<c:outvalue="${sessionScope.userName}"default="未登录"escapeXml=""/><c:set>:设置一个变量。设置格式如下:<c:setvar="name"scope=""value=""||target=""property=""/><c:remove>:删除某一个变量;<c:removevar="name"scope=""/><c:catch>:在页面中捕获异常<c:catchvar="error></c:catch>${error}条件控制标签:<c:if>:用于条件判断,使用格式:<c:iftest=""var="result"scope=""></c:if><c:choose><c:when><c:otherwise>,用于实现ifelse类似的情景<c:choose><c:whentest=""></c:when><c:whentest=""></c:when><c:otherwise></c:otherwise></c:choose>第三十一页,共45页。成都传智播客JSTL核心标签库-core的使用循环控制:<c:forEach>:用于循环或迭代使用方式1:<c:forEachvar="v"items="${collections}">$v</c:forEach>使用方式2:<c:forEachvar="i"begin="0"end="10"step="2">$i</c:forEach><c:forTokens>,对分隔字符作循环处理。<c:forTokensvar="v"items="a,b,c,d"delims=","></c:forTokens>

URL相关标签:<c:import>,导入另外一个页面中的内容;<c:importimport=""charEncoding=""scope=""var=""/><c:url>,生成URL连接,生成包含上下文的url。<c:urlvalue=""var="link"/><ahref="${link}">test</a><c:redirect>,导向另外一个页面<c:redirecturl=""></c:redirect>,要传递参数使用<c:param>标签。<c:param><c:redirecturl="ttt.jsp"><c:paramname="msg"value=""/></c:redirect>第三十二页,共45页。成都传智播客EL自定义函数EL自定义函数:在EL表达式中调用的某个Java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用。EL自定义函数可以扩展EL表达式的功能,让EL表达式完成普通Java程序代码所能完成的功能。第三十三页,共45页。成都传智播客EL自定义函数开发步骤编写EL自定义函数映射的Java类中的静态方法:这个Java类必须带有public修饰符,方法必须是这个类的带有public修饰符的静态方法编写标签库描述文件(tld文件),在tld文件中描述自定义函数在JSP页面中导入和使用自定义函数第三十四页,共45页。成都传智播客在tld文件中描述EL自定义函数为了能够让一个Java类的静态方法可以被EL表达式调用,需要在一个标签库描述文件(tld文件)中对EL自定义函数进行描述,已将Java类中的静态方法映射成一个EL自定义函数第三十五页,共45页。成都传智播客在tld文件中描述EL自定义函数<!--标签库的描述--><description>myelfunction</description><!--标签库的概述--><display-name>myelfunction</display-name><!--标签库的版本--><tlib-version>0.1</tlib-version><!--当前tld文件在jsp页面引用时建议使用的前缀--><short-name>itcastel</short-name><!--表示当前tld文件的uri该节点不能与其他tld文件的节点相同,因为在jsp页面可以通过该标识应用当前的tld文件--><uri></uri><!--配置一个自定义的EL函数--><function><!--配置自定义函数的名称该名称将在jsp页面被引用--><name>toGBK</name><!--指定函数所在的java类--><function-class>cn.itcast.el.ELFunctionDefined</function-class><!--指定java中静态函数的方法签名格式(返回值方法名(参数类型)有多个参数时,用,隔开)--><function-signature>java.lang.StringtoGBK(java.lang.String)</function-signature></function>第三十六页,共45页。成都传智播客在JSP页面中导入和使用EL自定义函数在标准JSP页面中使用taglib指令来引入tld文件:<%@taglibprefix="itcastel"uri="/WEB-INF/tld/myeltag.tld"%>uri:属性用于指定所引入的标签库描述(tld)文件中所定义的<uri>元素的内容;prefix属性用于为引入的tld文件指定一个”引用代号”。Prefix属性可以由jsp文件的作者任意指定,只要与其他taglib指令的prefix属性值不同就可以。调用EL自定义函数:

${itcasel:aa(param.username)}第三十七页,共45页。成都传智播客练习编写3个EL自定义函数:计算输入字符串的长度完成对字符串的截取完成两个数相除的功能gbk${itcastel:toGBK(param.username)}<br>utf-8:${itcastel:toUTF8(param.username)}<br>subString--${itcastel:subString(param.username,1,4)}<br>getLength:{itcastel:getLength(param.username)}<br>

第三十八页,共45页。成都传智播客jstlfn函数(1)为了简化在JSP页面操作字符串,JSTL中提供了一套EL自定义函数,这些自定义函数包含了JSP页面经常要用到的字符串操作在JSTL的表达是中要使用一个函数,其格式如下

${ns:methodName(args)}在使用这些函数之前必须在JSP中引入标准函数的声明

<%@taglibprefix="fn"uri=""%>第三十九页,共45页。成都传智播客jstlfn函数(2)第四十页,共45页。成都传智播客jstlfn函数(2)第四十一页,共45页。成都传智播客示例contains:${fn:contains("abCDefg","cd")}<br>containsIgnoreCase:${fn:containsIgnoreCase("abCDefg","cd")}<br>endsWith:${fn:endsWith("abCDefg","fg")}<br>

//escapeXml:用于设置是否将"<"、">"、"&"、"'"、"""、这些

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论