JSP自定义标签开发接口与实现类方法的解读

一、Tag接口中主要的方法与字段
1、字段:
static int EVAL_BODY_INCLUDE
    通过输出流输出标签体中的内容。
static int EVAL_PAGE
    继续执行页面其余部分内容。
static int SKIP_BODY
    忽略标签体内容。
static int SKIP_PAGE
    忽略页面内容。

2、方法:
int doEndTag()
    执行实例对象的结束标签。
int doStartTag()
    执行实例对象的开始标签。
Tag getParent()
    为标签处理类获取自定义标签的父标签。
void release()
    调用标签处理类去等待释放当前存在的状态。
void setPageContext(PageContext pc)
    设置当前页面的内容。
void setParent(Tag t)
    设置标签处理类的父标签。.

Tag接口方法详解:
    JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。

1、public void setPageContext(PageContext pc)
	JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。   
2、public void setParent(Tag t)
	setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
3、public int doStartTag()
	调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
4、public int doEndTag()
	WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
5、public void release()
	通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。
 

二、IterationTag接口中主要的方法与字段
	IterationTag接口继承了Tag接口所以其字段与方法除了自己独有的外还保留了从父接口中继承来的。
1、IterationTag接口中的字段:
static int EVAL_BODY_AGAIN
    请求重新执行某一部分的标签体。
2、IterationTag接口中的方法:
int doAfterBody()
    执行或重复执行标签体。

从Tag接口中继承的字段:
    EVAL_BODY_INCLUDE, EVAL_PAGE,SKIP_BODY, SKIP_PAGE
从Tag接口中继承的方法:
    doEndTag, doStartTag, getParent, release,setPageContext, setParent

	
	
三、BodyTag接口中主要的方法与字段
    BodyTag接口继承了Iteration接口,除了保有从它的父接口中继承来的字段和方法外还有自己独有的字段和方法。

1、 BodyTag接口中的字段
static int EVAL_BODY_BUFFERED
    创建一个新的缓冲区去存放标签体的主体内容。
static int EVAL_BODY_TAG
    不赞成使用的字段。在Java JSP API 1.2后已用BodyTag.EVAL_BODY_BUFFEREDor IterationTag.EVAL_BODY_AGAIN替代了该字段的使用。

2. BodyTag接口中的方法
void doInitBody()
    对标签体内容进行初始化。
void setBodyContent(BodyContent b)
    设置标签体内容的值。
从其直接父接口ItrationTag中继承来的字段:
    EVAL_BODY_AGAIN
从Tag接口中继承来的字段:
	EVAL_BODY_INCLUDE,EVAL_PAGE,SKIP_BODY,SKIP_PAGE
从其直接父接口ItrationTag中继承来的方法:
    doAfterBody
从Tag接口中继承来的方法:
   doEndTag,doStartTag,getParent,release,setPageContext,setParent
   
   
四、TagSurpport类中主要的方法与字段
1、TagSurpport类中的字段:
protected  java.lang.String id
    自定义标签的id属性值,或空值
protected PageContext pageContext
    页面内容。
2. TagSurpport类中的方法:
int doAfterBody()
    默认的执行标签体。
int doEndTag()
    默认的执行结束标签并返回 EVAL_PAGE.
int doStartTag()
    默认的执行开始标签并返回 SKIP_BODY.
static Tag findAncestorWithClass(Tag from,java.lang.Class klass)
    查找一个最接近被给定类型的实例         
java.lang.String getId()
    获取标签id属性的值否则值为空。
Tag getParent()
    获取自定义标签的父标签。
java.lang.Object getValue(java.lang.String k)
    根据给定的键获取值。
java.util.Enumeration getValues()
    通过标签处理类获取枚举值。
void release()
    等待释放当前的状态。.
void removeValue(java.lang.String k)
    移除所给定键的值。
void setId(java.lang.String id)
    为标签设置id属性。
void setPageContext(PageContextpageContext)
    设置页面内容。
void setParent(Tag t)
    设置父标签的值。
void setValue(java.lang.String k, java.lang.Object o)
    根据所给定的键设置值。
从Itration接口中继承的字段:
	EVAL_BODY_AGAIN
从Tag接口中继承的字段:
	EVAL_BODY_INCLUDE,EVAL_PAGE,SKIP_BODY,SKIP_PAGE
