a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 134|回复: 1

[专业语言] JAVA认证:剖析JSP与XML的交互编程技巧

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
JavaServer Pages ( JSP)和XML是Sun的J2EE的两个至关紧要的组件。 JSP是用于创建应用程序服务器端程序的有效工具,而客户可以是一个浏览器,一个设备或其它的应用程序。 你可以使用XML描述数据并在联系服务器与系统的其余部分之间传递。 如果你仔细考虑Web服务的抽象概念的话,JSP可以被认为是实现技术而XML则是数据封装和消息传送技术。 JSP页面可以通过三种方式使用XML:直接使用XML文件,使用JavaBeans来执行XML处理或者通过标记库使用XML。   一、直接使用XML' p& b* L( _, b. \, n, R: w1 z
  我们可以在JSP页面中直接使用XML,这要分为三类:: F8 w9 j, B3 `
  1. JSP可以读取XML文件并且基于这些数据执行动作。例如:一应用程序可以读取具有某些特定结构的数据的XML文件。
  B! n( K9 X3 t  2. JSP可以创建XML文件以发送数据到客户程序或其它的应用程序。 JSP可以转换XML文件,这个变换可以是交给XSLT处理,由JSP作为控制器,或者通过非XSLT解决方案来完成。 在这两种情况下,JSP的作用都是读取XML文件,转换它并生成一个输出。
. G3 U  _3 N! x  [% T$ _. T  因为JSP包含内嵌的Java程序,所以它可以直接地调用一个分析程序来读/写xml数据。 这是非常不合理的方法,因为数据和代码逻辑并不能很好的被分离开。 另外,这样的程序也很难读得懂。 所以,下面我将介绍第二方法:使用JavaBeans。! `& @4 ~& c4 a6 a0 u; }
  二、使用JavaBeans
