﻿<?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-天行健-随笔分类-系统设计</title><link>http://www.blogjava.net/bnlovebn/category/15729.html</link><description>《周易》曰：&lt;br&gt;
天行健，君子以自强不息(乾卦)&lt;br&gt;
地势坤，君子以厚德载物(坤卦)
</description><language>zh-cn</language><lastBuildDate>Tue, 20 Nov 2007 06:15:13 GMT</lastBuildDate><pubDate>Tue, 20 Nov 2007 06:15:13 GMT</pubDate><ttl>60</ttl><item><title>顺风：关于面向服务的SOA的八点断想[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/11/20/161792.html</link><dc:creator>重归本垒（BNBN）</dc:creator><author>重归本垒（BNBN）</author><pubDate>Tue, 20 Nov 2007 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/11/20/161792.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/161792.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/11/20/161792.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/161792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/161792.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 一、SOA是指面向服务的体系结构（service-oriented architecture），他代表了包括web技术在内的软件程序甚至硬件技术的一个发展方向，相对于错综复杂、标准各异的硬件平台、操作系统和编程语言，SOA提供尽可能中立而有效的接口，以实现任务、服务之间的对话，直接降低了商业信息系统的沟通成本。 <br />
<br />
&nbsp;&nbsp;&nbsp; 二、SOA更加接近比尔&#183;盖茨&#8220;信息就在你指尖&#8221;的愿景，继互联网打破信息和数据流动的壁垒之后，致力于打破软件程序在不同商业组织现有的机构系统之间进行无缝衔接的障碍，而IBM、RACLE等巨人定制的SOA国际标准SCA已经为此构造出简单性的底层技术标准基础。</p>
<p>&nbsp;&nbsp;&nbsp; 三、原则上所有异构的信息系统都存在无缝衔接的内在需求。传统的搜索引擎系统就是一种典型的封闭结构，没有真正无缝的外部接口。伯纳斯&#183;李所推动的语义网和web化的SOA在本质上一致，很好的结合起来双方力量可以倍增，语义网属于从网络底层推动&#8220;无缝衔接&#8221;的努力， 但是在这一技术方面的努力之外，还应该涌现出更多在人性、用户方面推动SOA的努力。</p>
<p>&nbsp;&nbsp;&nbsp; 四、SOA改变了软件的概念。软件原来传统的底层部分被改造为真正工具性的事物，而广义化的软件概念中&#8220;服务和任务&#8221;成为核心；软件不再是组件、单元、数据库等的加和，而是对于任务和服务的回应，因此服务之间的松耦合异常重要和活跃。随着概念的改变，软件业将重新洗牌。竞争规则改变很大，程序、代码、结构次要化，数据、任务、外部接口更加重要，文本数据可能成为以后SOA的主要对象。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;五、SOA侧重提供与不同任务的标准化服务接口，其水平高低应该取决于双方的可理解性、可分解性、可交互和互动性。从代码和数据，到结构的技术升级，将进行新的升级，以结构升级入手，寻找比结构更重要的，诸如函数调用、数据响应、结构自适应等。其中，最大的难点应该是互动如何改变参与者的状态，这也是最刺激的地方。</p>
<p>&nbsp;&nbsp;&nbsp; 六、SOA作为第三代软件架构标准，如果与web和3G结合，将大大拓展软件行业的空间，软件可以拥有自己的渠道了，软件加强了自身的力量。</p>
<p>&nbsp;&nbsp;&nbsp; 七、SOA真正付诸实施不是一两家商业力量的事情，他属于一项社会化的技术就年百微工程，需要整合大量的资源，需要有坚强的平台，需要建立商业力量和社会力量的共同利基，需要寻找现实和未来的平衡点。SOA的价值目前主要还是在理念方面，可以触类旁通的引用到很多其他技术领域；SOA让信息和技术更加自由、开放、共享，可以盘活更多的商业数据和技术资源，产生新的价值。同时，SOA需要做出大量的垂直标准，不同领域的差异性可能比较大，虽然他们具有共同的SCA底层。<br />
<br />
&nbsp;&nbsp;&nbsp; 八、SOA是商业信息系统的现有资源为基础提供低门槛的接口升级方案，让客户之间的商业沟通更加自由灵活，同时降低面对变化的任务和服务的沟通对话成本，这一目标是通过基于服务和任务的思维和文化理念层次的结构调整实现的，超越了仅仅基于技术和运用的结构调整方案。</p>
 <img src ="http://www.blogjava.net/bnlovebn/aggbug/161792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（BNBN）</a> 2007-11-20 10:04 <a href="http://www.blogjava.net/bnlovebn/archive/2007/11/20/161792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>F5 BIGIP 服务器负载均衡介绍</title><link>http://www.blogjava.net/bnlovebn/archive/2007/11/05/158177.html</link><dc:creator>重归本垒（BNBN）</dc:creator><author>重归本垒（BNBN）</author><pubDate>Mon, 05 Nov 2007 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/11/05/158177.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/158177.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/11/05/158177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/158177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/158177.html</trackback:ping><description><![CDATA[<div>
<div class="introduce">
<p>1． 服务器负载均衡市场需求<br />
&nbsp; 随着Internet的普及以及电子商务、电子政务的发展，越来越多的应用系统需要面对更高的访问量和数据量。同时，企业对在线系统的依赖也越来越高，大量的关键应用需要系统有足够的在线率及高效率。这些要求使得单一的网络服务设备已经不能满足这些需要，由此需要引入服务器的负载均衡，实现客户端同时访问多台同时工作的服务器，一则避免服务器的单点故障，再则提高在线系统的服务处理能力。从业界环境来说，如下的应用需求更是负载均衡发展的推动力：</p>
<ul>
    <li>&nbsp; 业务系统从Client-Server转向采用Browser-Server 系统结构，关键系统需要高可用性
    <li>&nbsp; 电子商务系统的高可用性和高可靠性需要
    <li>&nbsp; IT应用系统大集中的需要 （税务大集中,证券大集中,银行大集中）
    <li>&nbsp; 数据中心降低成本,提高效率<br />
    </li>
</ul>
<p>&nbsp; 负载均衡技术在现有网络结构之上提供了一种廉价、有效、透明的方法，来扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。它有两方面的含义：首先，大量的并发访问或数据流量分担到多台节点设备上分别处理，减少用户等待响应的时间；其次，单个重负载的运算分担到多台节点设备上做并行处理，每个节点设备处理结束后，将结果汇总，返回给用户，系统处理能力得到大幅度提高。</p>
<p>&nbsp; BIG/IP利用定义在其上面的虚拟IP地址来为用户的一个或多个应用服务器提供服务。因此，它能够为大量的基于TCP/IP的网络应用提供服务器负载均衡服务。BIG/IP连续地对目标服务器进行L4到L7合理性检查，当用户通过VIP请求目标服务器服务时，BIG/IP根椐目标服务器之间性能和网络健康情况，选择性能最佳的服务器响应用户的请求。</p>
<p>下图描述了一个负载均衡发生的流程：<br />
&nbsp;</p>
<p><img alt="" src="http://www.adntech.com/article/uploadfile/200704/20070415095440186.jpg" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp; 1. 客户发出服务请求到VIP<br />
&nbsp; 2. BIGIP接收到请求，将数据包中目的IP地址改为选中的后台服务器IP地址，然后将数据包发出到后台选定的服务器<br />
&nbsp; 3. 后台服务器收到后，将应答包按照其路由发回到BIGIP<br />
&nbsp; 4. BIGIP收到应答包后将其中的源地址改回成VIP的地址，发回客户端，由此就完成了一个标准的服务器负载均衡的流程。</p>
<p>2.负载均衡典型流程</p>
<ul>
    <li>&nbsp; 通过VIP来截获合适的需要负载均衡的流量
    <li>&nbsp; 服务器监控和健康检查,随时了解服务器群的可用性状态
    <li>&nbsp;&nbsp;负载均衡和应用交换功能,通过各种策略导向到合适的服务器<br />
    &nbsp;&nbsp; </li>
</ul>
<p>2.1 通过VIP来截获合适的需要负载均衡的流量<br />
&nbsp;&nbsp; 在BIGIP上通过设置VIP来截获需要进行负载均衡的流量，这个VIP地址可以是一个独立的主机地址和端口的组合（例如：202.101.112.115:80）也可以是一个网络地址和端口的组合（例如：202.101.112.0:80），当流量经过BIGIP的时候，凡是命中VIP的流量都将被截获并按照规则进行负载均衡。</p>
<p>2.2 服务器的健康监控和检查</p>
<p>&nbsp;&nbsp; <strong>服务器 (Node) - Ping (ICMP)</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIGIP可以定期的通过ICMP包对后台服务器的IP地址进行检测，如果在设定的时间内能收到该地址的ICMP的回应，则认为该服务器能提供服务</p>
<p>&nbsp;&nbsp; <strong>服务 (Port) &#8211; Connect<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BIGIP可以定期的通过TCP包对后台服务器的服务端口进行检测，如果在设定的时间内能收到该服务器端口的回应，则认为该服务器能提供服务</p>
<p><br />
&nbsp;&nbsp; <strong>扩展内容查证(ECV: Extended Content Verification)—ECV</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; ECV是一种非常复杂的服务检查，主要用于确认应用程序能否对请求返回对应的数据。如果一个应用对该服务检查作出响应并返回对应的数据，则BIG/IP控制器将该服务器标识为工作良好。如果服务器不能返回相应的数据，则将该服务器标识为宕机。宕机一旦修复，BIG/IP就会自动查证应用已能对客户请求作出正确响应并恢复向该服务器传送。该功能使BIG/IP可以将保护延伸到后端应用如Web内容及数据库。BIG/ip的ECV功能允许您向Web服务器、防火墙、缓存服务器、代理服务器和其它透明设备发送查询，然后检查返回的响应。这将有助于确认您为客户提供的内容正是其所需要的。</p>
<p>&nbsp;&nbsp; <strong>扩展应用查证(EAV: Extended Application Verification)</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; EAV是另一种服务检查，用于确认运行在某个服务器上的应用能否对客户请求作出响应。为完成这种检查，BIG/IP控制器使用一个被称作外部服务检查者的客户程序，该程序为BIG/IP提供完全客户化的服务检查功能，但它位于BIG/IP控制器的外部。例如，该外部服务检查者可以查证一个Internet或Intranet上的从后台数据库中取出数据并在HTML网页上显示的应用能否正常工作。EAV是BIG/IP提供的非常独特的功能，它提供管理者将BIG/IP客户化后访问各种各样应用的能力，该功能使BIG/IP在提供标准的可用性查证之外能获得服务器、应用及内容可用性等最重要的反馈。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 该功能对于电子商务和其它应用至关重要，它用于从客户的角度测试您的站点。例如，您可以模拟客户完成交易所需的所有步骤－连接到站点、从目录中选择项目以及验证交易使用的信用卡。一旦BIG/ip掌握了该&#8220;可用性&#8221;信息，即可利用负载均衡使资源达到最高的可用性。</p>
<p>&nbsp; BIG/ip已经为测试Internet服务的健康情况和状态，预定义的扩展应用验证(EAV)，它有二种用户界面：浏览器和CLI配置。BIG/IP预定义的应用检查：FTP、NNTP、SMTP、POP3和MSSQL。</p>
<p><br />
2.3 负载均衡和应用交换功能,通过各种策略导向到合适的服务器</p>
<p>&nbsp; BIGIP是一台对流量和内容进行管理分配的设备。它提供12种灵活的算法将数据流有效地转发到它所连接的服务器群。而面对用户，只是一台虚拟服务器。用户此时只须记住一台服务器，即虚拟服务器。但他们的数据流却被BIGIP灵活地均衡到所有的服务器。这12种算法包括：</p>
<p><strong>轮询（Round Robin）：</strong>顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第7层的故障，BIG/IP就把其从顺序循环队列中拿出，不参加下一次的轮询，直到其恢复正常。<br />
<strong>比率（Ratio）：</strong>给每个服务器分配一个加权值为比例，根椐这个比例，把用户的请求分配到每个服务器。当其中某个服务器发生第二到第7层的故障，BIG/IP就把其从服务器队列中拿出，不参加下一次的用户请求的分配，直到其恢复正常。<br />
<strong>优先权（Priority）：</strong>给所有服务器分组，给每个组定义优先权，BIG/IP用户的请求，分配给优先级最高的服务器组（在同一组内，采用轮询或比率算法，分配用户的请求）；当最高优先级中所有服务器出现故障，BIG/IP才将请求送给次优先级的服务器组。这种方式，实际为用户提供一种热备份的方式。<br />
<strong>最少的连接方式（Least Connection）：</strong>传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7层的故障，BIG/IP就把其从服务器队列中拿出，不参加下一次的用户请求的分配，直到其恢复正常。<br />
<strong>最快模式（Fastest）：</strong>传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7层的故障，BIG/IP就把其从服务器队列中拿出，不参加下一次的用户请求的分配，直到其恢复正常。<br />
<strong>观察模式（Observed）：</strong>连接数目和响应时间以这两项的最佳均衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7层的故障，BIG/IP就把其从服务器队列中拿出，不参加下一次的用户请求的分配，直到其恢复正常。<br />
<strong>预测模式（Predictive）：</strong>BIG/IP利用收集到的服务器当前的性能指标，进行预测分析，选择一台服务器在下一个时间片内，其性能将达到最佳的服务器相应用户的请求。(被bigip进行检测)<br />
<strong>动态性能分配（Dynamic Ratio-APM):</strong>BIG/IP收集到的应用程序和应用服务器的各项性能参数，动态调整流量分配。<br />
<strong>动态服务器补充（Dynamic Server Act.):</strong>当主服务器群中因故障导致数量减少时，动态地将备份服务器补充至主服务器群。<br />
<strong>服务质量(QoS)：</strong>按不同的优先级对数据流进行分配。<br />
<strong>服务类型(ToS)：</strong>按不同的服务类型（在Type of Field中标识）对数据流进行分配。<br />
<strong>规则模式：</strong>针对不同的数据流设置导向规则，用户可自行编辑流量分配规则，BIG/IP利用这些规则对通过的数据流实施导向控制。<br />
</p>
</div>
</div>
 <img src ="http://www.blogjava.net/bnlovebn/aggbug/158177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（BNBN）</a> 2007-11-05 09:37 <a href="http://www.blogjava.net/bnlovebn/archive/2007/11/05/158177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB交互界面易用性设计和验收的指导性原则[转]</title><link>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133567.html</link><dc:creator>重归本垒（BNBN）</dc:creator><author>重归本垒（BNBN）</author><pubDate>Tue, 31 Jul 2007 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133567.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/133567.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2007/07/31/133567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/133567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/133567.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">随着企业</span><span lang=EN-US><font face="Times New Roman">intranet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和国际</span><span lang=EN-US><font face="Times New Roman">internet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的迅速发展，越来越多的工作流程，商务交易，教育、培训、会议和讲座，以及个人消费娱乐都被转移到所谓的万维网（</span><span lang=EN-US><font face="Times New Roman">World Wide Web</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，以下简称</span><span lang=EN-US><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）上来了。与此相对应的是交互操作的复杂性越来越高。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">随着</span><span lang=EN-US><font face="Times New Roman">Browser/Server</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的日渐流行，很多操作都是在浏览器环境下的网页上完成的，并不是只有失效的链接和意外的出错才会使操作者感到烦恼，即便是一次完整的成功操作过程，也可能因为操作的繁复性过高或者使用上的不方便而给操作者带来不愉快的体验。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本文试图阐述</span><span lang=EN-US><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交互页面设计的一些指导性原则，这些原则有利于避免发生不愉快的操作体验。这些原则是用户友好性的，是在完成同一种操作要求下，使用户最感到轻松、简单、舒适的</span><span lang=EN-US><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交互界面设计原则。我们假定我们讨论的</span><span lang=EN-US><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面都是功能正常的，符合美学观点的。需要说明我们讨论的原则可能会和设计上的美学观点以及既有的功能设计有所冲突。如果发生这种情况，基于&#8220;实用的就是美的&#8221;观点，我们会建议您酌情放弃原先的美学观点与功能设计。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span lang=EN-US>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>1．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入控件的自动聚焦和可用键盘切换输入焦点</span><font face="Times New Roman"> <span lang=EN-US>
