﻿<?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-Scaler</title><link>http://www.blogjava.net/fanle/</link><description>生活在折腾中精彩！

         理论不懂就实践，实践不会就学理论！

</description><language>zh-cn</language><lastBuildDate>Mon, 13 Apr 2026 12:23:40 GMT</lastBuildDate><pubDate>Mon, 13 Apr 2026 12:23:40 GMT</pubDate><ttl>60</ttl><item><title>软件开发技巧</title><link>http://www.blogjava.net/fanle/archive/2009/04/24/267339.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Fri, 24 Apr 2009 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2009/04/24/267339.html</guid><wfw:comment>http://www.blogjava.net/fanle/comments/267339.html</wfw:comment><comments>http://www.blogjava.net/fanle/archive/2009/04/24/267339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fanle/comments/commentRss/267339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fanle/services/trackbacks/267339.html</trackback:ping><description><![CDATA[<br />
1、<a onmousedown="return c({'fm':'as','F':'77A717EA','T':'1240549595','title':this.innerHTML,'url':this.href,'p1':1,'y':'5FDEBFBD'})" href="http://gurudk.javaeye.com/blog/271173" target="_blank"><font size="3">一图胜千言——软件开发中的形象思维与图的运用</font></a>
<img src ="http://www.blogjava.net/fanle/aggbug/267339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2009-04-24 13:09 <a href="http://www.blogjava.net/fanle/archive/2009/04/24/267339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java技术</title><link>http://www.blogjava.net/fanle/archive/2009/04/24/267315.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Fri, 24 Apr 2009 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2009/04/24/267315.html</guid><description><![CDATA[<br />
1、java技术主要包括三个方面：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j2SE(java2 &nbsp; standard &nbsp; editor &nbsp; )(java基础，可以用awt、swing等做Ｃ／Ｓ模式得软件开发) <br />
<br />
　　　　　　　　 j2EE(java2 &nbsp; enterprise &nbsp; editor)(也就是企业级应用，Ｂ／Ｓ模式软件开发，目前主流方向，包<br />
括jsp/servlet、JDBC、JNDI、EJB等核心技术，以及一些框架 &nbsp; 如:struts、hibernater等) <br />
　　　　　　<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　j2ME(java2 &nbsp; micro &nbsp; editor)(主要应用于手机嵌入式开发) <br />
 <img src ="http://www.blogjava.net/fanle/aggbug/267315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2009-04-24 11:04 <a href="http://www.blogjava.net/fanle/archive/2009/04/24/267315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>观念</title><link>http://www.blogjava.net/fanle/archive/2009/04/11/264998.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Sat, 11 Apr 2009 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2009/04/11/264998.html</guid><wfw:comment>http://www.blogjava.net/fanle/comments/264998.html</wfw:comment><comments>http://www.blogjava.net/fanle/archive/2009/04/11/264998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fanle/comments/commentRss/264998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fanle/services/trackbacks/264998.html</trackback:ping><description><![CDATA[1、观念+时间=财富<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------比尔盖茨 <br />