% I( U1 q6 c5 p* _0 l9 Q  JSP可以通过< jsp:usebean>标记与JavaBeans紧密的整合起来。 下面的程序片段示范了如何使用在JSP页面中的一个JavaBean来设置并获取属性。
& e. p$ q* |" m! I  < jsp:useBean id="cb" scope="session" class="xmlrep.Customer" />
  q/ k/ o% M3 q8 r6 w: F  < jsp:setProperty name="cb" property="id" value="45" />& R# g! Y) g# L% X3 s
  < B> First Name is: < /B>
: ?- l7 {' g# ~' S4 D0 S  < %=cb.getFname() %>
; }% p6 [6 m/ s, Q: o0 g3 Y- |  < p>
, P% S( {+ B# ]; Z- O  < B> Last Name is: .< /B>
1 ^) C) O0 P  L: s) l  < %= cb.getLname() %> . r8 H0 W: y9 I1 s! T
  JSP与JavaBeans整合的特征就是可以自动把超文本标志语言的表单元素翻译成JavaBean属性。 如果有一个HTML表单并且想让它向JavaBean提交表单内容,你可以写下面的代码:8 r* e, N' K  [0 y/ V
  < jsp:setProperty name="cb" property="*" />3 B8 O( b3 F8 V2 i
  name属性包含JSP页面已经引用Bean的值。 前面< jsp:useBean>标记设置名称为" cb "。 与设置单独的Bean属性不同,你可以使用星号来标志"全部的"属性。 JSP页面自动地映射HTML表单值为同名的Bean属性。 如果你读取每个HTML表单元素,然后调用相应属性的Bean设置方法,那么结果也将是相同的。# ~# a( Z$ U( h. f  k$ c
  可以看到,类XML的标记允许JSP页面访问JavaBeans。 我们通过尽可能多的把封装的代码转变成可重用组件(JavaBeans),就可以把JSP页面中代码优化到最小的程度。 你可以使用通用的语法分析程序,像Xerces或者JAXPI,在单独的JavaBeans里与XML文件交互作用--并且你可以在不改动JSP页面的情况下改变分析程序。 此外,Beans还可以使用XSLT来执行XML文件的转换。
3 z3 {! j# G& S& U1 H5 n1 H
, p: d5 O* n8 L2 Z3 E: y' |6 n  使用JSP和JavaBeans来完成的这些抽象的动作比直接在JSP页面中插入原始的Java程序要好得多,但是你仍然需要熟悉Java程序,以便随时改变JSP页面。 应用程序的一致性与条理性依靠JavaBeans合作创建一个统一的输出结果的好坏程度。 例如,Bean中的缺陷可能会造成整个XML输出无效。 依靠Beans指定资源的方法,可能同时带来执行性能的问题。 
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:剖析JSP与XML的交互编程技巧

 </p>三、通过标记库JSP与XML交互
& F: ~; e5 H2 [3 b( Z: n  这也就是在前文中重点提到的,但是因为它实在太重要了,所以在本文中我必须也要提到。标记库可以定义出现在JSP页面中的作为类XML元素的自定义标签,可以把特定的Java代码与每个标记都关联起来。 例如,假定你可以访问一个天气情况数据库,而且你需要输出现在的天气状况。 那么,你可以在JSP中插入JDBC程序代码直接查询数据库(虽然这并不是一个好的选择),把这些代码封装到一个JavaBean内,或者把它包装成一个标记库。 使用最后一个选择,你的JSP页面内的程序代码看上去就像:
) R, e; U; r, y8 \$ R  < %@taglib uri="the TLD file" prefix="foo" %>" a2 s+ u2 Q; a
  Current weather is < foo:Weather/>4 I" ~1 h" e# g7 Z, t) H/ m, L
  注意在上述程序代码中看不到任何Java代码的踪迹。 作为一个页面设计人员,你使用一种熟悉的语法就像< foo:weather/>,这些与其它的任何标记看起来非常相似。 在页面中包含现在的天气状况的HTML字符串的地方插入它。( N$ q* C. ]% ~, o# V
  标记库有一个关联的XML格式的描述符文件,名叫Tag Library Descriptor(标记库描述符,TLD)。 在TLD文件中的每个标记都有一个条目,包括它的名称,版本和其它的任选信息。 在JSP页面内,你可以用" < %@_taglib prefix = " foo " %> "指令指定TLD文件。 属性" prefix "用来指定一个前缀,用来在JSP页面内使用特定的库来引用任何标记。 那为什么我们要使用标记< foo:Weather/>而不仅仅是< Weather/>。 TLD文件的精确位置依赖于正在使用的应用程序服务器。4 l9 n2 }) `5 W- U
  一个标记库标记可以代替为了完成这段程序逻辑的相应的Java程序代码。 每个标记都相当于一个相同名称的Java类。 这个类必须实现TagSupport接口,包含捕获事件触发器方法作为处理这个页面的JSP引擎。 当它第一次遇到这个标记的时候,引擎就会调用doStartTag ()方法。 可以使这个方法为空或者当需要的时候才执行应用程序逻辑。 当该方法返回SKIP_BODY时,那么引擎跳过这个标记体。 当它返回EVAL_BODY_INCLUDE时,引擎将会处理这个标记以及它的子标记。 类似地,JSP引擎在分析了结束标记之后就会调用doEndTag ()方法。 doAfterBody ()方法让你可以在引擎处理元素体之后执行动作,但是必须在doEndTag ()方法作用之前。 下面就是实现天气状况的Weather类的一个样本程序代码:
+ ~" u: |3 L9 i3 P6 N: c! L' I) @  import javax.servlet.jsp.*;
5 f7 _/ L7 u  i- ?  S5 x9 y  import javax.servlet.jsp.tagext.*;
# h- ~9 \* l" m# X  import java.io.*;- O! Z& x% y2 T+ ~/ N& ^
  public class Weather extends TagSupport {
% k8 I1 L1 P" k9 A" V, t) m! z  public int doStartTag() {
$ o9 M' V7 E0 r. P1 h( y2 W  try {
$ j4 D3 N5 k5 ~4 ]  JspWriter out = pageContext.getOut();: c" O+ V6 n& f% p- f) G0 R
  out.print(" sunny and cloudy mixed with " +
- U# L: h1 k7 n" q0 e6 U* d  "rain and sunshine. ");$ I- ]; t9 G, D. w
  } catch (IOException e) {6 J+ ~" `+ ~$ \1 O
  System.out.println("Error " + e);' x! F4 y* W! r& m+ X% B+ M
  }
. |. q" D. c' E7 a' h6 b  return (SKIP_BODY);3 ?9 E' Z$ ?, z% n+ H
  }
! @% [1 D% _1 \) X" O% j+ _' M  }* ]6 ]% }: N# \$ D0 b6 J7 b
  当引擎遇到" < somePrefix:Weather/> "标记的时候,它会在标记库内搜索一个同名的类。 如果doStartTag ()方法被实现的话(在本例中是这样的),它就会被调用。 这就使字符串包含适应显示的天气情况。 因为方法返回了SKIP_BODY,JSP读取器移动到标记的末尾。
. O1 G6 n) d( F# n3 X  最简单的使用JSP和标记库的方法就是使用Apache Tomcat引擎。 这个引擎也充当Servlet和JSP应用程序接口的引用实现。
7 H0 r$ q6 @! S0 x* J3 O  当使用标记库时,JSP页面看上去就非常像XML文件了。 当JSP页面被处理时,引擎执行与标记相关联的程序代码(实际上,首先调用JSP引擎把JSP页面翻译成一个servlet,然后再编译servlet。 与标记库相关联的方法都被包含在servlet中。),一个熟悉XML的人就可以设计并使用各种各样的页面布局进行试验,而不必改变任何Java程序代码。当然,代码与数据的分离的程度还是主要依赖标记库元素设计的好坏程度。0 h) ]5 A) f+ e; F( \9 C. ~
  JavaServer Pages ( JSP)和XML是Sun的J2EE的两个至关紧要的组件。 JSP是用于创建应用程序服务器端程序的有效工具,而客户可以是一个浏览器,一个设备或其它的应用程序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-27 20:57 , Processed in 1.728647 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表