<p>&#160;</p>
</span></font></font></strong>
<p>&#160;</p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">JavaScript</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现页面加载完成后立即自动聚焦</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">(focus)</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">到第一个输入控件。可用</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">TAB</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键（</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">IE</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺省实现）或方向键切换聚焦到下一个输入控件。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入控件指</span><span lang=EN-US><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面表单</span><span lang=EN-US><font face="Times New Roman">(&lt;form&gt;)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中显式的，需要用户进行修改、编辑操作的表单元素。对于这些控件，如果没有自动聚焦操作，不可避免的出现一次用户鼠标定位操作（如果用户此前处于键盘输入操作状态或鼠标定位后需要进行键盘输入操作，实际上是键盘鼠标切换操作）。如果鼠标定位后需要进行键盘输入操作，如果不能键盘切换输入焦点，那么不可避免的在切换输入焦点时需要反复的键盘鼠标切换操作，这是很繁琐的。</span></font></p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>如果实现了页面加载完成即自动聚焦到第一个输入控件，并且可以键盘切换输入焦点标定位操作，那么对于用户来说整个页面的输入操作可能都不需要鼠标操作，或次数较少，这是一种便利。毕竟频繁的键盘鼠标切换操作是比较累人的。</font></span></p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于有输入栏的对话框或网页，在不干预的情况下就应将当前控制焦点定位在待输入的输入栏上；如果输入栏在一般情况下不需要更改其中的内容，则应直接将焦点定在&#8220;确定&#8221;按钮上；在几个输入栏之间应支持</span><span lang=EN-US><font face="Times New Roman">tab</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US><font face="Times New Roman">shift+tab</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">切换操作，&#8220;确定&#8221;和&#8220;取消&#8221;应该是切换操作的终点，与具体所在位置无关。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><span lang=EN-US>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; mso-list: l1 level1 lfo1; tab-stops: list 0cm"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>2．</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></font></span></span></strong><font size=3><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可用</span><span lang=EN-US><font face="Times New Roman">Enter</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（或</span><span lang=EN-US><font face="Times New Roman">Ctrl</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＋</span><span lang=EN-US><font face="Times New Roman">Enter</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）键提交，确保和点击提交按钮的效果是相同的</span><span lang=EN-US>
<p>&#160;</p>
</span></strong></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不要在提交按钮上加入</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">onClick=&#8221;&#8230;&#8221;</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">JavaScript</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</span><span lang=EN-US><font face="Times New Roman">Enter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键提交页面是原则</span><span lang=EN-US><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的自然延伸，而且这也是浏览器所缺省支持的。只所以单独列出来是因为实际上有些设计者设计的页面不能达到这种效果，结果导致使用</span><span lang=EN-US><font face="Times New Roman">Enter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键提交和点击&#8220;确定&#8221;按钮提交带来的效果不一样。大部分情况下是设计者在&#8220;确定&#8221;按钮上加入了</span><span lang=EN-US><font face="Times New Roman">onClik=&#8221;&#8230;&#8221;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的代码，通过点击&#8220;确定&#8221;按钮后，会执行一段</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码，比如对某些</span><span lang=EN-US><font face="Times New Roman">hidden</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型的</span><span lang=EN-US><font face="Times New Roman">input</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">元素设值。而使用</span><span lang=EN-US><font face="Times New Roman">Enter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键提交时就不会执行这段代码。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正确的做法是把这段代码移到表单标签</span><span lang=EN-US><font face="Times New Roman">&lt;form&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，以</span><span lang=EN-US><font face="Times New Roman">onSubmit=&#8221;&#8230;&#8221;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性引入。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71; tab-stops: list 0cm"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于</span><span lang=EN-US><font face="Times New Roman">&lt;textarea&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表单元素，它会消耗</span><span lang=EN-US><font face="Times New Roman">Enter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键，因此会使得</span><span lang=EN-US><font face="Times New Roman">Enter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键提交失效。可以引入</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码捕捉</span><span lang=EN-US><font face="Times New Roman">Ctrl+Enter</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复合键，一旦捕捉到即执行表单的</span><span lang=EN-US><font face="Times New Roman">submit()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。对于需要频繁提交的场合，比如</span><span lang=EN-US><font face="Times New Roman">BBS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上，这种代码是很有必要的。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: list 0cm"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>3．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">鼠标动作提示和回应</span><span lang=EN-US>
<p>&#160;</p>
</span></font></strong>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对用户的鼠标定位操作，当移动到可响应的位置上时，应给予视觉或听觉的提示。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动作回应的最简单形式就是鼠标</span><span lang=EN-US><font face="Times New Roman">ICON</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变成手状。浏览器只对具有</span><span lang=EN-US><font face="Times New Roman">href</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性的</span><span lang=EN-US><font face="Times New Roman">HTML</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标签会自动进行这种变换</span><span lang=EN-US><font face="Times New Roman">ICON</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的行为。对于没有</span><span lang=EN-US><font face="Times New Roman">href</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性（或没有设置</span><span lang=EN-US><font face="Times New Roman">href</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性）的标签，可以通过</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置</span><span lang=EN-US><font face="Times New Roman">style</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性的</span><span lang=EN-US><font face="Times New Roman">cursor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang=EN-US><font face="Times New Roman">hand</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></font></p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>目标区域发生变化是更为主动的响应形式。当鼠标指针移到目标区域，此时指针图形改变或文字颜色发生改变均能较大的减轻用户搜索定位目标区域的注意力负担。在按钮上增添直观的图形，尽可能的增大按钮面积；按钮间保持适当的距离，太近增加了用户区别它们之间界限以防误操作的负担，太远增加了用户搜索定位按钮的负担。</font></span></p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt"><span lang=EN-US>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm"><font size=3><strong style="mso-bidi-font-weight: normal"><span lang=EN-US><font face="Times New Roman">4</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．尽可能早的在客户端完成输入数据合法性验证</span><span lang=EN-US>
<p>&#160;</p>
</span></strong></font>
<p>&#160;</p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入数据的合法性检验应该在客户端使用</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">JavaScript</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行验证。除非验证只能在服务器端完成，否则验证工作应在最早能完成的情况下进行。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoBodyTextIndent style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>在客户端完成数据合法性验证，可以避免一次服务器请求和回复通讯，这种通讯是需要用户等待的，如果用户等待很长时间后从服务器返回的结果提示出现的错误是在输入时即可发现的，那么这种设计就是不友好的。诸如密码长度限制，用户名允许字符限制等等，显然应该在客户端提交前就应该进行验证。</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>5．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据应用场景决定在表单页面和提交后返回页面间是否使用中间过渡页面</span><span lang=EN-US>
<p>&#160;</p>
</span></font></strong>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据应用场景，决定是否显示接收表单页面（表单页面和提交后返回页面间的中间过渡页面），以及使用何种方式显示接收表单页面。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表单页面和接收表单页面是大部分</span><span lang=EN-US><font face="Times New Roman">WEB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交互操作赖以实现的配合模式。关于表单页面和接收表单页面的相互关系的设计，要做如下几个方面的考虑。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>一，对于需要频繁操作的场合，从操作便利和快捷性出发，尽可能的减少服务器和客户端交互次数，应该避免使用中间过渡页面。提交完毕直接返回原来的表单页面或默认页面。在这种情况下要考虑到数据安全和可恢复性。</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果因为用户输入的数据不合格，需要重新输入，那么，去除中间页面，把错误信息直接显示在原表单页面上的设计方式，将是最简洁的处理方式。用户只需要根据错误提示进行更正即可。当然这样做稍微增加了编程负担。在表单接收页面上需要包含原表单页面的内容，而且输入数据项都必须用服务器端代码或客户端</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置成用户输入的值。为了开发快捷，可以这样做：表单页面和接收表单页面用同一个服务器端脚本页面实现。这个页面按如下流程完成原来两个页面的工作：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>页面脚本初始化</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>┃</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>检查&#8220;提交&#8221;变量是否设置</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体">┠</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已设置，做数据验证</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>┃<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span>┠验证通过－<span lang=EN-US>&gt;</span>业务逻辑处理－<span lang=EN-US>&gt;</span>使用包含页面方式或重定向方式返回到特定页面<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体">┃<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span>┗</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">验证不通过－</span><span lang=EN-US style="FONT-FAMILY: 宋体">&gt;</span><span style="FONT-FAMILY: 宋体">保存用户输入的数据－<span lang=EN-US>&gt;</span>退出表单提交处理到表单页面流程中</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>┗未设置，做表单页面流程，如有来自提交流程中产生的用户输入数据，则显示出来<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>其中，使用包含页面方式返回到特定页面可以避免一次客户端重定向过程，比客户端重定向过程还要快捷和稳定一些。但是有些情况下因为代码变量冲突或其他原因，使用包含页面方式可能并不方便，这时候可以使用服务器端重定向技术，在<span lang=EN-US>ASP</span>里是<span lang=EN-US>Server.Transfer</span>方法，在<span lang=EN-US>Java Servlet</span>里是<span lang=EN-US>RequestDispatcher.forward()</span>方法。不要使用<span lang=EN-US>Response.Redirect</span>或者<span lang=EN-US>HttpServletResponse.sendRedirect()</span>这种客户端<span lang=EN-US>HTTP</span>重定向方法。不使用中间过渡页面也就意味着用户不能后退浏览原先已经填好的表单页面，因为使用的是同一个<span lang=EN-US>URL</span>。所以在验证不通过情况下保存用户输入的数据就是必不可少的。<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>不使用中间过渡页面带来的另一个问题就是使用包含页面方式或服务器端重定向方式返回会使得<span lang=EN-US>URL</span>和页面内容不能一一对应。对于用户可能会直接用这个<span lang=EN-US>URL</span>（会收藏这个<span lang=EN-US>URL</span>）访问返回页面的情况，他会发现实际上到达的是表单页面，不是他想要的那个返回结果页面。所以，去除中间过渡页面，确实会带来<span lang=EN-US>URL</span>和内容含混不清的情况，因而不适合需要<span lang=EN-US>URL</span>和页面内容一一对应的场合。<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>二，从技术角度考虑，使用中间过渡页面能保证<span lang=EN-US>URL</span>和页面内容一一对应，简化页面开发工作。<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>为了保证页面内容总是和固定的<span lang=EN-US>URL</span>联系起来，必须使用客户端重定向：<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span lang=EN-US style="FONT-FAMILY: 宋体"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体">提交<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>业务逻辑处理<span lang=EN-US><span style="mso-spacerun: yes">&nbsp; </span></span>（中间过渡页面）<span lang=EN-US>
<p>&#160;</p>
</span></span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体"><font size=3>表单页面――――－<span lang=EN-US>&gt;</span>接收表单页面―――――――――<span lang=EN-US>&gt;</span>显示处理结果―――<span lang=EN-US>&gt;</span>客户端重定向到特定页面<span lang=EN-US>
<p>&#160;</p>
</span></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体">客户端重定向分几种情况：</span><span class=px14><span lang=EN-US><font face="Times New Roman">1</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使用</span><span lang=EN-US><font face="Times New Roman">HTTP Header</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重定向，</span><span lang=EN-US><font face="Times New Roman">Location:http://www.netall.com.cn</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这种定向是最快的，在窗口一片空白的情况下就迅速访问（</span><span lang=EN-US><font face="Times New Roman">GET</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）另一个页面。这种方式实际上不能显示处理结果，只能说是向第一种快速重定向方式的一种折衷处理；</span></span><span lang=EN-US style="FONT-FAMILY: 宋体">2,HTML</span><span style="FONT-FAMILY: 宋体">标签刷新，</span><span class=px14><span lang=EN-US><font face="Times New Roman">&lt;META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://www.netall.com.cn"&gt;</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这种定向比较友好，在这个页面加载完毕后访问另一个页面。很多设计者把这个作为一个技巧使用，在载入一个大页面前放置一个缓冲页面以避免用户乏味的等待；</span><span lang=EN-US><font face="Times New Roman">3</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重定向。由于是用代码控制重定向，可以做的更灵活。比如根据用户习惯，控制操作完毕后的转向流程。</span><span lang=EN-US><font face="Times New Roman">4</font></span></span><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，被动式的重定向。在页面上放置按钮或链接，由用户手动决定返回到特定页面。这种情况适合于处理结果的显示页面包含相当多的信息，需要用户仔细浏览，而决定下一步的操作。</span><span lang=EN-US>
<p>&#160;</p>
</span></span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span class=px14><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在使用中间过渡页面的情况下，不能再使用页面过期失效了。否则一旦出现错误，需要用户重新输入表单数据，用户就不能用后退按钮恢复此前填写的表单数据了。除非设计者有意禁止这种恢复。</span></span><span lang=EN-US style="FONT-FAMILY: 宋体">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span lang=EN-US style="FONT-FAMILY: 宋体">
<p><font size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>6．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">防止表单重复提交处理</span><span lang=EN-US>
<p>&#160;</p>
</span></font></strong>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对提交按钮点击后做变灰处理避免在网络响应较慢情况下用户重复提交同一个表单。使用页面过期失效避免用户后退浏览重复提交表单。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>有些复杂的应用会导致需要较长时间的等待才会返回处理结果。而在较慢的网络环境中，这种情况更是频繁发生。焦急等待的用户往往会重复点击提交按钮。这种情况是设计者所不希望看到的。</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在点击提交按钮后使按钮失效变灰是一个最直接的办法（根据原则</span><span lang=EN-US><font face="Times New Roman">2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这段代码应该放在</span><span lang=EN-US><font face="Times New Roman">&lt;form&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标签里</span><span lang=EN-US><font face="Times New Roman">onSubmit=&#8221;&#8230;&#8221;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做）。此外，在表单页面上，用服务器端脚本设置</span><span lang=EN-US><font face="Times New Roman">HTTP Header</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">Expires</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为立即过期可以保证用户没办法使用后退浏览恢复表单页面。注意这样做的代价可能是用户辛辛苦苦填写很长的内容，结果一旦操作失误就没法恢复。所以应该避免在包含</span><span lang=EN-US><font face="Times New Roman">&lt;textarea&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表单元素的页面上使用页面过期失效。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应该说，更严格的方法是，服务器端脚本就应该具备抵抗重复提交的能力。例如，为这个表单分配一个唯一</span><span lang=EN-US><font face="Times New Roman">ID</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或一个使用一次即失效的验证码。此外，这个表单处理还应具有事务性质，如果表单不被接受，所做的改变还是能恢复的。在金融应用场合，重复提交同一笔交易是肯定不被允许的。能在重复提交中获利的一方总是会想办法绕过浏览器的限制，所以不能依赖于客户端的技术。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>7．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页面链接是打开新窗口、使用原窗口还是弹出窗口的原则</span><span lang=EN-US>
<p>&#160;</p>
</span></font></strong>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般而言，首页上链接可以使用</span><span lang=EN-US style="COLOR: blue"><font face="Times New Roman">target=&#8221;_blank&#8221;</font></span><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性打开新窗口，而其他页面上的链接都应使用原窗口或弹出窗口。如果链接页面内容相对原页面来说不重要，是附属性质的，可以使用弹出窗口方式。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般情况下应该使用原窗口，把是否保留原窗口内容的权利留给用户。除非设计者相信原页面是如此重要，在用户发出点击指令后还有使用上的价值，以至于不能被随便更新或覆盖。一般来说，只有首页才会处于这样一个地位，用户在首页上打开一个链接后，一般还会在这个首页上去打开另一个链接。比如首页包含极多链接的门户网站，或者搜索引擎的搜索结果页面。</span><span lang=EN-US><font face="Times New Roman">Google.com</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前的搜索结果页面上的链接是使用原窗口的，后来他们意识到用户会反复使用这个页面，而改成打开新窗口了。一般的网站如果首页链接不多，就不必使用新窗口，这是用户友好的设计原则。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述情形的一个极端情况就是新页面内容比起原页面内容的重要性差很多，以至于都未必需要打开一个新页面。这时候使用弹出窗口比较合适。用</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">弹出窗口有好几种：一个是</span><span lang=EN-US><font face="Times New Roman">window.open()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数。这里有个技巧。应该使用</span><span lang=EN-US><font face="Times New Roman">window.open()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先打开一个空白窗口，再使用</span><span lang=EN-US><font face="Times New Roman">location.replace()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用目标页面替换。这样做可以避免在打开新页面的过程中导致原页面失去响应。</span><span lang=EN-US><font face="Times New Roman">Window.open()</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将打开一个新的浏览器窗口进程，因此资源消耗比较大。另一个是由微软</span><span lang=EN-US><font face="Times New Roman">DynamicHTML</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规范中扩充的方法</span><span lang=EN-US><font face="Times New Roman">createPopup()</font></span><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">。</span><span lang=EN-US><font face="Times New Roman">createPopup()</font></span><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">可以创建无边框的弹出窗口，消耗系统资源较小。还有一个就是用页面中隐藏的层<span lang=EN-US>&lt;div&gt;</span>来模拟一个弹出页面。后两种可以使用</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">代码填充弹出窗口内容。如果需要下载网页作为其内容的话，需要微软</span><span lang=EN-US><font face="Times New Roman">DynamicHTML</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规范中的</span><span lang=EN-US><font face="Times New Roman">&lt;download&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标签。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span lang=EN-US>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>8．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽可能少的排列可选项，尽可能少的安排操作步骤</span><span lang=EN-US>
<p>&#160;</p>
</span></font></strong>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据用户操作习惯安排尽可能少的操作菜单选项，同时要保证尽可能少的操作步骤。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在不降低功能多样性的前提下减少菜单项和操作步骤是用户友好的设计。要做到这一点很不容易。要从用户出发考虑他们最频繁的操作是什么。正常情况下一个用户需要的操作总可以归类为</span><span lang=EN-US><font face="Times New Roman">5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个以下的种类，如果出现更多的种类，那一定是没有针对用户兴趣去区分主次。一个用户同时有</span><span lang=EN-US><font face="Times New Roman">5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个以上的强烈兴趣中心是难以想像的，走马观花似的随意点击浏览的用户，是不大可能在某个种类上进行深入的交互操作的。在这</span><span lang=EN-US><font face="Times New Roman">5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个种类中，每个种类都可能有若干个可操作的二级种类。如果这些二级操作项是不可见的，那么意味着要做两次选择才能进入可操作页面。这就违背了&#8220;尽可能少的安排操作步骤&#8221;这一原则。如果使用</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">制作二级菜单，避免请求服务器，会好一些。如果二级菜单项总共不超过</span><span lang=EN-US><font face="Times New Roman">20</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个左右，不妨将二级菜单直接显示出来，比如放在左列一字向下排开，这样只需要一次选择到可操作项，更加明了方便。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span lang=EN-US>
<p><font face="Times New Roman" size=3>&nbsp;</font></p>
</span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face="Times New Roman"><font size=3>9．</font><span style="FONT: 7pt 'Times New Roman'"> </span></font></span></span></strong><strong style="mso-bidi-font-weight: normal"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作逻辑无漏洞，保证数据是操作安全的</span><span lang=EN-US>
<p>&#160;</p>
</span></font></strong>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多个页面间的操作和同个页面上的多个操作间的逻辑关系在设计上是安全和严谨的。保证不会出现不被允许的用户操作组合，至少不会因为用户的不适当的操作导致出错。</span><span lang=EN-US style="COLOR: blue">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>这最典型的表现则是在页面上广泛采用的所谓联动下拉框设计。一个下拉框中允许的选项受另一个下拉框中的选择而变。另外一个例子是根据选择使表单元素有效或者失效。如果在多个页面间也要维持某种合法性逻辑，那么就需要服务器端脚本的参与。这样会使表单设计跟操作有关，应该说这不是一个好的设计。可以通过变更操作步骤顺序、组合方式来尽可能避免这种情况出现。</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><font size=3><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作逻辑的设计既要保证用户任意的输入不会导致错误，也要保证是用户输入的数据能购被安全处理。在</span><span lang=EN-US><font face="Times New Roman">Session</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控制下的表单中输入大幅文字可能会导致超时出错，这时候往往还伴随重定向过程，导致用户的长篇输入荡然无存。用</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提醒用户已超时，请保存输入后重新提交，是一个好办法。某些表单元素如</span><span lang=EN-US><font face="Times New Roman">&lt;input type=&#8221;text&#8221;&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接受</span><span lang=EN-US><font face="Times New Roman">ESC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键清除数据，并且无法撤销，这也是很危险的。在中文输入法中常常使用</span><span lang=EN-US><font face="Times New Roman">ESC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键清楚输入的码位，一旦不小心多按一下</span><span lang=EN-US><font face="Times New Roman">ESC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会使得输入数据消失。因此有必要用</span><span lang=EN-US><font face="Times New Roman">JavaScript</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">禁用</span><span lang=EN-US><font face="Times New Roman">&lt;input&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US><font face="Times New Roman">&lt;textarea&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">ESC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">键处理过程。</span></font></p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=413028</p><img src ="http://www.blogjava.net/bnlovebn/aggbug/133567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（BNBN）</a> 2007-07-31 14:12 <a href="http://www.blogjava.net/bnlovebn/archive/2007/07/31/133567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库时代的终结</title><link>http://www.blogjava.net/bnlovebn/archive/2006/09/27/72299.html</link><dc:creator>重归本垒（BNBN）</dc:creator><author>重归本垒（BNBN）</author><pubDate>Wed, 27 Sep 2006 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2006/09/27/72299.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/72299.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2006/09/27/72299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/72299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/72299.html</trackback:ping><description><![CDATA[
		<h3 align="center">数据库时代的终结</h3>
		<p align="center">
				<a href="http://www.jdon.com/aboutme.htm">板桥里人</a> http://www.jdon.com 2005/04/28</p>
		<p>　　以数据库为核心的软件时代已经过去，数据库时代早已结束，当我看到J2EE征途中那么多人在对象和数据库之间彷徨痛苦ing的时候，我想我该出来喊一声了。</p>
		<p>　　其实这句话在几年前肯定有人喊过，因为中间件时代的来临，实际意味着数据库时代终结，正所谓一山无二虎：如果你重视数据库，你的J2EE系统就无法完全OO，只有你忽视数据库，你的系统才有可能完全迈向OO，至于数据库性能调优等特定功能都可交由EJB容器或O/R Mapping工具实现。 </p>
		<p>　　很多年前，包括我自己在内的大部分企业程序员都是从数据库开始我们的职业生涯，最早的是dBase/FoxPro，后来有了 SQL系列数据库, Oracle将数据库时代推向了顶峰。</p>
		<p>　　每当有一个新项目时，第一步就是首先设计出数据表结构(Table Schema)，然后开始使用SQL语句实现业务逻辑，这种开发模式一直重复，就是后来加入了DelPhI/VB，他们也只是承担图形显示实现，这种C/S结构带来最大问题是：非常难于维护，修改起来，迁一动百。</p>
		<p>　　软件的生命在于运动，当它需要发展时，最棒的软件人员如果对他也束手无策，这是谁的悲哀？</p>
		<p>　　现在更多人开始接受B/S结构，但是他们中很多人还没有真正明白为什么需要B/S结构，B/S代表的多层架构才是真正目的（因此，伪多层的B/S系统遍地皆是）。</p>
		<p>　　多层架构实际是将以前系统中的显示功能、业务运算功能和数据库功能完全分开，杜绝彼此的耦合与影响，从而实现松耦合和良好的可维护性。</p>
		<p>　　一. 从设计上说：由于实现层次完全分离，业务运算功能成为一种中间功能（中间层），它不依赖具体的表现层技术(Jsp/Html applet等)，也不依赖具体数据库技术（Oracle/SQL Server），业务运算功能运行在J2EE应用服务器中，当我们的业务运算功能不再依赖数据库时，是否意味着数据库已经不是重点？</p>
		<p>　　二. 当然，多层结构带来了性能问题：客户端访问数据库中的数据时，通常需要经过多个层次，非常耗费性能， 如何尽量减少数据库访问是J2EE应用系统首要解决的问题，使用存储过程并没有解决这个问题，存储过程的执行还是属于后端，并没有缩短客户端请求所要经历的坎坷路途。</p>
		<p>　　解决性能问题的根本解决之道是使用<a href="http://www.theserverside.com/articles/article.tss?l=ObjectCachingWithAOP&amp;News04_26_05-click" target="_blank">对象缓存</a>，现在， 64位CPU提供的巨大内存空间为单台缓存计算提供了硬件基础，更重要的是，这种缓存计算是可伸缩的，通过集群的缓存机制（如JBossCache）， 通过增加应用服务器的数量，可以提高整个业务逻辑层的缓存计算能力，抛弃过去那种为内存斤斤计较的老思维吧。</p>
		<p>　　三. 在系统分析之初是否首先需要数据表设计呢？回答是否定的， 以UML为代表面向对象的分析设计方法已经成为强大工具，随着面向模型驱动分析设计（MDA）的普及， 面向数据库分析方法正在逐步被抛弃，拥有深厚传统数据库分析习惯的程序员必须面对和接受这种挑战。</p>
		<p>　　纵观整个J2EE系统开发过程，数据库已经从过去的中心位置降为一种纯技术实现，数据库只是状态持久化的一种手段（文件是另外一种实现手段）；什么是持久化？这是相对于内存缓存状态而言，持久化就是当内存断电情况下能永久保存状态数据，但是如果J2EE应用服务器是7X24小时集群运行；几乎永不当机，是否有持久化的必要呢？</p>
		<p>　　很显然，数据库已经沦为与操作系统中文件系统同样的层面，以它为中心的时代真的结束了，IBM早期将DB2数据库开源已经强烈向我们昭示这点。</p>
		<p>　　对于J2EE初学者来说，尽早抛弃过去的两种影响：过程语言编程习惯和以数据库为中心的设计习惯，从全新的面向对象角度(OOA、OOD和OOP、AOP)来设计开发你的J2EE系统，J2EE设计开发三件宝：<a href="http://www.jdon.com/mybook/index.htm" target="_blank">Model、Patterns和Framework</a>。</p>
		<p>　　以上不只是理论，而是我每天正在做的，如果你也是或赞同请广为传播，唤醒更多彷徨痛苦的初学者。<br /></p>
		<p>TSS最近相关文章：</p>
		<p>
				<a href="http://www.theserverside.com/articles/article.tss?l=ObjectCachingWithAOP&amp;News04_26_05-click" target="_blank">使用AOP组合JBossCache实现对象缓存</a>
		</p>
		<p>
				<a href="http://www.theserverside.com/articles/article.tss?l=OSCacheHelpsDatabases&amp;News05_03_05-click" target="_blank">OSCache降低数据库负载 </a>
		</p>
		<p>
				<a href="http://www.theserverside.com/articles/article.tss?l=Caching&amp;News05_03_05-click" target="_blank">使用缓存提高Web应用系统性能</a>
		</p>
		<p>
				<a href="http://www.jdon.com/artichect/artichect/java_ee_architecture.htm" target="_blank">Java企业系统架构选择考量</a>
		</p>
		<p>
				<a href="http://www.jdon.com/artichect/state.htm" target="_blank">状态对象：数据库的替代者</a>
		</p>
		<p>
				<a href="http://www.jdon.com/mda/ddd.html" target="_blank">DDD(Domain-Driven Design领域驱动设计)实战</a>
		</p>
		<h3>
				<a href="http://www.jdon.com/jive/thread.jsp?forum=91&amp;thread=20162" target="_blank">讨论</a>
		</h3>
