清单A:执行XML/XSL 转换的示例标签及其所在的HTML页面html
<%@ taglib uri="http://www.jspinsider.com/jspkit/JAXP" prefix="JAXP"%>java
c:/xml/example.xml程序员
c:/xml/example.xslweb
以上的示例使用了简单的标签来访问处在幕后的更强大代码,标签部分的语句首先装载了一个XML文件,而后应用了一个XSL文件来将XML文件中的内容转换成某个表现格式,并发送给客户端,这一切仅仅只是用了一个很简单的标签。定制标签使得JSP项目中很容易建立重用的开放源代码模块,而你所须要的只是标签库和它的文档说明。服务器
能够说标签库是很重要的,接下来讲一说标签库的重要特性。并发
1.易于安装在多个项目上app
标签很容易从一个JSP项目迁移到其余项目。一旦创建了一个标签库,则只须要将全部的东西打包为一个JAR文件,你就能够在任何的JSP项目中从新使用。由于标签能够从新使用,标签库能够轻松地用于你本身的项目,因此标签库愈来愈通行。目前,最好的标签资源能够在JSPTags.com这个站点找到。jsp
2.扩展JSPide
标签库能够具有JSP规范(JSP 1.2)中的任何特性和功能,你能够无限制地扩展和增长JSP的功能,而无须要等待下一版本JSP的出现。例如,你对JSP的include调用不太满意。你能够创建本身的include标签,该标签执行的是你本身的规范。函数
3.容易维护
标签库使得JSP的web应用程序很是易于维护,缘由有:
(1)标签应用简单,对任何人而言都很容易使用、易于理解。
(2)全部的程序逻辑代码都集中放在的标签处理器和JavaBeans中。这意味着你在升级代码时,无须要对每一个使用该代码的页面进行修改,你只须要修改集中的代码文件即可。
(3)若是须要加入新的功能,你也无需修改任何已经存在的页面,能够在标签中加入额外的属性,从而引进新的行为,而其它旧的属性不变,这样全部旧的页面还能够正常工做。 例如你有一个让全部文本变蓝的标签:
My Text
但在后来项目中,你又想让蓝色变暗。你能够保留原有的标签,只要为其增长一个新的属性:shade ,以下所示:
My Text
全部旧的标签仍然能够产生蓝色的文本,但如今你可使用同一标签来产生变暗的蓝色文本了。
(4)标签提高了代码的重用性。那些通过屡次测试和使用的代码确定具备更少的bug。因此,使用定制标签的JSP页面也一样具备更少的缺陷,维护起来天然方便多了。
4.快速的开发时间
标签库提供一个简单的方式来重用代码。在服务器端的语言中,其中一个标准的重用代码方式是使用模板。相对于使用模板库,标签库是一个更好的解决办法。使用模板库,你必须为每一个项目修改模板或者且创建严格的界面,而标签库则没有这些限制,而且拥有全部面向对象的好处,能够作到灵活和更有扩展性,并且,经过重用代码,你能够花费更少的时间来作开发,更多的时间能够用在设计你的web应用上。标签库的接口也很简单,很是容易作插入、使用和调试。
虽然标签库很是易于使用,不过要创建一个标签库的内部实现机制仍是颇复杂的,起码要比创建一个简单的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 */
package ex;
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编码标签处理器
package ex;
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页面。
建立标签描述符
咱们须要描述自定义标签以让系统知道如何处理。该描述文件的后缀为.tld,TLD文件一般就以标签处理器命名,并存放在“/WEB-INF/”目录之下。请参看清单D。
清单D:HTML编码标签描述器
<?XML:NAMESPACE PREFIX = [default] http://java.sun.com/xml/ns/j2ee NS = "http://java.sun.com/xml/ns/j2ee" /><taglib xmlns="http://java.sun.com/xml/ns/j2ee" span="" <="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd" version="2.0">
1.0
1.1
HTML_FormatTag
empty
HTMLEncode
ex.HTML_FormatTag
更新Web XML文件
如今能够告诉JSP容器如何使用标签库了。为此要修改web.xml文件,具体说来是要在其中加入一个taglib的项目来注册该标签库,并为标签分配一个URI。URI是Web站点上惟一应用于这一特定标签的索引。因为标签从此还可能用在不一样的Web站点上,因此你最好采用完整的URL和/或者包名字(package name)来保证这一惟一性。这个例子是简化了,示例代码请参看清单E。
清单E:修改web.xml文件
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" span="" <="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
Welcome to Tomcat
Welcome to Tomcat
HTMLEncode
/WEB-INF/HTML_FormatTag.tld
使用新的标签
自定义的标签设置好后,就能够用在你的JSP页面上了。要作到这一点,只须要在页面上使用taglib指示命令声明所要采用的标签便可。标签经过其惟一的 URI被索引,而后被分配给一个名字空间前缀(prefix)。这一前缀并无什么特别的意义,只要它不与其它的名字空间冲突即可,能够任意。请参看如下的清单F和G。
清单F:在一个JSP页面上使用HTML编码标签
<%@ taglib uri="HTMLEncode" prefix="Examples"%>
清单G:范例代码的输出
网页源代码是:
<Hello,Simple sample>
经过这个标签,我就将该页面的全部<与>编码了。全部的自定义标签都是在服务器上处理的。这意味着你将不会在输出的页面上看到自定义的标签。
正如你所看到的那样,创建标签并不是难事。最麻烦的是学习标签处理器的整个细节。这是一个很强大的功能,咱们不过是触及了皮毛。因为这一过程须要采起的步骤不少,因此刚入门的JSP程序员可能在创建标签的时候会以为很困惑。
结论
标签库是JSP最重要的特性之一,它还处在不断的发展中。自定义标签库已经剥去了它的神秘面纱,愈来愈多的开发者也开始关注和使用它了。