标签的组成结构 虽然标签库非常易于使用,不过要建立一个标签库的内部实现机制还是颇复杂的,起码要比建立一个简单的JavaBean复杂。这个复杂是来自于标签库是由几部分构成的。不过,你只需要掌握了Java和JSP的知识就够了。 一个简单的标签由下面的元素构成: 1.JavaBean:为了得到Java与生具来的面向对象的好处,可重用的代码应该放到一个独立的代码容器中,也就是JavaBean。这些JavaBeans并不是标签库必不可少的一部分,但它们是标签库用来执行所分配任务的基础代码模块。 2.标签处理器:标签处理器是标签库的真正核心。一个标签处理器(tag handler)引用它所需要的任何外部资源(JavaBean)并且负责访问JSP页面的信息(PageContext对象)。而JSP页面则把页面上设置的标签属性和标签体中的内容都传递给标签处理器,当标签处理器完成其处理过程后,它就会把处理后的输出结果回送给JSP页面做进一步处理。 3.标签库描述符(TLD文件):这是一个简单的XML文件,它记录着标签处理器的属性、信息和位置等信息。JSP容器通过这个文件来得知从哪里及如何调用一个标签库。 4.Web站点的web.xml文件:这是Web站点的初始化文件,在这个文件中,需要定义了Web站点中用到的自定义标签,以及用来描述每个自定义标签的tld文件。 5.发布文件(WAR或JAR文件):如果你想重用自定义标签的话,你需要一个方法来将它由一个项目迁移到其他项目中去。将标签库打包为一个JAR文件是一个简单而且有效的方式。 6.JSP页面上的标签库声明:要在JSP页面中的使用某个自定义标签的话,需要使用标签库标示符在页面上进行声明。 看来要做的工作很多,刚开始用的时候当然会有点棘手,不过其实并不是很难。它的要点并不在于编码,而是在于如何将各部分正确地组织起来。这种层次性的结构是很重要的,它令标签的使用灵活和更容易转移。更重要的事,这些层次可以让整个建立标签库的过程都能通过JSP IDE(JSP的集成开发环境)自动完成。JSP IDE更可以自动完成创建定制标签的大部分工作,而你自己则只需要负责建立代码和标签处理器。 (注意:一个标签处理器仅定义一个自定义标签;一个标签库是几个处理相同任务的标签处理器的集合) 建立你的第一个标签 以下将一步一步地教你如何建立自定义的标签,具体的例子是扩展JSP,令它拥有自己的HTML编码功能。这个功能将所有的<和>字符用 HTML代码来代替。它可以很容易地扩展为做其它的编码处理。为了简化,这个例子只解释了建立自定义标签的基本要素。 创建JavaBean 代码中的任何可重用部分都应该放到一个JavaBean中。这一点是很重要的。这样你就可以在其他项目中重用这些代码了。由于任何放置在标签处理器内的代码在标签外都是不可以重用的,因此将可重用的代码部分独立开来是很重要的。在这个例子总,为HTML编码的逻辑是常用的,因此放到JavaBean中,请参看清单B 清单B:HTML编码JavaBean /* HTML_Format.java */ public class HTML_Format extends Object implements java.io.Serializable { /** 创建新的HTML_Format */ public HTML_Format() {} /** 将一个字符串中所有的所有 < 和 > 字符用响应的HTML编码代替 */ public String HTML_Encode(String as_data) { int li_len = as_data.length(); /*string buffer的长度要比原来的字符串长*/ StringBuffer lsb_encode = new StringBuffer(li_len + (li_len/10)); /* 循环替换全部的< 和 > 字符 */ for( int li_count = 0 ; li_count < li_len ; li_count++) { String ls_next = String.valueOf(as_data.charAt(li_count)); if (ls_next.equals("<")) ls_next = "<"; if (ls_next.equals(">")) ls_next = ">"; lsb_encode.append( ls_next ); } return( lsb_encode.toString() ); } } 创建标签处理器 标签处理器的代码请参看清单C: 清单C:HTML编码标签处理器 import java.io.IOException; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*;
public class HTML_FormatTag extends BodyTagSupport { /* 1) 在标签末将会调用这个函数 */ public int doEndTag() throws JspTagException { try { /* 2)得到标签中的文本 */ BodyContent l_tagbody = getBodyContent(); String ls_output = ""; /* 3)如果标签体有文本,就处理它 */ if(l_tagbody != null) { HTML_Format l_format = new HTML_Format(); /* 3a) 将标签体的内容转换为一个字符串 */ String ls_html_text = l_tagbody.getString(); ls_output = l_format.HTML_Encode(ls_html_text); } /* 4)将结果写回到数据流中 */ pageContext.getOut().write(ls_output.trim()); } catch (IOException e) { throw new JspTagException("Tag Error:" + e.toString()); } /* 让JSP继续处理以下页面的内容 */ return EVAL_PAGE; } } 这个处理很简单,它包括有: 1.读入位于开始和结束标签间的文本 2.调用html编码函数 3.将结果返回到JSP页面。 |