自定义标签的理解和编写

自定义标签的理解和编写

一、简单自定义标签

1):标签处理程序编写 可以继承自 TagSupport 或者BodyTagSupport ,具体看自己有没有标签体。在这里可以给标签设置属性。

2):标签描述文件

3):在JSP文件中访问。

可以

在这里完成一个简单的任务: BodyTag里面的内容添加颜色 在标签处理函数里面添加以下代码:

 

String content=bodyContent.getString(); 得到标签体 的内容。

             bodyContent.clearBody(); 清除标签体内容

             bodyContent.print("<font color="+color+">"); 天价格是控制符,这里color作为属性了

             bodyContent.print(content);   补上 内容

             bodyContent.print("</font>");   添加 格式控制

             bodyContent.writeOut(out);  输出

 

当然了 在上面的 得到了标签内容以后,可以做其他的处理,比如在论坛程序里面,可以设置屏蔽的关键字 ,每当检测到 不允许的关键字就用* ** 替换 ,在这里很容易实现 ,就不罗硕了 呵呵。

 

二、jsp 中还提供了 简单标记,在编写的时候 ,比较简单,只要简单的继承 SimpleTagSupport就可以了 ,然后 重写doTagSupport方法就可以了

 

1)每一次遇到标签时候。容器都会创建一个simpleTag实例, 并且这个方法没有参数,和经典标签一样,SimpleTag 不可以进行缓冲,因此不可以重用,咩一次都要重新构造实例。

 

PS:  经典标签开发的时候,有一个继承自BodyTagBodyTagSupport的类 这个里面实现了bodyTag接口里面的doStartTag()doEndTag()方法,并且返回值是 doStartTag方法的返回值为EVAL_BODY_BUFFEREDdoAfterBody() 返回值为SKIP_BODYdoEndTag() 返回值为EVAL_PAGE

 

2)调用了构造方法以后,就调用setJspContext(),setParent()方法。只有有父类标签的时候 才调用后者,

 

3)容器调用每个setter方法给属性赋值

 

4)如果body存在,就调用setJspBody()方法,设置这个标签的标签体,

 

5)容器调用doTag方法,所有标签逻辑、迭代、和Body 有关的计算都放在这里,

 

6doTag方法 返回时,所有参数都被锁定。

 

 

 

 

 

补充:关于标签缓冲

经典标签开发的时候,有一个继承自BodyTagBodyTagSupport的类 这个里面实现了bodyTag接口里面的doStartTag()doEndTag()方法,并且返回值是 doStartTag方法的返回值为EVAL_BODY_BUFFEREDdoAfterBody() 返回值为SKIP_BODYdoEndTag() 返回值为EVAL_PAGE

 

 

这一个网站里面讲解的比较好 讲解包括了标签的编写和标签执行的原理,有很大的参考价值

 http://www.soft6.com/tech/16/169433.html


  BodyContent
是一个输出器,是对JSPWriter的扩展(???)。主要是向其输出内容。  

this.getBodyContent()是标签体内容的缓存,输出这部分内容需要写回外层写入器才能输出。  
  this.getBodyContent().clear();  
清空缓存  
  this.getBodyContent().print(filteredContent);  
往缓存中增加内容  

PS:如果自己想在标签中输出内容,可以用bodyContend.print(“你要输出的内容”);
  this.getBodyContent().writeOut(pageContext.getOut());
输出缓存(适用于外层写入器,如doEndTag()  
  writeOut()  
的参数getPreviousOut(),输出缓存。(适用于内层写入器,如doAfterBody()jsp

 BodyContent对象的内容不自动写了入Servlet的输出流,而是积累在一字符串缓存中。当标签体完成后其对象仍可在doEndTag()方法中可以应用,由getString()getReader()方法操作。并在必要时修改及写入恢复的JSPWriter输出流。

EVAL_BODY_BUFFERED

  表示需要处理标签体。

  EVAL_BODY_INCLUDE

  表示需要处理标签体,但绕过setBodyContent()doInitBody()方法

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值