﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-java-god</title><link>http://www.blogjava.net/java-god/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 08:19:51 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 08:19:51 GMT</pubDate><ttl>60</ttl><item><title>J2EE架构的6个最佳实践-------利用高级J2EE最佳实践来改善现有和将来的J2EE应用程序的架构和设计</title><link>http://www.blogjava.net/java-god/archive/2008/05/15/200567.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Thu, 15 May 2008 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/05/15/200567.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/200567.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/05/15/200567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/200567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/200567.html</trackback:ping><description><![CDATA[虽然许多文章曾经讨论过J2EE最佳实践。那么，为什么我还要再写一篇文章呢？本文究竟与以前的文章有何不同或者说比其他文章好在哪呢？<br />
首先，本文的目标读者是正在从事技术工作的架构师。为了避免浪费大家的才智，我会避免讲述一些陈腐的最佳实践，例如&#8220;日常构建（build
daily）&#8221;、&#8220;测试一切（test everything）&#8221;和&#8220;经常集成（ integrate often）。
任何具有称职架构师的项目都有分工明确的、定义良好的团队结构。他们还为进行编码检查、构建代码（每日或在需要时）、进行测试（单元、集成和系统的）、部
署和配置/释放管理而具备已记录的过程。<br />
其次，我将跳过通常吹捧的最佳实践，例如&#8220;基于接口的设计&#8221;、&#8220;使用著名的设计模型&#8221;以及&#8220;使用面向服务的架构&#8221;等。相反，我将集中讲述我曾学过并且
使用了若干年的6（不是很多）个方面的in-the-trench课程。最后，本文的目的是让您思考一下自己的架构，提供工作代码示例或者解决方案超出了
本文的范围。下面就让我介绍一下这6课：<br />
<br />
<strong>第1课：切勿绕过服务器端验证</strong><br />
作为一位软件顾问，我曾有机会不但设计并实现了Web应用程序，而且还评估/审核了许多Web应用程序。在复杂的、并且用JavaScript客户端
封装的应用程序内，我经常遇到对用户输入信息执行大量检查的Web页面。即使HTML元素具有数据有效性的属性也如此，例如MAXLENGTH。只有在成
功验证所有输入信息后，才能提交HTML表单。结果，一旦服务器端收到通知表单（请求），便恰当地执行业务逻辑。<br />
在此，您发现问题了么？开发人员已经做了许多重要的假设。例如，他们假设所有的Web应用程序用户都同样诚实。开发人员还假设所有用户将总是使用他们
测试过的浏览器访问Web应用程序。还有很多其他的假设。这些开发人员忘记了利用可以免费得到的工具，通过命令行很容易地模拟类似浏览器的行为。事实上，
通过在浏览器窗口中键入适当的URL，您可以发送任何&#8220;posted&#8221;表单，尽管如此，通过禁用这些页面的GET请求，您很容易地阻止这样的&#8220;表单发
送&#8221;。但是，您不能阻止人们模拟甚至创建他们自己的浏览器来入侵您的系统。<br />
根本的问题在于开发人员不能确定客户端验证与服务器端验证的主要差别。两者的主要差别不在于验证究竟发生在哪里，例如在客户端或者在服务器端。主要的差别在于验证背后的目的不同。<br />
客户端验证仅仅是方便。执行它可为用户提供快速反馈——使应用程序似乎做出响应，给人一种运行桌面应用程序的错觉。<br />
另一方面，服务器端验证是构建安全Web应用程序必需的。不管在客户端一侧输入的是什么，它可以确保客户端送往服务器的所有数据都是有效的。<br />
因而，只有服务器端验证才可以提供真正应用程序级的安全。许多开发人员陷入了错误感觉的圈套：只有在客户端进行所有数据的验证才能确保安全。下面是说明此观点的一个常见的示例：<br />
一个典型的登录页面拥有一个用来输入用户名的文本框和一个输入密码的文本框。在服务器端，某人在接收servlet中可能遇到一些代码，这些代码构成了下面形式的SQL查询：<br />
"SELECT * FROM SecurityTable WHERE username = '" + form.getParameter("username")
+ "' AND password = '" + form.getParameter("password") + "';"，并执行这些代码。如果查询在结果集的某一行返回，则用户登录成功，否则用户登录失败。<br />
第一个问题是构造SQL的方式，但现在让我们暂时忽略它。如果用户在用户名中输入&#8220;Alice'--&#8221;会怎样呢？假设名为&#8220;Alice&#8221;的用户已经在
SecurityTable中，这时此用户（更恰当的说法是黑客）成功地登录。我将把找出为什么会出现这种情况的原因做为留给您的一道习题。<br />
许多创造性的客户端验证可以阻止一般的用户从浏览器中这样登录。但对于已经禁用了JavaScript的客户端，或者那些能够使用其他类似浏览器程序直接发送命令（HTTP
POST和GET命令）的高级用户（或者说黑客）来说，我们又有什么办法呢？服务器端验证是防止这种漏洞类型所必须的。这时，SSL、防火墙等都派不上用场了。<br />
<br />
<strong>第2课：安全并非是附加物</strong><br />
如第1课所述，我曾有幸研究过许多Web应用程序。我发现所有的JavaServer Page（JSP）都有一个共同的主题，那就是具有类似下面伪代码的布局：<br />
<br />
&lt;%<br />
User user = <br />
session.getAttribute("User");<br />
if(user == null)<br />
{<br />
// redirect to <br />
// the logon page&#8230;<br />
}
<p>if(!user.role.equals("manager"))<br />
{<br />
// redirect to the<br />
// "unauthorized" page&#8230;<br />
}<br />
%&gt;</p>
&lt;!-<br />
HTML, JavaScript, and JSP<br />
code to display data and<br />
allow user interaction --&gt;<br />
<br />
如果项目使用诸如Struts这样的MVC框架，所有的Action Bean都会具有类似的代码。尽管最后这些代码可能运行得很好，但如果您发现一个bug，或者您必须添加一个新的角色（例如，&#8220;guest&#8221;或者&#8220;admin&#8221;），这就会代表一场维护恶梦。<br />
此外，所有的开发人员，不管您多年轻，都需要熟悉这种编码模式。当然，您可以用一些JSP标签来整理JSP代码，可以创建一个清除派生Action Bean的基本Action
Bean。尽管如此，由于与安全相关的代码会分布到多个地方，所以维护时的恶梦仍旧存在。由于Web应用程序的安全是强迫建立在应用程序代码的级别上（由多个开发人员），而不是建立在架构级别上，所以Web应用程序还是很可能存在弱点。<br />
很可能，根本的问题是在项目接近完成时才处理安全性问题。最近作为一名架构师，我曾在一年多的时间里亲历了某一要实现项目的6个版本，而直到第四版时
我们才提到了安全性——即使该项目会将高度敏感的个人数据暴露于Web上，我们也没有注意到安全性。为了更改发布计划，我们卷入了与项目资助人及其管理人
员的争斗中，以便在第一版中包含所有与安全相关的功能，并将一些&#8220;业务&#8221;功能放在后续的版本中。最终，我们赢得了胜利。而且由于应用程序的安全性相当高，
能够保护客户的私有数据，这一点我们引以为荣，我们的客户也非常高兴。<br />
遗憾的是，在大多数应用程序中，安全性看起来并未增加任何实际的商业价值，所以直到最后才解决。发生这种情况时，人们才匆忙开发与安全相关的代码，而
丝毫没有考虑解决方案的长期可维护性或者健壮性。忽视该安全性的另一个征兆是缺乏全面的服务器端验证，如我在第1课中所述，这一点是安全Web应用程序的
一个重要组成部分。<br />
记住：J2EE Web应用程序的安全性并非仅仅是在Web.xml 和ejb-jar.xml文件中使用合适的声明，也不是使用J2EE技术，如Java
认证和授权服务（Java Authentication and Authorization Service，JAAS）。而是经过深思熟虑后的设计，且实现一个支持它的架构。<br />
<br />
<strong>第3课：国际化（I18N）不再是纸上谈兵 </strong><br />
当今世界的事实是许多英语非母语的人们将访问您的公共Web应用程序。随着电子政务的实行，由于它允许人们（某个国家的居民）在线与政府机构交互，所
以这一点特别真实。这样的例子包括换发驾照或者车辆登记证。许多第一语言不是英语的人们很可能将访问这样的应用程序。国际化（即：&#8220;i18n&#8221;，因为在
&#8220;internationalization&#8221;这个单词中，字母i和字母n之间一共有18个字母）使得您的应用程序能够支持多种语言。<br />
显然，如果您的JSP
页面中有硬编码的文本，或者您的Java代码返回硬编码的错误消息，那么您要花费很多时间开发此Web应用程序的西班牙语版本。然而，在Web应用程序
中，为了支持多种语言，文本不是惟一必须&#8220;具体化&#8221;的部分。因为许多图像中嵌有文字，所以图形和图像也应该是可配置的。在极端的情况下，图像（或者颜色）
在不同的文化背景中可能有完全不同的意思。类似地，任何格式化数字和日期的Java代码也必须本地化。但问题是：您的页面布局可能也需要更改。<br />
例如，如果您使用HTML表格来格式化和显示菜单选项、应用程序题头或注脚，则您可能必须为每一种支持的语言更改每一栏的最小宽度和表格其他可能的方面。为了适应不同的字体和颜色，您可能必须为每一种语言使用单独的样式表。<br />
显然，现在创建一个国际化的Web应用程序面临的是架构挑战而不是应用程序方面的挑战。一个架构良好的Web应用程序意味着您的JSP页面和所有与业
务相关的（应用程序特有的）Java代码都不知不觉地选择了本地化。要记住的教训是：不要因为Java、J2EE支持国际化而不考虑国际化。您必须从第一
天起就记住设计具有国际化的解决方案。<br />
<br />
<strong>第4课：在MVC表示中避免共同的错误 </strong><br />
J2EE开发已经足够成熟，在表示层，大多数项目使用MVC架构的某些形式，例如Struts。在这样的项目中，我常见到的现象是对MVC模式的误用。下面是几个示例。<br />
常见的误用是在模型层（例如，在Struts的Action Bean中）实现了所有的业务逻辑。不要忘了，表示层的模型层仍然是表示层的一部分。使用该模型层的正确方法是调用适当的业务层服务（或对象）并将结果发送到视图层（view
layer）。用设计模式术语来说，MVC表示层的模型应该作为业务层的外观（Fa?ade）来实现。更好的方法是，使用核心J2EE模式（Core J2EE
Patterns）中论述到的Business Delegate模式。这段自书中摘录的内容精彩地概述了将您的模型作为Business Delegate来实现的要点和优点：<br />
Business Delegate起到客户端业务抽象化的作用。它抽象化，进而隐藏业务服务的实现。使用Business Delegate，可以降低表示层客户端和系统的业务服务.之间的耦合程度。根据实现策略不同，Business
Delegate可以在业务服务API的实现中，保护客户端不受可能的变动性影响。这样，在业务服务API或其底层实现变化时，可以潜在地减少必须修改表示层客户端代码的次数。<br />
另一个常见的错误是在模型层中放置许多表示类型的逻辑。例如，如果JSP页面需要以指定方式格式化的日期或者以指定方式排序的数据，某些人可能将该逻
辑放置在模型层，对该逻辑来说，这是错误的地方。实际上，它应该在JSP页面使用的一组helper类中。当业务层返回数据时，Action
Bean应该将数据转发给视图层。这样，无需创建模型和视图之间多余的耦合，就能够灵活支持多个视图层（JSP、Velocity、XML等）。也使视图
能够确定向用户显示数据的最佳方式。<br />
最后，我见过的大多数MVC应用程序都有未充分应用的控制器。例如，绝大多数的Struts应用程序将创建一个基本的Action类，并完成所有与安
全相关的功能。其他所有的Action
Bean都是此基类的派生类。这种功能应该是控制器的一部分，因为如果没有满足安全条件，则首先调用不应该到达Action
Bean（即：模型）。记住，一个设计良好的MVC架构的最强大功能之一是存在一个健壮的、可扩展的控制器。您应该利用该能力以加强自己的优势。<br />
<br />
<strong>第5课：不要被JOPO束缚住手脚</strong><br />
我曾目睹许多项目为了使用Enterprise JavaBean而使用Enterprise JavaBean。因为EJB似乎给项目带来优越感和妄自尊大的表现，所以有时它是显酷的要素（coolness
factor）。而其他时候，它会使J2EE和EJB引起混淆。记住，J2EE和EJB不是同意词。EJB只是J2EE 的一部分，J2EE 是包含JSP、servlet、Java
消息服务（JMS）、Java数据库连接（JDBC）、JAAS、 Java管理扩展（JMX）和EJB在内的一系列技术，同样也是有关如何共同使用这些技术建立解决方案的一组指导原则和模式。<br />
如果在不需要使用EJB的情况下使用EJB，它们可能会影响程序的性能。与老的Web服务器相比，EJB一般对应用服务器有更多的需求。EJB提供的
所有增值服务一般需要消耗更大的内存和更多的CPU时间。许多应用程序不需要这些服务，因此应用服务器要与应用程序争夺资源。<br />
在某些情况下，不必要地使用EJB可能使应用程序崩溃。例如，最近我遇到了一个在开源应用服务器上开发的应用程序。业务逻辑封装在一系列有状态会话
bean（EJB）中。开发人员为了在应用服务器中完全禁用这些bean的&#8220;钝化&#8221;费了很大的劲。客户端要求应用程序部署在某一商用应用服务器上，而该服
务器是客户端技术栈的一部分。该应用服务器却不允许关闭&#8220;钝化&#8221;功能。事实上，客户端不想改变与其合作的应用服务器的设任何置。结果，开发商碰到了很大的
麻烦。（似乎）有趣的事情是开发商自己都不能给出为什么将代码用EJB（而且还是有状态会话bean）实现的好理由。不仅仅是开发商会遇到性能问题，他们
的程序在客户那里也无法工作。<br />
在Web应用程序中，无格式普通Java 对象（POJO）是EJB强有力的竞争者。POJO是轻量级的，不像EJB那样负担额外的负担。在我看来，对许多EJB的优点，例如对象入池，估计过高。POJO是您的朋友，不要被它束缚住手脚。<br />
<br />
<strong>第6课：数据访问并不能托管O/R映射 </strong><br />
我曾参与过的所有Web应用程序都向用户提供从其他地方存取的数据，并且因此需要一个数据访问层。这并不是说所有的项目都需要标识并建立这样一个层，
这仅仅说明这样层的存在不是隐含的就是明确的。如果是隐含的数据层，数据层是业务对象（即：业务服务）层的一部分。这适用于小型应用程序，但通常与大一些
项目所接受的架构指导原则相抵触。<br />
总之，数据访问层必须满足或超出以下四个标准：<br />
<strong>具有透明性 </strong><br />
业务对象在不知道数据源实现的具体细节情况下，可以使用数据源。由于实现细节隐藏在数据访问层的内部，所以访问是透明的。<br />
<strong>易于迁移</strong><br />
数据访问层使应用程序很容易迁移到其他数据库实现。业务对象不了解底层的数据实现，所以迁移仅仅涉及到修改数据访问层。进一步地说，如果您正在部署某
种工厂策略，您可以为每个底层的存储实现提供具体的工厂实现。如果是那样的话，迁移到不同的存储实现意味着为应用程序提供一个新的工厂实现。<br />
<strong>尽量减少业务对象中代码复杂性</strong> <br />
因为数据访问层管理着所有的数据访问复杂性，所以它可以简化业务对象和使用数据访问层的其他数据客户端的代码。数据访问层，而不是业务对象，含有许多
与实现相关的代码（例如SQL语句）。这样给开发人员带来了更高的效率、更好的可维护性、提高了代码的可读性等一系列好处。<br />
<strong>把所有的数据访问集中在单独的层上</strong><br />
由于所有的数据访问操作现在都委托给数据访问层，所以您可以将这个单独的数据访问层看做能够将应用程序的其他部分与数据访问实现相互隔离的层。这种集中化可以使应用程序易于维护和管理。<br />
<strong>注意：</strong>这
些标准都不能明确地调出对O/R（对象到关系）映射层的需求。O/R映射层一般用O/R映射工具创建，它提供对象对关系数据结构的查看和感知（look-
and-feel）。在我看来，在项目中使用O/R映射与使用EJB类似。在大多数情况下，并不要求它。对于包含中等规模的联合以及多对多关系的关系型数
据库来说，O/R映射会变得相当复杂。由于增加O/R 映射解决方案本身的内在复杂性，例如延迟加载（lazy
loading）、高速缓冲等，您将为您的项目带来更大的复杂性（和风险）。<br />
为了进一步支持我的观点，我将指出按照Sun
Microsystem所普及的实体Bean（O/R映射的一种实现）的许多失败的尝试，这是自1.0版以来一直折磨人的难题。在SUN的防卫措施中，一
些早期的问题是有关EJB规范的开发商实现的。这依次证明了实体Bean规范自身的复杂性。结果，大多数J2EE架构师一般认为从实体Bean中脱离出来
是一个好主意。<br />
大多数应用程序在处理他们的数据时，只能进行有限次数的查询。在这样的应用程序中，访问数据的一种有效方法是实现一个数据访问层，该层实现执行这些查
询的一系列服务（或对象、或API）。如上所述，在这种情况下，不需要O/R映射。当您要求查询灵活性时，O/R映射正合适，但要记住：这种附加的灵活性
并不是没有代价的。<br />
就像我承诺的那样，在本文中，我尽量避免陈腐的最佳实践。相反，关于J2EE项目中每一位架构师必须做出的最重要的决定，我集中讲解了我的观点。最
后，您应该记住：J2EE并非某种具体的技术，也不是强行加入到解决方案中的一些首字母缩写。相反，您应该在适当的时机，恰当的地方，使用合适的技术，并
遵循J2EE的指导原则和J2EE中所包含的比技术本身重要得多的实践。
<img src ="http://www.blogjava.net/java-god/aggbug/200567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-05-15 09:43 <a href="http://www.blogjava.net/java-god/archive/2008/05/15/200567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xslt 获取 xml 数据的格式</title><link>http://www.blogjava.net/java-god/archive/2008/05/07/198886.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Wed, 07 May 2008 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/05/07/198886.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/198886.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/05/07/198886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/198886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/198886.html</trackback:ping><description><![CDATA[xml文件的格式<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;DataSets&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;Metadata&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemDef OID="I0001" Name="姓名" DataType="string" Length=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SignificantDigits="" SASFieldName="" SDSVarName="" Origin=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comment="" DefaultValue="" Note="输入您的名字"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;RangeCheckRelationship="and"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;CodeListRef Name="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Question&gt;您的姓名?&lt;/Question&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Control qualityControl="" operationType="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ItemDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemDef OID="I0002" Name="说明信息" DataType="text" Length=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SignificantDigits="" SASFieldName="" SDSVarName="" Origin=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comment="" DefaultValue="7g" Note="" RangeCheckRelationship="and"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;CodeListRef Name="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Question&gt;您的详细说明&lt;/Question&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Control qualityControl="" operationType="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ItemDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemGroupDef OID="G0001" Name="个人描述" Repeating="yes"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;IsReferenceData="0" SASDatasetName="" Domain="" Origin="" Purpose=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comment=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Note="个人描述信息,包括:[r]&amp;amp;lt;br/&amp;amp;gt;[/r]1, 姓名[r]&amp;amp;lt;br/&amp;amp;gt;[/r]2, 详细描述信息"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef ItemOID="I0001" Name="姓名" OrderNumber="1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Mandatory="no" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef ItemOID="I0002" Name="说明信息" OrderNumber="2"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Mandatory="no" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ItemGroupDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;FormDef OID="F0001" Name="预诊-1" Repeating="yes"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Note="预诊信息[r]&amp;amp;lt;br/&amp;amp;gt;[/r]请详细输入"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemGroupRef ItemGroupOID="G0001" Name="个人描述"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;OrderNumber="1" Mandatory="no" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/FormDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;StudyEventDef OID="E0001" Name="新建诊断-1" Repeating="yes"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Type="Scheduled" Category=""&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;FormRef FormOID="F0001" Name="预诊-1" OrderNumber="1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Mandatory="no" page="1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/StudyEventDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;VarDef OID="var_0" DataType="string" Lable="您的姓名?"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Remark="E0001.1//F0001.1//G0001#1.I0001" Domain="" Function=""&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef Varname="v0" ItemOID="I0001" Eventpath="E0001.1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Formpath="F0001.1" ItemGrouppath="G0001#1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/VarDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;VarDef OID="var_1" DataType="text" Lable="您的详细说明"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Remark="E0001.1//F0001.1//G0001#1.I0002" Domain="" Function=""&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef Varname="v0" ItemOID="I0002" Eventpath="E0001.1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Formpath="F0001.1" ItemGrouppath="G0001#1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/VarDef&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/Metadata&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0010"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0009"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0008"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0007"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0006"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0005"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0004"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0003"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="niahoa" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="gee " VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0002"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="12" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="3" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0001"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="qqq" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="gg" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&lt;/DataSets&gt;<br />
xslt文件的格式<br />
&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;<br />
&lt;xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/&gt;<br />
&lt;xsl:strip-space elements="*"/&gt;<br />
<br />
&lt;xsl:template match="/"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="columnitems" select="//VarDef"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="rowitems" select="//DataSet"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="listcolumns"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="items" select="$columnitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="listrows"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="citems" select="$columnitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="ritems" select="$rowitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="listcolumns"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="items"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;SubjectCode,&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$items"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:when test="position() != last() and last() &gt;= 2"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@OID"/&gt;,&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:when&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@OID"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#xa;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;,&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$items"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:when test="position() != last() and last() &gt;= 2"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@Label"/&gt;,&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:when&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@Label"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#xa;&lt;/xsl:text&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="listrows"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="citems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="ritems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$ritems"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:value-of select="@Subject"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;,&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="item" select="Event"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="listrow"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="dataitem" select="$item"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="matchcitems" select="$citems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="listrow"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="dataitem"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="matchcitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$matchcitems"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="have"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="cellname" select="@OID"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="printcell"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="cn" select="$cellname"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="celldatas" select="$dataitem"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:variable&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:when test="position() != last() and last() &gt;= 2"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="$have"/&gt;,&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:when&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="$have"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#xa;&lt;/xsl:text&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="printcell"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="cn"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="celldatas"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$celldatas/Data"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:if test="$cn = @VarRefOID"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:value-of select="@Value"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:if&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;/xsl:stylesheet&gt;<br />
<br />
<img src ="http://www.blogjava.net/java-god/aggbug/198886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-05-07 10:41 <a href="http://www.blogjava.net/java-god/archive/2008/05/07/198886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过JDBC连接oracle数据库的十大技巧  http://flexjson.com.cn/</title><link>http://www.blogjava.net/java-god/archive/2008/05/06/198729.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Tue, 06 May 2008 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/05/06/198729.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/198729.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/05/06/198729.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/198729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/198729.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://flexjson.com.cn/&nbsp;&nbsp;<a href='http://www.blogjava.net/java-god/archive/2008/05/06/198729.html'>阅读全文</a><img src ="http://www.blogjava.net/java-god/aggbug/198729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-05-06 16:24 <a href="http://www.blogjava.net/java-god/archive/2008/05/06/198729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>统一软件过程</title><link>http://www.blogjava.net/java-god/archive/2008/04/07/191164.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Mon, 07 Apr 2008 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/04/07/191164.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/191164.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/04/07/191164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/191164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/191164.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 63pt 0.0001pt; text-align: justify; text-indent: 18pt;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">来源： </span><a href="http://flexjson.com.cn/uml.html">http://flexjson.com.cn/uml.html</a></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify; text-indent: 18pt;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">（</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">Rational Unified Process</span><span style="font-size: 9pt;">，统一软件开发过程，统一软件过程</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">)</span><span style="font-size: 9pt;">是一个面向对象且基于网络的程序开发方法论。根据</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">Rational(Rational Rose</span><span style="font-size: 9pt;">和统一建模语言的开发者</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">)</span><span style="font-size: 9pt;">的说法，好像一个在线的指导者，它可以为所有方面和层次的程序开发提供指导方针，模版以及事例支持。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"> RUP</span><span style="font-size: 9pt;">和类似的产品</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">--</span><span style="font-size: 9pt;">例如面向对象的软件过程（</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">OOSP</span><span style="font-size: 9pt;">），以及</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">OPEN Process</span><span style="font-size: 9pt;">都是理解性的软件工程工具</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">--</span><span style="font-size: 9pt;">把开发中面向过程的方面（例如定义的阶段，技术和实践）和其他开发的组件（例如文档，模型，手册以及代码等等）整合在一个统一的框架内。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><strong><span style="font-size: 9pt; font-family: 宋体;">一、六大经验</span></strong></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">迭代式开发。在软件开发的早期阶段就想完全、准确的捕获用户的需求几乎是不
可能的。实际上，我们经常遇到的问题是需求在整个软件开发工程中经常会改变。迭代式开发允许在每次迭代过程中需求可能有变化，通过不断细化来加深对问题的
理解。迭代式开发不仅可以降低项目的风险，而且每个迭代过程以可以执行版本结束，可以鼓舞开发人员。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">管理需求。确定系统的需求是一个连续的过程，开发人员在开发系统之前不可能完全详细的说明一个系统的真正需求。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">描述了如何提取、组织系统的功能和约束条件并将其文档化，用例和脚本的使用以被证明是捕获功能性需求的有效方法。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">基于组件的体系结构。组件使重用成为可能，系统可以由组件组成。基于独立的、可替换的、模块化组件的体系结构有助于管理复杂性，提高重用率。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">描述了如何设计一个有弹性的、能适应变化的、易于理解的、有助于重用的软件体系结构。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">可视化建模。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">往往和</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">UML</span><span style="font-size: 9pt;">联系在一起，对软件系统建立可视化模型帮助人们提供管理软件复杂性的能力。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">告诉我们如何可视化的对软件系统建模，获取有关体系结构于组件的结构和行为信息。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">验证软件质量。在</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">中软件质量评估不再是事后进行或单独小组进行的分离活动，而是内建于过程中的所有活动，这样可以及早发现软件中的缺陷。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">控制软件变更。迭代式开发中如果没有严格的控制和协调，整个软件开发过程很快就陷入混乱之中，</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">描述了如何控制、跟踪、监控、修改以确保成功的迭代开</span><span style="font-size: 9pt; font-family: Verdana;"> </span><span style="font-size: 9pt;">发。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">通过软件开发过程中的制品，隔离来自其他工作空间的变更，以此为每个开发人员建立安全的工作空间。</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt;" lang="EN-US">&nbsp;</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><strong><span style="font-size: 9pt; font-family: 宋体;">二、统一软件开发过程</span></strong><strong><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">的二维开发模型</span></strong><span style="font-size: 9pt; font-family: Verdana;"> </span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify; text-indent: 24pt;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">软件开发生命周期是一个二维的软件开发模型。</span><span style="font-size: 9pt; font-family: Verdana;"> </span><span style="font-size: 9pt;">横轴通过时间组织，是过程展开的生命周期特征，体现开发过程的动态结构，用来描述它的术语主要包括周期</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">(Cycle)</span><span style="font-size: 9pt;">、阶段</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">(Phase)</span><span style="font-size: 9pt;">、迭代</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"> (Iteration)</span><span style="font-size: 9pt;">和里程碑</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">(Milestone)</span><span style="font-size: 9pt;">；纵轴以内容来组织为自然的逻辑活动，体现开发过程的静态结构，用来描述它的术语主要包括活动</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"> (Activity)</span><span style="font-size: 9pt;">、产物</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">(Artifact)</span><span style="font-size: 9pt;">、工作者</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">(Worker)</span><span style="font-size: 9pt;">和工作流</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">(Workflow)</span><span style="font-size: 9pt;">。如图</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">1</span><span style="font-size: 9pt;">：</span><span style="font-size: 9pt; font-family: Verdana;">
</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"><img src="http://flexjson.com.cn/images/image001.jpg" alt="" height="299" width="674" /></span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><strong><span style="font-size: 9pt; font-family: 宋体;">三、统一软件开发过程</span></strong><strong><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span></strong><strong><span style="font-size: 9pt; font-family: 宋体;">核心概念</span></strong></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
RUP</span><span style="font-size: 9pt;">中定义了一些核心概念，如下图：</span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"><img src="http://flexjson.com.cn/images/image002.jpg" alt="" height="353" width="669" /></span></p>
<p style="margin: 0cm 63pt 0.0001pt; text-align: justify;"><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-size: 9pt;">角色：描述某个人或者一个小组的行为与职责。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US">RUP</span><span style="font-size: 9pt;">预先定义了很多角色。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt;">活动：是一个有明确目的的独立工作单元。</span><span style="font-size: 9pt; font-family: Verdana;" lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt;">工件：是活动生成、创建或修改的一段信息。</span></p>
<img src ="http://www.blogjava.net/java-god/aggbug/191164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-04-07 09:33 <a href="http://www.blogjava.net/java-god/archive/2008/04/07/191164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flexjson 文档的翻译，这里只是一部分，更详细的请访问 http://flexjson.com.cn/flexjson.html</title><link>http://www.blogjava.net/java-god/archive/2008/04/01/189919.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Tue, 01 Apr 2008 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/04/01/189919.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/189919.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/04/01/189919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/189919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/189919.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: flexjson 文档的翻译，这里只是一部分，更详细的请访问 http://flexjson.com.cn/&nbsp;&nbsp;<a href='http://www.blogjava.net/java-god/archive/2008/04/01/189919.html'>阅读全文</a><img src ="http://www.blogjava.net/java-god/aggbug/189919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-04-01 09:39 <a href="http://www.blogjava.net/java-god/archive/2008/04/01/189919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Junit4 快速入门</title><link>http://www.blogjava.net/java-god/archive/2008/03/24/188272.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Mon, 24 Mar 2008 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/03/24/188272.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/188272.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/03/24/188272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/188272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/188272.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">Junit </span><span style="font-family: 宋体;">概念<span lang="EN-US">,</span>原理这里就不说了，有兴趣的朋友可以查阅相关资料，这篇文章主要是为了快速给大家介绍一下<span lang="EN-US">junit4</span>的使用
以及与<span lang="EN-US"> junit3</span>的区别，这里默认大家对<span lang="EN-US">junit3</span>已经有些理解了。下面就开始吧<span lang="EN-US">:<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">1.</span><span style="font-family: 宋体;">先写个简单的被测试类：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">package</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> test.junit;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">class</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
BaseClass {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> String method() {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left; text-indent: 21pt;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">return</span></strong><span style="background: silver none repeat scroll 0%; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">this</span></strong><span style="background: silver none repeat scroll 0%; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" lang="EN-US">.getClass().getName();</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">} </span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">2.</span><span style="font-family: 宋体;">对于这个类的<span lang="EN-US">unit</span>测试，我们先看看在<span lang="EN-US">junit3</span>中怎么进行测试的吧：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">package</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> test.junit;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> junit.framework.TestCase;</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">引入<span lang="EN-US">TestCase</span>类</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">class</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
BaseClassTest </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">extends</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> TestCase {</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">类必须继承<span lang="EN-US">TestCase</span></span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">BaseClass </span><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US">; </span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">protected</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">void</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
setUp() </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">throws</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> Exception {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">super</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">.setUp();</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US"> = </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">new</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> BaseClass();</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">void</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
testMethod (){</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">测试方法必须以<span lang="EN-US">test</span>开头</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">通过<span lang="EN-US">assert*</span>来检验</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><em><span style="font-family: 宋体; color: black;" lang="EN-US">assertTrue</span></em><span style="font-family: 宋体; color: black;" lang="EN-US">(</span><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US">.method
().equals(</span><span style="font-family: 宋体; color: #2a00ff;" lang="EN-US">"test.junit.BaseClass"</span><span style="font-family: 宋体; color: black;" lang="EN-US">));</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;">通过上面这个类，我们对<span lang="EN-US">junit3</span>进行一些总结：</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">1. </span><span style="font-family: 宋体;">必须引入类<span lang="EN-US">TestCase</span>（<strong><span style="color: #7f0055;" lang="EN-US">import</span></strong><span style="color: black;" lang="EN-US"> junit.framework.TestCase;</span>），<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">2. </span><span style="font-family: 宋体;">必须继承类<span lang="EN-US">TestCase<strong><span style="color: #7f0055;"> </span></strong>(<strong><span style="color: #7f0055;">class</span></strong><span style="color: black;"> BaseClassTest </span><strong><span style="color: #7f0055;">extends</span></strong><span style="color: black;"> TestCase</span>)<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">3. </span><span style="font-family: 宋体;">测试方法必须以<span lang="EN-US">test</span>开头（<strong><span style="color: #7f0055;" lang="EN-US">public</span></strong><span style="color: black;" lang="EN-US"> </span><strong><span style="color: #7f0055;" lang="EN-US">void</span></strong><span style="color: black;" lang="EN-US"> testMethod ()</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">4. </span><span style="font-family: 宋体;">通过<span lang="EN-US">assert*</span>方法来判断结果（<em><span style="color: black;" lang="EN-US">assertTrue</span></em><span style="color: black;" lang="EN-US">(</span><span style="color: #0000c0;" lang="EN-US">baseClass</span><span style="color: black;" lang="EN-US">.method ().equals(</span><span style="color: #2a00ff;" lang="EN-US">"test.junit.BaseClass"</span><span style="color: black;" lang="EN-US">));</span>）。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">3. </span><span style="font-family: 宋体;">下面来了解一下<span lang="EN-US">junit4</span>里面的内部关系吧，下面来看看我们今天的主角<span lang="EN-US">junit4</span>是怎么处理这些的吧：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">package</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> test.junit;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> org.junit.Test;</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">引入<span lang="EN-US">Test</span>类</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">static</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
org.junit.Assert.*;</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">引入<span lang="EN-US">Assert.*</span>包</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">class</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
BaseClassTestNew {</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">这里不用再继承<span lang="EN-US">TestCase</span>类了。</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">BaseClass </span><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass = new BaseClass()</span><span style="font-family: 宋体; color: black;" lang="EN-US">; </span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: 宋体; color: #646464;" lang="EN-US">@Test</span><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">void</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> methodOne(){</span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">名字可以按你自己的爱好。但是必须以<span lang="EN-US">@Test</span>开头</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left; text-indent: 21pt;" align="left"><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">还是以<span lang="EN-US">assert*</span>来判断</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left; text-indent: 21pt;" align="left"><em><span style="font-family: 宋体; color: black;" lang="EN-US">assertTrue</span></em><span style="font-family: 宋体; color: black;" lang="EN-US">(</span><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US">.methodOne().equals(</span><span style="font-family: 宋体; color: #2a00ff;" lang="EN-US">"test.junit.BaseClass"</span><span style="font-family: 宋体; color: black;" lang="EN-US">));</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 20pt;" align="left"><span style="font-family: 宋体; color: black;">看看多么的简洁，好像少了很多约束，下面通过和<span lang="EN-US">junit3</span>的特性进行比较总结<span lang="EN-US">junit4</span>的特性：</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">1.</span><span style="font-family: 宋体;">必须引入类<span lang="EN-US">TestCase</span>（<strong><span style="color: #7f0055;" lang="EN-US">import</span></strong><span style="color: black;" lang="EN-US"> junit.framework.TestCase;</span><span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Wingdings;" lang="EN-US">&#232;</span><span style="font-family: 宋体;">必须引入类<span lang="EN-US">Test</span>（<strong><span style="color: #7f0055;" lang="EN-US">import</span></strong><span style="color: black;" lang="EN-US"> org.junit.Test;</span>）<span lang="EN-US">,</span>必须引入类（<strong><span style="color: red;" lang="EN-US">import</span></strong><span style="color: red;" lang="EN-US"> <strong>static</strong> org.junit.Assert.*;</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">2.</span><span style="font-family: 宋体;">必须继承类<span lang="EN-US">TestCase<strong><span style="color: #7f0055;"> </span></strong>(<strong><span style="color: #7f0055;">class</span></strong><span style="color: black;"> BaseClassTest </span><strong><span style="color: #7f0055;">extends</span></strong><span style="color: black;"> TestCase</span>)<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Wingdings;" lang="EN-US">&#232;</span><span style="font-family: 宋体;">不需要<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US">3.</span><span style="font-family: 宋体;">测试方法必须以<span lang="EN-US">test</span>开头（<strong><span style="color: #7f0055;" lang="EN-US">public</span></strong><span style="color: black;" lang="EN-US"> </span><strong><span style="color: #7f0055;" lang="EN-US">void</span></strong><span style="color: black;" lang="EN-US"> testMethod ()</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: Wingdings;" lang="EN-US">&#232;</span><span style="font-family: 宋体;">不需要，但是类开始的时候要标记<span lang="EN-US"> @Test<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">4.</span><span style="font-family: 宋体;">通过<span lang="EN-US">assert*</span>方法来判断结果（<em><span style="color: black;" lang="EN-US">assertTrue</span></em><span style="color: black;" lang="EN-US">(</span><span style="color: #0000c0;" lang="EN-US">baseClass</span><span style="color: black;" lang="EN-US">.method ).equals(</span><span style="color: #2a00ff;" lang="EN-US">"test.junit.BaseClass"</span><span style="color: black;" lang="EN-US">));</span>）。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.75pt;" align="left"><span style="font-family: 宋体;">从上面的对比，可以看出<span lang="EN-US">junit4</span>与<span lang="EN-US">junit3</span>的区别在于：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.75pt;" align="left"><strong><span style="font-family: 宋体;">去掉与类<span lang="EN-US">TestCase</span>的偶联性，唯一触发<span lang="EN-US">TestCase</span>的地方就是在<span lang="EN-US">@Test</span>上。</span></strong><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.75pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">4.</span><span style="font-family: 宋体;">以上就是<span lang="EN-US">junit4</span>与<span lang="EN-US">junit3</span>的区别与改进，下面再继续看看<span lang="EN-US">junit4</span>有哪些新增加的功能吧：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.75pt;" align="left"><strong><span style="font-family: 宋体;" lang="EN-US">1.<span style="color: #7f0055;"> @Before </span></span></strong><strong><span style="font-family: 宋体; color: #7f0055;">和<span lang="EN-US"> @After</span></span></strong><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.75pt;" align="left"><span style="font-family: 宋体;">类似于<span lang="EN-US">init() </span>和<span lang="EN-US">destory(),</span>可以将一些初始化和释放工作放到这里面，每个类都只有一个<span style="color: #7f0055;" lang="EN-US">@Before </span><span style="color: #7f0055;">和<span lang="EN-US"> @After</span>。为了实现这个功能，我们将测试类修改如下：</span><span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> org.junit.Test;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">新增加两个类</span></em><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: red;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: red;" lang="EN-US"> org.junit.Before;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: red;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: red;" lang="EN-US"> org.junit.After;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">import</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">static</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
org.junit.Assert.*;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">class</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
BaseClassTestNew {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">BaseClass </span><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US"> ; </span><em><span style="font-family: 宋体; color: red;" lang="EN-US">//</span></em><em><span style="font-family: 宋体; color: red;">这里不用进行初始化</span></em><span style="font-family: 宋体; color: black;"> </span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">@Before <strong>public</strong> <strong>void</strong>
runBeforeTest(){</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">baseClass = <strong>new</strong> BaseClass();</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: #646464;" lang="EN-US">@Test</span><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">void</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> method (){ </span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left; text-indent: 40pt;" align="left"><em><span style="font-family: 宋体; color: black;" lang="EN-US">assertTrue</span></em><span style="font-family: 宋体; color: black;" lang="EN-US">(</span><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US">.method
().equals(</span><span style="font-family: 宋体; color: #2a00ff;" lang="EN-US">"test.junit.BaseClass"</span><span style="font-family: 宋体; color: black;" lang="EN-US">));</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">@After <strong>public</strong> <strong>void</strong>
runAfterTest(){</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 52.5pt; text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">baseClass.teardownList();</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 52.5pt; text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">baseClass = <strong>null</strong>;</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: red;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21.75pt;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">@Before </span><span style="font-family: 宋体; color: black;">方法会在<span lang="EN-US"> @Test </span>之前进行，相反<span lang="EN-US"> @After </span>会在所有方法运行完进行。</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">Junit4</span><span style="font-family: 宋体;">同时还支持<span lang="EN-US"> @BeforeClass </span>和<span lang="EN-US"> @AfterClass</span>，原理一样，大家可以参考相关资料。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">2.TimeOut </span><span style="font-family: 宋体;">属性<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体;" lang="EN-US">Junit4</span><span style="font-family: 宋体;">支持<span lang="EN-US">timeout</span>，运用如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">a. </span><span style="font-family: 宋体; color: black;">首先在被测试类中增加用于测试<span lang="EN-US">timeout</span>的方法：</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">void</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
methodTimeOut() {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">try</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">Thread.<em>sleep</em>(50);</span><span style="font-family: 宋体; color: red;" lang="EN-US">//</span><span style="font-family: 宋体; color: red;">睡<span lang="EN-US">50</span>秒</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 42pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">System.</span><em><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">out</span></em><span style="font-family: 宋体; color: black;" lang="EN-US">.println(</span><span style="font-family: 宋体; color: #2a00ff;" lang="EN-US">"methodTimeOut"</span><span style="font-family: 宋体; color: black;" lang="EN-US">);</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">} </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">catch</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> (InterruptedException e) {</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">b.</span><span style="font-family: 宋体; color: black;">看看怎么测试这个方法：</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: #646464;" lang="EN-US">@Test</span><span style="font-family: 宋体; color: black;" lang="EN-US">(timeout=5)</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">public</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US"> </span><strong><span style="font-family: 宋体; color: #7f0055;" lang="EN-US">void</span></strong><span style="font-family: 宋体; color: black;" lang="EN-US">
methodTimeOut(){</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: 21pt;" align="left"><span style="font-family: 宋体; color: #0000c0;" lang="EN-US">baseClass</span><span style="font-family: 宋体; color: black;" lang="EN-US">.methodTimeOut();</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">}</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">1. </span><span style="font-family: 宋体; color: black;">增加（<span lang="EN-US">timeout=5</span>）这个设置项</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体; color: black;" lang="EN-US">2. </span><span style="font-family: 宋体; color: black;">运行完 没有输出<span lang="EN-US">methodTimeOut</span>，说明这个方法没有执行完，达到效果。</span><span style="font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">junit</span><span style="font-family: 宋体; color: #3f5fbf;">中的</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">assert</span><span style="font-family: 宋体; color: #3f5fbf;">方法全部放在</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">Assert</span><span style="font-family: 宋体; color: #3f5fbf;">类中，总结一下</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">junit</span><span style="font-family: 宋体; color: #3f5fbf;">类中</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">assert</span><span style="font-family: 宋体; color: #3f5fbf;">方法的分类。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">1.assertTrue/False([String</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">message,]boolean</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">condition);</span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">判断一个条件是</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">true</span><span style="font-family: 宋体; color: #3f5fbf;">还是</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">false</span><span style="font-family: 宋体; color: #3f5fbf;">。感觉这个最好用了，不用记下来那么多的方法名。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">2.fail([String</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">message,]);</span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">失败，可以有消息，也可以没有消息。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">3.assertEquals([String</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">message,]Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">expected,Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">actual);</span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">判断是否相等，可以指定输出错误信息。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">第一个参数是期望值，第二个参数是实际的值。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">这个方法对各个变量有多种实现。在</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">JDK1.5</span><span style="font-family: 宋体; color: #3f5fbf;">中基本一样。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">但是需要主意的是</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">float</span><span style="font-family: 宋体; color: #3f5fbf;">和</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">double</span><span style="font-family: 宋体; color: #3f5fbf;">最后面多一个</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">delta</span><span style="font-family: 宋体; color: #3f5fbf;">的值，可能是误差范围，不确定这个</span><span style="font-family: &quot;Courier New&quot;; color: black;"> </span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">4.assertNotNull/Null([String</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">message,]Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">obj);</span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">判读一个对象是否非空</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">(</span><span style="font-family: 宋体; color: #3f5fbf;">非空</span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">)</span><span style="font-family: 宋体; color: #3f5fbf;">。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">5.assertSame/NotSame([String</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">message,]Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">expected,Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">actual);</span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">判断两个对象是否指向同一个对象。看内存地址。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">7.failNotSame/failNotEquals(String</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">message,</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">expected,</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">Object</span><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US"> </span><span style="font-family: &quot;Courier New&quot;; color: #3f5fbf;" lang="EN-US">actual)</span><span style="font-family: 宋体; color: #3f5fbf;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">当不指向同一个内存地址或者不相等的时候，输出错误信息。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: &quot;Courier New&quot;; color: black;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; color: #3f5fbf;">注意信息是必须的，而且这个输出是格式化过的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left;" align="left"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: left; text-indent: -18pt;" align="left"><span style="font-family: 宋体;" lang="EN-US"><br />
<!--[if !supportLineBreakNewLine]--><br />
<!--[endif]--><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.blogjava.net/java-god/aggbug/188272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-03-24 16:12 <a href="http://www.blogjava.net/java-god/archive/2008/03/24/188272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wsdl文档结构分析</title><link>http://www.blogjava.net/java-god/archive/2008/03/20/187504.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Thu, 20 Mar 2008 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/03/20/187504.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/187504.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/03/20/187504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/187504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/187504.html</trackback:ping><description><![CDATA[&lt;?xml version="1.0"?&gt;<br />
&lt;definitions name="StockQuote"<br />
&nbsp;&nbsp;&nbsp; targetNamespace="http://example.com/stockquote.wsdl"<br />
&nbsp;&nbsp;&nbsp; xmlns:tns="http://example.com/stockquote.wsdl"<br />
&nbsp;&nbsp;&nbsp; xmlns:xsd1="http://example.com/stockquote.xsd"<br />
&nbsp;&nbsp;&nbsp; xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"<br />
&nbsp;&nbsp;&nbsp; xmlns="http://schemas.xmlsoap.org/wsdl/"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- 独立与机器和语言的类型定义 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;types&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;schema targetNamespace="http://example.com/stockquote.xsd"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlns="http://www.w3.org/2000/10/XMLSchema"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;element name="TradePriceRequest"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;complexType&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;all&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;element name="tickerSymbol" type="string" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/all&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/complexType&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/element&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;element name="TradePrice"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;complexType&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;all&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;element name="price" type="float" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/all&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/complexType&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/element&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/schema&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/types&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- 包括函数参数（输入与输出分开）或文档描述 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;message name="GetLastTradePriceInput"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;part name="body" element="xsd1:TradePriceRequest" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/message&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;message name="GetLastTradePriceOutput"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;part name="body" element="xsd1:TradePrice" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/message&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- 引用消息部分中消息定义来描述函数签名（操作名、输入参数、输出参数） --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;portType name="StockQuotePortType"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;operation name="GetLastTradePrice"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;input message="tns:GetLastTradePriceInput" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;output message="tns:GetLastTradePriceOutput" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/operation&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/portType&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- PortTypes部分的每一操作在此绑定实现 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!-- 说明了消息样式是rpc(document)，并且网络应用协议是HTTP --&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!--&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;operation name="GetLastTradePrice"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;soap:operation<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; soapAction="http://example.com/GetLastTradePrice" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;input&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!-- 说明输入输出元素均使用了字面编码。use的值必须是literal --&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;soap:body use="literal" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/input&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;output&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;soap:body use="literal" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/output&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/operation&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/binding&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;!-- 确定每一绑定的端口地址 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;service name="StockQuoteService"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;documentation&gt;My first service&lt;/documentation&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;port name="StockQuotePort" binding="tns:StockQuoteBinding"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;soap:address location="http://example.com/stockquote" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/port&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/service&gt;<br />
<br />
&lt;/definitions&gt;<br />
<img src ="http://www.blogjava.net/java-god/aggbug/187504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-03-20 16:27 <a href="http://www.blogjava.net/java-god/archive/2008/03/20/187504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ejb 3.0 具名查询和原生查询的写法列子。</title><link>http://www.blogjava.net/java-god/archive/2008/03/14/186188.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Fri, 14 Mar 2008 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/03/14/186188.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/186188.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/03/14/186188.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/186188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/186188.html</trackback:ping><description><![CDATA[package com.vsc.ejb.persistence.query;<br />
<br />
import java.io.Serializable;<br />
import java.sql.Timestamp;<br />
<br />
import javax.persistence.CascadeType;<br />
import javax.persistence.ColumnResult;<br />
import javax.persistence.Entity;<br />
import javax.persistence.GeneratedValue;<br />
import javax.persistence.GenerationType;<br />
import javax.persistence.Id;<br />
import javax.persistence.JoinColumn;<br />
import javax.persistence.ManyToOne;<br />
import javax.persistence.NamedNativeQueries;<br />
import javax.persistence.NamedNativeQuery;<br />
import javax.persistence.NamedQueries;<br />
import javax.persistence.NamedQuery;<br />
import javax.persistence.SqlResultSetMapping;<br />
import javax.persistence.SqlResultSetMappings;<br />
import javax.persistence.Table;<br />
import javax.persistence.TableGenerator;<br />
<br />
import com.clindataware.cdms.ejb.persistence.study.Study;<br />
import com.clindataware.cdms.ejb.persistence.study.Subject;<br />
<br />
@Entity<br />
@Table(name = "cdms_query")<br />
//这里可以放多个具名查询，有多个具名查询必须要用到NamedQueries。<br />
@NamedQueries( {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @NamedQuery(name = "Query.statisticByItem", query = "select count(query.itemoid) as sum,query.eventpath,query.formpath,query.itemoid,query.isprocessed"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "&nbsp; from Query query "<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " where query.study.id=:studyid and query.isdisable='false'"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " group by query.eventpath,query.formpath,query.itemoid,query.isprocessed"),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // sum, pid, pname, isp?<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @NamedQuery(name = "Query.statisticByInvestigator", query = "select count(query.participantid) as sum,user.fullname,query.participantid,query.isprocessed"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "&nbsp; from Query query,Participant part,User user"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " where query.study.id=:studyid "<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "&nbsp;&nbsp; and part.studyid=:studyid "<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "&nbsp;&nbsp; and query.participantid=part.user.id "<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "&nbsp;&nbsp; and part.user.id=user.id "<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "&nbsp;&nbsp; and query.isdisable='false' "<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " group by query.participantid,query.isprocessed,user.fullname "),<br />
})<br />
//这里可以放多个原生的具名查询，有多个原生的具名查询必须要用到NamedNativeQueries。<br />
@NamedNativeQueries({<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // sum, pid, pname, isp?<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @NamedNativeQuery(name = "Query.statisticBySite", query = "select count(b.id) as sum,b.name,b.id,a.isprocessed from " +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "(" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " select query.isprocessed,org.siteid as org_siteid,subject.siteid as sub_siteid" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " from cdms_Query query, cdms_Organization_Study org, cdms_Subject subject" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " where query.studyid=:studyid and query.studyid=org.studyid " +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " and query.subjectid=subject.id and query.isdisable='false'" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ") a" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " right join"+<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " (select distinct site.* from cdms_Query query, cdms_Organization site, cdms_Organization_Study org, cdms_Subject subject" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " where query.studyid=:studyid and site.id=org.siteid and query.studyid=org.studyid " +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " and site.category=1 and site.id=subject.siteid" +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " ) b on (a.org_siteid = b.id and a.sub_siteid = b.id) " +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " group by b.id, b.name, a.isprocessed", <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; resultSetMapping = "Query.statisticBySiteMapping"),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // sum, qtype, code, isp?<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @NamedNativeQuery(name = "Query.statisticByCause", query = "select count(query.id) as sum,qtype.name as name,qtype.code as code,query.isprocessed as isprocessed from cdms_querytype qtype left join cdms_query query on ( query.studyid = :studyid&nbsp; and query.querytype = qtype.code&nbsp; and query.isdisable = 'false' ) group by qtype.name,qtype.code,query.isprocessed", <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; resultSetMapping = "Query.statisticByCauseMapping")<br />
})<br />
//SqlResultSetMapping这定结果集返回的实体类型或标量值。<br />
@SqlResultSetMappings({<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @SqlResultSetMapping(name = "Query.statisticByCauseMapping", columns = {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @ColumnResult(name = "sum"), @ColumnResult(name = "name"),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @ColumnResult(name = "code"), @ColumnResult(name = "isprocessed") }),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @SqlResultSetMapping(name = "Query.statisticBySiteMapping", columns = {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @ColumnResult(name = "sum"), @ColumnResult(name = "name"),<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @ColumnResult(name = "id"), @ColumnResult(name = "isprocessed") })<br />
})<br />
<br />
public class Query implements Serializable {<br />
<br />
&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = 5025535683766463922L;<br />
<br />
&nbsp;&nbsp;&nbsp; private Long id;<br />
<br />
&nbsp;&nbsp;&nbsp; private String correctedvalue;<br />
<br />
&nbsp;&nbsp;&nbsp; private String correctedcause;<br />
<br />
&nbsp;&nbsp;&nbsp; private Boolean isdisable;<br />
<br />
&nbsp;&nbsp;&nbsp; private Long lastmodifierid;<br />
<br />
&nbsp;&nbsp;&nbsp; private String queryvalue;<br />
<br />
&nbsp;&nbsp;&nbsp; private Subject subject;<br />
<br />
&nbsp;&nbsp;&nbsp; private Integer querytype;<br />
<br />
&nbsp;&nbsp;&nbsp; private Long creatorid;<br />
<br />
&nbsp;&nbsp;&nbsp; private Study study;<br />
<br />
&nbsp;&nbsp;&nbsp; private Boolean isprocessed;<br />
<br />
&nbsp;&nbsp;&nbsp; private Timestamp lastmodifydate;<br />
<br />
&nbsp;&nbsp;&nbsp; private String querynumber;<br />
<br />
&nbsp;&nbsp;&nbsp; private Long participantid;<br />
<br />
&nbsp;&nbsp;&nbsp; private Boolean iscorrected;<br />
<br />
&nbsp;&nbsp;&nbsp; private Timestamp createdate;<br />
<br />
&nbsp;&nbsp;&nbsp; private String querycause;<br />
<br />
&nbsp;&nbsp;&nbsp; private Integer pagenumber;<br />
<br />
&nbsp;&nbsp;&nbsp; private String itemoid;<br />
<br />
&nbsp;&nbsp;&nbsp; private String itemname;<br />
<br />
&nbsp;&nbsp;&nbsp; private String iteminformation;<br />
<br />
&nbsp;&nbsp;&nbsp; private String eventpath;<br />
<br />
&nbsp;&nbsp;&nbsp; private String formpath;<br />
<br />
&nbsp;&nbsp;&nbsp; private Timestamp enddate;<br />
<br />
&nbsp;&nbsp;&nbsp; public Query() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @TableGenerator(name = "queryGen", table = "cdms_seq", pkColumnName = "pkvalue", valueColumnName = "value", pkColumnValue = "cdms_query", allocationSize = 1)<br />
&nbsp;&nbsp;&nbsp; @Id<br />
&nbsp;&nbsp;&nbsp; @GeneratedValue(strategy = GenerationType.TABLE, generator = "queryGen")<br />
&nbsp;&nbsp;&nbsp; public Long getId() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.id;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setId(Long id) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getCorrectedvalue() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.correctedvalue;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setCorrectedvalue(String correctedvalue) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.correctedvalue = correctedvalue;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getCorrectedcause() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.correctedcause;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setCorrectedcause(String correctedcause) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.correctedcause = correctedcause;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Boolean getIsdisable() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.isdisable;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setIsdisable(Boolean isdisable) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.isdisable = isdisable;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Long getLastmodifierid() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.lastmodifierid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setLastmodifierid(Long lastmodifierid) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.lastmodifierid = lastmodifierid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getQueryvalue() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.queryvalue;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setQueryvalue(String queryvalue) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.queryvalue = queryvalue;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @ManyToOne(cascade = CascadeType.REFRESH)<br />
&nbsp;&nbsp;&nbsp; @JoinColumn(name = "subjectid", referencedColumnName = "id")<br />
&nbsp;&nbsp;&nbsp; public Subject getSubject() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.subject;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setSubject(Subject subject) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.subject = subject;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Integer getQuerytype() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.querytype;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setQuerytype(Integer querytype) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.querytype = querytype;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Long getCreatorid() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.creatorid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setCreatorid(Long creatorid) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.creatorid = creatorid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @ManyToOne(cascade = CascadeType.REFRESH)<br />
&nbsp;&nbsp;&nbsp; @JoinColumn(name = "studyid", referencedColumnName = "id")<br />
&nbsp;&nbsp;&nbsp; public Study getStudy() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.study;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setStudy(Study study) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.study = study;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Boolean getIsprocessed() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.isprocessed;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setIsprocessed(Boolean isprocessed) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.isprocessed = isprocessed;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Timestamp getLastmodifydate() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.lastmodifydate;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setLastmodifydate(Timestamp lastmodifydate) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.lastmodifydate = lastmodifydate;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getQuerynumber() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.querynumber;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setQuerynumber(String querynumber) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.querynumber = querynumber;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Long getParticipantid() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.participantid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setParticipantid(Long participantid) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.participantid = participantid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Boolean getIscorrected() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.iscorrected;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setIscorrected(Boolean iscorrected) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.iscorrected = iscorrected;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Timestamp getCreatedate() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.createdate;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setCreatedate(Timestamp createdate) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.createdate = createdate;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getQuerycause() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.querycause;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setQuerycause(String querycause) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.querycause = querycause;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getIteminformation() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return iteminformation;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setIteminformation(String iteminformation) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.iteminformation = iteminformation;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getItemname() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return itemname;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setItemname(String itemname) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.itemname = itemname;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public String getItemoid() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return itemoid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setItemoid(String itemoid) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.itemoid = itemoid;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Integer getPagenumber() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return pagenumber;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setPagenumber(Integer pagenumber) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.pagenumber = pagenumber;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return Returns the eventpath.<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public String getEventpath() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return eventpath;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param eventpath<br />
&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The eventpath to set.<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void setEventpath(String eventpath) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.eventpath = eventpath;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @return Returns the formpath.<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public String getFormpath() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return formpath;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;* @param formpath<br />
&nbsp;&nbsp;&nbsp; &nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The formpath to set.<br />
&nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; public void setFormpath(String formpath) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.formpath = formpath;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public Timestamp getEnddate() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return enddate;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setEnddate(Timestamp enddate) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.enddate = enddate;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
<br />
<img src ="http://www.blogjava.net/java-god/aggbug/186188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-03-14 09:34 <a href="http://www.blogjava.net/java-god/archive/2008/03/14/186188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade模式的一个典型应用--数据库JDBC的应用</title><link>http://www.blogjava.net/java-god/archive/2008/02/28/182697.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Thu, 28 Feb 2008 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/02/28/182697.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/182697.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/02/28/182697.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/182697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/182697.html</trackback:ping><description><![CDATA[<em><strong>Facade模式的定义</strong></em>: 为子系统中的一组接口提供一个一致的界面.Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作:<br />
<strong>说明：</strong>这是在网上的一篇文章中看到的列子，上面没有写全，我在这里补上了，没有用到接口。<br />
<br />
package com.pattern.structural.facade;<br />
<br />
import java.sql.Connection;<br />
import java.sql.DriverManager;<br />
import java.sql.PreparedStatement;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;<br />
/*<br />
&nbsp;* 外观模式的主要用途就是为子系统的复杂处理过程提供方便的调用方法，<br />
&nbsp;* 使得子系统更加容易被使用。<br />
&nbsp;* Facade对象通常属于Singleton模式。<br />
*/<br />
public class Mysql {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private static Connection conn=null;<br />
&nbsp;&nbsp;&nbsp; private static PreparedStatement prep=null;<br />
<br />
&nbsp;&nbsp;&nbsp; public Mysql(String sql) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prep = conn.prepareStatement(sql);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void setString(int index, String parString) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prep.setString(index, parString);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public ResultSet executeQuery() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return prep.executeQuery();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public void close() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; prep.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
package com.pattern.structural.facade;<br />
<br />
import java.sql.Connection;<br />
import java.sql.DriverManager;<br />
import java.sql.PreparedStatement;<br />
import java.sql.ResultSet;<br />
<br />
public class DBCompare {<br />
<br />
&nbsp;&nbsp;&nbsp; public void getResultSet(String sql) {<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String sql = "SELECT * FROM bulletin WHERE id = ?";<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Mysql mysql = new Mysql(sql);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mysql.setString(1, "4");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet rset = mysql.executeQuery();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (rset.next()) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(rset.getString("id"));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mysql.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mysql = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
package com.pattern.structural.facade;<br />
<br />
import java.sql.ResultSet;<br />
<br />
public class FacadeTest {<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Mysql mysql = new Mysql("SELECT * FROM bulletin");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet rset = mysql.executeQuery();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (rset.next()) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(rset.getString("id"));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mysql.close();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mysql = null;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
<img src ="http://www.blogjava.net/java-god/aggbug/182697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-02-28 15:27 <a href="http://www.blogjava.net/java-god/archive/2008/02/28/182697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Command——电视篇</title><link>http://www.blogjava.net/java-god/archive/2008/02/27/182377.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Wed, 27 Feb 2008 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/02/27/182377.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/182377.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/02/27/182377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/182377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/182377.html</trackback:ping><description><![CDATA[<span id="zoom">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span style="font-family: 宋体;">大家都知道</span><span style="font-family: 宋体;">电视遥控器节目面板（</span><span lang="EN-US">ProgramPan</span><span style="font-family: 宋体;">）是由节目按钮组成，通过选择相应的节目按钮，就可以切换到相应的节目屏道。</span><span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-family: 宋体;"><font size="4">下来让我们看看如何实现通过遥控器按钮选择节目屏道的过程吧。</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">&nbsp;<o:p></o:p></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">1</span><span style="font-family: 宋体;">、在这里，先定义遥控器按钮（</span><span lang="EN-US">RemoteControlButton</span><span style="font-family: 宋体;">）接口：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">public interface RemoteControlButton {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp; </span>public abstract void<span>&nbsp; </span>selectProgram(); //</span><span style="font-family: 宋体;">选择节目屏道</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">2</span><span style="font-family: 宋体;">、再定义遥控器按钮（</span><span lang="EN-US">RemoteControlButton</span><span style="font-family: 宋体;">）接口的实现类：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">A</span><span style="font-family: 宋体;">：卡通节目按钮（</span><span lang="EN-US">CartonProgramButton</span><span style="font-family: 宋体;">）类：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">public class CartonProgramButton implements RemoteControlButton{</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>public void selectProgram() {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println("</span><span style="font-family: 宋体;">选择了卡通屏道！</span><span lang="EN-US">");</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">B</span><span style="font-family: 宋体;">：电视剧节目按钮（</span><span lang="EN-US">TvPlanProgramButton</span><span style="font-family: 宋体;">）类：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">public class TvPlanProgramButton implements RemoteControlButton {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>public void selectProgram() {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println("</span><span style="font-family: 宋体;">选择了电视剧屏道！</span><span lang="EN-US">");</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">C</span><span style="font-family: 宋体;">：足球节目按钮（</span><span lang="EN-US">FootProgramButton</span><span style="font-family: 宋体;">）类：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">public class FootProgramButton implements RemoteControlButton {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>public void selectProgram() {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>System.out.println("</span><span style="font-family: 宋体;">选择了足球屏道！</span><span lang="EN-US">");</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">3</span><span style="font-family: 宋体;">、遥控器节目面板（</span><span lang="EN-US">ProgramPan</span><span style="font-family: 宋体;">）类：用来控制节目按钮，显示节目</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">public class ProgramPan {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>public static List programList() {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>List list = new ArrayList();<span>&nbsp; </span>//</span><span style="font-family: 宋体;">节目屏道按钮列表</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>list.add(new CartonProgramButton()); //</span><span style="font-family: 宋体;">卡通屏道按钮</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>list.add(new TvPlanProgramButton()); //</span><span style="font-family: 宋体;">电视剧屏道按钮</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>list.add(new FootProgramButton());<span>&nbsp;&nbsp; </span>//</span><span style="font-family: 宋体;">足球屏道按钮</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp;&nbsp;&nbsp; </span>return list;</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">4</span><span style="font-family: 宋体;">、编写测试类：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">public class TestCommand {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>public static void main(String[] args) {</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span>List list = ProgramPan.programList();<span>&nbsp; </span>//</span><span style="font-family: 宋体;">获得节目屏道按钮</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp;&nbsp;&nbsp; </span>for (Iterator it = list.iterator();it.hasNext();)</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>( (RemoteControlButton) it.next()).selectProgram();<span>&nbsp; </span>//</span><span style="font-family: 宋体;">选择节目屏道中对应的节目</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4"><span>&nbsp; </span>}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span lang="EN-US"><font size="4">}</font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">5</span><span style="font-family: 宋体;">、说明：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">A</span><span style="font-family: 宋体;">：</span><span lang="EN-US">Command</span><span style="font-family: 宋体;">说白了就是通过选择一个个命令，然后执行相应动作。</span><span lang="EN-US"><o:p></o:p></span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">B</span><span style="font-family: 宋体;">：</span><span lang="EN-US">Command</span><span style="font-family: 宋体;">是对行为进行封装的典型模式，在本例中通过遥控器节目面板（</span><span lang="EN-US">ProgramPan</span><span style="font-family: 宋体;">）这个封装类来实现我们看电视节目的目的。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><font size="4"><span lang="EN-US">C</span><span style="font-family: 宋体;">：</span><span lang="EN-US">Command</span><span style="font-family: 宋体;">模式和</span><span lang="EN-US">Facade(</span><span style="font-family: 宋体;">外观</span><span lang="EN-US">)</span><span style="font-family: 宋体;">模式似乎比较相似。都是通过封装类来进行访问的。如何区分，对这点我也比较疑惑。</span></font></p>
</span>
<img src ="http://www.blogjava.net/java-god/aggbug/182377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-02-27 09:21 <a href="http://www.blogjava.net/java-god/archive/2008/02/27/182377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>