您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 自定义标签的开发与使用(理论)
自定义标签的开发与使用1.自定义标签入门1.1为什么使用自定义标签将Java代码从HTML中剥离,便于美工维护页面加快Web应用程序的开发进度提高代码重用性使得JSP程序更加容易维护分离了程序逻辑和表示逻辑减少了JSP页面中的脚本,减少了维护成本提供了可重用的功能组件一个标签的使用1.2什么是自定义标签自定义标签提供了较高的可重用性和易用性一个自定义标签可代表多条Java语句,但在JSP页面中也可以使用HTML标记来使用自定义标签所有的Java源代码隐藏在自定义标签的Java实现类中若需在其它页面中完成相同的功能,只需在页面使用该自定义标签如果自定义标签代码的Java代码改变了,所有引用该标签的JSP页面不需要进行修改,功能就可随之更新1.3自定义标签的应用形式空标签空标签是指不包含标签体的标签格式1:tag:example/格式2:tag:example/tag:example有标签体的标签格式:tag:examplebody/tag:example嵌套标签格式:tag:example1tag:example2body/tag:example2/tag:example1带属性的标签tag:exampleattribute1=”attributeValue1”attribute2=”attributeValue2”body/tag:example1.4实现自定义标签步骤标签处理程序(Java类)标签库描述符(提供有关标签和库文件的元信息的XML文件)JSP实现(包含自定义标签的JSP文件)使用标签处理程序实现自定义标签自定义标签的开发步骤编写实现标签功能的Java类,该类即为标签处理器对于无标签体标签,需要继承:javax.servlet.jsp.tagext.TagSupport对于有标签体标签,需要继承:javax.servlet.jsp.tagext.BodyTagSupportjavax.servlet.jsp.tagext.Tag接口Tag接口中的方法:–doStartTag():初始化标签的一些内容,如连数据库–doEndTag():作一些善后工作,如关数据库–release():释放这个标签对象–doAfterBody():完成标签体求值之后调用–doBeforeBody():开始标签体求值之前调用自定义标签的开发步骤编写标签库描述符(tld)文件?xmlversion=1.0encoding=UTF-8?!DOCTYPEtaglibPUBLIC-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//ENweb-jsptaglibrary_1_2.dtdtaglibtlib-version1.0/tlib-versionjsp-version1.2/jsp-versionshort-namejavawebtaglib/short-nameuri自定义标签的开发步骤在Web应用程序中部署和安装自定义标签库将标签文件存储在Web应用程序的WEB-INF目录下或子目录下但不能放在WEB-INF\classes目录和WEB-INF\lib目录中在JSP页面中导入和使用自定义标签语法:%@tagliburi=”uri”prefix=”prefix”%%@pagelanguage=javaimport=java.util.*pageEncoding=UTF-8%%@tagliburi==javaweb%htmlheadtitle/title/headbodyh2这是使用自定义标签,客户端的IP地址:hr/javaweb:showIpTag//h2/body导入标签库描述文件使用自定义标签1.5自定义标签与JavaBean的区别自定义标签与JavaBean的区别如下:JavaBean不能与jsp页面进行通信(不能在JavaBean中使用隐式对像),而自定义标签能通过pageContext对象访问JSP中一系列的隐含对象自定义标签比JavaBean更能将复杂的操作缩减为十分简洁的代码建立自定义标签比JavaBean更复杂如果要在Java类中获取JSP页面的环境信息并输出内容给浏览器,建议采用自定义标签如果要封装一个实体类,建议采用JavaBean2.自定义标签APIjavax.servlet.jsp.tagext.Tagjavax.servlet.jsp.tagext.IterationTagjavax.servlet.jsp.tagext.TagSupportjavax.servlet.jsp.tagext.BodyTagSupportjavax.servlet.jsp.tagext.BodyTag接口描述Tag定义了标签处理程序和JSP页面生成的Servlet之间的基本协议,以及所有标签处理程序的基本方法IterationTag扩展了Tag接口,增加了一个控制重复处理标签主体内容的方法BodyTag扩展了IterationTag接口,由需要对标签主体内容进行访问并能对其进行操作的标签处理程序使用自定义标签类与接口层次关系图2.1Tag、IterationTag、BodyTag接口2.2TagSupport类TagSupport类TagSupport类实现Tag和InterationTag接口doStartTag()方法JSP页面遇到开始标签时执行。方法签名:publicintdoStartTag()throwsJspExceptiondoStartTag方法返回常量EVAL_BODY_INCLUDE或SKIP_BODYEVAL_BODY_INCLUDE:Web容器执行标签的标签体后,进入doEndTag()SKIP_BODY:Web容器忽略自定义标签的标签体,直接解释执行自定义标签的结束标记,进入doEndTag()方法doEndTag()方法JSP页面遇到结束标签且通常在执行doStartTag()方法之后执行方法签名:publicintdoEndTag()throwsJspExceptiondoEndTag方法执行完后可向Web容器返回常量EVAL_PAGE或SKIP_PAGEEVAL_PAGE:Web容器接着执行JSP页面中位于结束标记后面的代码SKIP_PAGE:Web容器会忽略JSP页面中位于结束标记后面的所有内容TagSupport类doAfterBody()方法充许用户有条件地重新处理标签的主体,之后调用;标签无主体时不调用doAfterBody()方法方法签名:publicintdoAfterBody()throwsJspExceptiondoAfterBody方法执行完后可向Web容器返回常量EVAL_BODY_AGAIN或SKIP_BODYEVAL_BODY_AGAIN:Web容器会把标签体的内容重复执行;反复调用doAfterBody方法,直到返回SKIP_BODY2.3BodyTagSupport类BodyTagSupport类实现BodyTag接口,扩展TagSupport类BodyTagSupport类可支持开发需要访问和操纵标签主体内容的标签doStartTag()方法doStartTag方法返回常量EVAL_BOYD_INCLUDE、SKIP_BODY,EVAL_BODY_BUFFERED。EVAL_BODY_BUFFERED:Web容器创建专用于捕获标签体运行结果的BodyContent对象,调用setBodyContent方法将BodyContent对象的引用传递给标签处理器,将标签体的执行结果写入到BodyContent对象中doEndTag()方法JSP页面遇到结束标签且通常在执行doStartTag()方法之后执行publicintdoEndTag()throwsJspExceptionsetBodyContent()方法设置bodyContent属性域并提供具有BodyContent对象的类在执行doInitBody()方法之前,JSP页面会自动执行此方法方法签名:publicvoidsetBodyContent(BodyContentb)throwsJspExceptionBodyTagSupport类doInitBody()方法在setBodyContent()方法之后被调用,用于Web容器执行标签体之前初始化BodyContent对象方法签名:publicvoiddoInitBody()throwsJspExceptiondoAfterBody()方法充许用户有条件地重新处理标签的主体。在处理完标签主体后调用如果标签没有主体,则不会调用doAfterBody()方法方法签名:publicintdoAfterBody()throwsJspExceptionTagSupport与BodyTagSupport的区别üTagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。ü交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。ü用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport。üdoStartTag()的返回值:TagSupport:EVAL_BODY_INCLUDESKIP_BODYBodyTagSupport:多了EVAL_BODY_BUFFERED1.4一般标签的生命周期doStartTag()返回常量描述SKIP_BODY指引JSP引擎跳过处理标签体内容并继续执行doEndTag()方法EVAL_BODY_INCLUDE指引JSP引擎计算和包括标签主体内容EVAL_BODY_BUFFERED指引JSP页面计算标签体内容并调用doInitBody()方法doAfterBody()返回常量描述SKIP_BODY指引JSP引擎跳过处理标签体内容并继续执doEndTag()方法EVAL_BODY_AGAIN指引JSP引擎迭代计算过的标签主体,并再次调用doAfterBody()方法doEndTag()返回常量描述EVAL_PAGE指引JSP引擎继续计算页面的剩余部分SKIP_PAGE指引JSP引擎跳过计算JSP页面的剩余部分标签的生命周期publicclassTestTagextendsBodyTagSupport{publicintdoStartTag()throwsJspException{System.out.println(doStartTag方法被调用了...);returnthis.EVAL_BODY_BUFFERED;}publicvoidsetBodyContent(BodyContentbodyContent){System.out.println(setBodyContent方法被调用了...);super.setBodyContent(bodyContent);}publicvoiddoInitBody()throwsJspException{System.out.println(doInitBody方法被调用了.
本文标题:自定义标签的开发与使用(理论)
链接地址:https://www.777doc.com/doc-3449811 .html