从Object中继承的方法:
	clone, equals, finalize, getClass,hashCode, notify, notifyAll, toString, wait, wait, wait

	
五、TagSurpport类中主要的方法与字段
1、TagSurpport类中主要字段
protected BodyContent bodyContent
    当前标签体的内容。
2、 TagSurpport类中主要方法
int doAfterBody()
    当执行完标签体后不再重复执行标签体内容,而是继续执行页面内容。
int doEndTag()
    默认执行结束标签体返回值为 EVAL_PAGE.
void doInitBody()
	当第一次执行标签体时就初始化标签体。
int doStartTag()
    默认执行开始标签返回值为 EVAL_BODY_BUFFERED.
BodyContent getBodyContent()
    获取当前的页面内容。
JspWriter getPreviousOut()
    获取之前的输出。
void release()
    释放当前状态。
void setBodyContent(BodyContent b)
    设置页面内容。
	
用BodyTagSupport类主要方法详解:
BodyTagSupport类中增加了两个方法:
setBodyContent(BodyContent bc)
	容器在执行这个标签处理类的实例时,将调用该方法,把标签主体返回的内容缓存在BodyContent类的实例中。BodyContent除了从父类JspWriter继承提供用于向响应体中写入文本的方法,还提供了用于获取它缓冲的标签体内容。
doInitBody()
	计算标签主体之前调用该方法进行初始化共,可以向bodyContent对象中写入初始内容,这些内容会放置在标签主体内容之前。

 
BodyContent类专门用于缓存标签主体返回的内容,包括静态文本以及由嵌套标签或脚本元素所创建的动态内容。

从TagSupport类中继承的字段:
	id,pageContext
从BodyTag类中继承的字段:
	EVAL_BODY_BUFFERED,EVAL_BODY_TAG
从BodyTag接口中继承的字段:
	EVAL_BODY_AGAIN
从Tag接口中继承的字段:
	EVAL_BODY_INCLUDE,EVAL_PAGE,SKIP_BODY,SKIP_PAGE
从TagSupport类中继承的方法:
	findAncestorWithClass,getId,getParent,getValue,getValues,removeValue,setId,setPageContext,setParent,setValue
从Object类中继承的方法:
	clone,equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait,wait
从Tag接口中继承的方法:
	getParent,setPageContext,setParent

