JSP 与XML 联合开发技

JSP 与XML 联合开发技
 
jsp高级编程252页

taglib 编译指令
在JSP 程序中我们可以通过taglib 编译指令在J 中导入Tag Libraries 关于taglib 操
作指令的知识我们在本系列第一本书中已经提到过为了本书的结构完整起见我们把
这部分的内容复述如下供读者参考
JSP 程序可用的标记/指令集可以通过使用标记库(Tag Library)的形式来进一步扩充
在JSP 程序中用taglib 编译指令声明该程序中可以使用的标记库用URI 参数唯一地标
识这个标记库并指定一个相应的标记库识别符(prefix)用来辨别不同标记库标记的使用
如果一个JSP 编译器不能定位一个标记库(即在URI 位置处没有找到相应的标记库) 那么
会引发一个致命的编译错误如果在taglib 指令之前使用了它所引入的标记库识别符也
会引发致命的编译错误
标记库可以包含一个确认方法(Validation Method) 用这个方法可以确定JSP 页面是否
正确使用了该标记库的功能taglib 指令的语法形式如下所示
<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>
其中的属性含义是
 uri 唯一的指定标记库的绝对URI 或相对URI URI 用于定位这个标记库的位置
 tagPrefix 指定所用的标记库的识别符定义了<prefix:tagname>标记中的prefix
用以区别用户所使用的不同的标记库

<leaPrefix:myTag>
注意jsp jspx java servlet sun 和sunw 等是保留的标记库识别符用户不能定
义这样的识别符在目前的规范里空识别符是不允许的
下面的JSP 代码片断演示了在JSP 程序中如何使用自定义的标记库

<%@ taglib uri="leaApp/mytags" prefix="leaTags" />
...
<leaTags:playPingPong>
...
</leaTags:playPingPong>
在上面的代码中taglib 编译指令引入了一个自定义标记库该标记库的相对地址(URI)
为leaApp/mytags 该标记库的识别符是leaTags 这个JSP 程序不能够再使用这个识别符以
引入其它的标记库本例中我们假设此标记库中有playPingPong 这个Tag 并在JSP 程序
中使用它
注意如果Java 编译器碰到一个形如tagName 的标记这个标记是由taglib 编译指令
引入的但是tagName 在相应的标记库里不存在那么这也将导致致命的编译
错误假设在上面的例子中leaApp/mytags 标记库里没有定义playPingPong
这个标记那么将发生致命的编译错误
6.2.2 Tag Library 和Tag 的原理
本小节将介绍Tag Library 与Tag 的工作原理这个问题涉及到两大方面第一个方面
是JSP 程序的执行原理第二个方面就是Tag 的执行原理
我们首先介绍第一个方面JSP 程序的运行原理根据JSP1.2 规范的描述JSP 程
序的运行可以分为这样的几个步骤
Parsing
在这一步JSP 引擎将检查JSP 程序的源代码看看是否有违反语法的地方如果有
那么抛出错误信息不运行此JSP 程序如果一切正常那么就把这个JSP 程序翻译为XML
文件的格式也就是把这个JSP 程序按照XML 文件的格式重新写一遍我们在前面已经
提到过JSP 程序有两种书写方式一种方式是普通的HTML 标记加上JSP 指令与Java 脚
本第二种书写方式就是把JSP 指令替换为特定的XML 标记这些标记在一个DTD 文件
中给出了定义所谓的Parsing 过程就是把按第一种方式书写的JSP 程序翻译为以第二种方
式书写的JSP 程序并加上一些debug 信息例如
<%@ include file=”copyright.hmtl” %>
将会被替换为
<jsp:directive.include file=”copyright.html” />
在这一过程中JSP 引擎还会处理include 进来的文件识别那些是由JSP 指令转换过
来的XML 标记那些是程序员自定义的标记实际上我们可以直接以第二种方式书写
JSP 程序这样Parsing 过程会被JSP 引擎忽略掉JSP 程序的运行速度将有所加快的
 
第6 章 JSP 与XML 联合开发技术
Validation
这一步所作的工作就是验证JSP 程序中所使用的自定义标记库检查程序员是否正确
使用了该标记库的功能JSP 引擎会按照所使用的自定义标记库的出现顺序逐个验证它
们查看每一个自定义Tag 是否有对应的TagExtraInfo 类(亦即下文的TEI 类) 如果有
那么就调用相应的TagExtraInfo 类的isValid()方法检查程序员是否正确使用了该标记的属
性与参数
Translation
在这一步中JSP 程序(XML 格式的)被JSP 引擎翻译为一个标准的Java 类该Java
类一般继承了HttpJspPage 接口覆盖了_jspService()方法该类编译执行的结果就是我们
所看到的JSP 程序的执行结果请看程序清单6.1
程序清单6.1(test.jsp)
<%
out.println("你好");
%>
程序清单6.1 经过JSP 引擎翻译后所产生的Java 类文件如下所示(程序清单6.2 有少
量改动主要是代码缩进方面)
程序清单6.2
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.Ve

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值