</p>三、通过标记库JSP与XML交互
5 Y0 o( V1 z! ^. a2 [) Q' Y Y 这也就是在前文中重点提到的,但是因为它实在太重要了,所以在本文中我必须也要提到。标记库可以定义出现在JSP页面中的作为类XML元素的自定义标签,可以把特定的Java代码与每个标记都关联起来。 例如,假定你可以访问一个天气情况数据库,而且你需要输出现在的天气状况。 那么,你可以在JSP中插入JDBC程序代码直接查询数据库(虽然这并不是一个好的选择),把这些代码封装到一个JavaBean内,或者把它包装成一个标记库。 使用最后一个选择,你的JSP页面内的程序代码看上去就像:( R) N0 ? V7 A0 f6 L) o% V& A9 E
< %@taglib uri="the TLD file" prefix="foo" %>
9 v; ~3 f5 B- ]0 w1 h2 q8 r Current weather is < foo:Weather/>
, y$ O0 C5 { p8 ] 注意在上述程序代码中看不到任何Java代码的踪迹。 作为一个页面设计人员,你使用一种熟悉的语法就像< foo:weather/>,这些与其它的任何标记看起来非常相似。 在页面中包含现在的天气状况的HTML字符串的地方插入它。
# ^7 E6 k* [7 Y9 T4 v 标记库有一个关联的XML格式的描述符文件,名叫Tag Library Descriptor(标记库描述符,TLD)。 在TLD文件中的每个标记都有一个条目,包括它的名称,版本和其它的任选信息。 在JSP页面内,你可以用" < %@_taglib prefix = " foo " %> "指令指定TLD文件。 属性" prefix "用来指定一个前缀,用来在JSP页面内使用特定的库来引用任何标记。 那为什么我们要使用标记< foo:Weather/>而不仅仅是< Weather/>。 TLD文件的精确位置依赖于正在使用的应用程序服务器。6 e" Z. u5 ~+ M
一个标记库标记可以代替为了完成这段程序逻辑的相应的Java程序代码。 每个标记都相当于一个相同名称的Java类。 这个类必须实现TagSupport接口,包含捕获事件触发器方法作为处理这个页面的JSP引擎。 当它第一次遇到这个标记的时候,引擎就会调用doStartTag ()方法。 可以使这个方法为空或者当需要的时候才执行应用程序逻辑。 当该方法返回SKIP_BODY时,那么引擎跳过这个标记体。 当它返回EVAL_BODY_INCLUDE时,引擎将会处理这个标记以及它的子标记。 类似地,JSP引擎在分析了结束标记之后就会调用doEndTag ()方法。 doAfterBody ()方法让你可以在引擎处理元素体之后执行动作,但是必须在doEndTag ()方法作用之前。 下面就是实现天气状况的Weather类的一个样本程序代码:( t( f7 \) c V7 R2 N
import javax.servlet.jsp.*;) ~: t9 A. B5 q8 d6 o
import javax.servlet.jsp.tagext.*;
. u! h1 ] S; f% M: K( |. T import java.io.*;3 P" n2 Y/ v* s, m7 ~
public class Weather extends TagSupport {
) Y$ J% d. S6 A, s+ f& i- V% i public int doStartTag() {) e0 s: i" Q' m/ R8 r l3 H
try {
) c( L* K# R3 O6 U5 j3 Y- h JspWriter out = pageContext.getOut();
0 R- Y/ |, u4 O9 A( S out.print(" sunny and cloudy mixed with " +
6 n, E i( y+ ^5 f+ Q7 S/ X "rain and sunshine. ");: g0 M# v1 c# U, b1 Q( l+ _, P
} catch (IOException e) {7 N9 Y0 w! c! z7 ^+ w6 n; Q7 q
System.out.println("Error " + e);
3 v R# W3 a4 d8 f) I& _8 w% b/ Y }) l2 f2 i; z+ t, O/ h
return (SKIP_BODY);
: i T* `6 X# p Y# f, | }7 ^7 w1 k! u5 ~, v; L/ s9 Z
}# N+ w; }. T) a1 Q
当引擎遇到" < somePrefix:Weather/> "标记的时候,它会在标记库内搜索一个同名的类。 如果doStartTag ()方法被实现的话(在本例中是这样的),它就会被调用。 这就使字符串包含适应显示的天气情况。 因为方法返回了SKIP_BODY,JSP读取器移动到标记的末尾。' c9 V9 T+ [8 K+ c9 G
最简单的使用JSP和标记库的方法就是使用Apache Tomcat引擎。 这个引擎也充当Servlet和JSP应用程序接口的引用实现。* y. g+ q' ?1 E( @
当使用标记库时,JSP页面看上去就非常像XML文件了。 当JSP页面被处理时,引擎执行与标记相关联的程序代码(实际上,首先调用JSP引擎把JSP页面翻译成一个servlet,然后再编译servlet。 与标记库相关联的方法都被包含在servlet中。),一个熟悉XML的人就可以设计并使用各种各样的页面布局进行试验,而不必改变任何Java程序代码。当然,代码与数据的分离的程度还是主要依赖标记库元素设计的好坏程度。
: f& |+ t& A R' k8 Q2 ^/ e JavaServer Pages ( JSP)和XML是Sun的J2EE的两个至关紧要的组件。 JSP是用于创建应用程序服务器端程序的有效工具,而客户可以是一个浏览器,一个设备或其它的应用程序。 |