转载于:https://www.cnblogs.com/lizhangqu/p/4234554.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS JSP ASP .NET J2AM API接口和返回的版本 目前所有版本的JS JSP ASP .NET J2AM 都是提供源代码的,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译的语言,则提供了编译用的 shell 文件(Linux/Unix 下使用)和 bat 文件(Windows 下使用),或者直接提供编译好的二进制库文件。 不过为了让读者能够更清楚如何安装,我们还是对每种语言的安装都做详细的讲解,你可以在安装列表里找到你感兴趣的语言的安装方法。 示例 如果你已经把 JS JSP ASP .NET J2AM 安装好了,那么接下来就让我们开始第一个小程序吧。按照惯例,第一个演示程序几乎总是 HelloWorld,我们也不想打破这个惯例,不过对于 PHPRPC 来说,有服务器端就要有客户端,否则我们就没有什么好演示的啦,所以我们的第一个演示程序实际上是两个,一个是服务器端,另一个是客户端。我们都先用 PHP 语言来写好了。 服务器端 view plaincopy to clipboardprint? <?php include ("php/phprpc_server.php"); function HelloWorld() { return 'Hello World!'; } $server = new PHPRPC_Server(); $server->add('HelloWorld'); $server->start(); ?> 客户端 view plaincopy to clipboardprint? <?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); echo $client->HelloWorld(); ?> 对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器或命令行下运行客户端程序,你就可以看到结果了。 这两个程序几乎简单到无需解释的地步,所以如果你已经明白它们的意思,那么就可以直接跳过下面的解释,继续看后面的例子。 服务器端第 1 句是将 它的服务器端程序包含到你的程序里,之后的 2 - 4 句是定义一个远程调用的函数,你会发现它与本地函数没有任何区别。第 5 句是创建服务器端对象,第 6 句是添加要发布的方法,这里添加的就是刚刚定义的 HelloWorld 函数,在 PHP ,添加的发布方法是函数名的字符串表示,在其它语言可能略有不同。第 7 句是启动服务。 客户端就更简单了,第 1 句是将 它的客户端程序包含到你的程序里。第 2 句是创建客户端对象,其的参数就是服务器端的地址。第 3 句是对远程方法(函数)的调用,之后通过 echo 将它显示出来。如果顺利的话,执行后你就会看到输出的 Hello World!。 上面的例子是发布的是函数,下面我们来看一下的静态方法如何发布: view plaincopy to clipboardprint? <?php include ("php/phprpc_server.php"); class Hello { static function HelloWorld() { return 'Hello World!'; } } $server = new PHPRPC_Server(); $server->add('HelloWorld', 'Hello'); $server->start(); ?> 这个服务器端只要它的名字与发布的地址与上面那个发布函数的例子一样的话,上面的那个客户端就可以得到同样的结果,也就是说,在客户端看来是没有任何区别的。 它并不是只可以在 PHP 使用,它同样支持其它语言的服务器和客户端,而且还可以无差别的相互调用。 现在我们来看一下如何在 Java 调用这个 PHP 的服务器方法: view plaincopy to clipboardprint? import org.phprpc.*; interface IHello { public String helloWorld(); } public class HelloWorld { public static void main ( String [] args ) { PHPRPC_Client client = new PHPRPC_Client("http://127.0.0.1/server.php"); IHello clientProxy = (IHello)client.useService(IHello.class); System.out.println(clientProxy.helloWorld()); } } 当我们把这个例子编译之后,在命令行输入以下命令就可以看到执行结果了: java -classpath .;phprpc_client.jar HelloWorld 这个 Java 的客户端看上去比 PHP 的要稍微复杂一些,不过仍然很好理解。在 Java 客户端,我们使用了接口来描述远程方法,之后我们通过 useService 方法返回一个远程代理对象,该对象实现了我们定义的接口,之后我们就可以直接调用远程方法 helloWorld 了。如果你比较细心的话,你还会发现我们在 PHP 定义的方法和在 Java 定义的接口的名字的大小写有点不同,但是仍然可以正常调用。是的,PHPRPC 发布的方法是不区分大小写的。所以不论你所使用的语言是否区分大小写,都可以按照自己(或语言)的习惯来定义方法名。 在本章的最后,我们再来看一下在 JavaScript 如何调用它的服务。顺便再强调一下,服务器端不止是可以用 PHP 来编写,你同样可以使用其它语言(比如 Java,.NET,Ruby,Python 等),这里我们只是以 PHP 为例而已。在这个例子你还会看到如何使用加密传输。 view plaincopy to clipboardprint? <html> <head> <title>HelloWorld</title> [removed][removed] [removed] var client = new PHPRPC_Client('http://127.0.0.1/server.php', ['HelloWorld']); client.setEncryptMode(2); client.HelloWorld(function (result) { alert(result); }); [removed] </head> <body> </body> </html> 这个 JavaScript 是在网页运行的,这里建议大家要把 head 和 body 标签都写全,即使它们对你来说看上去没有什么用处,但是在有些浏览器,如果这些标签没有写全,或者写的不正确,程序就不能正确运行。 在这个例子,我们会发现在创建 PHPRPC_Client 对象时,除了要写服务器地址以外,还要将远程方法的名字作为参数,因为远程方法可能不止一个,所以这个参数是数组型的。 client.setEncryptMode(2); 这句是设置加密传输,参数 2 表示双向加密,就是参数和结果都加密(只不过这个 HelloWorld 比较特殊,它没有参数)。 接下来就是调用远程方法 HelloWorld 了,我们会发现它跟 PHP 和 Java 客户端的调用不太一样。是的,在 JavaScript 远程调用都是采用异步方式的,也就是说要获得结果,需要用回调函数,回调函数作为远程方法的最后一个参数,回调函数也有四个参数,这里我们只使用第一个参数,也就是返回结果 result,通过 alert(result); 我们就可以在浏览器看到最后弹出的 Hello World! 提示框了。 通过上面的例子,我们已经看到在 PHP、JavaJavaScript 这三种语言使用 PHPRPC 都很简单,但因为语言的不同,在写法和用法上又有一些差别。不过你不用担心其它的语言跟它们也会有很大的差别,因为在接下来的章节你很快就会发现其它语言跟这上面三种语言实现的写法和用法上的相似或相同之处了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值