自定义标签的理解和编写
一、简单自定义标签
(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: 经典标签开发的时候,有一个继承自BodyTag的BodyTagSupport的类 , 这个里面实现了bodyTag接口里面的doStartTag()、doEndTag()方法,并且返回值是 :doStartTag方法的返回值为EVAL_BODY_BUFFERED。doAfterBody() 返回值为SKIP_BODY,doEndTag() 返回值为EVAL_PAGE 。
(2)调用了构造方法以后,就调用setJspContext(),setParent()方法。只有有父类标签的时候 才调用后者,
(3)容器调用每个setter方法给属性赋值 ,
(4)如果body存在,就调用setJspBody()方法,设置这个标签的标签体,
(5)容器调用doTag方法,所有标签逻辑、迭代、和Body 有关的计算都放在这里,
(6)doTag方法 返回时,所有参数都被锁定。
补充:关于标签缓冲
经典标签开发的时候,有一个继承自BodyTag的BodyTagSupport的类 , 这个里面实现了bodyTag接口里面的doStartTag()、doEndTag()方法,并且返回值是 :doStartTag方法的返回值为EVAL_BODY_BUFFERED。doAfterBody() 返回值为SKIP_BODY,doEndTag() 返回值为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()方法