作者:ma_yk
摘要
在jsp中有一种机制,可以让你在jsp页面中插入与html类似的标记。本文介绍jsp定制标记的基本概念和构成,以及如何开发和应用jsp定制标记。
关键字
jsp,xml,tld,标记符
什么是标记
使用html语言我们可以这样去编辑我们的网页:
hello world
hello world
在这里我们把,
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
在上例中就是一个jsp定制标记符。widtht、height是这个标记的属性。<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>是一个标记库定义指令,在稍后我们将会讨论。在jsp中定制标记符,实质上就是以标记的形式封装了一个俱有独立功能的java类。标记的使用减少了直接嵌入jsp页面的java代码,方便了页面的布局,并且有利于代码的复用,提高了开发的效率。
jsp服务器解析标记的过程
那么当一个标记被嵌入jsp页面后,jsp服务器是如何对这个标记进行解析的呢?下面让我们一起看一下它的顺序图:
图中各对象的含义如下所示:
client: 表示客户端。
jsp-server:jsp服务器。
jsp-page:jsp页面。
tld: 标记库描述文件,定义标记和标记的各种属性和处理文件等。
tagclass 标记处理程序
当一个用户访问一个jsp页面时,这个请求被发送到jsp服务器,jsp服务器会根据这个请求去调用相应的页面,如果这个页面中有自定义的标记,jsp服务就会根据页面指令<%@ taglib>去访问tld得到处理程序的相关信息,接着调用该处理程序的构造器方法,启动标记符处理程序,并读取标记符的属性和相应值。对每个没有设置属性的,调用相应的set方法。当标记符第一次使用时,它的任何属性都不会做过设置,因此对每个属性都调用set方法。属性设置完以后,jsp服务器调用处理程序的dostarttag(),然后再调用doendtag()方法。最后jsp服务器会继续处理剩下的页面,在页面结尾调用release()方法,清理占用的所有资源。
tld文件
tld(tld:tag library descriptor标记库描述符)文件,标准的xml格式的标记定义文件,被用来存放标记符的信息,下面就是一个典型的tld文件。
public "-//sun microsystems, inc.//dtd jsp tag library 1.1//en"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
tagclass.login.login
在这个tld文件中定义了只有一个标记符的标记符库,这个名为login的标记符会调用一个applet以验证用户的合法性。处理这个标记的类就是tagclass.login.login。width、height是这个标记的两个属性。属性是在使用标记符时作为参数发送的值。我们可以在上面的示例中增加几个标记,也可以为每个标记添加几个属性。我们开发标记符库时不一定非要从头开始,自己编写一个全新tld。我们可以使用某个集成的开发的环境,也可以修改上面的例子。
taglib指令
那么当jsp服务器在解析一个标记符时,它是如何定义一个标记库的呢?这就是taglib指令的主要责任。
taglib 指令
定义一个标记库以及其自定义标记的前缀.
jsp 语法
<%@ taglib uri="uritotaglibrary" prefix="tagprefix" %>
例子
<%@ taglib uri="/tlds/taglib.tld" prefix="tagclass" %>
描述
<% @ taglib %>指令声明此jsp文件使用了自定义的标记,同时引用标记库,
也指定了他们的标记的前缀。 你必须在使用自定义标记之前使用<% @ taglib %>指令。
属性
uri="uritotaglibrary" :uniform resource identifier (uri)根据标记的前缀对自定义的标记进行唯一的命名,uri可以是一个相对或绝对的路径。
prefix="tagprefix":在自定义标记之前的前缀。如上例中的
标记符的处理程序(tag handle)
我们还是以一个例子来看下如何实现一个tag handle。首先是看一下它的类图:
让我们再看一下它的代码:
package tagclass.login;
import javax.servlet.jsp.tagext.tagsupport;
import javax.servlet.jsp.*;
import java.io.*;
public class login extends tagsupport
{
public login()
{
super();
}
public int dostarttag() throws jsptagexception
{
jspwriter out = pagecontext.getout();
try
{
out.println("");
}
catch(exception e)
{
}
return skip_body;
}
publicc int doendtag()throws jsptagexception
{
return eval_page;
}
public void release()
{
super.release();
}
public void setwidth(string language)
{
this.width = width;
}
public string getwidth()
{
return this.width;
}
public void setheight(string height)
{
this.height=height;
}
public string getheight()
{
return this.height;
}
private string width;
private string height;
}
从以上我们可以看出,实现一个简单的标记符处理程序有几个要求:①增加一个类,使之继承java.servlet.jsp.tagext.tagsupport类。这个类提供了java.servlet.jsp.tagext.tag接口所要求的所有的方法。另外,还需要使用一些基本的api,使jsp容器能够调用我们自己提供的标记符处理程序。②必须为每个标记符属性分别创建一个get
skip_body隐含0 :跳过了开始和结束标签之间的代码。<
闽公网安备 35060202000074号