<br />
2、这并不奇怪，工作的新鲜感褪色后，就设法需要通过一个目标为自己输送动力。这便是职业规划。<br />
<br />
3、在这个社会上做什么事情都需要恒心的。因为工作是一场马拉松。即使刚开始跑在了前面，后来也是有能落后的，所以如果有想法，坚持下去。总有一天你会成功的。<br />
<img src ="http://www.blogjava.net/fanle/aggbug/264998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2009-04-11 11:25 <a href="http://www.blogjava.net/fanle/archive/2009/04/11/264998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何做一个合格的程序员 </title><link>http://www.blogjava.net/fanle/archive/2009/04/09/264678.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Thu, 09 Apr 2009 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2009/04/09/264678.html</guid><wfw:comment>http://www.blogjava.net/fanle/comments/264678.html</wfw:comment><comments>http://www.blogjava.net/fanle/archive/2009/04/09/264678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fanle/comments/commentRss/264678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fanle/services/trackbacks/264678.html</trackback:ping><description><![CDATA[<p>程序员是一种技术工作，在IT的发展中有相当重要的地位，从底层硬件通讯协议的建立，到数据传输层的处理，到操作系统的建设，到数据库平台的建设，一直到应用层上各种数据营销平台的搭建，程序员在里面都扮演着举足轻重的角色并为IT事业的发展做出了巨大的贡献。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中国有很多精于编码的人，但是中国软件行业，尤其是网络应用开发方面误区很大，很难形成有规模的软件开发力量和产品能力，不但比美国差距甚远，和印度相比 也是颇有不如。这些问题不是在于中国程序员的智商和工作努力状况，也不是在于国家和民间对开发的投入程度，而是很大程度上，有一些对技术，对程序开发，对项目设计方面的思想误区，这些误区，导致了软件行业的产品化能力不足，缺乏规模化和大型复用系统研发能力，可以说，改变认识误区，是解决软件行业小作坊模式和个体英雄模式所带来的局限性的重要工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有很多朋友，他们18~22岁，通过自学也写了不少代码，他们有的代码写的很漂亮，一些技术细节相当出众，也很有钻研精神，但是他们被一些错 误的认识和观点左右，缺乏对系统，对程序的整体理解能力，这些人，正如一位网上的朋友说得很好，他们实际上只是一些 Coding Fans，压根没有资格称为程序员。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作一个真正合格的程序员，或者说就是可以真正合格完成一些代码工作的程序员，应该具有的素质。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>1、团队精神和协作能力</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;把它作为基本素质，并不是不重要，恰恰相反，这是程序员应该具备的最基本的，也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语，任何个人的力量都是有限的，即便如 Linux 这样的天才，也需要通过组成强大的团队来创造奇迹，那些遍布全球的为 Linux 写核心的高手们，没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财，但是一旦进入一些大系统的研发团队，进入商业化和产品化的开发任务，缺乏这种素质的人就完全不合格了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>2、文档习惯</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子，良好的文档是正规研发流程中非常重要的环节，作为代码程序员，30％的工作时间写技术文档是很正常的，而作为高级程序员和系统分析员，这个比例还要高很多。缺乏文档，一个软件系统就缺乏生命力，在未来的查错，升级以及模块的复用时就都会遇到极大的麻烦。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>3、规范化、标准化的代码编写习惯</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为一些外国知名软件公司的规矩，代码的变量命名，代码内注释格式，甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定，良好的编写习惯，不但有助于代码的移植和纠错，也有助于不同技术人员之间的协作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有些 Coding Fans 叫嚣高水平程序员写的代码旁人从来看不懂，这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性，是程序员基本的素质需求。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再看看整个 Linux 的搭建，没有规范化和标准化的代码习惯，全球的研发协作是绝对不可想象的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>4、需求理解能力</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序员需要理解一个模块的需求，很多小朋友写程序往往只关注一个功能需求，他们把性能指标全部归结到硬件，操作系统和开发环境上，而忽视了本身代码的性能考虑，有人曾经放言说写一个广告交换程序很简单，这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的，对于这样的程序员，你给他深蓝那套系统，他也做不出太极链的并访能力。性能需求指标中，稳定性，并访支撑能力以及安全性都很重要，作为程序员需要评估该模块在系统运营中所处的环境， 将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点，一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>5、复用性、模块化思维能力</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经常可以听到一些程序员有这样的抱怨，写了几年程序，变成了熟练工，每天都是重复写一些没有任何新意的代码，这其实是中国软件人才最大浪费的地方，一些重复性工作变成了熟练程序员的主要工作，而这些，其实是完全可以避免的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复用性设计，模块化思维就是要程序员在完成任何一个功能模块或函数的时候，要多想一些，不要局限在完成当前任务的简单思路上，想想看该模块是否可以脱离这 个系统存在，是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用，这样就能极大避免重复性的开发工作，如果一个软件研发单位和工作组能够在 每一次研发过程中都考虑到这些问题，那么程序员就不会在重复性的工作中耽误太多时间，就会有更多时间和精力投入到创新的代码工作中去。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一些好的程序模块代码，即便是70年代写成的，拿到现在放到一些系统里面作为功能模块都能适合的很好，而现在我看到的是，很多小公司软件一升级或改进就动辄全部代码重写，大部分重复性工作无谓的浪费了时间和精力。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>6、测试习惯</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为一些商业化正规化的开发而言，专职的测试工程师是不可少的，但是并不是说有了专职的测试工程师程序员就可以不进行自测；软件研发作为一项工程而言，一个很重要的特点就是问题发现的越早，解决的代价就越低，程序员在每段代码，每个子模块完成后进行认真的测试，就可以尽量将一些潜在的问题最早的发现和解决，这样对整体系统建设的效率和可靠性就有了最大的保证。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;测试工作实际上需要考虑两方面，一方面是正常调用的测试，也就是看程序是否能在正常调用下完成基本功能，这是最基本的测试职责，可惜在很多公司这成了唯一的测试任务，实际上还差的远那；第二方面就是异常调用的测试，比如高压力负荷下的稳定性测试，用户潜在的异常输入情况下的测试，整体系统局部故障情况下该 模块受影响状况的测试，频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试，但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求，有针对性的进行相关测试并尽早发现和解决问题，当然这需要上面提到的需求理解能力。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>7、学习和总结的能力</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序员是人才很容易被淘汰，很容易落伍的职业，因为一种技术可能仅仅在三两年内具有领先性，程序员如果想安身立命，就必须不断跟进新的技术，学习新的技能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;善于学习，对于任何职业而言，都是前进所必需的动力，对于程序员，这种要求就更加高了。但是学习也要找对目标，一些小 Coding Fans 们，他们也津津乐道于他们的学习能力，一会学会了 ASP，一会儿学会了 PHP，一会儿学会了 JSP，他们把这个作为炫耀的资本，盲目的追逐一些肤浅的，表面的东西和名词，做网络程序不懂通讯传输协议，做应用程序不懂中断向量处理，这样的技术人员，不管掌握了多少所谓的新语言，永远不会有质的提高。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;善于总结，也是学习能力的一种体现，每次完成一个研发任务，完成一段代码，都应当有目的的跟踪该程序的应用状况和用户反馈，随时总结，找到自己的不足，这样逐步提高，一个程序员才可能成长起来。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个不具备成长性的程序员，即便眼前看是个高手，建议也不要选用，因为他落伍的时候马上就到了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具备以上全部素质的人，应当说是够格的程序员了，请注意以上的各种素质都不是由 IQ 决定的，也不是大学某些课本里可以学习到的，需要的仅仅是程序员对自己工作的认识，是一种意识上的问题。<br />
<br />
转<a href="http://www.blogjava.net/kent/archive/2008/06/03/205651.html"><font color="#000000">：</font>http://www.blogjava.net/kent/archive/2008/06/03/205651.html</a></p>
<img src ="http://www.blogjava.net/fanle/aggbug/264678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2009-04-09 17:25 <a href="http://www.blogjava.net/fanle/archive/2009/04/09/264678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：一位软件工程师的6年总结</title><link>http://www.blogjava.net/fanle/archive/2009/03/31/263243.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Tue, 31 Mar 2009 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2009/03/31/263243.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转：http://topic.csdn.net/u/20090326/14/B43FC779-58C4-4729-9748-84EE0567703D.html<br><br>一位软件工程师的6年总结 <br>“又是一年毕业时 ”，看到一批批学子离开人生的象牙塔，走上各自的工作岗位；想想自己也曾经意气风发、踌躇满志，不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼，希望对所有的软件工程师们有所帮助，早日实现自己的人生目标。本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议，前面几点旨在确定大的方向，算是废话吧。 &nbsp;&nbsp;<a href='http://www.blogjava.net/fanle/archive/2009/03/31/263243.html'>阅读全文</a><img src ="http://www.blogjava.net/fanle/aggbug/263243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2009-03-31 22:32 <a href="http://www.blogjava.net/fanle/archive/2009/03/31/263243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebService</title><link>http://www.blogjava.net/fanle/archive/2009/03/31/263171.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Tue, 31 Mar 2009 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2009/03/31/263171.html</guid><wfw:comment>http://www.blogjava.net/fanle/comments/263171.html</wfw:comment><comments>http://www.blogjava.net/fanle/archive/2009/03/31/263171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fanle/comments/commentRss/263171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fanle/services/trackbacks/263171.html</trackback:ping><description><![CDATA[<p>1、一个关于webservice 接口的问题：<br />
<br />
XFire默认的Aegis Binding语法非常简单，int,String,Date等类型的参数和返回值都无需定义，只要定义一下List findBooksByName()的返回值List里的对象是Book就可以了，是我见过最简单的binding定义，大大优于其他以设计复杂为终极目标的方案。 <br />
例： <br />
&lt;mapping&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;method name="findBooksByName"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;return-type componentType="org.springside.bookstore.domain.Book"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;/method&gt;&nbsp;&nbsp;&nbsp; <br />
&lt;/mapping&gt; <br />
为了以约定俗成代替配置，所有Service和Entity Bean的binding文件要求命名为xxx.aegis.xml，而且要和原来的类sit together在同一目录里。 <br />
<br />
2、在Eclipse上使用XFire开发WebService：<a href="http://www.cnblogs.com/zhuweisky/archive/2006/06/01/414971.html">http://www.cnblogs.com/zhuweisky/archive/2006/06/01/414971.html</a></p>
<p>&nbsp;</p>
 <img src ="http://www.blogjava.net/fanle/aggbug/263171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2009-03-31 16:49 <a href="http://www.blogjava.net/fanle/archive/2009/03/31/263171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员面试之九阴真经</title><link>http://www.blogjava.net/fanle/archive/2008/12/12/245843.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Fri, 12 Dec 2008 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/archive/2008/12/12/245843.html</guid><wfw:comment>http://www.blogjava.net/fanle/comments/245843.html</wfw:comment><comments>http://www.blogjava.net/fanle/archive/2008/12/12/245843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fanle/comments/commentRss/245843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fanle/services/trackbacks/245843.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 谈谈final, finally, finalize的区别： <br>final：：：修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载 &nbsp;&nbsp;<a href='http://www.blogjava.net/fanle/archive/2008/12/12/245843.html'>阅读全文</a><img src ="http://www.blogjava.net/fanle/aggbug/245843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2008-12-12 10:10 <a href="http://www.blogjava.net/fanle/archive/2008/12/12/245843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：java访问权限修饰符public protected friendly private用法总结</title><link>http://www.blogjava.net/fanle/articles/241447.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Wed, 19 Nov 2008 10:07:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/articles/241447.html</guid><description><![CDATA[<span style="font-family: Verdana; font-size: 13px; "><span style="font-size: 12pt; ">java访问权限修饰符public&#160; protected&#160; friendly private用法总结&#160;&#160;</span><br />