<img src ="http://www.blogjava.net/bnlovebn/aggbug/72299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（BNBN）</a> 2006-09-27 14:38 <a href="http://www.blogjava.net/bnlovebn/archive/2006/09/27/72299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈“框架与模式”</title><link>http://www.blogjava.net/bnlovebn/archive/2006/04/10/40271.html</link><dc:creator>重归本垒（BNBN）</dc:creator><author>重归本垒（BNBN）</author><pubDate>Mon, 10 Apr 2006 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/bnlovebn/archive/2006/04/10/40271.html</guid><wfw:comment>http://www.blogjava.net/bnlovebn/comments/40271.html</wfw:comment><comments>http://www.blogjava.net/bnlovebn/archive/2006/04/10/40271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bnlovebn/comments/commentRss/40271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bnlovebn/services/trackbacks/40271.html</trackback:ping><description><![CDATA[没想到我的一个笔记就是转截别人的文章，没想到却忘了出自于哪了。<br /><br /><br /><br />现在软件设计里到处都是模式，框架。有次朋友问什么是模式？我也在学习中，就我的学习经验，给出以下小结。（注意：个人观点，仅供参考，欢迎指正。）<br />　　<br />　　<b>1．什么是模式？</b><br />　　<br />　　<font color="#ff0000">模式</font>，即<font color="#ff0000">pattern</font>。其实就是解决某一类问题的<font color="#ff0000">方法论</font>。你把解决某类问题的方法总结归纳到理论高度，那就是模式。<br />　　<br />　　Alexander给出的经典定义是：每个模式都描述了一个在我们的环境中不断出现的问题，然后描述了该问题的<font color="#ff0000">解决方案的核心</font>。通过这种方式，你可以无数次地使用那些已有的解决方案，无需在重复相同的工作。<br />　　<br />　　模式有不同的领域，建筑领域有建筑模式，软件设计领域也有<font color="#ff0000">设计模式</font>。当一个领域逐渐成熟的时候，自然会出现很多模式。<br />　　<br />　　<b>什么是框架？</b><br />　　<br />　　<font color="#ff0000">框架</font>，即<font color="#ff0000">framework</font>。其实就是某种应用的<font color="#ff0000">半成品</font>，就是<font color="#ff0000">一组组件</font>，供你选用完成你自己的系统。简单说就是使用别人搭好的舞台，你来做表演。而且，框架一般是成熟的，不断升级的软件。<br />　　<br />　　<b>2．为什么要用模式？</b><br />　　<br />　　因为模式是一种<font color="#ff0000">指导</font>，在一个良好的指导下，有助于你完成任务，有助于你作出一个优良的设计方案，达到事半功倍的效果。而且会得到解决问题的最佳办法。<br />　　<br />　　为什么要用框架？<br />　　<br />　　因为软件系统发展到今天已经很复杂了，特别是服务器端软件，设计到的知识，内容，问题太多。在某些方面使用别人<font color="#ff0000">成熟的框架</font>，就相当于让别人帮你完成一些<font color="#ff0000">基础工作</font>，你只需要集中精力完成系统的<font color="#ff0000">业务逻辑设计</font>。而且框架一般是成熟，稳健的，他可以处理系统很多细节问题，比如，事物处理，安全性，数据流控制等问题。还有框架一般都经过很多人使用，所以结构很好，所以扩展性也很好，而且它是不断升级的，你可以直接享受别人升级代码带来的好处。<br />　　<br />　　框架一般处在低层应用平台（如J2EE）和高层业务逻辑之间的<font color="#ff0000">中间层</font>。<br />　　<br />　　<b>软件为什么要分层？</b><br />　　<br />　　为了实现“高内聚、低耦合”。把问题划分开来各个解决，易于控制，易于延展，易于分配资源…总之好处很多啦：）。<br />　　<br />　　<b>3．以下所述主要是JAVA，J2EE方面的模式和框架：</b><br />　　<br />　　<b>常见的设计模式有什么？</b><br />　　<br />　　首先，你要了解的是GOF的《设计模式--可复用面向对象软件的基础》一书（这个可以说是程序员必备的了），注意：GOF不是一个人，而是指四个人。它的原意是Gangs Of Four,就是“四人帮”，就是指此书的四个作者：Erich Gamma,Richard Helm，Ralph Johnson,John Vlissides。这本书讲了23种主要的模式，包括：<font color="#ff0000">抽象工厂</font>、<font color="#ff0000">适配器</font>、<font color="#ff0000">外观模式</font>等。<br />　　<br />　　还有其他的很多模式，估计有100多种。<br />　　<br />　　软件设计模式太多，就我的理解简单说一下最常见的<font color="#ff0000">MVC模式</font>。<br />　　<br />　　MVC模式是1996年由Buschmann提出的：<br />　　<br />　　模型（Model）：就是封装数据和所有基于对这些数据的操作。<br />　　<br />　　视图（View）：就是封装的是对数据显示，即用户界面。<br />　　<br />　　控制器（Control）：就是封装外界作用于模型的操作和对数据流向的控制等。<br />　　<br />　　另外：<br />　　<br />　　<font color="#ff0000">RUP</font>（Rational Unified Process）软件统一过程，<font color="#ff0000">XP</font>（Extreme Programming）极端编程，这些通常被叫做“过程方法”，是一种软件项目实施过程的方法论，它是针对软件项目的实施过程提出的方法策略。也是另一个角度的模式。<br />　　<br />　　<b>4．常见的JAVA框架有什么？</b><br />　　<br />　　<b>WAF：</b><br />　　<br />　　全称：WEB APPLICATION FRAMEWORK<br />　　<br />　　主要应用方面：EJB层，（WEB层也有，但是比较弱）。<br />　　<br />　　主要应用技术：EJB等<br />　　<br />　　出处：http://java.sun.com/blueprints/code/index.html<br />　　<br />　　简述：这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系统)里面的框架。是SUN蓝皮书例子程序中提出的应用框架。它实现了 MVC和其他良好的设计模式。SUN的网站上有技术资料，最好下载PetStore来研究，WEBLOGIC里自带此系统，源码在bea\weblogic700\samples\server\src\petstore。这是学习了解J2EE的首选框架。<br />　　<br />　　<b>Struts:</b><br />　　<br />　　主要应用方面：WEB层。<br />　　<br />　　主要应用技术：JSP,TagLib,JavaBean,XML等<br />　　<br />　　出处：http://jakarta.apache.org/struts/index.html<br />　　<br />　　简述：这是APACHE的开源项目，目前应用很广泛。基于MVC模式，结构很好，基于JSP。Jbuilder8里已经集成了STRUTS1.02的制作。<br />　　<br />　　简述WAF+STRUTS结合的例子：WEB层用STRUTS，EJB层用WAF：<br />　　<br />　　JSP(TagLib)——&gt;ActionForm——&gt;Action　——&gt;　Event——&gt;EJBAction——&gt;EJB　　——&gt;DAO——&gt;Database　JSP（TagLib） (forward) &lt;——Action　&lt;——EventResponse&lt;——<br />　　<br />　　<b>Turbine：</b><br />　　<br />　　主要应用方面：WEB层。<br />　　<br />　　主要应用技术：servlet等<br />　　<br />　　出处：http://jakarta.apache.org/turbine/index.html<br />　　<br />　　简述：这是APACHE的开源项目。基于SERVLET。据说速度比较快，基于service（pluggable implementation可插拔的执行组件）的方式提供各种服务。<br />　　<br />　　<b>COCOON：</b><br />　　<br />　　主要应用方面：WEB层。<br />　　<br />　　主要应用技术：XML，XSP，servlet等<br />　　<br />　　出处：http://cocoon.apache.org/2.0/<br />　　<br />　　简述：这是APACHE的一个开源项目。基于XML，基于XSP（通俗地说，XSP是在XML静态文档中加入Java程序段后形成的动态XML文档。）。特点是可以与多种数据源交互，包括文件系统，数据库，LDAP，XML资源库，网络数据源等。<br />　　<br />　　<b>ECHO</b>：<br />　　<br />　　主要应用方面：WEB层。<br />　　<br />　　主要应用技术：servlet等<br />　　<br />　　出处：http://www.nextapp.com/products/echo/<br />　　<br />　　简述：nextapp公司的一个开源项目。基于SERVLET。页面可以做的很漂亮，结合echopoint，可以作出很多图形效果（里面用了jfreechart包）。使用SWING的思想来作网页，把HTML当作JAVA的类来做。但是大量使用Session，页面分帧（Frame）很多,系统资源消耗很大。<br />　　<br />　　<b>JATO</b>：<br />　　<br />　　全称：SUN ONE Application Framework<br />　　<br />　　主要应用方面：WEB层。<br />　　<br />　　主要应用技术：JSP,TagLib,JavaBean等<br />　　<br />　　出处：http://www.sun.com/<br />　　<br />　　简述：这是SUN推出的一个商业性框架，一看名字就知道是结合SUN ONE的平台推出的。我下载了JATO2.0看了一下，感觉有些简单，使用了JSP＋TagLib+JavaBean。如他的DOC所说JATO是适合用在小的WEB应用里。<br />　　<br />　　<b>TCF：</b><br />　　<br />　　全称：Thin-Client Framework<br />　　<br />　　主要应用方面：JAVA GUI。<br />　　<br />　　主要应用技术：JAVA application等<br />　　<br />　　出处：http://www.alphaworks.ibm.com/tech/tcf<br />　　<br />　　简述：这是IBM出的一个框架。基于MVC模式，基于JAVA Application。推荐一篇介绍文章：http://www-900.ibm.com/developerWorks/cn/java/j-tcf1/index.shtml<img src ="http://www.blogjava.net/bnlovebn/aggbug/40271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bnlovebn/" target="_blank">重归本垒（BNBN）</a> 2006-04-10 17:15 <a href="http://www.blogjava.net/bnlovebn/archive/2006/04/10/40271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>