让
XML
看得见
将
XML
同
Web
系统的用户界面进行集成显然是一种有益的尝试。绝大多数的界面程序,无论是基于还是不基于
Web
,都是将数据进行转换,然后用易读的格式展现给用户。用诸如
XML
这种
“
易消化
”
的格式存放数据将简化上述工作,同时它还大大提高了内容的可管理性,接下来我们就可看到这一点。不过首先要大书一笔的是,
XML
在
Web
界面层的应用得益于
JSP
技术的发展。
一直以来大家都希望能清晰地区分
Web
应用程序的表示层与底层对象模型,
JSP
框架诞生于这些努力之中(包括早期
JHTML
尝试)。
JSP
框架允许将
Java
代码嵌入到
HTML
内容中,这样既可以实现动态内容,又不必经常修改
Java Servlets
的代码。在页面中包含
Java
技术的途径是通过
JSP
标记(
JSP Tags
),这些标记以
XML
风格出现。在
JSP
中,
Java
程序以代码片段、服务器端
JavaBeans
组件、在服务器端触发特定操作的不透明标记(标准的或自定义的)等形式存在。当某个用户通过浏览器请求
JSP
页面时,一个
Java
应用服务器解析该
JSP
页面,将其编译成一个
Java Servlet
,然后执行该
Servlet
以产生答复页面。
一种直接将
XML
数据源集成到
JSP
的界面中去的方法是,将
XML
加载到
JavaBeans
组件中(如同我们在
MediaAsset
例子中所做的),然后在
JSP
中直接引用这些
JavaBeans
组件。
下面是一个嵌入
Java
代码片断的例子:
第
14
讲的媒体资源
!--
引入我们的类
--
>
<%@
!--
定义一个资源对象,以便用于显示
--
>
!--
从一个先前定义的位置装载资源
--
>
<% MediaParser parser
=
new MediaParser
();
Collection assets
=
parser
.
loadAssets
(
"http
:
//javaschool
.
org
/jaf/E162/lecture14
-
assets
.
xml"
);
Iterator iter
=
assets
.
iterator
();
%>
其中粗体部分为
JSP
代码片断和标记,其余部分是标准的
HTML
文本。
上述程序还有一种更简洁的写法,那就是使用自定义
JSP
页面标记。这样我们就可以从
JSP
页面中剔出代码段,只使用
JavaBeans
组件和自定义的
JSP
标记即可。比如说,为了去掉创建解析器、加载资源数据到集合中的那段代码,我们可创建一个自己的标记,由它在幕后完成这些工作。以下是例子:
.
<
!--
引入我们的类
--
>
<%@
!--
加载我们自定义的标记库
--
>
<%@
<
!--
从一个先前定义的位置装载资源
--
>
使用自定义标记的最大好处是使我们的程序代码集中在一个地方(对
Java
技术而言,一般是指在
“
类
”
中),易于管理。这样可以将程序中对象层同界面层的集成关系定义得很清晰,修改代码所造成的影响是可以预测和管理的。
直接将
XML
数据转换成
Web
显示内容的另一种方法是使用
XSL
和
XSLT
。在这种方案中,将
XML
数据映射成
HTML
(或
WML
等)的逻辑由
XSL
样式表(
XSL StyleSheet
)来定义。样式表描述了每个特定
XML
数据实体应该怎样转换成界面数据实体(如
HTML
表格、内联标记等)。在
JSP
架构中,
XSL
转换只能应用于特定的
XML
数据源,最理想的是采用一套自定义的
JSP
标记并引用某个
XSLT
处理程序。这方面的典型示例请参考
java
.
sun
.
com
中关于
XML
同
JSP
构架集成的白皮书。
同前面那个
JSP
自定义标记加
XML
解析器组件的方案相比,
XSLT
方案的伸缩性要好一些,而且具有更好的可管理性。在这种情形下,我们的转换逻辑是编写在一个
XSL
样式表中,而不是在
Java
代码中。这意味着当需要修改界面时,大多数情况下只是编辑样式表或者
HTML
,代码不受影响。不过在决定选用何种方案之前,还是要根据实际状况仔细权衡。如果选用
XSLT
方案,那么就得有人负责维护这些
XSL
样式表(要么是负责界面的人,要么是编写程序的人)。
XSLT
既像内容,又像程序,因此双方都不能把责任推给对方,结果大家可能都被这不伦不类的
XSLT
弄得矛盾百出。从这点上考虑,采用自定义标记并由界面开发者将其嵌入表示层的方法似乎更有吸引力,因为这样软件工程师只考虑
Java
代码,而内容工程师也只操心内容标记。(软件设计师)
Java servlet
过滤器是
J2EE 1
.
3
版在其
Web
层最新发布的一种
Web
组件。当
Sevelet
将请求写入某个资源或者从某个资源中读取回答信息时,过滤器可以非常方便地转换其中的头信息和内容信息。这里所说的资源可以是一个
Java servlet
、一个
JSP
页面,甚至一个静态
Web
页。过滤器的确很
“
酷
”
,因为它允许开发人员从转换内容的代码中分离出生成内容的那部分代码,并加以重用。当需要通过
XSLT
方式将
XML
数据转换到不同的
XML
应用目标时,
Java servlet
过滤器尤其有用。(软件设计师)
在
J2EE
应用程序中使用
Java servlet
过滤器转换其输出,以便兼容任何类型客户端的前景呼之欲出。
servlet
过滤器能够侦测到来自使用
WAP
协议(无线应用协议)的移动客户端的呼叫,并且将答复内容转换成
WML
(无线标记语言)格式。
servlet
过滤器也能检测到来自
iMode
无线客户的呼叫,并将其转变成
cHTML
(紧凑
HTML
)格式。当然,
servlet
过滤器也能够分辨出传统的
HTML
浏览器客户的请求,并用正确的格式进行回复。
结束语
在
J2EE 1
.
2
.
1
规范中,
XML“
集成
”
仅指组件或应用程序的
XML
格式的部署描述。在
J2EE 1
.
3
规范中,对
XML
的支持被扩展为要求具备
SAX 2
和
DOM 2
解析器,以及在兼容
J2EE
的服务器平台上提供
XSLT
转换处理程序。您可以毋庸置疑地相信,将来在
J2EE
架构中还会集成进更多的
XML
特性,因为
J2EE
规范的定义者们会认真倾听开发者社区中对在企业级应用中使用更多
XML
的渴求呼声。例如,
JSR
(
Java
定义请求)处理小组中与
JAXM
规范相关的部分(
JSR 000067
)承诺在
J2EE
后续规范中集成进
JAXM
。可以预见,在
JSP
架构、
EJB
和
JDBC
规范中均会有类似的变化。
J2EE
平台中上述组件的变革,将使
Java
技术开发者目前用的
XML
更为规范化(以及标准化),发挥出更大的威力。