<br />
&#160;&#160;&#160;&#160; 首先声明：java中，friendly这个修饰符并没有显式的声明，在成员变量和方法前什么修饰符也不用，默认的就是friendly。<br />
&#160;&#160;&#160; 为了条理清晰，分三种不同情况来总结。
<p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><br />
<font color="#ff0000">&#160;&#160;&#160;</font><font color="#ff0000">一 访问权限修饰符修饰成员变量和方法<br />
</font>&#160;&#160;&#160;<font color="#ff0000">public</font>：表明该成员变量和方法是共有的，能在任何情况下被访问。<br />
&#160;&#160;&#160;<br />
&#160;&#160;&#160;<font color="#ff0000">protected</font>：必须在同一包中才能被访问。(说的比较简单，看个例子就明白了)&#160;&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160; eg:class A<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected int weight ;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected int f( int a,int b&#160;&#160; )&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 方法体<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160; 假设B与A在同一个包中，则<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; class B<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; void g()<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; A a=new A();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; A.weight=100;//合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; A.f(3,4);&#160;&#160;&#160; //合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;<font color="#ff0000">特别说明：什么是在同一个包中？</font><br />
&#160;&#160; 答：用package打包在一起的class ,叫在同一个包中。(不明白，举个例子)<br />
&#160;&#160;&#160;&#160;&#160;&#160; eg:在JDK的src\java\io中，你会看到许多java类，第一句源代码都是package java.io;<br />
&#160;&#160;&#160;&#160;&#160;&#160; 没有使用package打包的，在同一目录下的类也会被视做同一个包。<br />
&#160;&#160;&#160;<br />
&#160;&#160;<font color="#ff0000">&#160;friendly</font>：在这种情况下中，同protected。区别在第二和第三种情况中。&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160; eg: class A<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int weight ;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int f( int a,int b&#160;&#160; )&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // 方法体<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160; 假设B与A在同一个包中，则<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; class B<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; void g()<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; A a=new A();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; A.weight=100;//合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; A.f(3,4);&#160;&#160;&#160; //合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;<font color="#ff0000">private:</font>&#160;只能在本类中访问。<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; eg:&#160;&#160;&#160; class&#160;&#160; Test<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private int money;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Test()<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; money=2000;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private int getMoney()<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return money;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public&#160; static&#160; void main(String args[])<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Test te=new&#160; Test();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; te.money=3000;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int m=te.getMoney();&#160;&#160;&#160;&#160;&#160;&#160; //合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("money="+m);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;&#160; PS： 实际上，把重要的数据修饰为private，然后写一个public的函数访问它，正好体现了OOP的封装特性，是OOP安全性的体现。<br />
&#160;&#160;&#160;<font color="#ff0000"></font></p>
<p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><font color="#ff0000">二&#160; 访问权限修饰符修饰类<br />
</font>&#160;&#160; 1，不能用protected和private修饰类。<br />
&#160;&#160; 2，用friendly修饰的类叫友好类，在另外一个类中使用友好类创建对象时，要保证它们在同一包中。<br />
&#160;&#160;</p>
<p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; "><font color="#ff0000">三&#160;&#160; 访问权限修饰符与继承<br />
</font>&#160;&#160; 这里的访问修饰符指的是修饰成员变量和方法。可以分为两种情况：<br />
&#160;&#160; 1，子类与父类在同一包中<br />
&#160;&#160;&#160; 此时只有声明为private的变量与方法不能被继承(访问)。<br />
&#160;&#160; eg:<br />
&#160;&#160;&#160;&#160; class Father<br />
&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160; private int money ;<br />
&#160;&#160;&#160;&#160;&#160;&#160; int weight=100;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160; class Son extends Father<br />
&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160; viod f()<br />
&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; money=10000;//&#160;&#160; 非法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; weight=100; //&#160;&#160; 合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160; 2,子类与父类不在同一包中<br />
&#160;&#160;&#160; 此时private与friendly均不能被继承(访问)， protected与public可以。<br />
&#160;&#160;&#160;&#160; eg:<br />
&#160;&#160;&#160;&#160;&#160;&#160; Father.java</p>
<p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; margin-bottom: 14px; ">&#160;&#160;&#160;&#160;&#160; package com.aaa<br />
&#160;&#160;&#160;&#160;&#160; public class Father<br />
&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160; int height ;<br />
&#160;&#160;&#160;&#160;&#160;&#160; protected&#160; int money=120;<br />
&#160;&#160;&#160;&#160;&#160;&#160; public int weight;<br />
&#160;&#160;&#160;&#160;&#160;&#160; protected int getMoney()<br />
&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return money;<br />
&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160; void setMoney(int newMoney)<br />
&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; money=newMoney;<br />
&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;<br />
&#160;&#160;&#160;&#160;&#160; Son.java<br />
&#160;&#160;&#160;&#160;&#160; package com.bbb<br />
&#160;&#160;&#160;&#160;&#160; import com.aaa.Father;<br />
&#160;&#160;&#160;&#160;&#160; public class Son extends Father<br />
&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; void f()<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; money=10000;//合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //height=170;//非法，height为friendly修饰的变量<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(money);//输出结果是10000<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //setMoney(300);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //非法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int number=getMoney();&#160;&#160;&#160; //合法<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(number);//输出结果是10000<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public&#160; static&#160; void main(String args[])<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Son sss=new Son();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sss.f();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;&#160;&#160;&#160;&#160; }<br />
&#160;&#160;<font color="#ff0000">所以，访问权限修饰符权限从高到低排列是public&#160; ,protected&#160; ,friendly, private。</font></p>
</span>
  <img src ="http://www.blogjava.net/fanle/aggbug/241447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2008-11-19 18:07 <a href="http://www.blogjava.net/fanle/articles/241447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX介绍</title><link>http://www.blogjava.net/fanle/articles/241407.html</link><dc:creator>攀登者</dc:creator><author>攀登者</author><pubDate>Wed, 19 Nov 2008 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/fanle/articles/241407.html</guid><wfw:comment>http://www.blogjava.net/fanle/comments/241407.html</wfw:comment><comments>http://www.blogjava.net/fanle/articles/241407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fanle/comments/commentRss/241407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fanle/services/trackbacks/241407.html</trackback:ping><description><![CDATA[<div class="box2">感觉这篇文章介绍ajax很不错,特转来共享,为了表示对作者的尊重,所以连下面的一并拷了过来,希望对大家有用:<span class="Tit"><br />
