| 发表于:2007-01-10 10:33:423楼 得分:0 |
建立一个自定义的标签 1.创建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() ); } } 2.创建标签处理器 标签处理器的代码请参看清单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页面。 3.创建标签描述符 我们需要描述自定义标签以让系统知道如何处理。该描述文件的后缀为.tld,tld文件通常就以标签处理器命名,并存放在“/web-inf/”目录之下。请参看清单d。 清单d:html编码标签描述器 <?xml version= "1.0 " encoding= "utf-8 " ?> <!doctype taglib public "-//sun microsystems, inc.//dtd jsp tag library 1.1//en " "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd "> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>html_formattag</shortname> <uri></uri> <info>html encoding tag </info> <tag> <name>htmlencode</name> <tagclass>html_formattag</tagclass> <info>encode html</info> </tag> </taglib> 更新web xml文件 现在可以告诉jsp容器如何使用标签库了。为此要修改web.xml文件,具体说来是要在其中加入一个taglib的项目来注册该标签库,并为标签分配一个uri。uri是web站点上唯一应用于这一特定标签的索引。由于标签今后还可能用在不同的web站点上,所以你最好采用完整的url和/或者包名字(package name)来保证这一唯一性。这个例子是简化了,示例代码请参看清单e。 清单e:修改web.xml文件 <?xml version= "1.0 " encoding= "iso-8859-1 "?> <!doctype web-app public "-//sun microsystems, inc.//dtd web application 2.2//en " "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd "> <web-app> <taglib> <taglib-uri> htmlencode </taglib-uri> <taglib-location> /web-inf/html_formattag.tld </taglib-location> </taglib> </web-app> 使用新的标签 自定义的标签设置好后,就可以用在你的jsp页面上了。要做到这一点,只需要在页面上使用taglib指示命令声明所要采用的标签即可。标签通过其唯一的 uri被索引,然后被分配给一个名字空间前缀(prefix)。这一前缀并没有什么特别的意义,只要它不与其它的名字空间冲突便可,可以任意。请参看以下的清单f和g。 清单f:在一个jsp页面上使用html编码标签 <%@ taglib uri= "htmlencode " prefix= "examples " %> <pre> <?xml:namespace prefix = examples /><examples:htmlencode> < hello , simple sample > </examples:htmlencode> </pre> 清单g:范例代码的输出 < hello , simple sample > which displays as: < hello , simple sample > | | |
|