ajax</span></div>
<table class="htb wr" cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="font-size: 12px; word-break: break-all; line-height: 150%; font-family: Verdana, Helvetica, Arial">
            <div class="box2 p14"><a style="color: rgb(52,104,164)" href="http://baike.baidu.com/pic/1/1172721636085091.jpg" target="_blank"></a>AJAX全称为&#8220;Asynchronous JavaScript and XML&#8221;（异步JavaScript和XML），是指一种创建交互式网页应用的网页开发技术。&nbsp;<wbr><br />
            <br />
            <br />
            <div class="titord"><span class="t1"><a name="1"></a>主要包含了以下几种技术</span></div>
            <br />
            <br />
            Ajax（Asynchronous JavaScript + XML）的定义&nbsp;<wbr><br />
            <br />
            基于web标准（standards-based presentation）XHTML+CSS的表示；&nbsp;<wbr><br />
            <br />
            使用 DOM（Document Object Model）进行动态显示及交互；&nbsp;<wbr><br />
            <br />
            使用 XML 和 XSLT 进行数据交换及相关操作；&nbsp;<wbr><br />
            <br />
            使用 XMLHttpRequest 进行异步数据查询、检索；&nbsp;<wbr><br />
            <br />
            使用 JavaScript 将所有的东西绑定在一起。<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/170434.htm" target="_blank">英文</a>参见Ajax的提出者Jesse James Garrett的原文。<br />
            <br />
            类似于DHTML或LAMP，AJAX不是指一种单一的技术，而是有机地利用了一系列相关的技术。事实上，一些基于AJAX的&#8220;派生/合成&#8221;式（derivative/composite）的技术正在出现，如&#8220;AFLAX&#8221;。&nbsp;<wbr><br />
            <br />
            AJAX的应用使用支持以上技术的web浏览器作为运行平台。这些浏览器目前包括：<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/393243.htm" target="_blank">Mozilla</a>、<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/3279.htm" target="_blank">Firefox</a>、<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/85144.htm" target="_blank">Internet Explorer</a>、<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/10019.htm" target="_blank">Opera</a>、<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/459265.htm" target="_blank">Konqueror</a>及<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/110484.htm" target="_blank">Safari</a>。但是Opera不支持XSL格式对象，也不支持XSLT。<br />
            <br />
            <strong><br />
            </strong>
            <div class="titord"><strong><span class="arr"><a title="返回页首" style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/1641.htm#"></a></span><span class="t1"><a name="2"></a>与传统的web应用比较</span></strong></div>
            <br />
            <br />
            传统的web应用允许用户填写表单(form)，当提交表单时就向<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/3912.htm" target="_blank">web</a><a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/899.htm" target="_blank">服务器</a>发送一个请求。服务器接收并处理传来的表单，然後返回一个新的<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/828.htm" target="_blank">网页</a>。这个做法浪费了许多带宽，因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求，应用的响应时间就依赖于服务器的<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/84619.htm" target="_blank">响应时间</a>。这导致了用户界面的响应比本地应用慢得多。&nbsp;<wbr><br />
            <br />
            与此不同，AJAX应用可以仅向服务器发送并取回必需的数据，它使用SOAP或其它一些基于XML的web service接口，并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少，结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成，所以Web服务器的处理时间也减少了。<br />
            <br />
            Ajax应用程序的优势在于：<br />
            <br />
            1. 通过异步模式，提升了用户体验<br />
            <br />
            2. 优化了<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/7718.htm" target="_blank">浏览器</a>和服务器之间的传输，减少不必要的数据往返，减少了带宽占用<br />
            <br />
            3. Ajax引擎在客户端运行，承担了一部分本来由服务器承担的工作，从而减少了大用户量下的服务器负载。<br />
            <br />
            <strong><br />
            </strong>
            <div class="titord"><strong><span class="arr"><a title="返回页首" style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/1641.htm#"></a></span><span class="t1"><a name="3"></a>Ajax的工作原理</span></strong></div>
            <br />
            <br />
            　　Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入，它是一种支持异步请求的技术。简而言之，XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应，而不阻塞用户。<br />
            <br />
            　　在创建Web站点时，在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用Ajax可以完成的功能：<br />
            <br />
            &nbsp;<wbr> &nbsp;<wbr> 动态更新购物车的物品总数，无需用户单击Update并等待服务器重新发送整个页面。&nbsp;<wbr><br />
            <br />
            &nbsp;<wbr> &nbsp;<wbr> 提升站点的性能，这是通过减少从服务器下载的数据量而实现的。例如，在某购物车页面，当更新篮子中的一项物品的数量时，会重新载入整个页面，这必须下载整个页面的数据。如果使用Ajax计算新的总量，服务器只会返回新的总量值，因此所需的带宽仅为原来的百分之一。消除了每次用户输入时的页面刷新。例如，在Ajax中，如果用户在分页列表上单击Next，则服务器数据只刷新列表而不是整个页面。&nbsp;<wbr><br />
            直接编辑表格数据，而不是要求用户导航到新的页面来编辑数据。对于Ajax，当用户单击Edit时，可以将静态表格刷新为内容可编辑的表格。用户单击Done之后，就可以发出一个Ajax请求来更新服务器，并刷新表格，使其包含静态、只读的数据。<br />
            <br />
            　　一切皆有可能！但愿它能够激发您开始开发自己的基于Ajax的站点。然而，在开始之前，让我们介绍一个现有的Web站点，它遵循传统的提交/等待/重新显示的范例，我们还将讨论Ajax如何提升用户体验。<br />
            <br />
            　　　Ajax的工作原理相当于在用户和服务器之间加了—个中间层，使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端，利于客户端闲置的处理能力来处理，减轻服务器和带宽的负担，从而达到节约ISP的空间及带宽租用成本的目的。<br />
            <br />
            我们以两个验证通行证帐号是否存在的例子来讲述AJAX在实际中的应用：<br />
            <br />
            (1)用文本字符串的方式返回服务器的响应来验证网易通行证帐号是否存在；&nbsp;<wbr><br />
            <br />
            (2)以XMLDocument对象方式返回响应来验证金山通行证帐号是否存在；<br />
            <br />
            首先，我们需要用JavaScript来创建<a style="color: rgb(52,104,164)" href="http://baike.baidu.com/view/1105115.htm" target="_blank">XMLHttpRequest&nbsp;<wbr></a>类向服务器发送一个HTTP请求， XMLHttpRequest 类首先由Internet Explorer以ActiveX对象引入，被称为XMLHTTP。后来Mozilla﹑Netscape﹑Safari 和其他浏览器也提供了XMLHttpRequest类，不过它们创建XMLHttpRequest类的方法不同。<br />
            <br />
            对于Internet Explorer浏览器，创建XMLHttpRequest 方法如下：<br />
            <br />
            xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP.3.0"); //3.0或4.0, 5.0&nbsp;<wbr><br />
            xmlhttp_request = new ActiveXObject("Msxml2.XMLHTTP");&nbsp;<wbr><br />
            xmlhttp_request = new ActiveXObject("Microsoft.XMLHTTP");&nbsp;<wbr><br />
            <br />
            由于在不同Internet Explorer浏览器中XMLHTTP版本可能不一致，为了更好的兼容不同版本的Internet Explorer浏览器，因此我们需要根据不同版本的Internet Explorer浏览器来创建XMLHttpRequest类，上面代码就是根据不同的Internet Explorer浏览器创建XMLHttpRequest类的方法。<br />
            <br />
            对于Mozilla﹑Netscape﹑Safari等浏览器，创建XMLHttpRequest 方法如下：xmlhttp_request = new XMLHttpRequest();<br />
            <br />
            如果服务器的响应没有XML mime-type header，某些Mozilla浏览器可能无法正常工作。为了解决这个问题，如果服务器响应的header不是text/xml，可以调用其它方法修改该header。<br />
            <br />
            xmlhttp_request = new XMLHttpRequest();&nbsp;<wbr><br />
            xmlhttp_request.overrideMimeType('text/xml');&nbsp;<wbr><br />
            <br />
            在实际应用中，为了兼容多种不同版本的浏览器，一般将创建XMLHttpRequest类的方法写成如下形式：<br />
            <br />
            try{&nbsp;<wbr><br />
            if( window.ActiveXObject ){&nbsp;<wbr><br />
            for( var i = 5; i; i-- ){&nbsp;<wbr><br />
            try{&nbsp;<wbr><br />
            if( i == 2 ){&nbsp;<wbr><br />
            xmlhttp_request = new ActiveXObject( "Microsoft.XMLHTTP" ); }<br />
            else{&nbsp;<wbr><br />
            xmlhttp_request = new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );&nbsp;<wbr><br />
            xmlhttp_request.setRequestHeader("Content-Type","text/xml");&nbsp;<wbr><br />
            xmlhttp_request.setRequestHeader("Content-Type","gb2312"); }<br />
            break;}&nbsp;<wbr><br />
            catch(e){&nbsp;<wbr><br />
            xmlhttp_request = false; } } }<br />
            else if( window.XMLHttpRequest )<br />
            { xmlhttp_request = new XMLHttpRequest();&nbsp;<wbr><br />
            if (xmlhttp_request.overrideMimeType)&nbsp;<wbr><br />
            { xmlhttp_request.overrideMimeType('text/xml'); } } }<br />
            catch(e){ xmlhttp_request = false; }&nbsp;<wbr><br />
            <br />
            在定义了如何处理响应后，就要发送请求了。可以调用HTTP请求类的open()和send()方法，如下所示：<br />
            <br />
            xmlhttp_request.open('GET', URL, true);&nbsp;<wbr><br />
            xmlhttp_request.send(null);&nbsp;<wbr><br />
            <br />
            open()的第一个参数是HTTP请求方式—GET，POST或任何服务器所支持的您想调用的方式。按照HTTP规范，该参数要大写；否则，某些浏览器(如Firefox)可能无法处理请求。&nbsp;<wbr><br />
            <br />
            第二个参数是请求页面的URL。<br />
            <br />
            第三个参数设置请求是否为异步模式。如果是TRUE，JavaScript函数将继续执行，而不等待服务器响应。这就是"AJAX"中的"A"。<br />
            <br />
            用JavaScript来创建XMLHttpRequest 类向服务器发送一个HTTP请求后，接下来要决定当收到服务器的响应后，需要做什么。这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应。可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名，如下所示：<br />
            <br />
            xmlhttp_request.onreadystatechange =FunctionName;<br />
            <br />
            FunctionName是用JavaScript创建的函数名，注意不要写成FunctionName()，当然我们也可以直接将JavaScript代码创建在onreadystatechange之后，例如：<br />
            <br />
            xmlhttp_request.onreadystatechange = function(){<br />
            // JavaScript代码段<br />
            };<br />
            <br />
            首先要检查请求的状态。只有当一个完整的服务器响应已经收到了，函数才可以处理该响应。XMLHttpRequest 提供了readyState属性来对服务器响应进行判断。<br />
            <br />
            readyState的取值如下：&nbsp;<wbr><br />
            <br />
            0 (未初始化)&nbsp;<wbr><br />
            <br />
            1 (正在装载)&nbsp;<wbr><br />
            <br />
            2 (装载完毕)&nbsp;<wbr><br />
            <br />
            3 (交互中)&nbsp;<wbr><br />
            <br />
            4 (完成)<br />
            <br />
            所以只有当readyState=4时，一个完整的服务器响应已经收到了，函数才可以处理该响应。具体代码如下：<br />
            <br />
            if (http_request.readyState == 4) { // 收到完整的服务器响应 }&nbsp;<wbr><br />
            else { // 没有收到完整的服务器响应 }<br />
            <br />
            当readyState=4时，一个完整的服务器响应已经收到了，接着，函数会检查HTTP服务器响应的状态值。完整的状态取值可参见W3C文档。当HTTP服务器响应的值为200时，表示状态正常。<br />
            <br />
            在检查完请求的状态值和响应的HTTP状态值后，就可以处理从服务器得到的数据了。有两种方式可以得到这些数据：<br />
            <br />
            (1) 以文本字符串的方式返回服务器的响应<br />
            <br />
            (2) 以XMLDocument对象方式返回响应<br />
            <br />
            实例一： 用文本字符串的方式返回服务器的响应来验证网易通行证帐号是否存在<br />
            <br />
            首先，我们登陆网易通行证注册页面，可以看到检测用户名是否存在是将用户名提交给checkssn.jsp页面进行判断，格式为：<br />
            <br />
            reg.163.com/register/checkssn.jsp?username=用户名&nbsp;<wbr><br />
            <br />
            根据上面讲到的方法，我们可以利用AJAX技术对网易通行证用户名进行检测：<br />
            <br />
            第一步：新建一个基于Xhtml标准的网页，在区域插入Javascript函数如下：<br />
            <br />
            function getXMLRequester( )<br />
            <br />
            { var xmlhttp_request = false;&nbsp;<wbr><br />
            <br />
            try<br />
            <br />
            { if( window.ActiveXObject )<br />
            <br />
            { for( var i = 5; i; i-- ){&nbsp;<wbr><br />
            <br />
            try{&nbsp;<wbr><br />
            <br />
            if( i == 2 )<br />
            <br />
            { xmlhttp_request = new ActiveXObject( "Microsoft.XMLHTTP" ); }<br />
            <br />
            else<br />
            <br />
            { xmlhttp_request = new ActiveXObject<br />
            <br />
            ( "Msxml2.XMLHTTP." + i + ".0" );&nbsp;<wbr><br />
            <br />
            xmlhttp_request.setRequestHeader("Content-Type","text/xml");&nbsp;<wbr><br />
            <br />
            xmlhttp_request.setRequestHeader("Content-Type","gb2312"); }<br />
            <br />
            break;}&nbsp;<wbr><br />
            <br />
            catch(e){ xmlhttp_request = false; } } }<br />
            <br />
            else if( window.XMLHttpRequest )<br />
            <br />
            { xmlhttp_request = new XMLHttpRequest();<br />
            <br />
            if (xmlhttp_request.overrideMimeType)<br />
            <br />
            { xmlhttp_request.overrideMimeType('text/xml'); } } }<br />
            <br />
            catch(e){ xmlhttp_request = false; }&nbsp;<wbr><br />
            <br />
            return xmlhttp_request ; }&nbsp;<wbr><br />
            <br />
            function IDRequest(n) { //定义收到服务器的响应后需要执行的JavaScript函数<br />
            <br />
            url=n+document.getElementById('163id').value;//定义网址参数<br />
            <br />
            xmlhttp_request=getXMLRequester();//调用创建XMLHttpRequest的函数<br />
            <br />
            xmlhttp_request.onreadystatechange = doContents;//调用doContents函数<br />
            <br />
            xmlhttp_request.open('GET', url, true);&nbsp;<wbr><br />
            <br />
            xmlhttp_request.send(null); }&nbsp;<wbr><br />
            <br />
            function doContents()&nbsp;<wbr><br />
            <br />
            { if (xmlhttp_request.readyState == 4) {// 收到完整的服务器响应&nbsp;<wbr><br />
            <br />
            if (xmlhttp_request.status == 200) {//HTTP服务器响应的值OK<br />
            <br />
            document.getElementById('message').innerHTML = xmlhttp_request.responseText;&nbsp;<wbr><br />
            <br />
            //将服务器返回的字符串写到页面中ID为message的区域 }&nbsp;<wbr><br />
            <br />
            else { alert(http_request.status); } } }&nbsp;<wbr><br />
            <br />
            在区域建立一个文本框，id为163id，再建一个id为messsge的空白区域用来显示返回字符串(也可以通过Javascript函数截取一部分字符串显示)：&nbsp;<wbr><br />
            <br />
            &lt;input type=text id="163id"&gt;<br />
            &lt;span id="message"&gt;&lt;/span&gt;<br />
            <br />
            这样，一个基于AJAX技术的用户名检测页面就做好了，不过这个页面将返回服务器响应生成页面的所有字符串，当然还可以对返回的字符串进行一些操作，便于应用到不同的需要当中。<br />
            <br />
            实例二： 以XMLDocument对象方式返回响应来验证金山通行证帐号是否存在<br />
            <br />
            在上面的例子中，当服务器对HTTP请求的响应被收到后，我们会调用请求对象的reponseText属性。该属性包含了服务器返回响应文件的内容。现在我们以XMLDocument对象方式返回响应，此时将不再需要reponseText属性而使用responseXML属性。<br />
            <br />
            首先登陆金山通行证注册页面，我们发现金山通行证用户名的检测方式为： pass.kingsoft.com/ksgweb/jsp/login/uid.jsp?uid=用户名,并且返回XML数据:<br />
            <br />
            isExistedUid -2&nbsp;<wbr><br />
            <br />
            当result值为-1时表示此用户名已被注册，当result值为-2时表示此用户名尚未注册，因此通过对result值的判断可以知道用户名是否被注册。<br />
            <br />
            对上例代码进行修改：<br />
            <br />
            首先找到<br />
            <br />
            document.getElementById('message').innerHTML = xmlhttp_request.responseText;<br />
            <br />
            改为:<br />
            <br />
            var response = xmlhttp_request.responseXML.documentElement;<br />
            <br />
            var result = response.getElementsByTagName('result')[0].firstChild.data;//返回result节点数据<br />
            <br />
            if(result ==-2){<br />
            <br />
            document.getElementById('message').innerHTML = "用户名"+document.getElementById('163id').value+"尚未注册";}<br />
            <br />
            else if(result ==-1){<br />
            <br />
            document.getElementById('message').innerHTML = "对不起,用户名"+document.getElementById('163id').value+"已经注册";}<br />
            <br />
            通过以上两个实例说明了AJAX的客户端基础应用，采用的是网易和金山现成的服务器端程序，当然为了开发合适自己页面的程序，还需要对自己编写服务器端程序，这设计到程序语言及数据库的操作，对于有一定程序基础的读者一定不是很难的事情。<br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
  <img src ="http://www.blogjava.net/fanle/aggbug/241407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fanle/" target="_blank">攀登者</a> 2008-11-19 16:01 <a href="http://www.blogjava.net/fanle/articles/241407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>