<?xml version="1.0" encoding="GB2312"?>
<rss version="2.0">
<channel>

<title><![CDATA[编程爱好者论坛 -新手入门区]]></title>
<link>http://bbs.pfan.cn/bbs.asp?bbsid=3</link>
<description>编程爱好者论坛</description>
<language>zh-cn</language>

<item>
<author><![CDATA[砍柴宝马]]></author>
<title><![CDATA[APP中国金桂浆纸，各国官员对环保和科技创新高度关注]]></title>
<link>http://bbs.pfan.cn/post-385712.html</link>
<description><![CDATA[2012年4月19日，国务院办公厅印发了《“十二五”全国城镇污水处理及再生利用设施建设规划》，明确了‘十二五’期间的建设任务，是指导各地加快城镇污水处理设施建设和安排政府投资的重要依据。”近日，英国、意大利、希腊、俄罗斯等18个国家驻邕、驻穗领事官员考察团到APP中国下属的广西金桂浆纸业有限公司考察，APP中国金桂浆纸总经理李俊逸接待了考察组一行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP中国金桂浆纸在化机浆污水处理中采用最先进的碱回收技术，全厂资源循环利用和污染物处理都达到了国内最先进水平，同时，APP中国金桂浆纸企业生产系统实现了高度的工业化、信息化，成为了国内浆纸企业的典范，各国官员对企业在环保和科技创新方面所做的努力给予了高度评价，对广西在北部湾经济开发区建设中坚持节约资源、循环利用、清洁生产的可持续发展理念表示赞赏。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;考察过程中，各国官员非常关注APP中国金桂浆纸生产所需原料木材的来源，APP中国金桂相关负责人介绍：自建成投产以来，生产所需木材全部来源于企业在国家划定的商品用材林区培育的人工林区，项目配套的林基地项目已经于2011年通过了国家环保部的验收。同时，企业在原料林建设过程中，采取了一系列的科学措施，以保持林区生物多样性，促进生态环境实现良性发展。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;广西在北部湾开发建设过程中，非常注重经济开发与环境保护之间的协调发展，APP中国金桂浆纸作为北部湾经济开发区的重大项目，在环保方面所做的努力，对北部湾建设发展起到了良好的示范和推动效应。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“植树造林、造福自然；制浆造纸、造福人民”是APP中国广西金桂浆纸业有限公司以的发展理念，金桂高度重视企业与社会和环境的持续发展关系，致力于环境保护，形成林、浆、纸一体化产业链。<br><br>]]></description>
<pubDate>2012-5-20 23:52:00</pubDate>
</item>

<item>
<author><![CDATA[zxck]]></author>
<title><![CDATA[[讨论]给大家介绍一个翻译软件，顺便讨论一下是否应该使用此类软件]]></title>
<link>http://bbs.pfan.cn/post-385647.html</link>
<description><![CDATA[有很多编程爱好者因为无法越过外语这道坎，在学习编程时感到异常痛苦，甚至因此放弃编程。<br>&nbsp;&nbsp;&nbsp;&nbsp;有一个好的翻译软件，能够帮上很大的忙。但是现在的机器翻译水平，还远远不能令人满意。<br>&nbsp;&nbsp;&nbsp;&nbsp;谁都知道目前最好的办法还是自己努力学好外语，但说起来容易，做起来难。<br>&nbsp;&nbsp;&nbsp;&nbsp;在这里给不懂外语，又不打算努力学好外语的朋友，推荐一个软件：[url=http://zxck.com]ZXCK即时在线翻译[/url]，详细的介绍网站上有，也有图片和视频。<br>&nbsp;&nbsp;&nbsp;&nbsp;如果经常使用这样的软件，可能形成依赖，影响外语的学习，如果不用，又有一种有车不坐，偏要走路的感觉。大家觉得呢？]]></description>
<pubDate>2012-5-19 23:56:00</pubDate>
</item>

<item>
<author><![CDATA[duobee]]></author>
<title><![CDATA[extjs的buffered问题]]></title>
<link>http://bbs.pfan.cn/post-385578.html</link>
<description><![CDATA[最近做extjs甘特图，需要用到extjs的大数据量buffered功能，可是extjs的例子是静态生成的，我是从后台读取数据的。用buffered会报错。有高手可以解决吗？]]></description>
<pubDate>2012-5-18 13:45:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]初学者必知系统安全注册表]]></title>
<link>http://bbs.pfan.cn/post-384982.html</link>
<description><![CDATA[对于现在各式各样的病毒、网络黑客和一些喜欢恶作剧的朋友，我们不得不作好防范工作，以免一些重要或是私人的信息被暴露。这里，主要谈一些应用注册表起到相应防护作用的实例。<br>　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●抵御BackDoor的破坏：&nbsp;<br>　　如果您的计算机上网了，那么就存在受黑客攻击的潜在危险，有一个名为BackDoor的后门程序，专门拣系统的漏洞进行攻击，我们可以修改注册表进行防范。打开HKEY_LOCAL_MACHINE＼SoftwareMicrosoft&nbsp;WindowsCurrentVersionRun子键分支，将右边窗口中的“Notepad”键值项删除即可。&nbsp;<br>　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●禁止通过“文件夹选项”显示隐藏文件：&nbsp;<br>　　使用“文件夹选项”中的隐藏文件来进行对文件的保护是很不可靠的，任何用户都可以通过选择“显示所有文件”而看到被隐藏的文件。而在注册表中修改后别人就不会再那么容易看到隐藏的文件了。打开HKEY_LOCAL_MACHINESoftwareMicrosoftWindows&nbsp;CurrentVersion&nbsp;ExplorerAdvancedFolderHiddenSHOWALL子键分支，将右边窗口中的CheckedValue的数值改为0，这样，即使在“文件夹选项”中选择“显示所有文件”，隐藏文件也不会显示出来了。<br>　　http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●屏蔽对软盘的网络访问功能：&nbsp;<br>　　计算机中许多病毒除了从网络传播外，是通过软盘传播的。所以，屏蔽对软盘的访问可以有效提高系统的安全性。打开注册表中HKEY_LOCAL_MACHINESOFTWARE&nbsp;MicrosoftWindows&nbsp;NTCurrentVersionWinlogon子键分支，将右边窗口中的AllocateFloppies双字节键值项的制改为1即可。&nbsp;<br>　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●抵御WinNuke黑客程序对计算机的攻击：<br>　　WinNuke是一个破坏力极强的程序，能对计算机中的Windows&nbsp;XP系统进行破坏，会导致整个计算机系统瘫痪，您可以通过注册表防范WinNuke的攻击。打开HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesVxdMSTCP，在右边的窗口中新建一个双字节值，命名为“BSDUrgent”，将其键值设为0。]]></description>
<pubDate>2012-5-9 22:05:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]初学者，你应当如何学习C++以及编程]]></title>
<link>http://bbs.pfan.cn/post-384981.html</link>
<description><![CDATA[javascript是世界上最受误解的语言，其实C++何尝不是。坊间流传的错误的C++学习方法一抓就是一大把。我自己在学习C++的过程中也走了许多弯路，浪费了不少时间。　　为什么会存在这么多错误熟悉?原因主要有三个，一是C++语言的细节太多。二是一些闻名的C++书籍总在(不管有意还是无意)暗示语言细节的重要性和有趣。三是现代C++库的开发哲学必须用到一些犄角旮旯的语言细节(但注重，是库设计，不是日常编程)。这些共同塑造了C++社群的整体心态和哲学。　　单是第一条还未必能够成气候，其它语言的细节也不少(尽管比起C++起来还是小巫见大巫)，就拿Javascript来说，作用域规则，名字查找，closure，for/in，这些都是细节，而且其中还有违反直觉的。但许多动态语言的程序员的理念我猜大约是学到哪用到哪罢。但C++就不一样了，学C++之人有一种类似于被暗示的潜在心态，就是一定要先把语言核心基本上吃透了才能下手写出漂亮的程序。这首先就错了。这个意识形成的原因在第二点，C++书籍。市面上的C++书籍不计其数，但有一个共同的缺点，就是讲语言细节的书太多——《C++&nbsp;gotchas》，《Effective&nbsp;C++》，《More&nbsp;Effective&nbsp;C++》，但无可厚非的是，C++是这样一门语言：要拿它满足现代编程理念的需求，尤其是C++库开发的需求，还必须得关注语言细节，乃至于在C++中利用语言细节已经成了一门学问。比如C++模板在设计之初根本没有想到模板元编程这回事，更没想到C++模板系统是图灵完备的，这也就导致了《Modern&nbsp;C++&nbsp;Design》和《C++&nbsp;Template&nbsp;MetaPRogramming》的惊世骇俗。<br><br>　　这些技术的出现为什么惊世骇俗，打个比方，就好比是一块大家都认为已经熟悉无比，再无秘密可言的土地上，忽然某天有人挖到原来地下还蕴藏着最丰富的石油。在这之前的C++虽然也有一些细节，但也还算轻易把握，那可是C++程序员们的happy&nbsp;old&nbsp;times，因为C++的一切都一览无余，everything&nbsp;is&nbsp;figured&nbsp;out。然而《Modern&nbsp;C++&nbsp;Design》的出世告诉人们，“瞧，还有多少细节你们没有把握啊。”于是C++程序员们久违的激情被重燃起来，奋不顾身的踏入细节的沼泽中。尤其是，模板编程将C++的细节进一步挖掘到了极致——我们干嘛关心涉及类对象的隐式转换的优先级高低?看看boost::is_base_of就可以知道有多诡异了。<br><br>　　但最大的问题还在于，对于这些细节的关注还真有它合适的理由：我们要开发现代模板库，要开发active&nbsp;library，就必须动用模板编程技术，要动用模板编程技术，就必须利用语言的犄角旮旯，enable_if，type_traits，甚至连早就古井无波的C宏也在乱世中重生，看看boost::preprocessor有多诡异就知道了，连C宏的图灵完备性(预编译期的)都被挖掘出来了。为什么要做这些?好玩?标榜?都不是，开发库的实际需求。但这也正是最大的悲哀了。在boost里面因实际需求而动用语言细节最终居然能神奇的完成任务的最好教材就是boost::foreach，这个小设施对语言细节的发掘达到了惊天地泣鬼神的地步，不信你先试着自己去看看它的源代码，再看看作者介绍它的文章吧。而boost::typeof也不甘其后——C++语言里面有太多被“发现”而不是被“发明”的技术。难道最初无意设置这些语言规则的家伙们都是Oracles?&nbsp;　　因为没有variadic&nbsp;templates，人们用宏加上缺省模板参数来实现类似效果。因为没有concepts，人们用模板加上析构函数的细节来完成类似工作。因为没有typeof，人们用模板元编程和宏加上无尽的细节来实现目标…&nbsp;C++开发者们的DIY精神不可谓不强。　　然而，假如仅仅是因为要开发优秀的库，那么涉及这些细节都还是情有可原的，至少在C++09出现并且编译器厂商跟上之前，这些都还能说是不得已而为之。但我们广大的C++程序员呢?大众是轻易被误导的，我也曾经是。以为把握了更多的语言细节就更牛，但实际却是那些语言细节十有八九是平时编程用都用不到的。C++中众多的细节虽然在库设计者手里面有其用武之地，但普通程序员则根本无需过多关注，尤其是没有实际动机的关注。一般性的编码实践准则，以及基本的编程能力和基本功，乃至基本的程序设计理论以及算法设计。才是真正需要花时间把握的东西。　　学习最佳编码实践比学习C++更重要。看优秀的代码也比埋头用差劲的编码方式写垃圾代码要有效。直接、清楚、明了、KISS地表达意图比玩编码花招要重要…&nbsp;　　避免去过问任何语言细节，除非必要。这个必要是指在实际编程当中碰到问题，这样就算需要过问细节，也是最省事的，懒惰者原则嘛。一个把握了基本的编程理念并有较强学习能力的程序员在用一门生疏的语言编程时就算拿着那本语言的圣经从索引翻起也可以编出合格的程序来。十年学会编程不是指对每门语言都得十年，那一辈子才能学几门语言哪，假如按字母顺序学的话一辈子都别指望学到Ruby了;十年学习编程更不是指先把语言特性从粗到细全都吃透才敢下手编程，在实践中提高才是最重要的。　　至于这种抠语言细节的哲学为何能在社群里面呈野火燎原之势，就是一个心理学的问题了。想像人们在论坛上讨论问题时，一个对语言把握很细致的人肯定能够得到更多的佩服，而由于论坛上的问题大多是小问题，所以解决实际问题的真正能力并不能得到显现，也就是说，知识型的人能够得到更多佩服，后者便成为动力和仿效的砝码。然而真正的编程能力是与语言细节没关系的，熟练运用一门语言能够帮你最佳表达你的意图，但熟练运用一门语言绝不意味着要把它的边边角角全都记住。懂得一些常识，有了编程的基本直觉，碰到一些细节错误的时候再去查书，是最节省时间的办法。　　C++的书，Bjarne的圣经《The&nbsp;C++&nbsp;Programming&nbsp;Language》是高屋建瓴的。《大规模C++程序设计》是挺务实的。《Accelerated&nbsp;C++》是最佳入门的。《C++&nbsp;Templates》是仅作参考的。《C++&nbsp;Template&nbsp;Metaprogramming》是精力过剩者可以玩一玩的，普通程序员碰都别碰的。《ISO.IEC&nbsp;C++&nbsp;Standard&nbsp;14882》不是拿来读的。Bjarne最近在做C++的教育，新书是绝对可以期待的。&nbsp;<br>　　P.S.&nbsp;关于如何学习编程，g9的blog上有许多出色的文章：这里，这里，这里，这里…&nbsp;实际上，我建议你去把g9老大的blog翻个底朝天&nbsp;:P&nbsp;　　再P.S.&nbsp;书单?我是遑于给出一个类似《C++初学者必读》这种书单的。C++的书不计其数，被公认的好书也不胜枚举。只不过有些书轻易给初学者造成一种错觉，就是“学习C++就应该是这个样子的”。比如有朋友提到的《高质量C/C++编程》，这本书有价值，但不适合初学者，初学者读这样的书轻易一叶障目不见泰山。实际上，正确的态度是，细节是必要的。但细节是次要的。其实学习编程我觉得应该最先学习如何用伪码表达思想呢，君不见《IntrodUCtion&nbsp;to&nbsp;Algorithm》里面的代码?《TAOCP》中的代码?哦，对了它们是自己建立的语言，但这种仅教学目的的语言的目的就是为了避免让写程序的人一开始就忘了写程序是为了完成功能，以为写程序就是和语言细节作斗争了。Bjarne说程序的正确性最重要，boost的编码标准里面也将正确性列在性能前面。　　此外，一旦建立了正确的学习编程的理念，其实什么书(只要不是太垃圾的)都有些用处。都当成参考书，用的时候从目录或索引翻，基本就对了。　　再再P.S.&nbsp;myan老大和g9老大都给出了许多出色的见解。我不得不再加上一个P.S。具体我就不摘录了，假如你读到这里，请务必往下看他们的评论。转载者别忘了转载他们的评论:-)&nbsp;　　许多朋友都问我同一个问题，到底要不要学习C++。其实这个问题问得很没有意义。“学C++”和“不学C++”这个二分法是没意义的，为什么?因为这个问题很表面，甚至很浮躁。重要的不是你把握的语言，而是你把握的能力，借用myan老大的话，“重要的是这个磨练过程，而不是结果，要的是你粗壮的腿，而不是你身上背的那袋盐巴。”。此外学习C++的意义其实真的是醉翁之意不在酒，像C/C++这种系统级语言，在学习的过程中必须要涉及到一些底层知识，如内存治理、编译连接系统、汇编语言、硬件体系结构等等等等知识(注重，这不包括过分犄角旮旯的语言枝节)。这些东西也就是所谓的内功了(其实最最重要的内功还是长期学习所磨练出来的自学能力)。对此大嘴Joel在《Joel&nbsp;On&nbsp;Software》里面提到的漏洞抽象定律阐述得就非常漂亮。　　所以，答案是，让你成为高手的并不是你把握什么语言，精通C++未必就能让你成为高手，不精通C++也未必就能让你成为低手。我想大家都不会怀疑g9老大假如要抄起C++做一个项目的话会比大多数自认熟练C++的人要做得漂亮。所以要害的不是语言这个表层的东西，而是底下的本质矛盾。当然，不是说那就什么语言都不要学了，按照一种曹操的逻辑，“天下语言，唯imperative与declarative耳”。C++是前者里面最复杂的一种，支持最广泛的编程范式。借用当初数学系入学大会上一个老师的话，“你数学都学了，还有什么不能学的呢?”。学语言是一个途径，假如你把它用来磨练自己，可以。假如你把它用来作为学习系统底层知识的钥匙，可以。假如你把它用来作为学习如何编写优秀的代码，如何组织大型的程序，如何进行抽象设计，可以。假如掉书袋，光啃细节，我认为不可以(除非你必须要用到细节，像boost库的coder们)。&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　然后再借用一下g9老大的《银弹和我们的职业》中的话：&nbsp;　　银弹和我们的职业发展有什么相干?很简单：我们得把时间用于学习解决本质困难。新技术给高手带来方便。菜鸟们却不用指望被新技术拯救。沿用以前的比喻，&nbsp;一流的摄影师不会因为相机的更新换代而丢掉饭碗，反而可能借助先进技术留下传世佳作。因为摄影的本质困难，还是摄影师的艺术感觉。热门技术也就等于相机。&nbsp;不停追新，学习这个框架，那个软件，好比成天钻研不同相机的说明书。而热门技术后的来龙去脉，才好比摄影技术。为什么推出这个框架?它解决了什么其它框架&nbsp;不能解决的问题?它在哪里适用?它在哪里不适用?它用了什么新的设计?它改进了哪些旧的设计?Why&nbsp;is&nbsp;forever.&nbsp;和&nbsp;朋友聊天时提到Steve&nbsp;McConnell的《Professional&nbsp;Software&nbsp;Development》里面引了一个调查，说软件开发技术的半衰期20年。也就是说20年后我们现在知识里一半的东西过时。相当不坏。朋友打趣道：“应&nbsp;该说20年后IT界一半的技术过时，我们学的过时技术远远超过这个比例。具体到某人，很可能5年他就废了”。话虽悲观，但可见选择学习内容的重要性。学习&nbsp;本质技艺(技术迟早过时，技艺却常用长新)还有一好处，就是不用看着自己心爱的技术受到挑战的时候干嚎。C/C++过时就过时了呗，只要有其它的系统编程&nbsp;语言。Java倒了就倒了呗，未必我不能用.NET?Ruby昙花一现又如何。假如用得不爽，换到其它动态语言就是了。J2EE被废了又怎样?未必我们就&nbsp;做不出分布系统了?这里还举了更多的例子。　　一句话，只有人是真正的银弹。职业发展的目标，就是把自己变成银弹。那时候，你就不再是人，而是人弹。　　最后就以我在Bjarne的众多访谈当中摘录的一些关于如何学习C++(以及编程)的看法结束吧(没空逐段翻译了，只将其中我觉得最重要的几段译了一下，当然，其它也很重要，这些段落是在Bjarne的所有采访稿中摘抄出来的，所以强烈建议都过目一下)：　　I&nbsp;suspect&nbsp;that&nbsp;people&nbsp;think&nbsp;too&nbsp;little&nbsp;about&nbsp;what&nbsp;they&nbsp;want&nbsp;to&nbsp;build,&nbsp;too&nbsp;little&nbsp;about&nbsp;what&nbsp;would&nbsp;make&nbsp;it&nbsp;correct,&nbsp;and&nbsp;too&nbsp;much&nbsp;about&nbsp;&quot;efficiency&quot;&nbsp;and&nbsp;following&nbsp;fashions&nbsp;of&nbsp;programming&nbsp;style.&nbsp;The&nbsp;key&nbsp;questions&nbsp;are&nbsp;always:&nbsp;&quot;what&nbsp;do&nbsp;I&nbsp;want&nbsp;to&nbsp;do?&quot;&nbsp;and&nbsp;&quot;how&nbsp;do&nbsp;I&nbsp;know&nbsp;that&nbsp;I&nbsp;have&nbsp;done&nbsp;if?&quot;.&nbsp;Strategies&nbsp;for&nbsp;testing&nbsp;enters&nbsp;into&nbsp;my&nbsp;concerns&nbsp;from&nbsp;well&nbsp;before&nbsp;I&nbsp;write&nbsp;the&nbsp;firat&nbsp;line&nbsp;of&nbsp;code,&nbsp;and&nbsp;that&nbsp;despite&nbsp;my&nbsp;view&nbsp;that&nbsp;you&nbsp;have&nbsp;to&nbsp;write&nbsp;code&nbsp;very&nbsp;early&nbsp;-&nbsp;rather&nbsp;than&nbsp;wait&nbsp;until&nbsp;a&nbsp;design&nbsp;is&nbsp;complete.&nbsp;<br>　　译：我感觉人们过多关注了所谓“效率”以及跟随编程风格的潮流，却严重忽视了本不该被忽视的问题，如“我究竟想要构建什么样的系统”、“怎样才能使它正确”。最要害的问题永远是：“我究竟想要做什么?”和“如何才能知道我的系统是否已经完成了呢?”就拿我来说吧，我会在编写第一行代码之前就考虑测试方案，而且这还是在我关于应当早于设计完成之前就进行编码的观点的前提之下。　　Obviously,&nbsp;C++&nbsp;is&nbsp;very&nbsp;complex.&nbsp;Obviously,&nbsp;people&nbsp;get&nbsp;lost.&nbsp;However,&nbsp;most&nbsp;peple&nbsp;get&nbsp;lost&nbsp;when&nbsp;they&nbsp;get&nbsp;diverted&nbsp;into&nbsp;becoming&nbsp;language&nbsp;lawyers&nbsp;rather&nbsp;than&nbsp;getting&nbsp;lost&nbsp;when&nbsp;they&nbsp;have&nbsp;a&nbsp;clear&nbsp;idea&nbsp;of&nbsp;what&nbsp;they&nbsp;want&nbsp;to&nbsp;eXPress&nbsp;and&nbsp;simply&nbsp;look&nbsp;at&nbsp;C++&nbsp;language&nbsp;features&nbsp;to&nbsp;see&nbsp;how&nbsp;to&nbsp;express&nbsp;it.&nbsp;Once&nbsp;you&nbsp;know&nbsp;data&nbsp;absreaction,&nbsp;class&nbsp;hierarchies&nbsp;(object-oriented&nbsp;programming),&nbsp;and&nbsp;parameterization&nbsp;with&nbsp;types&nbsp;(generic&nbsp;programming)&nbsp;in&nbsp;a&nbsp;fairly&nbsp;general&nbsp;way,&nbsp;the&nbsp;C++&nbsp;language&nbsp;features&nbsp;fall&nbsp;in&nbsp;place.&nbsp;　　译：诚然，C++非常复杂。诚然，人们迷失其中了。然而问题是，大多数人不是因为首先对自己想要表达什么有了清楚的熟悉只不过在去C++语言中搜寻合适的语言特性时迷失的，相反，大多数人是在不觉成为语言律师的路上迷失在细节的丛林中的。事实是，只需对数据抽象、类体系结构(OOP)以及参数化类型(GP)有一个相当一般层面的了解，C++纷繁的语言特性也就清楚起来了。]]></description>
<pubDate>2012-5-9 22:04:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]初学者的编程箴言]]></title>
<link>http://bbs.pfan.cn/post-384980.html</link>
<description><![CDATA[1、急功近利<br><br><br>表现为急于想完成某某系统、急于想有所经济回报，通常给自己定下很高的目标，在学习上也是总想投机取巧，希望通过一个源码来成为高手的想法的人不在少数。&nbsp;<br><br><br>事实上，可以这么说，不说是一个初学者，对大量职业程序员来说，具备更多的实践和经验积累，但即使是这种情况，他们写出的共享软件、商业软件大部分也仍然是不赚钱的，不完善的，编程是一项系统工程，是一个长期投资的过程，在具体实践中还受到激烈的市场因素影响，走捷径的想法非常幼稚，对很多想通过易语言来作为短期的经济投资的话，绝大部分会失望地离去。<br><br><br>2、盲从传言<br><br><br>对初学者来说，最难把握的是学习的方向，这个时候一个不尽完善的引导会使学习的方法走向误区，很多人也会谈些经验之谈，但某些经验之谈往往带有很大程度的主观性和局限性。对初学者的忠告是，不要偏听偏信少数的说法，而应该冷静地多听多看，尽量多查阅资料，多看程序，从而扩大眼界，提高知识的全面性方是一条稳步正确的学习之路。<br><br><br>3、急于获得成就感<br><br><br>应该说，喜欢编程的人很多并不是只追求单纯的经济效益，而更多是为了兴趣和成就感，这种类型的人通常很急于得到旁人的认同，&nbsp;总想拿出一份惊人之做来展示自己的技术，这种做法的初衷并没有什么不对，&nbsp;对激励自己是很好的做法，&nbsp;问题在于在这个过程中盲目地追求新、奇、特反而会忽视了对基础的编程思想的学习，&nbsp;我们看很多专业的软件，从界面、从实现上的解决都是朴实无华的，并没有什么新奇的地方，&nbsp;但深刻的地方全部蕴涵在深刻的业务流程中，也正是这些地方体现了软件真正的价值。还是那句话，软件是一种工具，奇异和眩目往往是赝品的代名词。<br><br><br>4、照本宣科http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br><br><br>这种类型的学习者也不在少数，看上去似乎很脚踏实地，常常虚心地钻研源代码、收集各种教程、例程，&nbsp;有的还花很大的力气去整理这些东西，&nbsp;这么作有问题吗？&nbsp;如果你希望日后成为一名教师的话，倒不妨一试，但要成为能独立编写程序的人来说是十分有害处的，&nbsp;因为他**了编程思想的提高。&nbsp;就写程序而言和发明创造是一样的，创造力是编程者的灵魂，在学习的时候**了思想的提高而成为一个收藏家，通过局部代码的堆砌来完成软件，从编程结构上而言很容易导致混乱，这么作的结果比较糟糕，花了若干蛮力仍然可说是个门外汉在程序之门口徘徊不前。其实看代码、学经验当然是可行的，问题是看什么、学什么，一大段代码其实不用每句去揣摩，更多的是看局部细节的实现是否比自己的实现更加有效率，代码组织是否更加科学，这个过程如果自己不先有一个完整的思考和实践过程&nbsp;，看代码的学习方法无外乎一剂毒药。<br><br><br>5、博而不专<br><br><br>说到这种类型，比较有意思，&nbsp;这类学习者一般涉猎比较广泛，兴趣也十分容易转移，软件世界确实是个花花世界，&nbsp;各种技术就如同众多的**在不断勾引着学习者，往往学习者终日留连在百花丛中而迷失了方向，其实，在电脑技术发展初期，这种学习方法是可取的，当时各种知识体系都不是很完备，专业细分也不明显，但在技术发展的今天，已经没有人可以穷其一生来精通各种技术了，技术也如同各种猛兽一般每天在肆意地成长和繁殖，且不说你去和一头豹子去赛跑，但说能骑好一匹马就是了不起的成绩了，在学习过程中应该注意一个知识的延续性，不要轻易中断一个技术的钻研，而在深入这个技术的基础下再去辅助学习其他相关的技术，这样的学习方法同样可以逐渐丰富和连贯的知识体系，更重要的是，不断深入一个技术会让你的学习时间更加有效率，更加容易到某一阶段可以获益，因为只有这样，你才能不知不觉中在某一特定领域成为一名高手。<br><br><br><br><br><br>易语言在众多兵器当中，不是最强的五器，也不是最威武的刀，同样也比不上剑的内涵，最多算把锋利的匕首，但是别忘了“一寸长一份强，一寸短一份险”，学习匕首，看剑谱研究弊邪法或跟风学习什么奇着异式更加不着边际，首先要看到匕首也有其优势，在正确理解和认识了其优势劣势后方能以柔克刚，以弱胜强，&nbsp;一方面要记住世间万物相生相克的辨证世界观同时也要准确地把握住易语言真正的优势和发展方向，这也是我的一个经验。<br>]]></description>
<pubDate>2012-5-9 22:02:00</pubDate>
</item>

<item>
<author><![CDATA[魔兽小兵]]></author>
<title><![CDATA[新手求助，程序问题]]></title>
<link>http://bbs.pfan.cn/post-384912.html</link>
<description><![CDATA[#include&lt;stdio.h&gt;<br>#define&nbsp;LETTER&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;***********************************************************<br>&nbsp;void&nbsp;main()<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;str[20]=&quot;c&nbsp;Language&quot;,c;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=0;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((c=str[i])!=&#39;\0&#39;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br>#if&nbsp;LETTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**************************************************************************<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(c&gt;=&#39;a&#39;&amp;&amp;c&lt;=&#39;z&#39;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=c-32;<br>#else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(c&gt;=&#39;A&#39;&amp;&amp;c&lt;=&#39;Z&#39;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=c+32;<br>#endif<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%c&quot;,c);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标记的两行啥作用呢？[em15]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题目是“输入一行字母字符，根据需要设置条件编译，使之能将字母全改为大写输出，或全改为小写输出。”]]></description>
<pubDate>2012-5-8 17:59:00</pubDate>
</item>

<item>
<author><![CDATA[xuwei125479094]]></author>
<title><![CDATA[新手报道嘻游科技官网]]></title>
<link>http://bbs.pfan.cn/post-384904.html</link>
<description><![CDATA[<br>嘻游科技官网,嘻游网络加速器,客服QQ79490724,专业提供日本代理服务器,日服游戏代理,日本游戏加速器,日服网游加速器,日本动态服务器,包括网页|网络游戏,支持cf日服,洛奇英雄传日服,TERA日服,龙之谷日服,冒险岛日服,dnf日服,艾尔之光日服代理,c9日服等等千款日本大型加速,日本游戏任您玩!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;嘻游加速器软件官方下载：http://www.000sj.com/<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;QQ客服；79490724&nbsp;<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;24小时热线电话；13507262655]]></description>
<pubDate>2012-5-8 16:23:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]Photoshop基本概念知识]]></title>
<link>http://bbs.pfan.cn/post-384878.html</link>
<description><![CDATA[Photoshop基本概念知识<br>　　Photoshop：它是由Adobe公司开发的图形处理系列软件之一，主要应用于在图像处理、广告设计的一个电脑软件。最先它只是在Apple机（MAC）上使用，后来也开发出了for&nbsp;window的版本。下面是这个软件里一些基本的概念。&nbsp;　　<br>位图：又称光栅图，一般用于照片品质的图像处理，是由许多像小方块一样的&quot;像素&quot;组成的图形。由其位置与颜色值表示，能表现出颜色阴影的变化。在Photoshop主要用于处理位图.<br>矢量图：通常无法提供生成照片的图像物性，一般用于工程技术绘图。如灯光的质量效果很难在一幅矢量图表现出来。<br>分辨率：每单位长度上的像素叫做图像的分辨率，简单讲即是电脑的图像给读者自己观看的清晰与模糊，分辨率有很多种。如屏幕分辨率，扫描仪的分辨率，打印分辨率。&nbsp;　　<br>图像尺寸与图像大小及分辨率的关系：如图像尺寸大，分辨率大，文件较大，所占内存大，电脑处理速度会慢，相反，任意一个因素减少，处理速度都会加快。&nbsp;　　<br>通道：在PS中，通道是指色彩的范围，一般情况下，一种基本色为一个通道。如RGB颜色，R为红色，所以R通道的范围为红色，G为绿色，B为蓝色。&nbsp;　　<br>图层：在PS中，一般多是用到多个图层制作每一层好象是一张透明纸，叠放在一起就是一个完整的图像。对每一图层进行修改处理，对其它的图层不含造成任何的影响。&nbsp;　　<br>图像的色彩模式：&nbsp;　　1）RGB彩色模式：又叫加色模式，是屏幕显示的最佳颜色，由红、绿、蓝三种颜色组成，每一种颜色可以有0-255的亮度变化。&nbsp;　　<br>2）CMYK彩色模式：由品蓝，品红，品黄和黑色组成，又叫减色模式。一般打印输出及印刷都是这种模式，所以打印图片一般都采用CMYK模式。&nbsp;　　<br>3）HSB彩色模式：是将色彩分解为色调，饱和度及亮度通过调整色调，饱和度及亮度得到颜色和变化。&nbsp;　　<br>4）Lab彩色模式：这种模式通过一个光强和两个色调来描述一个色调叫a，另一个色调叫b。它主要影响着色调的明暗。一般RGB转换成CMYK都先经Lab的转换。&nbsp;　　<br>5）索引颜色：这种颜色下图像像素用一个字节表示它最多包含有256色的色表储存并索引其所用的颜色，它图像质量不高，占空间较少。&nbsp;　　<br>6）灰度模式：即只用黑色和白色显示图像，像素0值为黑色，像素255为白色。<br>7）位图模式：像素不是由字节表示，而是由二进制表示，即黑色和白色由二进制表示，从而占磁盘空间最小。&nbsp;　　当屏幕分辨率高于800X600时右上角出现的条形框是干什么的？&nbsp;　　当分辨率高于600*800时，任务栏最左边有一深灰色条形框，可以把常用面板拖放上去，节省了很多空间。&nbsp;　　怎样正确显示中文字体名？&nbsp;　　按CTRL+K，然后把Show&nbsp;Fonts&nbsp;Name&nbsp;In&nbsp;English去掉就可以了。&nbsp;　　输入写字的时候显示半个情况该如何处理？&nbsp;　　这是字库的原因。建议使用特粗XX时，用“方正字库”或“微软”。文鼎字库在字体的间距设置不好时，就是半个。……汉仪的“turetype”字体也会出问题。&nbsp;　　使用路径(Path)工具时的几个技巧？&nbsp;　　使用笔形(Pen)工具制作路径时按住Shift键可以强制路径或方向线成水平、垂直或45度角，按住Ctrl键可暂时切换到路径选取工具，按住Alt键将笔形光标在在黑色节点上单击可以改变方向线的方向，使曲线能够转折；按Alt键用路径选取(Direct&nbsp;Selection)工具单击路径会选取整个路径；要同时选取多个路径可以按住Shift后逐个单击；使用路径选工具时按住“Ctrl+Alt”键移近路径会切换到加节点与减节点笔形工具。&nbsp;　　若要切换路径(path)是否显示，可以按住Shift键后在路径调色板的路径栏上单击鼠标，&nbsp;或者在路径调色版灰色区域单击即可。&nbsp;　　若要一起执行数个宏(Action)，可以先增加一个宏，然后录制每一个所要执行的宏。&nbsp;　　若要在一个宏(Action)中的某一命令后新增一条命令，可以先选中该命令，然后单击调色板上的开始录制(Begin&nbsp;recording)图标，选择要增加的命令，再单击停止录制(Stop&nbsp;recording)图标即可。&nbsp;　　在使用Filter/Render/Clouds滤镜时，若要产生更多明显的支纹图案，可先按住Alt键后再执行该命令；若要生成低漫射支彩效果，可先按住Shift键后再执行命令。&nbsp;　　在使用Filter/Render/Lighting&nbsp;Effects滤镜时，若要在对话框内复制光源时，可先按住Alt键后再拖动光源即可实现复制。&nbsp;　　若要在Color调色板上直接切换色彩模式，可先按住Shift键后，再将光标移到色彩条上单击即可。&nbsp;　　如何制作透明背景的图片？&nbsp;　　首先，只有GIF才可以使用透明，所以在保存文件的时候不要选择保存或另存为，而是直接选“输出GIF”然后，选择透明色，如果你需要透明的部分都是白色就选白色，依次类推做图片时把背景图片隐藏调然后再Save&nbsp;for&nbsp;Web&nbsp;就可以透明了。&nbsp;　　在GIF图上写上中文，字迹为何不连续？&nbsp;　　先把GIF转成RGB，写完字再转回Index&nbsp;Color，选择Image&gt;Mode&gt;Rgb/Image&gt;Mode&gt;Index&nbsp;Color。&nbsp;　　怎样用PS做一个实体的倒影和背影？比如一个瓶子怎么制造出它的倒影和背影？&nbsp;　　把瓶子复制一层放下面，把这层黑了，然后Blur，然后把这层Trasnform&gt;Distort，对好比例后，调整透明度。&nbsp;　　或者直接把瓶子层给Shadow或者Outerglow，然后把Effect层独立出来，接着也是扭曲变形了。&nbsp;　　如果你是说瓶子正面要看到背面反射的周围物体的画面，可以用Render-3D&nbsp;Transform，这样的方法不如用3D建模更逼真，PS里有滤镜Lens&nbsp;Pro&nbsp;，可以直接做玻璃球之类的表面倒映。倒影是水里的？&nbsp;复制瓶子层，翻转过来，把透明度降低，放在水层上，如果觉得太清楚，就选择Filter&gt;Distort&gt;Ripple，加点波纹，如果觉得太生硬，就在Layer&nbsp;Properties里调整一下瓶和水层间的颜色关系。<br>掌握PS需要学会<br>　　常用选择工具及填充色彩工具的使用&nbsp;　　路径工具及渲染工具的使用&nbsp;　　图层及图层混合模式的使用&nbsp;　　常用滤镜使用技巧&nbsp;　　图像色彩调整及图像模式的使用&nbsp;　　路径工具的使用技巧&nbsp;　　通道及路径的使用技巧及&nbsp;　　图层、通道、路径高级实例分析讲解，如何利用通道、路径来扣图&nbsp;　　常用滤镜使用及外挂滤镜使用技巧&nbsp;　　Photoshop在照片中的应用，婚纱照、老照片等技巧&nbsp;　　Photoshop在平面广告创意中的应用&nbsp;　　Photoshop在包装盒制作中如何布局及包装盒制作中的应用&nbsp;　　Photoshop在网页制作中如何布局及网页制作中应用&nbsp;　　Photoshop在效果图后期处里中的应用<br>PHOTOSHOP基本工具快捷键<br>　　工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)&nbsp;　　矩形、椭圆选框工具：【M】&nbsp;　　裁剪工具：【C】&nbsp;　　移动工具：【V】&nbsp;　　套索、多边形套索、磁性套索：【L】&nbsp;　　魔棒工具：【W】&nbsp;　　喷枪工具：【J】&nbsp;　　画笔工具：【B】&nbsp;　　像皮图章、图案图章：【S】&nbsp;　　历史记录画笔工具：【Y】&nbsp;　　像皮擦工具：【E】&nbsp;　　铅笔、直线工具：【N】&nbsp;　　模糊、锐化、涂抹工具：【R】&nbsp;　　减淡、加深、海棉工具：【O】&nbsp;　　钢笔、自由钢笔、磁性钢笔：【P】&nbsp;　　添加锚点工具：【+】&nbsp;　　删除锚点工具：【-】&nbsp;　　直接选取工具：【A】&nbsp;　　文字、文字蒙板、直排文字、直排文字蒙板：【T】&nbsp;　　度量工具：【U】&nbsp;　　直线渐变、径向渐变、对称渐变、角度渐变、菱形渐变：【G】&nbsp;　　油漆桶工具：【K】&nbsp;　　吸管、颜色取样器：【I】&nbsp;　　抓手工具：【H】&nbsp;　　缩放工具：【Z】&nbsp;　　默&nbsp;认前景色和背景色：【D】&nbsp;　　切换前景色和背景色：【X】&nbsp;　　切换标准模式和快速蒙板模式：【Q】&nbsp;　　标准屏幕模式、带有菜单栏的全屏模式、全屏模式&nbsp;：【F】&nbsp;连续按两下【F】&nbsp;　　临时使用移动工具：【Ctrl】&nbsp;　　临时使用吸色工具：【Alt】&nbsp;　　临时使用抓手工具：【空格】&nbsp;　　打开工具选项面板：【Enter】&nbsp;　　快速输入工具选项(当前工具选项面板中至少有一个可调节数字)&nbsp;：【0】至【9】&nbsp;　　循环选择画笔&nbsp;：【[】或【]】&nbsp;　　选择第一个画笔&nbsp;：【Shift】+【[】&nbsp;　　选择最后一个画笔&nbsp;：【Shift】+【]】&nbsp;　　建立新渐变(在”渐变编辑器”中)&nbsp;：【Ctrl】+【N】&nbsp;　　文件操作&nbsp;　　新建图形文件：&nbsp;【Ctrl】+【N】&nbsp;　　用默认设置创建新文件&nbsp;：【Ctrl】+【Alt】+【N】&nbsp;　　打开已有的图像：&nbsp;【Ctrl】+【O】&nbsp;　　打开为...&nbsp;：【Ctrl】+【Alt】+【O】&nbsp;　　关闭当前图像&nbsp;：【Ctrl】+【W】&nbsp;　　保存当前图像&nbsp;：【Ctrl】+【S】&nbsp;　　另存为...&nbsp;：【Ctrl】+【Shift】+【S】&nbsp;　　存储副本&nbsp;：【Ctrl】+【Alt】+【S】&nbsp;　　页面设置&nbsp;：【Ctrl】+【Shift】+【P】&nbsp;　　打印&nbsp;：【Ctrl】+【P】&nbsp;　　打开“预置”对话框&nbsp;：【Ctrl】+【K】&nbsp;　　显示最后一次显示的“预置”对话框&nbsp;：【Alt】+【Ctrl】+【K】&nbsp;　　设置“常规”选项(在预置对话框中)：&nbsp;【Ctrl】+【1】&nbsp;　　设置“存储文件”(在预置对话框中)&nbsp;：【Ctrl】+【2】&nbsp;　　设置“显示和光标”(在预置对话框中)&nbsp;：【Ctrl】+【3】&nbsp;　　设置“透明区域与色域”(在预置对话框中)&nbsp;：【Ctrl】+【4】&nbsp;　　设置“单位与标尺”(在预置对话框中)&nbsp;：【Ctrl】+【5】&nbsp;　　设置“参考线与网格”(在预置对话框中)&nbsp;：【Ctrl】+【6】&nbsp;　　外发光效果(在”效果”对话框中)：&nbsp;【Ctrl】+【3】&nbsp;　　内发光效果(在”效果”对话框中)&nbsp;：【Ctrl】+【4】&nbsp;　　斜面和浮雕效果(在”效果”对话框中)&nbsp;：【Ctrl】+【5】&nbsp;　　应用当前所选效果并使参数可调(在”效果”对话框中)&nbsp;：【A】&nbsp;　　图层混合模式&nbsp;　　循环选择混合模式&nbsp;：【Alt】+【-】或【+】&nbsp;　　正常&nbsp;：【Ctrl】+【Alt】+【N】&nbsp;　　阈值（位图模式）：&nbsp;【Ctrl】+【Alt】+【L】&nbsp;　　溶解&nbsp;：【Ctrl】+【Alt】+【I】&nbsp;　　背后&nbsp;：【Ctrl】+【Alt】+【Q】&nbsp;　　清除&nbsp;：【Ctrl】+【Alt】+【R】&nbsp;　　正片叠底：&nbsp;【Ctrl】+【Alt】+【M】&nbsp;　　屏幕：&nbsp;【Ctrl】+【Alt】+【S】&nbsp;　　叠加：&nbsp;【Ctrl】+【Alt】+【O】&nbsp;　　柔光：&nbsp;【Ctrl】+【Alt】+【F】&nbsp;　　强光：【Ctrl】+【Alt】+【H】&nbsp;　　颜色减淡&nbsp;：【Ctrl】+【Alt】+【D】&nbsp;　　颜色加深&nbsp;：【Ctrl】+【Alt】+【B】&nbsp;　　变暗：&nbsp;【Ctrl】+【Alt】+【K】&nbsp;　　变亮：【Ctrl】+【Alt】+【G】&nbsp;　　差值：&nbsp;【Ctrl】+【Alt】+【E】&nbsp;　　排除：【Ctrl】+【Alt】+【X】&nbsp;　　色相：&nbsp;【Ctrl】+【Alt】+【U】&nbsp;　　饱和度：&nbsp;【Ctrl】+【Alt】+【T】&nbsp;　　颜色：&nbsp;【Ctrl】+【Alt】+【C】&nbsp;　　光度：&nbsp;【Ctrl】+【Alt】+【Y】&nbsp;　　复制当前图层：【Ctrl】+【J】&nbsp;　　强行关闭当前话框：【Ctrl】+【Alt】+【W】&nbsp;　　粘贴：【Ctrl】+【Alt】+【V】&nbsp;　　无限返回上一步：【Ctrl】+【Alt】+【Z】&nbsp;　　选择功能&nbsp;　　全部选取：【Ctrl】+【A】&nbsp;　　取消选择：【Ctrl】+【D】&nbsp;　　重新选择：【Ctrl】+【Shift】+【D】&nbsp;　　羽化选择：【Ctrl】+【Alt】+【D】&nbsp;　　反向选择：【Ctrl】+【Shift】+【I】&nbsp;　　路径变选区&nbsp;数字键盘的：【Enter】&nbsp;　　载入选区：&nbsp;【Ctrl】+点按图层、路径、通道面板中的缩约图&nbsp;　　主要档案格式&nbsp;　http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com　.PSD：原始的图像文件，包含所有的&nbsp;Photoshop&nbsp;处理信息，如图层，文本，渲染效果等。Photoshop&nbsp;与&nbsp;Image&nbsp;Ready&nbsp;亦能开启PSD格式）。PSD格式保存有图层、色版、路径，还有一些调整图层等（目前无法保存相关的历史记录）。&nbsp;　　.PSB&nbsp;(Photoshop&nbsp;Big)：此格式用於档案大小超过2&nbsp;Giga&nbsp;Bytes&nbsp;的档案，是新版本的.PSD&nbsp;格式&nbsp;　　.PDD&nbsp;(PhotoDeluxe&nbsp;Document)：此格式只用来支援&nbsp;Photo&nbsp;Deluxe&nbsp;的功能。Photo&nbsp;Deluxe&nbsp;现已停止开发。<br>]]></description>
<pubDate>2012-5-8 0:38:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]photoshop技能基础]]></title>
<link>http://bbs.pfan.cn/post-384877.html</link>
<description><![CDATA[学PS基础：<br>经典的Photoshop技巧大全，如果你是初级阶段的水平，熟读此文并掌握，马上进阶为中级水平。常见技巧&nbsp;经典的Photoshop技巧大全，如果你是初级阶段的水平，熟读此文并掌握，马上进阶为中级水平。-<br>　　1.&nbsp;快速打开文件-<br>　　双击Photoshop的背景空白处(默认为灰色显示区域)即可打开选择文件的浏览窗口。-<br>　　2.&nbsp;随意更换画布颜色-<br>　　选择油漆桶工具并按住Shift点击画布边缘，即可设置画布底色为当前选择的前景色。如果要还原到默认的颜色，设置前景色为25％灰度&nbsp;(R192，G192，B192)再次按住Shift点击画布边缘。-<br>　　3.&nbsp;选择工具的快捷键-<br>　　可以通过按快捷键来快速选择工具箱中的某一工具，各个工具的字母快捷键如下：-<br>　　选框-M&nbsp;移动-V&nbsp;套索-L&nbsp;魔棒-W-<br>　　喷枪-J&nbsp;画笔-B&nbsp;铅笔-N&nbsp;橡皮图章-S-<br>　　历史记录画笔-Y&nbsp;橡皮擦-E&nbsp;模糊-R&nbsp;减淡-O-<br>　　钢笔-P&nbsp;文字-T&nbsp;度量-U&nbsp;渐变-G-<br>　　油漆桶-K&nbsp;吸管-I&nbsp;抓手-H&nbsp;缩放-Z-<br>　　默认前景和背景色-D&nbsp;切换前景和背景色-X-<br>　　编辑模式切换-Q&nbsp;显示模式切换-F-<br>　　另外，如果我们按住Alt键后再单击显示的工具图标，或者按住Shift键并重复按字母快捷键则可以循环选择隐藏的工具。-<br>　　4.&nbsp;获得精确光标-<br>　　按Caps&nbsp;Lock键可以使画笔和磁性工具的光标显示为精确十字线，再按一次可恢复原状。-<br>　　5.&nbsp;显示/隐藏控制板-<br>　　按Tab键可切换显示或隐藏所有的控制板(包括工具箱)，如果按Shift+Tab则工具箱不受影响，只显示或隐藏其他的控制板。-<br>　　6.&nbsp;快速恢复默认值-<br>　　有些不擅长Photoshop的朋友为了调整出满意的效果真是几经周折，结果发现还是原来的默认效果最好，这下傻了眼，后悔不该当初呀！怎么恢复到默认值呀？试着轻轻点按选项栏上的工具图标，然后从上下文菜单中选取“复位工具”或者“复位所有工具”。-<br>　　7.&nbsp;自由控制大小-<br>　　缩放工具的快捷键为“Z”，此外“Ctrl＋空格键”为放大工具，“Alt＋空格键”为缩小工具，但是要配合鼠标点击才可以缩放；相同按&nbsp;Ctrl+“+”键以及“－”键分别也可为放大和缩小图像；Ctrl+Alt+“+”和Ctrl+Alt+“－”&nbsp;可以自动调整窗口以满屏缩放显示，使用此工具你就可以无论图片以多少百份比来显示的情况下都能全屏浏览！如果想要在使用缩放工具时按图片的大小自动调整窗口，可以在缩放工&nbsp;具的属性条中点击“满画布显示”选项。-<br>　　8.&nbsp;使用非Hand&nbsp;Tool(手形工具)时，按住空格键后可转换成手形工具，即可移动视窗内图像的可见范围。在手形工具上双击鼠标可以使图像以最适合的窗口大小显示，在缩放工具上双击鼠标可使图像以1:1的比例显示。-<br>　　9.&nbsp;在使用Erase&nbsp;Tool(橡皮擦工具)时，按住Alt&nbsp;键即可将橡皮擦功能切换成恢复到指定的步骤记录状态。-<br>　　10.&nbsp;使用Smudge&nbsp;Tool(指尖工具)时，按住Alt键可由纯粹涂抹变成用前景色涂抹。-<br>　　11.&nbsp;要移动使用Type&nbsp;Mask&nbsp;Tool(文字蒙版工具)打出的字形选取范围时，可先切换成快速蒙版模式（用快捷键Q切换），然后再进行移动，完成后只要再切换回标准模式即可。-<br>　　12.&nbsp;按住Alt键后，使用Rubber&nbsp;Stamp&nbsp;Tool(橡皮图章工具)在任意打开的图像视窗内单击鼠标，即可在该视窗内设定取样位置，但不会改变&nbsp;作用视窗。-<br>　　13.&nbsp;在使用Move&nbsp;Tool(移动工具)时，可按键盘上的方向键直接以1&nbsp;pixel的距离移动图层上的图像，如果先按住Shift键后再按方向键则以每次10&nbsp;pixel的距离移动图像。而按Alt键拖动选区将会移动选区的拷贝。-<br>　　14.&nbsp;使用磁性套索工具或磁性钢笔工具时，按“[”或“]”键可以实时增加或减少采样宽度(选项调板中)。-<br>　　15.&nbsp;度量工具在测量距离上十分便利(特别是在斜线上)，你同样可以用它来量角度(就像一只量角器)。在信息面板可视的前提下，选择度量工具点击并拖出一条直线，按住Alt键从第一条线的节点上再拖出第二条直线，这样两条线间的夹角和线的长度都显示在信息面板上。用测量工具拖动可以移动测量线(也可以只单独移动测量线的一个节点)，把测量线拖到画布以外就可以把它删除。-<br>　　16.&nbsp;使用绘画工具如(如画笔，向笔等)，按住Shift键单击鼠标，可将两次单击点以直线连接。-<br>　　17.&nbsp;按住Alt键用吸管工具选取颜色即可定义当前背景色。通过结合颜色取样器工具(Shift+I)和信息面板监视当前图片的颜色变化。变化前后的颜色值显示在信息面板上其取样点编号的旁边。通过信息面板上的弹出菜单可以定义取样点的色彩模式。要增加新取样点只需在画布上用颜色取样器工具随便什么地方再点一下，按住Alt键点击可以除去取样点。但一张图上最多只能放置四个颜色取样点。当Photoshop中有对话框(例如：色阶命令、曲线命令等等)弹出时，要增加新的取样点必须按住Shift键再点击，按住Alt+Shift点击可以减去一个取样点。-<br>　　18.&nbsp;裁切工具大家都一定用过，这种情况你也一定遇到过；在你调整裁切握、而裁切框又比较接近图像边界的时候，裁减框会自动地贴到图像的边上，令你无法精确的裁切图像。不过只要在调整裁切边框的时候接下“Ctrl”键，那么裁切框就会服服帖帖，让你精确裁切。-<br>-<br>-<br>复制技巧-<br>　　19.&nbsp;按住Ctrl+Alt键拖动鼠标可以复制当前层或选区内容。-<br>　　20.&nbsp;如果你最近拷贝了一张图片存在剪贴板里，Photoshop在新建文件(Ctrl+N)的时候会以剪贴板中图片的尺寸作为新建图的默认大小。要略过这个特性而使用上一次的设置，在打开的时候按住Alt键(Ctrl+Alt+N)。-<br>　　21.&nbsp;如果创作一幅新作品，需要与一幅已打开的图片有一样的尺寸、解析度、格式的文件。选取“文件”→“New”，点Photoshop菜单栏的Windows选项，在弹出菜单的最下面一栏点击已开启的图片名称，是的，就是这么简单!-<br>　　22.&nbsp;在使用自由变换工具(Ctrl+T)时按住Alt键(Ctrl+Alt+T)即可先复制原图层(在当前的选区)后在复制层上进行变换；Ctrl+Shift+T为再次执行上次的变换，Ctrl+Alt+Shift+T为复制原图后再执行变换。-<br>　　23.&nbsp;使用“通过复制新建层(Ctrl+J)”或“通过剪切新建层(Ctrl+J)”命令可以在一步之间完成拷贝到粘贴和剪切到粘贴的工作；通过复制(剪切)新建层命令粘贴时仍会放在它们原来的地方，然而通过拷贝(剪切)再粘贴，就会贴到图片(或选区)的中心。-<br>　　24.&nbsp;若要直接复制图像而不希望出现命名对话框，可先按住Alt键，再执行“图像”→“副本”命令。-<br>　　25.&nbsp;Photoshop的剪贴板很好用，但你更希望直接使用Windows系统剪贴板，直接处理从屏幕上截取的图像。好的，按下Ctrl＋K，在弹出的面板上将“输出到剪贴板”点中吧！-<br>　　26.&nbsp;在Photoshop内实现有规律复制-<br>　　在做版面设计的时候我们会经常把某些元素有规律地摆放以寻求一种形式的美感，在Photoshop内通过四个快捷键的组合就可以轻易得出。-<br>　　(1)圈选出你要复制的物体；-<br>　　(2)按Ctrl+J产生一个浮动&nbsp;Layer；-<br>　　(3)按旋转并移动到适当位置后确认；-<br>　　(4)现在可以按住Ctrl+Alt+Shift&nbsp;后连续按“T”就可以有规律地复制出连续的物体。(只按住Ctrl+Shift则只是有规律移动)-<br>　　27.&nbsp;当我们要复制文件中的选择对象时，要使用编辑菜单中的复制命令。复制一次你也许觉不出麻烦，但要多次复制，一次一次的点击就相当不便了。这时你可以先用选择工具选定对象，而后点击移动工具，再按住“Alt”键不放。当光标变成一黑一白重叠在一起的两个箭头时，拖动鼠标到所需位置即可。若要多次复制，只要重复的放松鼠标就行了。-<br>　　28.&nbsp;可以用选框工具或套索工具，把选区从一个文档拖到另一个上。-<br>　　29.&nbsp;要为当前历史状态或快照建立一个复制文档可以：-<br>　　(1)点击“从当前状态创建新文档”按钮；-<br>　　(2)从历史面板菜单中选择新文档；-<br>　　(3)拖动当前状态(或快照)到“从当前状态创建新文档”按钮上；-<br>　　(4)右键点击所要的状态(或快照)从弹出菜单中选择新文档把历史状态中当前图片的某一历史状态拖到另一个图片的窗口可改变目的图片的内容。按住Alt键点击任一历史状态(除了当前的、最近的状态)可以复制它。而后被复制的状态就变为当前(最近的)状态。按住Alt拖动动作中的步骤可以把它复制到另一个动作中。-<br>　　选择技巧-<br>　　30.&nbsp;把选择区域或层从一个文档拖向另一个时，按住Shift键可以使其在目的文档上居中。如果源文档和目的文档的大小(尺寸)相同，被拖动的元素会被放置在与源文档位置相同的地方(而不是放在画布的中心)。如果目的文档包含选区，所拖动的元素会被放置在选区的中心。-<br>　　31.&nbsp;在动作调板中单击右上角的三角形按钮，从弹出的菜单中选择载入动作，进入PhotoshopGoodiesActions目录下，其下有按钮、规格、命令、图像效果，文字效果、纹理、帧六个动作集，包含了很多实用的东西哟!另外，在该目录下还有一个ACTIONS.PDF文件，可用&nbsp;Adobe&nbsp;Acrobat软件打开，里面详细介绍了这些动作的使用方法和产生的效果。-<br>　　32.&nbsp;单击工具条中的画笔类工具，在随后显示的属性条中单击画笔标签右边的小三角，在弹出的菜单中再点击小箭头选择“载入画笔…”。&nbsp;到Photoshop目录的Brushes文件夹中选择*.abr。原来这里还有这么多可爱的东西。-<br>　　33.&nbsp;画出一个漂亮的标记，想在作品中重复使用？好办，用套索工具选好它，在Brushes的弹出菜单中选“储存画笔…”，然后用画笔工具选中这个新笔头……朋友，想做居室喷涂吗?-<br>　　34.&nbsp;如果想选择两个选择区域之间的部分，在已有的任意一个选择区域的旁边同时按住Shift和Alt键进行拖动，画第二个选择区域(鼠标十字形旁出现一个乘号，表示重合的该区域将被保留)。-<br>　　35.&nbsp;在选择区域中删除正方形或圆形，首先增加任意一个选择区域，然后在该选择区域内，按Alt键拖动矩形或椭圆的面罩工具。然后松开Alt键，按住Shift键，拖动到你满意为止。然后先松开鼠标按钮再松开Shift键。-<br>　　36.&nbsp;从中心向外删除一个选择区域，在任意一个选择区域内，先按Alt键拖动矩形或椭圆的面罩工具，然后松开Alt键后再一次按住Alt键，最后松开鼠标按钮再松开Alt键。-<br>　　37.&nbsp;在快速蒙版模式下要迅速切换蒙版区域或选取区域选项时，先按住Alt键后将光标移到快速遮色片模式图标上单击鼠标就可以了。-<br>　　38.&nbsp;使用选框工具的时候，按住Shift键可以划出正方形和正圆的选区；按住Alt键将从起始点为中心勾划选区。-<br>　　39.&nbsp;使用“重新选择”命令(Ctrl+Shift+D)来载入/恢复之前的选区。-<br>　　40.&nbsp;在使用套索工具勾画选区的时候按Alt键可以在套索工具和多边形套索工具间切换。勾画选区的时候按住空格键可以移动正在勾画的选区。-<br>1.复制图层，混合模式为滤色，&nbsp;<br>2.涂层2蒙板反向擦出眼睛&nbsp;<br>3.盖印（alt+ctrl+shift+E）&nbsp;<br>4.通道混合气，选中单色，红色+54，绿色+54，蓝色+32&nbsp;<br>6.混合模式-正叠&nbsp;<br>7.对盖印层调整，图像-调整-暗影/高光-暗影：50，50，144&nbsp;&nbsp;高光：0，50，30&nbsp;&nbsp;中间调：20，0&nbsp;&nbsp;0.01，0.01&nbsp;<br>8.再次盖印&nbsp;<br>9.用图章擦去右腮的阳光&nbsp;<br>10.用减淡工具-范围为高光，强度50%，擦出眼球反光，只擦眼黑，&nbsp;<br>11.再次盖印，滤镜-其他-高反差，参数80&nbsp;<br>12.改高反差那一层模式为柔光，加强对比，&nbsp;<br>13.用自己喜欢的方法锐化&nbsp;<br>14.长时间少色相饱和的红色，或别的微调试试<br><br><br>1、选择素材图。&nbsp;<br>2、创建新画布，背景填充黑色，并将人物素材拖到画布中，使用橡皮擦工具将脸部之外的部分擦除。&nbsp;<br>3、创建新透明画布（20&nbsp;x&nbsp;20px），将前景色设为白色，使用1px的铅笔工具对画布左侧和下侧描边。&nbsp;<br>4、编辑&nbsp;&gt;&gt;&nbsp;变换&nbsp;&gt;&gt;&nbsp;变形，按下图调整网格层节点。&nbsp;<br>5、将图层不透明度设为20%。双击网格层打开图层样式窗口，选择外发光，混合模式为“颜色减淡”，不透明度100%，颜色为白色，扩展0，大小5。&nbsp;<br>6、创建新图层，使用钢笔工具沿网格选出若干方块，并用黑色填充。&nbsp;<br>7、按住Ctrl&nbsp;键并点击上述黑色方块层获得选区，选择人像层，剪切并粘贴（粘贴后的图层命名为“碎片”），并通过自由变换（Ctrl&nbsp;+&nbsp;T）将其缩小一点后移动到如下位置。<br>8、选择碎片层，按住&nbsp;Alt&nbsp;键，并同时点击键盘向右方向键（点9次），得到类似立体效果。此时看到图层面板中出现10个碎片层，将除了顶层外的其他碎片层合并，并将合并后的图层命名为“侧边”。双击侧边层，打开图层样式窗口，选择渐变叠加，将不透明度设为80%，角度180，使用#000000&nbsp;到&nbsp;#D58761渐变，其他属性取默认值。&nbsp;<br>9、利用画笔工具为侧边添加一些纹理效果。&nbsp;<br>10、重复执行步骤&nbsp;6-步骤&nbsp;9，得到如下效果。&nbsp;<br>http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com11、将所有的黑色方块层合并，双击打开图层样式窗口，选择斜面与浮雕，样式为“内斜面”，深度“75%”，大小5px，软化0px，角度0，高度50。高光模式为“滤色”，高光颜色#DCA57E，不透明度100%。&nbsp;<br>阴影模式“正片叠底”，阴影颜色#000000，不透明度75%。&nbsp;<br>12、在碎片层下方创建新图层，使用烟雾笔刷添加烟雾效果。选择碎片层，使用黑色柔角笔刷描绘画布右侧，得到如下渐隐效果。&nbsp;<br>13、在人物层上方创建新图层，再次使用钢笔工具随意选出若干方块，并用黑色填充。将图层混合模式设为“柔光”。&nbsp;<br>14、操作与步骤&nbsp;13相同，只是填充颜色换成白色。&nbsp;<br>15、选择人物层，滤镜&nbsp;&gt;&gt;&nbsp;模糊&nbsp;&gt;&gt;&nbsp;表面模糊，半径5px，阀值15。在所有图层上方创建调整图层，图层&nbsp;&gt;&gt;&nbsp;创建调整图层&nbsp;&gt;&gt;&nbsp;色阶，属性设为10，1.25，244。&nbsp;<br>16、为了得到酷酷的感觉，可以在胳膊上添加条形码纹身。<br><br>]]></description>
<pubDate>2012-5-8 0:36:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]编程指南:C语言编程易犯毛病集合]]></title>
<link>http://bbs.pfan.cn/post-384876.html</link>
<description><![CDATA[C语言的最大特点是：功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格，这就给编程人员留下“灵活的余地”，但还是由于这个灵活给程序的调试带来了许多不便，尤其对初学C语言的人来说，经常会出一些连自己都不知道错在哪里的错误。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;看着有错的程序，不知该如何改起，本人通过对C的学习，积累了一些C编程时常犯的错误，写给各位学员以供参考。&nbsp;<br><br>　　1.书写标识符时，忽略了大小写字母的区别。&nbsp;<br><br>　　main()&nbsp;<br>　　{&nbsp;<br>　　int&nbsp;a=5;&nbsp;<br>　　PRintf(&quot;%d&quot;,A);&nbsp;<br>　　}&nbsp;<br>　　编译程序把a和A认为是两个不同的变量名，而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上，符号常量名用大写，变量名用小写表示，以增加可读性。&nbsp;<br><br>　　2.忽略了变量的类型，进行了不合法的运算。&nbsp;<br>　　main()&nbsp;<br>　　{&nbsp;<br>　　float&nbsp;a,b;&nbsp;<br>　　printf(&quot;%d&quot;,a%b);&nbsp;<br>　　}&nbsp;<br>　　%是求余运算，得到a/b的整余数。整型变量a和b可以进行求余运算，而实型变量则不答应进行“求余”运算。&nbsp;<br><br>　　3.将字符常量与字符串常量混淆。&nbsp;<br>　　char&nbsp;c;&nbsp;<br>　　c=&quot;a&quot;;&nbsp;<br>　　在这里就混淆了字符常量与字符串常量，字符常量是由一对单引号括起来的单个字符，字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志，它是由系统自动加上的，所以字符串“a”实际上包含两个字符：‘a&#39;和‘\&#39;，而把它赋给一个字符变量是不行的。&nbsp;<br><br>　　4.忽略了“=”与“==”的区别。&nbsp;<br>　　在许多高级语言中，用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写&nbsp;<br>　　if&nbsp;(a=3)&nbsp;then&nbsp;…&nbsp;<br>　　但C语言中，“=”是赋值运算符，“==”是关系运算符。如：&nbsp;<br>　　if&nbsp;(a==3)&nbsp;a=b;&nbsp;<br>　　前者是进行比较，a是否和3相等，后者表示假如a和3相等，把b值赋给a。由于习惯问题，初学者往往会犯这样的错误。&nbsp;<br><br>　　5.忘记加分号。&nbsp;<br>　　分号是C语句中不可缺少的一部分，语句末尾必须有分号。&nbsp;<br>　　a=1&nbsp;<br>　　b=2&nbsp;<br>　　编译时，编译程序在“a=1”后面没发现分号，就把下一行“b=2”也作为上一行语句的一部分，这就会出现语法错误。改错时，有时在被指出有错的一行中未发现错误，就需要看一下上一行是否漏掉了分号。&nbsp;<br>　　{&nbsp;z=x+y;&nbsp;<br>　　t=z/100;&nbsp;<br>　　printf(&quot;%f&quot;,t);&nbsp;<br>　　}&nbsp;<br>　　对于复合语句来说，最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。&nbsp;<br><br>　　6.多加分号。&nbsp;<br>　　对于一个复合语句，如：&nbsp;<br>　　{&nbsp;z=x+y;&nbsp;<br>　　t=z/100;&nbsp;<br>　　printf(&quot;%f&quot;,t);&nbsp;<br>　　};&nbsp;<br>　　复合语句的花括号后不应再加分号，否则将会画蛇添足。&nbsp;<br>　　又如：&nbsp;<br>　　if&nbsp;(a%3==0);&nbsp;<br>　　I++;&nbsp;<br>　　本是假如3整除a，则I加1。但由于if&nbsp;(a%3==0)后多加了分号，则if语句到此结束，程序将执行I++语句，不论3是否整除a，I都将自动加1。&nbsp;<br>　　再如：&nbsp;<br>　　for&nbsp;(I=0;I&lt;5;I++);&nbsp;<br>　　{scanf(&quot;%d&quot;,&amp;x);&nbsp;<br>　　printf(&quot;%d&quot;,x);}&nbsp;<br>　　本意是先后输入5个数，每输入一个数后再将它输出。由于for()后多加了一个分号，使循环体变为空语句，此时只能输入一个数并输出它。&nbsp;<br><br>　　7.输入变量时忘记加地址运算符“&amp;”。&nbsp;<br>　　int&nbsp;a,b;&nbsp;<br>　　scanf(&quot;%d%d&quot;,a,b);&nbsp;<br>　　这是不合法的。Scanf函数的作用是：按照a、b在内存的地址将a、b的值存进去。“&amp;a”指a在内存中的地址。<br><br>　　8.输入数据的方式与要求不符。①scanf(&quot;%d%d&quot;,&amp;a,&amp;b);&nbsp;<br>　　输入时，不能用逗号作两个数据间的分隔符，如下面输入不合法：&nbsp;<br>　　3，4&nbsp;<br>　　输入数据时，在两个数据之间以一个或多个空格间隔，也可用回车键，跳格键tab。&nbsp;<br>　　②scanf(&quot;%d,%d&quot;,&amp;a,&amp;b);&nbsp;<br>　　C规定：假如在“格式控制”字符串中除了格式说明以外还有其它字符，则在输入数据时应输入与这些字符相同的字符。下面输入是合法的：&nbsp;<br>　　3，4&nbsp;<br>　　此时不用逗号而用空格或其它字符是不对的。&nbsp;<br>　　3&nbsp;4&nbsp;3：4&nbsp;<br>　　又如：&nbsp;<br>　　scanf(&quot;a=%d,b=%d&quot;,&amp;a,&amp;b);&nbsp;<br>　　输入应如以下形式：&nbsp;<br>　　a=3,b=4&nbsp;<br><br>　　9.输入字符的格式与要求不一致。&nbsp;<br>　　在用“%c”格式输入字符时，“空格字符”和“转义字符”都作为有效字符输入。&nbsp;<br>　　scanf(&quot;%c%c%c&quot;,&amp;c1,&amp;c2,&amp;c3);&nbsp;<br>　　如输入a&nbsp;b&nbsp;c&nbsp;<br>　　字符“a”送给c1，字符“&nbsp;”送给c2，字符“b”送给c3，因为%c只要求读入一个字符，后面不需要用空格作为两个字符的间隔。&nbsp;&nbsp;更多内容请看C/C++进阶技术文档专题，或&nbsp;<br><br>　　10.输入输出的数据类型与所用格式说明符不一致。&nbsp;<br>　　例如，a已定义为整型，b定义为实型&nbsp;<br>　　a=3;b=4.5;&nbsp;<br>　　printf(&quot;%f%d\n&quot;,a,b);&nbsp;<br>　　编译时不给出出错信息，但运行结果将与原意不符。这种错误尤其需要注重。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;　　11.输入数据时，企图规定精度。&nbsp;<br>　　scanf(&quot;%7.2f&quot;,&amp;a);&nbsp;<br>　　这样做是不合法的，输入数据时不能规定精度。&nbsp;<br><br>　　12.switch语句中漏写break语句。&nbsp;<br>　　例如：根据考试成绩的等级打印出百分制数段。&nbsp;<br>　　switch(grade)&nbsp;<br>　　{&nbsp;case&nbsp;&#39;A&#39;:printf(&quot;85~100\n&quot;);&nbsp;<br>　　case&nbsp;&#39;B&#39;:printf(&quot;70~84\n&quot;);&nbsp;<br>　　case&nbsp;&#39;C&#39;:printf(&quot;60~69\n&quot;);&nbsp;<br>　　case&nbsp;&#39;D&#39;:printf(&quot;&lt;60\n&quot;);&nbsp;<br>　　default:printf(&quot;error\n&quot;);&nbsp;<br>　　由于漏写了break语句，case只起标号的作用，而不起判定作用。因此，当grade值为A时，printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break;”。例如&nbsp;<br>　　case&nbsp;&#39;A&#39;:printf(&quot;85~100\n&quot;);break;&nbsp;<br><br>　　13.忽视了while和do-while语句在细节上的区别。&nbsp;<br>　　(1)main()&nbsp;<br>　　{int&nbsp;a=0,I;&nbsp;<br>　　scanf(&quot;%d&quot;,&amp;I);&nbsp;<br>　　while(I&lt;=10)&nbsp;<br>　　{a=a+I;&nbsp;<br>　　I++;&nbsp;<br>　　}&nbsp;<br>　　printf(&quot;%d&quot;,a);&nbsp;<br>　　}&nbsp;<br>　　(2)main()&nbsp;<br>　　{int&nbsp;a=0,I;&nbsp;<br>　　scanf(&quot;%d&quot;,&amp;I);&nbsp;<br>　　do&nbsp;<br>　　{a=a+I;&nbsp;<br>　　I++;&nbsp;<br>　　}while(I&lt;=10);&nbsp;<br>　　printf(&quot;%d&quot;,a);&nbsp;<br>　　}&nbsp;<br>　　可以看到，当输入I的值小于或等于10时，二者得到的结果相同。而当I&gt;10时，二者结果就不同了。因为while循环是先判定后执行，而do-while循环是先执行后判定。对于大于10的数while循环一次也不执行循环体，而do-while语句则要执行一次循环体。&nbsp;<br><br>　　14.定义数组时误用变量。&nbsp;<br>　　int&nbsp;n;&nbsp;<br>　　scanf(&quot;%d&quot;,&amp;n);&nbsp;<br>　　int&nbsp;a[n];&nbsp;<br>　　数组名后用方括号括起来的是常量表达式，可以包括常量和符号常量。即C不答应对数组的大小作动态定义。&nbsp;<br><br>　　15.在定义数组时，将定义的“元素个数”误认为是可使的最大下标值。&nbsp;<br>　　main()&nbsp;<br>　　{static&nbsp;int&nbsp;a[10]={1,2,3,4,5,6,7,8,9,10};&nbsp;<br>　　printf(&quot;%d&quot;,a[10]);&nbsp;<br>　　}&nbsp;<br>　　C语言规定：定义时用a[10]，表示a数组有10个元素。其下标值由0开始，所以数组元素a[10]是不存在的。&nbsp;<br><br>　　16.初始化数组时，未使用静态存储。&nbsp;<br>　　int&nbsp;a[3]={0,1,2};&nbsp;<br>　　这样初始化数组是不对的。C语言规定只有静态存储(static)数组和外部存储(exterm)数组才能初始化。应改为：&nbsp;<br>　　static&nbsp;int&nbsp;a[3]={0,1,2};&nbsp;<br><br>　　17.在不应加地址运算符&amp;的位置加了地址运算符。&nbsp;<br>　　scanf(&quot;%s&quot;,&amp;str);&nbsp;<br>　　C语言编译系统对数组名的处理是：数组名代表该数组的起始地址，且scanf函数中的输入项是字符数组名，不必要再加地址符&amp;。应改为：&nbsp;<br>　　scanf(&quot;%s&quot;,str);&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　18.同时定义了形参和函数中的局部变量。&nbsp;<br>　　int&nbsp;max(x,y)&nbsp;<br>　　int&nbsp;x,y,z;&nbsp;<br>　　{z=x&gt;y?x:y;&nbsp;<br>　　return(z);&nbsp;<br>　　}&nbsp;<br>　　形参应该在函数体外定义，而局部变量应该在函数体内定义。应改为：&nbsp;<br>　　int&nbsp;max(x,y)&nbsp;<br>　　int&nbsp;x,y;&nbsp;<br>　　{int&nbsp;z;&nbsp;<br>　　z=x&gt;y?x:y;&nbsp;<br>　　return(z);&nbsp;<br>　　}&nbsp;&nbsp;更多内容请看C/C++进阶技术文档专题，或&nbsp;<br>]]></description>
<pubDate>2012-5-8 0:34:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]解析Java的多线程机制]]></title>
<link>http://bbs.pfan.cn/post-384799.html</link>
<description><![CDATA[进程与应用程序的区别&nbsp;<br>　　&nbsp;<br>　　进程（Process）是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例，进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。&nbsp;<br>　　&nbsp;<br>　　C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后，提交给计算机处理器运行。这时，处在可执行状态中的应用程序称为进程。从用户角度来看，进程是应用程序的一个执行过程。从操作系统核心角度来看，进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位，是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中，而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括：&nbsp;<br>　　&nbsp;<br>　　●进程在执行过程中有内存单元的初始入口点，并且进程存活过程中始终拥有独立的内存地址空间；&nbsp;<br>　　&nbsp;<br>　　●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型；&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br>　　&nbsp;<br>　　●从应用程序进程在执行过程中向CPU发出的运行指令形式不同，可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。&nbsp;<br>　　&nbsp;<br>　　在Unix操作系统启动过程中，系统自动创建swapper、init等系统进程，用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程，均拥有唯一的进程标识（PID）。<br><br>进程与Java线程的区别&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址，在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。&nbsp;<br>　　&nbsp;<br>　　Java语言中定义的线程（Thread）同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行，它必须运行在处于活动状态的应用程序进程中，因此可以定义线程是程序内部的具有并发性的顺序代码流。&nbsp;<br>　　&nbsp;<br>　　Unix操作系统和Microsoft&nbsp;Windows操作系统支持多用户、多进程的并发执行，而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行，操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程，子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间，但保持每个线程拥有独立的执行堆栈和程序执行上下文（Context）。&nbsp;<br>　　&nbsp;<br>　　基于上述区别，线程也可以称为轻型进程&nbsp;(Light&nbsp;Weight&nbsp;Process，LWP)。不同线程间允许任务协作和数据交换，使得在计算机系统资源消耗等方面非常廉价。&nbsp;<br>　　&nbsp;<br>　　线程需要操作系统的支持，不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起，提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中，将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里，然后开始做菜。等菜做好了，饭熟了同时衣服也洗好了。&nbsp;<br>　　&nbsp;<br>　　需要注意的是：在应用程序中使用多线程不会增加&nbsp;CPU&nbsp;的数据处理能力。只有在多CPU&nbsp;的计算机或者在网络计算体系结构下，将Java程序划分为多个并发执行线程后，同时启动多个线程运行，使不同的线程运行在基于不同处理器的Java虚拟机中，才能提高应用程序的执行效率]]></description>
<pubDate>2012-5-6 23:16:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[Java网络编程]]></title>
<link>http://bbs.pfan.cn/post-384798.html</link>
<description><![CDATA[尽管TCP/IP协议的名称中只有TCP这个协议名，但是在TCP/IP的传输层同时存在TCP和UDP两个协议。<br><br>　　TCP是Tranfer&nbsp;Control&nbsp;Protocol的简称，是一种面向连接的保证可靠传输的协议。通过TCP协议传输，得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接，以便在TCP协议的基础上进行通信，当一个socket（通常都是server&nbsp;socket）等待建立连接时，另一个socket可以要求进行连接，一旦这两个socket连接起来，它们就可以进行双向数据传输，双方都可以进行发送或接收操作。<br><br>　　UDP是User&nbsp;Datagram&nbsp;Protocol的简称，是一种无连接的协议，每个数据报都是一个独立的信息，包括完整的源地址或目的地址，它在网络上以任何可能的路径传往目的地，因此能否到达目的地，到达目的地的时间以及内容的正确性都是不能被保证的。&nbsp;<br><br>　　下面我们对这两种协议做简单比较：<br>　<br>　　使用UDP时，每个数据报中都给出了完整的地址信息，因此无需要建立发送方和接收方的连接。对于TCP协议，由于它是一个面向连接的协议，在socket之间进行数据传输之前必然要建立连接，所以在TCP中多了一个连接建立的时间。<br>http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br>　　使用UDP传输数据时是有大小限制的，每个被传输的数据报必须限定在64KB之内。而TCP没有这方面的限制，一旦连接建立起来，双方的socket就可以按统一的格式传输大量的数据。UDP是一个不可靠的协议，发送方所发送的数据报并不一定以相同的次序到达接收方。而TCP是一个可靠的协议，它确保接收方完全正确地获取发送方所发送的全部数据。<br><br>　　总之，TCP在网络通信上有极强的生命力，例如远程连接（Telnet）和文件传输（FTP）都需要不定长度的数据被可靠地传输。相比之下UDP操作简单，而且仅需要较少的监护，因此通常用于局域网高可靠性的分散系统中client/server应用程序。<br><br>　　读者可能要问，既然有了保证可靠传输的TCP协议，为什么还要非可靠传输的UDP协议呢？主要的原因有两个。一是可靠的传输是要付出代价的，对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽，因此TCP传输的效率不如UDP高。二是在许多应用中并不需要保证严格的传输可靠性，比如视频会议系统，并不要求音频视频数据绝对的正确，只要保证连贯性就可以了，这种情况下显然使用UDP会更合理一些<br>]]></description>
<pubDate>2012-5-6 23:15:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[网络基础知识]]></title>
<link>http://bbs.pfan.cn/post-384797.html</link>
<description><![CDATA[计算机网络形式多样，内容繁杂。网络上的计算机要互相通信，必须遵循一定的协议。目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议<br><br>　　网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题，一个是如何准确的定位网络上一台或多台主机，另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位，数据传输的路由，由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制，这是网络编程的主要对象，一般不需要关心IP层是如何处理数据的。<br>　<br>　　目前较为流行的网络编程模型是客户机/服务器（C/S）结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行，监听网络端口，一旦有客户请求，就会启动一个服务进程来响应该客户，同时自己继续监听服务端口，使后来的客户也能及时得到服务。<br><br>8.1.2网络基本概念http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　IP地址：标识计算机等网络设备的网络地址，由四个8位的二进制数组成，中间以小数点分隔。<br>　　　　如：166.111.136.3&nbsp;,&nbsp;166.111.52.80<br><br>　　主机名(hostname)：网络地址的助记名，按照域名进行分级管理。<br>　　　　如：www.tsinghua.edu.cn<br>　　　　　　www.fanso.com<br>　　<br>　　端口号(port&nbsp;number)：网络通信时同一机器上的不同进程的标识。<br>　　　　如:80，21，23，25，其中1~1024为系统保留的端口号<br>　　<br>　　服务类型(service)：网络的各种服务。<br>　　　　http,&nbsp;telnet,&nbsp;ftp,&nbsp;smtp<br>　<br>　　我们可以用以下的一幅图来描述这里我们所提到的几个概念：<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;&nbsp;&nbsp;&nbsp;看图<br><br>　　在Internet上IP地址和主机名是一一对应的，通过域名解析可以由主机名得到机器的IP，由于机器名更接近自然语言，容易记忆，所以使用比IP地址广泛，但是对机器而言只有IP地址才是有效的标识符。<br><br>　　通常一台主机上总是有很多个进程需要网络资源进行网络通讯。网络通讯的对象准确的讲不是主机，而应该是主机中运行的进程。这时候光有主机名或IP地址来标识这么多个进程显然是不够的。端口号就是为了在一台主机上提供更多的网络资源而采取得一种手段，也是TCP层提供的一种机制。只有通过主机名或IP地址和端口号的组合才能唯一的确定网络通讯中的对象：进程。<br><br>服务类型是在TCP层上面的应用层的概念。基于TCP/IP协议可以构建出各种复杂的应用，服务类型是那些已经被标准化了的应用，一般都是网络服务器（软件）。读者可以编写自己的基于网络的服务器，但都不能被称作标准的服务类型。<br><br>]]></description>
<pubDate>2012-5-6 23:15:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]线程间的同步]]></title>
<link>http://bbs.pfan.cn/post-384796.html</link>
<description><![CDATA[Java应用程序的多个线程共享同一进程的数据资源，多个用户线程在并发运行过程中可能同时访问具有敏感性的内容。在Java中定义了线程同步的概念，实现对共享资源的一致性维护。下面以笔者最近开发的移动通信计费系统中线程间同步控制方法，说明Java语言中多线程同步方式的实现过程。&nbsp;<br>　　&nbsp;<br>　　在没有多线程同步控制策略条件下的客户账户类定义框架代码如下所示：&nbsp;<br>　　&nbsp;<br>　　<br><br>public&nbsp;class&nbsp;RegisterAccount&nbsp;　　{&nbsp;　　float&nbsp;fBalance;&nbsp;　　//客户缴费方法&nbsp;　　public&nbsp;void&nbsp;deposit(float&nbsp;fFees){&nbsp;fBalance&nbsp;+=&nbsp;fFees;&nbsp;}&nbsp;　　//通话计费方法&nbsp;　　public&nbsp;void&nbsp;withdraw(float&nbsp;fFees){&nbsp;fBalance&nbsp;-=&nbsp;fFees;&nbsp;}&nbsp;　　…&nbsp;…&nbsp;　　}&nbsp;　　&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　读者也许会认为：上述程序代码完全能够满足计费系统实际的需要。确实，在单线程环境下该程序确实是可靠的。但是，多进程并发运行的情况是怎样的呢？假设发生这种情况：客户在客户服务中心进行缴费的同时正在利用移动通信设备仅此通话，客户通话结束时计费系统启动计费进程，而同时服务中心的工作人员也提交缴费进程运行。读者可以看到如果发生这种情况，对客户账户的处理是不严肃的。&nbsp;<br>　　&nbsp;<br>　　如何解决这种问题呢？很简单，在RegisterAccount类方法定义中加上用于标识同步方法的关键字synchronized。这样，在同步方法执行过程中该方法涉及的共享资源（在上述代码中为fBalance成员变量）将被加上共享锁，以确保在方法运行期间只有该方法能够对共享资源进行访问，直到该方法的线程运行结束打开共享锁，其它线程才能够访问这些共享资源。在共享锁没有打开的时候其它访问共享资源的线程处于阻塞状态。&nbsp;http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　&nbsp;<br>　　进行线程同步策略控制后的RegisterAccount类定义如下面代码所示：&nbsp;<br>　　&nbsp;<br>　　<br><br>public&nbsp;class&nbsp;RegisterAccount&nbsp;　　{&nbsp;　　float&nbsp;fBalance;&nbsp;　　public&nbsp;synchronized&nbsp;void&nbsp;deposit(float&nbsp;fFees){&nbsp;fBalance&nbsp;+=&nbsp;fFees;&nbsp;}&nbsp;　　public&nbsp;synchronized&nbsp;void&nbsp;withdraw(float&nbsp;fFees){&nbsp;fBalance&nbsp;-=&nbsp;fFees;&nbsp;}&nbsp;　　…&nbsp;…&nbsp;　　}&nbsp;　　&nbsp;<br>　　从经过线程同步机制定义后的代码形式可以看出：在对共享资源进行访问的方法访问属性关键字（public）后附加同步定义关键字synchronized，使得同步方法在对共享资源访问的时候，为这些敏感资源附加共享锁来控制方法执行期间的资源独占性，实现了应用系统数据资源的一致性管理和维护。<br><br>Java线程的管理&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　线程的状态控制&nbsp;<br>　　&nbsp;<br>　　在这里需要明确的是：无论采用继承Thread类还是实现Runnable接口来实现应用程序的多线程能力，都需要在该类中定义用于完成实际功能的run方法，这个run方法称为线程体（Thread&nbsp;Body）。按照线程体在计算机系统内存中的状态不同，可以将线程分为创建、就绪、运行、睡眠、挂起和死亡等类型。这些线程状态类型下线程的特征为：&nbsp;<br>　　&nbsp;<br>　　创建状态：当利用new关键字创建线程对象实例后，它仅仅作为一个对象实例存在，JVM没有为其分配CPU时间片等线程运行资源；&nbsp;<br>　　&nbsp;<br>　　就绪状态：在处于创建状态的线程中调用start方法将线程的状态转换为就绪状态。这时，线程已经得到除CPU时间之外的其它系统资源，只等JVM的线程调度器按照线程的优先级对该线程进行调度，从而使该线程拥有能够获得CPU时间片的机会。&nbsp;<br>　　&nbsp;<br>　　睡眠状态：在线程运行过程中可以调用sleep方法并在方法参数中指定线程的睡眠时间将线程状态转换为睡眠状态。这时，该线程在不释放占用资源的情况下停止运行指定的睡眠时间。时间到达后，线程重新由JVM线程调度器进行调度和管理。&nbsp;<br>　　&nbsp;<br>　　挂起状态：可以通过调用suspend方法将线程的状态转换为挂起状态。这时，线程将释放占用的所有资源，由JVM调度转入临时存储空间，直至应用程序调用resume方法恢复线程运行。&nbsp;<br>　　&nbsp;<br>　　死亡状态：当线程体运行结束或者调用线程对象的stop方法后线程将终止运行，由JVM收回线程占用的资源。&nbsp;<br>　　&nbsp;<br>　　在Java线程类中分别定义了相应的方法，用于在应用程序中对线程状态进行控制和管理。&nbsp;<br>　　&nbsp;<br>　　线程的调度&nbsp;<br>　　&nbsp;<br>　　线程调用的意义在于JVM应对运行的多个线程进行系统级的协调，以避免多个线程争用有限资源而导致应用系统死机或者崩溃。&nbsp;<br>　　&nbsp;<br>　　为了线程对于操作系统和用户的重要性区分开，Java定义了线程的优先级策略。Java将线程的优先级分为10个等级，分别用1-10之间的数字表示。数字越大表明线程的级别越高。相应地，在Thread类中定义了表示线程最低、最高和普通优先级的成员变量MIN_PRIORITY、MAX_PRIORITY和NORMAL_PRIORITY，代表的优先级等级分别为1、10和5。当一个线程对象被创建时，其默认的线程优先级是5。&nbsp;<br>　　&nbsp;<br>　　为了控制线程的运行策略，Java定义了线程调度器来监控系统中处于就绪状态的所有线程。线程调度器按照线程的优先级决定那个线程投入处理器运行。在多个线程处于就绪状态的条件下，具有高优先级的线程会在低优先级线程之前得到执行。线程调度器同样采用&quot;抢占式&quot;策略来调度线程执行，即当前线程执行过程中有较高优先级的线程进入就绪状态，则高优先级的线程立即被调度执行。具有相同优先级的所有线程采用轮转的方式来共同分配CPU时间片。&nbsp;<br>　　&nbsp;<br>　　在应用程序中设置线程优先级的方法很简单，在创建线程对象之后可以调用线程对象的setPriority方法改变该线程的运行优先级，同样可以调用getPriority方法获取当前线程的优先级。&nbsp;<br>　　&nbsp;<br>　　在Java中比较特殊的线程是被称为守护（Daemon）线程的低级别线程。这个线程具有最低的优先级，用于为系统中的其它对象和线程提供服务。将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。典型的守护线程例子是JVM中的系统资源自动回收线程，它始终在低级别的状态中运行，用于实时监控和管理系统中的可回收资源。&nbsp;<br>　　&nbsp;<br>　　线程分组管理&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>　　&nbsp;<br>　　Java定义了在多线程运行系统中的线程组（ThreadGroup）对象，用于实现按照特定功能对线程进行集中式分组管理。用户创建的每个线程均属于某线程组，这个线程组可以在线程创建时指定，也可以不指定线程组以使该线程处于默认的线程组之中。但是，一旦线程加入某线程组，该线程就一直存在于该线程组中直至线程死亡，不能在中途改变线程所属的线程组。&nbsp;<br>　　&nbsp;<br>　　当Java的Application应用程序运行时，JVM创建名称为main的线程组。除非单独指定，在该应用程序中创建的线程均属于main线程组。在main线程组中可以创建其它名称的线程组并将其它线程加入到该线程组中，依此类推，构成线程和线程组之间的树型管理和继承关系。&nbsp;<br>　　&nbsp;<br>　　与线程类似，可以针对线程组对象进行线程组的调度、状态管理以及优先级设置等。在对线程组进行管理过程中，加入到某线程组中的所有线程均被看作统一的对象。&nbsp;<br><br>]]></description>
<pubDate>2012-5-6 22:38:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]解析Java的多线程机制]]></title>
<link>http://bbs.pfan.cn/post-384795.html</link>
<description><![CDATA[进程与应用程序的区别&nbsp;<br>　　&nbsp;<br>　　进程（Process）是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例，进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。&nbsp;<br>　　&nbsp;<br>　　C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后，提交给计算机处理器运行。这时，处在可执行状态中的应用程序称为进程。从用户角度来看，进程是应用程序的一个执行过程。从操作系统核心角度来看，进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位，是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中，而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括：&nbsp;<br>　　&nbsp;<br>　　●进程在执行过程中有内存单元的初始入口点，并且进程存活过程中始终拥有独立的内存地址空间；&nbsp;<br>　　&nbsp;<br>　　●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型；&nbsp;<br>　　&nbsp;<br>　　●从应用程序进程在执行过程中向CPU发出的运行指令形式不同，可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。&nbsp;<br>　　&nbsp;<br>　　在Unix操作系统启动过程中，系统自动创建swapper、init等系统进程，用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程，均拥有唯一的进程标识（PID）。<br><br>进程与Java线程的区别&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址，在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。&nbsp;<br>　　&nbsp;<br>　　Java语言中定义的线程（Thread）同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行，它必须运行在处于活动状态的应用程序进程中，因此可以定义线程是程序内部的具有并发性的顺序代码流。&nbsp;<br>　　&nbsp;<br>　　Unix操作系统和Microsoft&nbsp;Windows操作系统支持多用户、多进程的并发执行，而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行，操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程，子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间，但保持每个线程拥有独立的执行堆栈和程序执行上下文（Context）。&nbsp;<br>　　&nbsp;<br>　　基于上述区别，线程也可以称为轻型进程&nbsp;(Light&nbsp;Weight&nbsp;Process，LWP)。不同线程间允许任务协作和数据交换，使得在计算机系统资源消耗等方面非常廉价。&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br>　　&nbsp;<br>　　线程需要操作系统的支持，不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起，提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中，将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里，然后开始做菜。等菜做好了，饭熟了同时衣服也洗好了。&nbsp;<br>　　&nbsp;<br>　　需要注意的是：在应用程序中使用多线程不会增加&nbsp;CPU&nbsp;的数据处理能力。只有在多CPU&nbsp;的计算机或者在网络计算体系结构下，将Java程序划分为多个并发执行线程后，同时启动多个线程运行，使不同的线程运行在基于不同处理器的Java虚拟机中，才能提高应用程序的执行效率。<br><br>另外，如果应用程序必须等待网络连接或数据库连接等数据吞吐速度相对较慢的资源时，多线程应用程序是非常有利的。基于Internet的应用程序有必要是多线程类型的，例如，当开发要支持大量客户机的服务器端应用程序时，可以将应用程序创建成多线程形式来响应客户端的连接请求，使每个连接用户独占一个客户端连接线程。这样，用户感觉服务器只为连接用户自己服务，从而缩短了服务器的客户端响应时间。&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　Java语言的多线程程序设计方法&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　利用Java语言实现多线程应用程序的方法很简单。根据多线程应用程序继承或实现对象的不同可以采用两种方式：一种是应用程序的并发运行对象直接继承Java的线程类Thread；另外一种方式是定义并发执行对象实现Runnable接口。&nbsp;<br>　　&nbsp;<br>　　继承Thread类的多线程程序设计方法&nbsp;<br>　　&nbsp;<br>　　Thread&nbsp;类是JDK中定义的用于控制线程对象的类，在该类中封装了用于进行线程控制的方法。见下面的示例代码：&nbsp;<br>　　&nbsp;<br>　　<br><br>//Consumer.java&nbsp;　　import&nbsp;java.util.*;&nbsp;　　class&nbsp;Consumer&nbsp;extends&nbsp;Thread&nbsp;　　{&nbsp;　　&nbsp;int&nbsp;nTime;&nbsp;　　&nbsp;String&nbsp;strConsumer;&nbsp;　　&nbsp;public&nbsp;Consumer(int&nbsp;nTime,&nbsp;String&nbsp;strConsumer)&nbsp;　　&nbsp;{&nbsp;　　&nbsp;this.nTime&nbsp;=&nbsp;nTime;&nbsp;　　&nbsp;this.strConsumer&nbsp;=&nbsp;strConsumer;&nbsp;　　&nbsp;}&nbsp;　　&nbsp;public&nbsp;void&nbsp;run()&nbsp;　　&nbsp;{&nbsp;　　while(true)&nbsp;　　{&nbsp;　　&nbsp;try&nbsp;　　{&nbsp;　　&nbsp;System.out.println(&quot;Consumer&nbsp;name:&quot;+strConsumer+&quot;\n&quot;);&nbsp;　　&nbsp;Thread.sleep(nTime);&nbsp;　　&nbsp;}&nbsp;　　catch(Exception&nbsp;e)&nbsp;　　{&nbsp;　　&nbsp;e.printStackTrace();&nbsp;　　&nbsp;}&nbsp;　　}&nbsp;　　&nbsp;}&nbsp;　　static&nbsp;public&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;　　{&nbsp;　　&nbsp;Consumer&nbsp;aConsumer&nbsp;=&nbsp;new&nbsp;Consumer&nbsp;(1000,&nbsp;&quot;aConsumer&quot;);&nbsp;　　&nbsp;aConsumer.start();&nbsp;　　&nbsp;Consumer&nbsp;bConsumer&nbsp;=&nbsp;new&nbsp;Consumer&nbsp;(2000,&nbsp;&quot;bConsumer&quot;);&nbsp;　　&nbsp;bConsumer.start();&nbsp;　　&nbsp;Consumer&nbsp;cConsumer&nbsp;=&nbsp;new&nbsp;Consumer&nbsp;(3000,&nbsp;&quot;cConsumer&nbsp;&quot;);&nbsp;　　&nbsp;cConsumer.start();&nbsp;　　}&nbsp;　　}&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　&nbsp;<br>　　从上面的程序代码可以看出：多线程执行地下Consumer继承Java语言中的线程类Thread并且在main方法中创建了三个Consumer对象的实例。当调用对象实例的start方法时，自动调用Consumer类中定义的run方法启动对象线程运行。线程运行的结果是每间隔nTime时间打印出对象实例中的字符串成员变量strConsumer的内容。&nbsp;<br>　　&nbsp;<br>　　可以总结出继承Thread类的多线程程序设计方法是使应用程序类继承Thread类并且在该类的run方法中实现并发性处理过程。&nbsp;<br>　　&nbsp;<br>　　实现Runnable接口的多线程程序设计方法&nbsp;http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　&nbsp;<br>　　Java语言中提供的另外一种实现多线程应用程序的方法是多线程对象实现Runnable接口并且在该类中定义用于启动线程的run方法。这种定义方式的好处在于多线程应用对象可以继承其它对象而不是必须继承Thread类，从而能够增加类定义的逻辑性。&nbsp;<br>　　&nbsp;<br>　　实现Runnable接口的多线程应用程序框架代码如下所示：&nbsp;<br>　　&nbsp;<br>　　//Consumer.java&nbsp;<br>　　import&nbsp;java.util.*;&nbsp;<br>　　class&nbsp;Consumer&nbsp;implements&nbsp;Runnable&nbsp;<br>　　{&nbsp;<br>　　&nbsp;…&nbsp;…&nbsp;<br>　　public&nbsp;Consumer(int&nbsp;nTime,&nbsp;String&nbsp;strConsumer){…&nbsp;…}&nbsp;<br>　　public&nbsp;void&nbsp;run(){…&nbsp;…}&nbsp;<br>　　static&nbsp;public&nbsp;void&nbsp;main(String&nbsp;args[])&nbsp;<br>　　{&nbsp;<br>　　Thread&nbsp;aConsumer&nbsp;=&nbsp;new&nbsp;Thread(new&nbsp;Consumer(1000,&nbsp;&quot;aConsumer&quot;));&nbsp;<br>　　aConsumer.start();&nbsp;<br>　　//其它对象实例的运行线程&nbsp;<br>　　&nbsp;//…&nbsp;…&nbsp;<br>　　&nbsp;}&nbsp;<br>　　}&nbsp;<br>　　&nbsp;<br>　　从上述代码可以看出：该类实现了Runnable接口并且在该类中定义了run方法。这种多线程应用程序的实现方式与继承Thread类的多线程应用程序的重要区别在于启动多线程对象的方法设计方法不同。在上述代码中，通过创建Thread对象实例并且将应用对象作为创建Thread类实例的参数。<br><br>]]></description>
<pubDate>2012-5-6 22:37:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]Java新手入门的30个基本概念]]></title>
<link>http://bbs.pfan.cn/post-384794.html</link>
<description><![CDATA[在我们学习Java的过程中,掌握其中的基本概念对我们的学习无论是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基础,所以有必要对其中的基本概念做以归纳,以便大家在以后的学习过程中更好的理解java的精髓,在此我总结了30条基本的概念。<br><br>　　Java概述:<br><br>　　目前Java主要应用于中间件的开发(middleware)---处理客户机于服务器之间的通信技术,早期的实践证明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载计算机的开发.Java于其他语言所不同的是程序运行时提供了平台的独立性,称许可以在windows,solaris,linux其他操作系统上使用完全相同的代码.Java的语法与C++语法类似,C++/C程序员很容易掌握,而且Java是完全的彻底的面向对象的,其中提出了很好的GC(Garbage&nbsp;Collector)垃圾处理机制,防止内存溢出。<br><br>　　Java的白皮书为我们提出了Java语言的11个关键特性。<br><br>　　(1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。<br><br>　　(2)分布式:Java带有很强大的TCP/IP协议宓睦炭?Java应用程序能够通过URL来穿过网络来访问远程对象,由于servlet机制的出现,使Java编程非常的高效,现在许多的大的web&nbsp;server都支持servlet。<br><br>　　(3)OO:面向对象设计是把重点放在对象及对象的接口上的一个编程技术.其面向对象和C++有很多不同,在与多重继承的处理及Java的原类模型。<br><br>　　(4)健壮特性:Java采取了一个安全指针模型,能减小重写内存和数据崩溃的可能型。<br><br>　　(5)安全:Java用来设计网路和分布系统,这带来了新的安全问题,Java可以用来构建防病毒和防攻击的System.事实证明Java在防毒这一方面做的比较好。<br><br>　　(6)中立体系结构:Java编译其生成体系结构中立的目标文件格式可以在很多处理器上执行,编译器产生的指令字节码(Javabytecode)实现此特性,此字节码可以在任何机器上解释执行。<br><br>　　(7)可移植性:Java中对基本数据结构类型的大小和算法都有严格的规定所以可移植性很好。<br><br>　　(8)多线程:Java处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成.所以多线程是Java作为服务器端开发语言的流行原因之一。<br><br>　　(9)Applet和servlet:能够在网页上执行的程序叫Applet,需要支持Java的浏览器很多,而applet支持动态的网页,这是很多其他语言所不能做到的。<br><br>基本概念:<br><br>　　1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can&nbsp;or&nbsp;not而不是how&nbsp;and&nbsp;why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率。<br><br>　　2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)。<br><br>　　3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance&nbsp;field)。<br><br>　　4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍。<br><br>　　5.对象的3个主要特性&nbsp;<br><br>　　behavior---说明这个对象能做什么.<br>　　state---当对象施加方法时对象的反映.<br>　　identity---与其他相似行为对象的区分标志.<br>　　每个对象有唯一的indentity&nbsp;而这3者之间相互影响.<br><br>　　6.类之间的关系:http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>use-a&nbsp;:依赖关系<br>has-a&nbsp;:聚合关系<br>is-a&nbsp;:继承关系--例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)<br><br>　　7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化。<br><br>　　例:Data类的构造器叫Data<br><br>　　　new&nbsp;Data()---构造一个新对象,且初始化当前时间.<br>　　　Data&nbsp;happyday=new&nbsp;Data()---把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者是不同的.new返回的值是一个引用。<br><br>　　构造器特点:构造器可以有0个,一个或多个参数<br>　　构造器和类有相同的名字<br>　　一个类可以有多个构造器<br>　　构造器没有返回值<br>　　构造器总是和new运算符一起使用.<br><br>　　8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法。<br><br>　　9.包(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包.java.lang&nbsp;java.util&nbsp;java,net等,包是分层次的所有的java包都在java和javax包层次内。<br><br>　　10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段。<br><br>　　11.扩展类:扩展类充分体现了is-a的继承关系.&nbsp;形式为:class&nbsp;(子类)&nbsp;extends&nbsp;(基类)。<br><br>　　12.多态:在java中,对象变量是多态的.而java中不支持多重继承。<br><br>13.动态绑定:调用对象方法的机制。&nbsp;<br><br><br>　　(1)编译器检查对象声明的类型和方法名。<br><br>　　(2)编译器检查方法调用的参数类型。http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br><br><br>　　(3)静态绑定:若方法类型为priavte&nbsp;static&nbsp;final&nbsp;编译器会准确知道该调用哪个方法。<br><br>　　(4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本。<br><br>　　(5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码。<br><br>　　14.final类:为防止他人从你的类上派生新类,此类是不可扩展的。<br><br>　　15.动态调用比静态调用花费的时间要长。<br><br>　　16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。<br><br>　　例:&nbsp;public&nbsp;abstract&nbsp;string&nbsp;getDescripition<br><br>17.Java中的每一个类都是从Object类扩展而来的。<br><br>　　18.object类中的equal和toString方法。<br><br>　　equal用于测试一个对象是否同另一个对象相等。<br><br>　　toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示.<br>(toString&nbsp;方法是一个很重要的方法)<br><br>　　&nbsp;19.通用编程:任何类类型的所有值都可以同object类性的变量来代替。<br><br>　　20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大小。<br><br>　　21.class类&nbsp;object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类。<br><br>　　22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具。<br><br>　　能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大.<br><br>　　1.在运行时分析类的能力。<br>　　2.在运行时探察类的对象。<br>　　3.实现通用数组操纵代码。<br>　　4.提供方法对象。<br><br>　　&nbsp;而此机制主要针对是工具者而不是应用及程序。<br><br>　　&nbsp;反射机制中的最重要的部分是允许你检查类的结构.用到的API有:<br><br>java.lang.reflect.Field&nbsp;返回字段.<br>java.reflect.Method&nbsp;返回方法.<br>java.lang.reflect.Constructor&nbsp;返回参数.<br><br>　　方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案。<br><br>　　23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface。<br><br>　　24.接口不是一个类,而是对符合接口要求的类的一套规范。<br><br>　　若实现一个接口需要2个步骤:　<br><br>　　1.声明类需要实现的指定接口。<br>　　2.提供接口中的所有方法的定义。<br><br>　　声明一个类实现一个接口需要使用implements&nbsp;关键字<br><br>　　class&nbsp;actionB&nbsp;implements&nbsp;Comparable&nbsp;其actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口.<br><br>　　&nbsp;25.一个类只有一个超类,但一个类能实现多个接口。Java中的一个重要接口：Cloneable<br><br>　　26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法。<br><br>　　例:ActionListener&nbsp;接口监听.<br>　　类似的API有:java.swing.JOptionPane<br><br>　　　java.swing.Timer<br>　　　java.awt.Tookit<br><br>　　27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它。<br><br>　　28.内部类:一个内部类的定义是定义在另一个内部的类。<br><br>　　原因是:<br><br>　　1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。<br><br>　　2.对于同一个包中的其他类来说,内部类能够隐藏起来。<br><br>　　3.匿名内部类可以很方便的定义回调。<br><br>　　4.使用内部类可以非常方便的编写事件驱动程序。<br><br>　　29.代理类(proxy):<br><br>　　1.指定接口要求所有代码<br><br>　　2.object类定义的所有的方法(toString&nbsp;equals)<br><br>　　30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型<br>]]></description>
<pubDate>2012-5-6 22:36:00</pubDate>
</item>

<item>
<author><![CDATA[aisini010]]></author>
<title><![CDATA[[转帖]精易VIP教程&nbsp;-&nbsp;正则表达式(全套12课已全部放出)]]></title>
<link>http://bbs.pfan.cn/post-384757.html</link>
<description><![CDATA[精易VIP教程&nbsp;-&nbsp;第1课：认识了解正则表达式&nbsp;http://115.com/file/andc3v9a#<br>精易VIP教程&nbsp;-&nbsp;第2课：点号应用之简单的数据提取&nbsp;http://115.com/file/andc3vvp#<br>精易VIP教程&nbsp;-&nbsp;第3课：星号的认识与应用&nbsp;http://115.com/file/dpfkcrvi#<br>精易VIP教程&nbsp;-&nbsp;第4课：问号和加号的认识与应用&nbsp;http://115.com/file/c2ren091#<br>精易VIP教程&nbsp;-&nbsp;第5课：连字符和范围描述符的认识与应用&nbsp;http://115.com/file/c2ren00g#<br>精易VIP教程&nbsp;-&nbsp;第6课：脱字符和美元符的认识与应用&nbsp;http://115.com/file/andc3ukc#<br>精易VIP教程&nbsp;-&nbsp;第7课：转义符的认识与应用&nbsp;http://115.com/file/andczhrd#<br>精易VIP教程&nbsp;-&nbsp;第8课：字符组简记法1&nbsp;http://115.com/file/bexmz478#<br>精易VIP教程&nbsp;-&nbsp;第9课：字符组简记法2&nbsp;http://115.com/file/dpfk62y9#<br>精易VIP教程&nbsp;-&nbsp;第10课：大括号与选择符的认识与应用&nbsp;http://115.com/file/dpfk62ga#<br>精易VIP教程&nbsp;-&nbsp;第11课：子表达式的认识与应用&nbsp;http://115.com/file/bexmzlbe#<br>精易VIP教程&nbsp;-&nbsp;第12课：贪婪和懒惰的匹配&nbsp;http://115.com/file/c2regzkz#<br>UID：11223]]></description>
<pubDate>2012-5-5 23:16:00</pubDate>
</item>

<item>
<author><![CDATA[aisini010]]></author>
<title><![CDATA[[转帖]精易VIP教程&nbsp;-&nbsp;易语言零起点(全套15课已全部放出)]]></title>
<link>http://bbs.pfan.cn/post-384756.html</link>
<description><![CDATA[精易VIP教程&nbsp;-&nbsp;第1集：初识易语言&nbsp;http://115.com/file/bhyt5hzx<br>精易VIP教程&nbsp;-&nbsp;第2集：新手变菜鸟&nbsp;http://115.com/file/bhyt5em8<br>精易VIP教程&nbsp;-&nbsp;第3集：编写第一个易程序&nbsp;http://115.com/file/cl191ngr<br>精易VIP教程&nbsp;-&nbsp;第4集：认识了解：子程序及参数&nbsp;http://115.com/file/dn8q8s8k<br>精易VIP教程&nbsp;-&nbsp;第5集：认识了解：局部变量,程序集变量,全局变量&nbsp;http://115.com/file/aqxegi9a<br>精易VIP教程&nbsp;-&nbsp;第6集：认识了解：自定义数据类型&nbsp;http://115.com/file/e6a375pa<br>精易VIP教程&nbsp;-&nbsp;第7集：如何引用模块,并利用模块编写1个简单的小程序&nbsp;http://115.com/file/bhkj775e<br>精易VIP教程&nbsp;-&nbsp;第8集：如何调用模块中的类,并利用模块编写1个简单的小程序&nbsp;http://115.com/file/dn8wznvi<br>精易VIP教程&nbsp;-&nbsp;第9集：利用扩展支持库编写一个程序&nbsp;http://115.com/file/aqx6r4qj<br>精易VIP教程&nbsp;-&nbsp;第10集：认识了解API&nbsp;http://115.com/file/dn8guxjp<br>精易VIP教程&nbsp;-&nbsp;第11课：利用核心支持库和API编写一个自己的易模块&nbsp;http://115.com/file/aqx6re3p<br>精易VIP教程&nbsp;-&nbsp;第12集：DLL的编写与调用&nbsp;http://115.com/file/bhkqvcrk<br>精易VIP教程&nbsp;-&nbsp;第13集：认识了解数据库&nbsp;http://115.com/file/bhkqvovm<br>精易VIP教程&nbsp;-&nbsp;第14集：利用数据库编写一个资料库&nbsp;http://115.com/file/e6adxj5y<br>精易VIP教程&nbsp;-&nbsp;第15集：调试程序及修改代码错误&nbsp;http://115.com/file/dn8gaxz6<br>UID：11223]]></description>
<pubDate>2012-5-5 23:14:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[怎么制作和使用sitemap.xml、&nbsp;robots.txt]]></title>
<link>http://bbs.pfan.cn/post-384745.html</link>
<description><![CDATA[声明：该文章仅仅针对刚刚进入seo的菜鸟级别，大鸟请飞过。首先我们先来看一下蜘蛛是怎么爬去我们的网站的。一般蜘蛛到我们的网站后，它会先看有没有sitmap.xml这个文件，然后再看有没有robots.txt这个文件。如果有sitemap.xml，则再看robots.txt这个文件给了那些爬去权限，接着就沿着地图的路线去爬行。如果这两个文都没有，那蜘蛛就会漫无目的的乱打乱闯，可见这两个文件对于搜索引擎是多么重要。<br>http://www.zhengzhoubz168.com<br>http://www.chengdubanzheng99.com<br><br><br>　　XML那么网站地图是什么?有什么作用，为什么要做网站地图?怎么做网站地图?这可能是困扰刚刚进入seo行业的seoer最大的问题。首先我们来看网站地图，网站地图顾名思义就是一个地图，其作用和我们平时的地图是一样的，但是这个地图是给搜索引擎看的，有了网站地图搜索引擎蜘蛛就不会在你的网站上漫无边际的爬了，有利于搜索引擎的收录。<br><br>　　关于网站地图的制作其实很简单，这里有一个在线生成的网址http://www.xml-sitemaps.com可以免费生成500个url，如果要生成完全的,需要付费,对于一个小站来说,先收录5百页也是不错的主意,生成速度有点慢,你可要耐心等待一下。也可以用来在线生成yahoo的urllist.txt，但是yahoo也是sitemap成员，所以个人觉得有个sitemap.xml文件已经够用了。当然还有其他的在线生成工具，和离线生成工具，可以在网上搜一下。http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br><br>　　另外有了sitemap，还需要有一个robots.txt来把门。那么robots.txt又是什么呢?这是一个给蜘蛛沿sitemap爬行网站分配权限文件。告诉蜘蛛那些可以爬行，那些不可以爬行的。另外百度不能直接支持sitemap怎么办?那么我们就要在robots.txt中告诉百度蜘蛛，你的sitemap在哪里。在robots.txt中加入这样一句代码就可以了。http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>Sitemap：http://www.xxxxxx.com/根目录/sitemap.xml。这一句等于是告诉百度蜘蛛我的sitemap文件在网站的根目录下。<br>&nbsp;<br><br>]]></description>
<pubDate>2012-5-5 19:05:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[解析PHP中的XML数据]]></title>
<link>http://bbs.pfan.cn/post-384744.html</link>
<description><![CDATA[如果你计划在PHP中处理XML数据，就需要一个XML库为你提取数据。例如解析RSSfeed或是模式匹配(寻找XHTML图像或是元素)。<br><br>　　SimpleXML扩展提供了一个非常直观的API，更容易将XML转换成对象和遍历元素。唯一的缺点就是在内存中加载整个文档或是非常大的XML文件，它的性能可能是一个问题。http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br><br>　　如果性能是一个考虑因素，你可以去使用XMXMLLReader。XMLReader是一个XML解析器，它通过在加载过程中遍历每个节点，在而不是在内存中加载整个文档。http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　下面的代码使用简单的XML可以从我的网站获取最新的RSS。在我的服务器上，我已经使用Curl库处理HTTP连接，因为它支持服务器托管并且更安全。<br>&nbsp;<br><br>]]></description>
<pubDate>2012-5-5 19:04:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]将Oracle内置的安全特性用于php]]></title>
<link>http://bbs.pfan.cn/post-384742.html</link>
<description><![CDATA[当今大多数Web应用程序都需要至少采用某种基本的安全策略。例如，提供用口令保护的内容的网站、仅具有管理员后端的网站、网志和个人杂志、电子商务网站、企业内联网，等等。<br><br>　　构建这些类型的Web应用程序最常用的设计方法是将安全策略整合到Web应用程序的业务逻辑中，即由应用程序决定某个用户是否有权访问数据库中的某个数据。在这种情形下，数据库的角色仅为存储数据和依请求提供数据。换句话说，如果Web应用程序命令数据库提供特定信息，则数据库会直接执行该命令而不检查用户的权限。<br><br>　　在该文中，您将学习如何利用Oracle内置的安全特性在数据库级执行应用程序安全规则，以提高应用程序的整体安全性。作为附带的好处，直接在数据库中实现数据访问安全不但有助于提高应用程的安全性，而且有助于降低复杂性。<br><br>　　从Web应用程序控制数据访问会怎么样？大多数情况下没有问题；这是个不错的解决方案，尤其是在涉及的数据为非任务关键或绝密的时候。许多书和在线资源中都用到了该方法。实际上，有本很受欢迎的PHP/MySQL书明确反对每个应用程序创建一个以上的数据库用户帐户，这是因为“额外的用户或复杂的权限会因某个操作在继续前要检查更多的信息而降低MySQL的执行速度”。确实如此；但是，在放弃将安全性整合到数据库逻辑中的想法前可能要考虑几件事情。我们来看以下示例。<br><br>　　假设创建一个内容管理系统(CMS)。其中使用数据库来存储网站上发布的内容。大部分数据是公开的，允许匿名Web用户读取；但只允许编辑更改数据。使用单一数据库帐户访问和修改数据库中的记录，并通过用口令保护仅管理员可以访问的页面的访问权限用PHP代码控制安全性。<br><br>　　如果Web应用程序的公共端遭受了一个诸如公共搜索表单（即编码不够严密的表单）上的SQL注入的攻击，则该入侵者可能能够对该公共帐户可以访问的数据库对象执行任意SQL语句。当然，就这里的情形而言，执行SELECT语句不会造成什么大问题，这是因为数据本来就是公共的。但由于公共权限和管理权限使用同一数据库帐户，因此入侵者还能执行UPDATE和DELETE语句，甚至是从数据库中删除表。http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br><br><br>　　Oracle数据库为Web开发人员提供了控制数据访问的许多方法，从管理对特定数据库对象（如表、视图和过程）的访问到控制个别行或列的数据的访问。很显然，对Oracle每个安全特性或可用选项的讨论超出了本文的范围。在这里，我们将不涉及过多细节，而仅介绍Oracle数据访问安全性的最基本方面：<br><br>　　验证和用户帐户。与其他数据库一样，请求访问Oracle的每个用户（数据库帐户）必须通过验证。验证工作可以由数据库、操作系统或网络服务来做。除基本的验证（口令验证）外，Oracle还支持强验证机制，如Kerberos、CyberSafe、RADIUS，等等。http://www.zhonghuabz168.com<br>http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br><br>　　角色。Oracle角色是一个权PHP限的有名集。尽管可以直接授予用户帐户权限，但使用角色可以极大简化用户管理，尤其是需要管理大量用户时。创建易管理的小角色，然后根据用户的安全级别授予用户一个或多个角色，这样做的效率非常高。更不用说修改权限变得如何简单了—只需修改角色关联的角色即可，无需修改每个用户帐户。<br><br>　　首先，创建该表。启动Oracle数据库特别版，以系统管理员身份登录。如果还没有释放示例HR用户，请将其释放。按照特别版安装附带的入门指南中的指示操作。请注意，默认情况下，HR用户被赋予RESOURCE角色。在这里，赋予该用户DBA角色，这样就可以使用该帐户管理CMS应用程序的数据库方面了。当然，不会使用HR用户帐户进行在线访问，只用它管理数据库。<br><br>　　由于该表是使用HR用户帐户创建的，因此该表归HR帐户所有并位于HR模式中，并且在明确授予其他用户访问该表的权限前，其他用户无法访问该表。如果不信，可以创建一个新用户，用该用户访问WEB_CONTENT表试试。<br><br>　　现在，创建两个新用户，CMS_USER和CMS_EDITOR。最终，将授予CMS_USER对WEB_CONTENT表的只读权限，并将该用户用作为匿名Web用户提供内容的数据库帐户。CMS_EDITOR帐户将在该表上拥有更多权限，将被用作CMS编辑的帐户（该帐户需要更改和维护该表中的数据）。<br><br>　　（出于简化的目的，此处的口令与用户名对应。）<br><br>　　为了让这两个帐户都登录数据库，我们需要赋予它们CONNECT角色。为此，在XE图形界面的Administration/DatabaseUsers部分选中用户信息下的CONNECT复选框，或执行以下命令：<br><br>　　将产生错误消息http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br><br><br>　　要允许CMS_EDITOR更改该表的内容，需要授予以下权限：<br><br>　　完成上述步骤后，可以配置PHP应用程序，使之对由匿名Web用户请求的所有数据库连接均使用CMS_USER帐户，对由受口令保护的管理页面引发的连接使用CMS_EDITOR帐户。现在，即使公共Web表单受到攻击，该攻击对数据库的影响将微乎其微，这是因为CMS_USER帐户仅具有只读权限。<br><br>　　在本文中，我们只是简单介绍了Oracle数据访问安全性的一些最基本的特性。此外，Oracle还有许多其他特性，可把您的Web应用程序的安全性提高到一个新的等级—包括虚拟专用数据库(VPD)和标签安全性。<br>&nbsp;<br><br>]]></description>
<pubDate>2012-5-5 19:03:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[C语言与数据库操作入门（Win版）]]></title>
<link>http://bbs.pfan.cn/post-384706.html</link>
<description><![CDATA[数据库，DataBase，学C语言的是不是想说，很想爱她却并不容易呢？不用着急，C语言也可以操作数据库的，既使你不会Windows&nbsp;API，只要参照本文的方法，写数据库应用程序，你也行。本文以MySql和Access数据库为基础，简要介绍C语言如何操作数据库，本文部分知识点也适用于linux下面编程使用MySql数据库。<br><br>一、如果你只会一点C语言，那么还有哪些知识需要你自己去补充呢？<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（1）了解一下数据库的基本情况，发展史，很有必要，选用一种数据库，数据库有很多，开源数据库据说多达35个，常用的数据库也有如下几个：MySQL、&nbsp;PostgreSQL、MaxDB、Ingres、SQLite。这些大部分都是免费开源的数据库，都需要你去下载安装的，微软还有收费的MSSQL，Access数据库可以使用，当然，对于大多数中国用户来说，MSSQL,&nbsp;Access免费使用，本文以MySql和Access数据库为例，示例C语言如何操作数据库。关于Access数据库，安装过office的基本上都有，如果不会使用它创建mdb数据库的话，请到http://www.bccn.net/Article/sjk/access/Index.html&nbsp;本站的技术文档中学习一下。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（2）了解SQL基本语法，所谓的SQL，就是指结构化查询语言，数据库操作的基本语言，至少有四个语句需要你学习和掌握，它们就是Select查询语句，Update更新语句，Insert插入语句和Delete删除语句，其它的还有建表，建库，建关系等等。。可以参考偶上传的资料《mysql中文参考手册》，有很多的SQL语言学习书，想要深入学习的还可以看老外的《SQL语言艺术》这本。<br><br>资料下载：http://115.com/file/be42nia8<br><br>文件：mysql5.1中文手册.rar<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（3）了解C语言与数据库互动的方式，其实只有两种，一种是通过win32&nbsp;API接口，一种就是直接通过数据库提供的C头文件和DLL库直接操作数据库。mySQL同时提供两种接口方式，SQLite提供直接访问的C语言头文件和DLL库，SQLite还可以把代码直接编译进程序当中，使数据库访问更加快徢。Windows常用数据库接口是odbc接口，另外还有ADO,&nbsp;OLE&nbsp;DB接口，当然，和odbc相比，它们的学习基本上是一通百通的，数据库互动，基本上成了一个定式，创建数据库链结－&gt;创建语句对象－&gt;执行SQL命令-&gt;访问执行结果集-&gt;关闭链结，不论是java语言还是C#，还是VB，javascript语言，都是相同或是相似的，所以学习也是一通百通，因为重点并不在这里，而是在SQL本身的掌握上，请将重点移到SQL语言本身，数据库设计原则，存储过程上面。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（4）数据源DSN，关于如何创建数据库的链结数据源DSN，这个是基础知识，在控制面板/管理工具/数据源(odbc)中，如果不会玩的话，还是在网上去搜索一下图文教程，学习一下，本文就不重复了。<br><br>二、准备本示例所需要的数据库。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（1）下载并安装：mySQL的官网：http://www.mysql.com/downloads/，目前最新版本为5.5.18，虽然已被人收购，但并不影响我们学习SQL，版本分为企业版和公众版，公众版对于学习的个人是免费的，而且也是足够了，所以我们下载上面的MySQL&nbsp;Community&nbsp;Server版，另一个需要下载的是Connector/ODBC，这个是ODBC驱动，可选下载为MySQL&nbsp;Workbench&nbsp;(GUI&nbsp;Tool)，这个是用于Gui前端管理软件，就是命令行的可视版，说白了就是一个窗口界面，你可以通过界面操作mySql数据库，会命令行的都习惯于使用命令行操作，如果你想成为它的专家，使用命令行吧。不懂英文页面？没关系，下载最简单的方式就是在上点那个最大的图，mysql&nbsp;installer&nbsp;for&nbsp;windows，上面所说的三个部件包括使用文档资料都放在一个安装包里了，209MB。测试了一下，从National&nbsp;Sun&nbsp;Yat-Sen&nbsp;University,&nbsp;Taiwan&nbsp;&nbsp;台湾站http下载比较快。安装额外需求，.NET4运行库。补充说明一下，MySQL&nbsp;Workbench的安装需要VC++&nbsp;2010运行库和.net4运行库，数据库系统MySQL&nbsp;Community&nbsp;Server版和Odbc驱动的安装无任何附加安装需求，所以可以单独下载所需部件进行安装，不用注册个人资料也可以直接下载。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;安装过程中如果有需要，可以选择Developer&nbsp;Componets下面的C&nbsp;include&nbsp;files/Lib&nbsp;files这个，是用来直接和数据库相链的C语言头文件和库文件。安装完成后，在弹出的配置MySql对话框，选择standard&nbsp;Confiuration，下一步，勾选include&nbsp;Bin&nbsp;Director&nbsp;in&nbsp;Windows&nbsp;Path这项，下一步后，在Modify&nbsp;Securiti&nbsp;Settings那里填写新的登录安全密码，下一步Execute执行既可完成。<br><br>资料下载：上次提供的5.1.3版客户端中文显示有问题，5.1.0版虽然中文显示没有问题，但在创建表约束那里有问题。最新的版本经过测试没有这个二个问题。<br><br>http://115.com/file/an4yzdwc#<br>mysql-5.5.18-win32.rar&nbsp;（mysql&nbsp;5.5.18官方版，31MB，）<br><br>http://115.com/file/c2bpnc9g<br>mysql-connector-odbc-5.1.9-win32.rar&nbsp;&nbsp;&nbsp;（mysql&nbsp;odbc&nbsp;驱动32位&nbsp;&nbsp;2.5MB）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（2）数据库示例：以简单的通讯录为例。<br><br>数据库：PersonAL<br><br>表1：Users(本表存放用户信息)<br><br>字段（共3个）：uid&nbsp;（自动数字），name(char,&nbsp;10)--姓名，pass(char,&nbsp;15)--密码<br><br>表2：PersonInfo（本表存放联系人信息）<br><br>字段（共10个）：pid&nbsp;(自动数字),&nbsp;name(char,&nbsp;10)&nbsp;--姓名，gender(char,&nbsp;2)--性别，&nbsp;birthday（date）--生日<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;city(char,&nbsp;10)--所在城市，&nbsp;telphone（char,&nbsp;20）--联系电话，&nbsp;qq(char,&nbsp;15)&nbsp;--&nbsp;QQ号，<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web（char&nbsp;30）--微博,&nbsp;gid（int）--所属组id，uid（int）--所属用户id<br><br>表3：GroupInfo(本表存放联系人分组信息)<br><br>字段(共2个)：gid(自动数字)，&nbsp;name(char,&nbsp;20)&nbsp;--组名<br><br>&nbsp;&nbsp;&nbsp;&nbsp;(2.1)Access数据库创建：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请参照Access软件使用创建PersonAL.mdb数据库，并创建这三张对应的表，如果不会，请赶快学习，不重复了。同时这里也提供创建好的数据库。<br><br>建好的数据库:http://115.com/file/an4ntb4n#<br>PersonAL.rar<br><br>&nbsp;&nbsp;&nbsp;（2.2）MySql数据库创建：你可以先把上面的&lt;mysql中文手册&gt;第三节教程，打开学习一下，这里要提醒的是每个SQL语句都以分号为结束，和C语言一样，不要忘记打了，&nbsp;微软的SQL&nbsp;Server中不需要这个分号。如果SQL命令输错了，请\c，然后回车返回。&nbsp;数据库，DataBase，学C语言的是不是想说，很想爱她却并不容易呢？不用着急，C语言也可以操作数据库的，既使你不会Windows&nbsp;API，只要参照本文的方法，写数据库应用程序，你也行。本文以MySql和Access数据库为基础，简要介绍C语言如何操作数据库，本文部分知识点也适用于linux下面编程使用MySql数据库。<br><br>一、如果你只会一点C语言，那么还有哪些知识需要你自己去补充呢？<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（1）了解一下数据库的基本情况，发展史，很有必要，选用一种数据库，数据库有很多，开源数据库据说多达35个，常用的数据库也有如下几个：MySQL、&nbsp;PostgreSQL、MaxDB、Ingres、SQLite。这些大部分都是免费开源的数据库，都需要你去下载安装的，微软还有收费的MSSQL，Access数据库可以使用，当然，对于大多数中国用户来说，MSSQL,&nbsp;Access免费使用，本文以MySql和Access数据库为例，示例C语言如何操作数据库。关于Access数据库，安装过office的基本上都有，如果不会使用它创建mdb数据库的话，请到http://www.bccn.net/Article/sjk/access/Index.html&nbsp;本站的技术文档中学习一下。http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;（2）了解SQL基本语法，所谓的SQL，就是指结构化查询语言，数据库操作的基本语言，至少有四个语句需要你学习和掌握，它们就是Select查询语句，Update更新语句，Insert插入语句和Delete删除语句，其它的还有建表，建库，建关系等等。。可以参考偶上传的资料《mysql中文参考手册》，有很多的SQL语言学习书，想要深入学习的还可以看老外的《SQL语言艺术》这本。<br><br>资料下载：http://115.com/file/be42nia8<br><br>文件：mysql5.1中文手册.rar<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（3）了解C语言与数据库互动的方式，其实只有两种，一种是通过win32&nbsp;API接口，一种就是直接通过数据库提供的C头文件和DLL库直接操作数据库。mySQL同时提供两种接口方式，SQLite提供直接访问的C语言头文件和DLL库，SQLite还可以把代码直接编译进程序当中，使数据库访问更加快徢。Windows常用数据库接口是odbc接口，另外还有ADO,&nbsp;OLE&nbsp;DB接口，当然，和odbc相比，它们的学习基本上是一通百通的，数据库互动，基本上成了一个定式，创建数据库链结－&gt;创建语句对象－&gt;执行SQL命令-&gt;访问执行结果集-&gt;关闭链结，不论是java语言还是C#，还是VB，javascript语言，都是相同或是相似的，所以学习也是一通百通，因为重点并不在这里，而是在SQL本身的掌握上，请将重点移到SQL语言本身，数据库设计原则，存储过程上面。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（4）数据源DSN，关于如何创建数据库的链结数据源DSN，这个是基础知识，在控制面板/管理工具/数据源(odbc)中，如果不会玩的话，还是在网上去搜索一下图文教程，学习一下，本文就不重复了。<br><br>二、准备本示例所需要的数据库。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（1）下载并安装：mySQL的官网：http://www.mysql.com/downloads/，目前最新版本为5.5.18，虽然已被人收购，但并不影响我们学习SQL，版本分为企业版和公众版，公众版对于学习的个人是免费的，而且也是足够了，所以我们下载上面的MySQL&nbsp;Community&nbsp;Server版，另一个需要下载的是Connector/ODBC，这个是ODBC驱动，可选下载为MySQL&nbsp;Workbench&nbsp;(GUI&nbsp;Tool)，这个是用于Gui前端管理软件，就是命令行的可视版，说白了就是一个窗口界面，你可以通过界面操作mySql数据库，会命令行的都习惯于使用命令行操作，如果你想成为它的专家，使用命令行吧。不懂英文页面？没关系，下载最简单的方式就是在上点那个最大的图，mysql&nbsp;installer&nbsp;for&nbsp;windows，上面所说的三个部件包括使用文档资料都放在一个安装包里了，209MB。测试了一下，从National&nbsp;Sun&nbsp;Yat-Sen&nbsp;University,&nbsp;Taiwan&nbsp;&nbsp;台湾站http下载比较快。安装额外需求，.NET4运行库。补充说明一下，MySQL&nbsp;Workbench的安装需要VC++&nbsp;2010运行库和.net4运行库，数据库系统MySQL&nbsp;Community&nbsp;Server版和Odbc驱动的安装无任何附加安装需求，所以可以单独下载所需部件进行安装，不用注册个人资料也可以直接下载。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;安装过程中如果有需要，可以选择Developer&nbsp;Componets下面的C&nbsp;include&nbsp;files/Lib&nbsp;files这个，是用来直接和数据库相链的C语言头文件和库文件。安装完成后，在弹出的配置MySql对话框，选择standard&nbsp;Confiuration，下一步，勾选include&nbsp;Bin&nbsp;Director&nbsp;in&nbsp;Windows&nbsp;Path这项，下一步后，在Modify&nbsp;Securiti&nbsp;Settings那里填写新的登录安全密码，下一步Execute执行既可完成。<br><br>资料下载：上次提供的5.1.3版客户端中文显示有问题，5.1.0版虽然中文显示没有问题，但在创建表约束那里有问题。最新的版本经过测试没有这个二个问题。<br><br>http://115.com/file/an4yzdwc#<br>mysql-5.5.18-win32.rar&nbsp;（mysql&nbsp;5.5.18官方版，31MB，）<br><br>http://115.com/file/c2bpnc9g<br>mysql-connector-odbc-5.1.9-win32.rar&nbsp;&nbsp;&nbsp;（mysql&nbsp;odbc&nbsp;驱动32位&nbsp;&nbsp;2.5MB）<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（2）数据库示例：以简单的通讯录为例。<br><br>数据库：PersonAL<br><br>表1：Users(本表存放用户信息)<br><br>字段（共3个）：uid&nbsp;（自动数字），name(char,&nbsp;10)--姓名，pass(char,&nbsp;15)--密码<br><br>表2：PersonInfo（本表存放联系人信息）<br><br>字段（共10个）：pid&nbsp;(自动数字),&nbsp;name(char,&nbsp;10)&nbsp;--姓名，gender(char,&nbsp;2)--性别，&nbsp;birthday（date）--生日<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;city(char,&nbsp;10)--所在城市，&nbsp;telphone（char,&nbsp;20）--联系电话，&nbsp;qq(char,&nbsp;15)&nbsp;--&nbsp;QQ号，<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web（char&nbsp;30）--微博,&nbsp;gid（int）--所属组id，uid（int）--所属用户id<br><br>表3：GroupInfo(本表存放联系人分组信息)http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br><br>字段(共2个)：gid(自动数字)，&nbsp;name(char,&nbsp;20)&nbsp;--组名<br><br>&nbsp;&nbsp;&nbsp;&nbsp;(2.1)Access数据库创建：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请参照Access软件使用创建PersonAL.mdb数据库，并创建这三张对应的表，如果不会，请赶快学习，不重复了。同时这里也提供创建好的数据库。<br><br>建好的数据库:http://115.com/file/an4ntb4n#<br>PersonAL.rarhttp://www.chongqingbz168.com<br>http://www.zhongxing999.com<br><br><br>&nbsp;&nbsp;&nbsp;（2.2）MySql数据库创建：你可以先把上面的&lt;mysql中文手册&gt;第三节教程，打开学习一下，这里要提醒的是每个SQL语句都以分号为结束，和C语言一样，不要忘记打了，&nbsp;微软的SQL&nbsp;Server中不需要这个分号。如果SQL命令输错了，请\c，然后回车返回。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;（2.3）mySql的中文问题，默认的语言不符合要求，我们需要修改mysql目录下面的my.ini中的编码语言，这里一共有两地方需要修改，一个是[client]客户端那里，把里面的default-character-set=xxxx&nbsp;改成&nbsp;default-character-set=gbk或是gb2312（中文编码），可使mysql.exe客户端在查询的时候显示中文数据，另一个服务器端，修改成default-character-set=utf8，这样可以保证和网页的常用编码一致，保存配置，打开控制面板中的服务，重启mysql服务器，从开始菜单中到mysql程序组启动mysql命令行客户端，输入安装时设置的密码，进入到mysql命令行状态<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;（2.3）mySql的中文问题，默认的语言不符合要求，我们需要修改mysql目录下面的my.ini中的编码语言，这里一共有两地方需要修改，一个是[client]客户端那里，把里面的default-character-set=xxxx&nbsp;改成&nbsp;default-character-set=gbk或是gb2312（中文编码），可使mysql.exe客户端在查询的时候显示中文数据，另一个服务器端，修改成default-character-set=utf8，这样可以保证和网页的常用编码一致，保存配置，打开控制面板中的服务，重启mysql服务器，从开始菜单中到mysql程序组启动mysql命令行客户端，输入安装时设置的密码，进入到mysql命令行状态<br>]]></description>
<pubDate>2012-5-4 22:41:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[C++之棋类游戏从0开始]]></title>
<link>http://bbs.pfan.cn/post-384705.html</link>
<description><![CDATA[C++的陷阱感觉比C还多，做一些项目的话，估计能有一些收获。如果你有兴趣的话，不防让思维跟随本文做一次有氧运动，没准某一时刻你的编程思路又开启了一道新的门路。<br>一、棋类游戏基本分析过程。<br>&nbsp;&nbsp;&nbsp;&nbsp;打开百度，你可以输入中国象棋，国际象棋，军棋来查找图片，将这三张图片下载回来，放在一起，我们观察一下这三种棋有什么共同点？如果你不能得到如下一种观点，说明你的观察力欠佳，对着这三张图再仔细捉摸一下。这三种棋都有一个共同点，就是由棋盘和棋子组成，对了，还有一个问题：那么棋子放在哪里？棋子在棋盘上是有坐标的，所以有一个隐藏的共同点就是坐标，我们将这三点放在一起再看：这类棋类游戏的共同点就是由棋盘、棋子和坐标组成的。再扩展一下思路，下棋，当然要有下棋的人喽，这类游戏都是二人对下游戏，而且我们可以用一个计时器来计算下棋的时间，这一下是不是又多出了二个概念呢？Player－－玩家和Timer－－时间。OK，这就是面象对象编程的初步，数据抽象。本示例中我们将同时支持这三种游戏，呵呵，是不是兴奋了？<br>二、用类来表示概念。http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>&nbsp;&nbsp;&nbsp;&nbsp;和C语言有些类似，C语言一般用struct结构来表示一种类型的概念，C++中用class类来表示概念，最后我们将会给出整个程序的UML图，这里我们以实现中国象棋为例，可以先创建三个头文件和三个CPP文件：ClsChessBase.h，ClsChessPoint.h，ClsChinaBoard.h，和它们对应的CPP实现文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;同时为了使我们的游戏程序代码便于管理，我们使用C++的特性：名字空间（namespace）来进行管理，采用名字空间可以避免全局命名污染问题，同时可以跨文件使用，在不同的头文件中使用namespace就象在一个文件中一样。这里我们为游戏取一个namespace&nbsp;ChessGame{&nbsp;}，所有的类和相关的代码将放在这个域里。<br>三、代码风格问题：http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;类的首字母必须大写，私有成员必须以private显式标出，成员函数可以按自己熟悉的风格命名，不做强制要求。偶习惯使用下划线函数命名方式。尽量不使用#define语句，请使用const，enum，inline来替换，使用STL标准库，不能用using&nbsp;namespace&nbsp;std；这样的语句，在程序中统一使用如std::cout，std::string这样的标准命名方式。绝不使用全局变量，用static类成员变量代替。因为程序中某些代码需要你自己写（当然最后会给出完整的代码），所以你必须遵守本代码风格提出的要求。http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br>记住，只有你亲自动手写代码，你才会从中获取知识，最好的方式就是看完本文后，关了本文，自己打代码。<br>四、继承与（IS－A）－－&nbsp;分析棋子类。<br>]]></description>
<pubDate>2012-5-4 22:36:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[讨论]模拟EasyX的Graphics图形库运行流程]]></title>
<link>http://bbs.pfan.cn/post-384704.html</link>
<description><![CDATA[曾经在网上看某人发布了EasyX绘图库，用于仿Borland&nbsp;TC,&nbsp;BC++中的Graphics图形库，可以让初学者在没有学习过Win32编程的情况下，使用VC进行绘图操作。学习完win32编程后，发现开发一个这种类似的库，其实还是有章可寻的，于是动手做了一个实验，基本上实现了一这个流程，当然，可能和原库真实的代码有点不同，谁知道呢？反正偶手上没有这个库的源代码。程序代码运用了多线程和缓冲技术，不过只包装了一个画线的函数。代码除了main函数以外，其它部分就可以放在lib库工程里，呵呵，多动动脑，程序背后的秘密就出来了。有兴趣的还可以把程序改成双缓冲绘图模式。<br><br><br>#include&nbsp;&lt;windows.h&gt;<br>#include&nbsp;&lt;stdio.h&gt;<br>#include&nbsp;&lt;conio.h&gt;<br>#include&nbsp;&lt;stdlib.h&gt;<br>#include&nbsp;&lt;time.h&gt;<br><br>//////////////////////////////////////////////////<br>//模拟库中的inigraph,&nbsp;closegraph,&nbsp;lineto函数<br>void&nbsp;init_graphics(int&nbsp;width,&nbsp;int&nbsp;height);<br>void&nbsp;close_graphics();<br>void&nbsp;draw_line(int&nbsp;x,&nbsp;int&nbsp;y,&nbsp;int&nbsp;x1,&nbsp;int&nbsp;y1,&nbsp;COLORREF&nbsp;color);<br><br>unsigned&nbsp;long&nbsp;_stdcall&nbsp;ThreadFunc(void&nbsp;*);<br>LRESULT&nbsp;CALLBACK&nbsp;main_proc(HWND,&nbsp;UINT,&nbsp;WPARAM,&nbsp;LPARAM);<br><br>//////////////////////////////////////////////////<br>HANDLE&nbsp;hwin_main;<br>DWORD&nbsp;ThreadID;<br>HWND&nbsp;hwnd_main;<br>HDC&nbsp;hdc_main;<br>HDC&nbsp;hdc_buff&nbsp;=&nbsp;0;<br>HBITMAP&nbsp;hmap&nbsp;=&nbsp;0;<br>int&nbsp;main_w,&nbsp;main_h;<br>UINT&nbsp;draw_timer;<br>HWND&nbsp;console;<br><br>/////////////////////////////////////////////////////////////////////////<br>//&nbsp;模拟EasyX的Graphics图形库运行流程，主函数看着是不是有点TC代码的熟悉？<br>/////////////////////////////////////////////////////////////////////////<br>int&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;init_graphics(640,&nbsp;480);<br>&nbsp;&nbsp;&nbsp;&nbsp;srand(&nbsp;time(NULL)&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;120;&nbsp;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw_line(200,&nbsp;200,&nbsp;rand()%&nbsp;640&nbsp;-&nbsp;(rand()&nbsp;%&nbsp;100),&nbsp;rand()&nbsp;%&nbsp;480&nbsp;+&nbsp;rand()&nbsp;%&nbsp;100,&nbsp;RGB(70,&nbsp;40,&nbsp;128));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(20);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;draw_line(30,&nbsp;30,&nbsp;100,&nbsp;100+i,&nbsp;RGB(255,&nbsp;0,&nbsp;128));<br>&nbsp;&nbsp;&nbsp;&nbsp;draw_line(40,&nbsp;130,&nbsp;100,&nbsp;100+i,&nbsp;RGB(255,&nbsp;0,&nbsp;128));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;start&nbsp;waitting.....\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;WaitForSingleObject(hwin_main,&nbsp;INFINITE);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;waitting&nbsp;end.....\n&quot;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;close_graphics();<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br>}<br><br>unsigned&nbsp;long&nbsp;_stdcall&nbsp;ThreadFunc(void&nbsp;*lpvoid)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASS&nbsp;wnd;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;wnd,&nbsp;0,&nbsp;sizeof(wnd));<br>&nbsp;&nbsp;&nbsp;&nbsp;wnd.hbrBackground&nbsp;=&nbsp;(HBRUSH)&nbsp;GetStockObject(BLACK_BRUSH);<br>&nbsp;&nbsp;&nbsp;&nbsp;wnd.hCursor&nbsp;=&nbsp;LoadCursor(NULL,&nbsp;IDC_ARROW);<br>&nbsp;&nbsp;&nbsp;&nbsp;wnd.hInstance&nbsp;=&nbsp;GetModuleHandle(NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;wnd.lpfnWndProc&nbsp;=&nbsp;main_proc;<br>&nbsp;&nbsp;&nbsp;&nbsp;wnd.lpszClassName&nbsp;=&nbsp;&quot;EasyWindow&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;wnd.style&nbsp;=&nbsp;CS_HREDRAW&nbsp;|&nbsp;CS_VREDRAW;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(!&nbsp;RegisterClass(&amp;wnd)&nbsp;)&nbsp;fprintf(stderr,&nbsp;&quot;register&nbsp;class&nbsp;error!\n&quot;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;hwnd_main&nbsp;=&nbsp;CreateWindow(&quot;EasyWindow&quot;,&nbsp;&quot;EasyWindow&nbsp;Create&quot;,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WS_OVERLAPPEDWINDOW,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10,&nbsp;10,&nbsp;main_w,&nbsp;main_h,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wnd.hInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(!&nbsp;hwnd_main&nbsp;)&nbsp;fprintf(stderr,&nbsp;&quot;Create&nbsp;windows&nbsp;error!\n&quot;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hwnd_main,&nbsp;SW_SHOWNORMAL);<br>&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hwnd_main);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;hdc_main&nbsp;=&nbsp;GetDC(hwnd_main);<br>&nbsp;&nbsp;&nbsp;&nbsp;hdc_buff&nbsp;=&nbsp;CreateCompatibleDC(NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;hmap&nbsp;=&nbsp;CreateCompatibleBitmap(hdc_main,&nbsp;main_w,&nbsp;main_h);<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(hdc_buff,&nbsp;hmap);<br>&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(hwnd_main,&nbsp;hdc_main);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(hwnd_main,&nbsp;draw_timer,&nbsp;30,&nbsp;NULL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;while(GetMessage(&amp;msg,&nbsp;NULL,&nbsp;0,&nbsp;0)&nbsp;&gt;&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(&amp;msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br>}<br><br>LRESULT&nbsp;CALLBACK&nbsp;main_proc(HWND&nbsp;hwnd,&nbsp;UINT&nbsp;uMsg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;PAINTSTRUCT&nbsp;ps;<br>&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;hdc;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;switch(uMsg)<br>&nbsp;&nbsp;&nbsp;&nbsp;{http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_CHAR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SendMessage(console,&nbsp;WM_CHAR,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_DESTROY:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteDC(hdc_buff);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hmap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(hwnd_main,&nbsp;draw_timer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_TIMER:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvalidateRect(hwnd_main,&nbsp;NULL,&nbsp;FALSE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;WM_PAINT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdc&nbsp;=&nbsp;BeginPaint(hwnd,&nbsp;&amp;ps);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(hdc,&nbsp;0,&nbsp;0,&nbsp;main_w,&nbsp;main_h,&nbsp;hdc_buff,&nbsp;0,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPaint(hwnd,&nbsp;&amp;ps);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DefWindowProc(hwnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br>}<br>http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br><br>void&nbsp;init_graphics(int&nbsp;width,&nbsp;int&nbsp;height)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;main_w&nbsp;=&nbsp;width;<br>&nbsp;&nbsp;&nbsp;&nbsp;main_h&nbsp;=&nbsp;height;<br>&nbsp;&nbsp;&nbsp;&nbsp;hwin_main=CreateThread(NULL,0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadFunc,NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&amp;ThreadID);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Sleep(20);<br>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;下面这段可以隐藏控制台窗口&nbsp;*/<br>&nbsp;&nbsp;&nbsp;&nbsp;console&nbsp;=&nbsp;FindWindow(&quot;ConsoleWindowClass&quot;,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(console)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(console,&nbsp;SW_HIDE);<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;&quot;can&#39;t&nbsp;find&nbsp;console&nbsp;windows\n&quot;);<br><br>}<br><br>void&nbsp;close_graphics()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hwin_main);<br>&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(console,&nbsp;SW_SHOWNORMAL);<br>}<br><br>void&nbsp;draw_line(int&nbsp;x,&nbsp;int&nbsp;y,&nbsp;int&nbsp;x1,&nbsp;int&nbsp;y1,&nbsp;COLORREF&nbsp;color)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;HPEN&nbsp;pen,&nbsp;old_pen;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;pen&nbsp;=&nbsp;CreatePen(PS_SOLID,&nbsp;2,&nbsp;color);<br>&nbsp;&nbsp;&nbsp;&nbsp;old_pen&nbsp;=&nbsp;(HPEN)&nbsp;SelectObject(hdc_buff,&nbsp;pen);<br>&nbsp;&nbsp;&nbsp;&nbsp;MoveToEx(hdc_buff,&nbsp;x,&nbsp;y,&nbsp;NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;LineTo(hdc_buff,&nbsp;x1,&nbsp;y1);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(old_pen);<br>}<br>]]></description>
<pubDate>2012-5-4 22:34:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]堵住ASP漏洞]]></title>
<link>http://bbs.pfan.cn/post-384700.html</link>
<description><![CDATA[无论你相不相信，通过&nbsp;asp，可能可以很方便地入侵&nbsp;web&nbsp;server、窃取服务器上de文件、捕获&nbsp;web&nbsp;数据库等系统de用户口令，甚至恶意删除服务器上dede文件，直至造成系统损坏，这些都决非耸人听闻，而且都确确实实发生过，本文将向你一一揭示这些&nbsp;asp&nbsp;存在de漏洞，并提出一些防范意见.<br><br>　　上一篇中给大家着重谈了“ADO&nbsp;存取数据库时如何分页显示”de问题，有位朋友来信给我指出我在计算页面总数时忽略了&nbsp;Recordset&nbsp;对象de一个重要参数“PageCount”，它能在给&nbsp;Pagesize&nbsp;赋值后自动得出页面de总数，而无须用“INT(RS.recordcount/PgSz*-1)*-1”这样繁琐de公式.我要感谢这位朋友热心地给我指出程序中de不足，由于这个程序匙我在很久以前写de，因为在分页显示de时候记录de总数不一定能整除页面显示记录de数目，而当时我又不能肯定&nbsp;PageCount&nbsp;匙否能正确得出页面de数目，所以偷懒写了这个公式：），说实话我到现在还都没试过用&nbsp;pagecount，有兴趣de朋友千万要试一下哦，可别学我de懒惰呀.<br><br>　　最近我在&nbsp;chinaasp&nbsp;de&nbsp;bbs&nbsp;上讨论问题时发现很多朋友对于&nbsp;asp&nbsp;de一些安全性问题不甚了解，甚至不知道如何解决最常见de&nbsp;asp::$DATA&nbsp;显示源代码de问题，因此我觉得非常有必要在这里给广大朋友们重点谈一谈这个问题，在征得&nbsp;chinaasp&nbsp;飞鸟de同意下，我将他曾经写过de一点关于&nbsp;asp&nbsp;漏洞de介绍加上我自己de一些实践经验拿出来给大家详细分析一下这个对于&nbsp;webmaster&nbsp;来说至关重要de&nbsp;asp&nbsp;de安全性问题.<br><br>　　当去年&nbsp;::$DATA&nbsp;de漏洞被发现并公布de第二天，我曾经检测了当时国内大部分运用&nbsp;asp&nbsp;de站点，其中百分之九十九都存在以上可以看见源代码de问题，当日我甚至在微软de站点上抓下了&nbsp;search.asp&nbsp;这个文件de源代码.可能你会觉得看到源代码并没有什么大碍，如果作为&nbsp;webmaster&nbsp;de你这么想就大错特错了.譬如，如果&nbsp;asp&nbsp;程序员将站点de登陆密码直接写在&nbsp;asp&nbsp;里，那么一旦源码被发现，他人就可以很容易de进入本不该被看到de页面，我就曾经利用这个方法免费成为了一个收费网站de成员（大家可别揭发我哦！），而且很多数据库de连接用户名和密码也都匙直接写在&nbsp;asp&nbsp;里，一旦被发现，如果你de数据库允许远程访问而且没有设防de话就相当危险了.在一些用&nbsp;asp&nbsp;开发de&nbsp;bbs&nbsp;程序中，往往使用de匙&nbsp;access&nbsp;mdb&nbsp;库，如果&nbsp;mdb&nbsp;库存放de路径被获知，数据库就很有可能被他人下载，加之如果数据库里含有de密码不加密，那就非常危险了，获取密码de人如果有意进行恶意破坏，他只需要以&nbsp;admin&nbsp;身份登陆删除所有&nbsp;bbs&nbsp;里de帖子，就够你呛de了.下面列出了目前已经发现de一些漏洞，希望大家提高警惕一、经过实验我们发现，&nbsp;win95+pws&nbsp;上运行&nbsp;ASP&nbsp;程序，只须简单地在浏览器地址栏de&nbsp;asp&nbsp;文件名后多加一个小数点&nbsp;ASP&nbsp;程序就会被下载下来.&nbsp;IIS3&nbsp;也存在同样de问题，如果你目前还在使用&nbsp;IIS3&nbsp;一定要测试一下.&nbsp;<br>　　二、&nbsp;iis2、&nbsp;iis3、&nbsp;iis4&nbsp;de一个广为人知de漏洞就匙&nbsp;::$DATA，通过它使用&nbsp;ie&nbsp;de&nbsp;view&nbsp;source&nbsp;或&nbsp;netscape&nbsp;直接访问该&nbsp;asp&nbsp;文件就能轻而易举地看到&nbsp;asp&nbsp;代码.&nbsp;win98+pws4&nbsp;不存在这个漏洞.&nbsp;<br><br>　　究竟匙什么原因造成了这种可怕de漏洞呢？究其根源其实匙&nbsp;Windows&nbsp;NT&nbsp;特有de文件系统在做怪.有一点常识de人都知道在&nbsp;NT&nbsp;提供了一种完全不同于&nbsp;FAT&nbsp;de文件系统：&nbsp;NTFS，这种被称之为新技术文件系统de技术使得&nbsp;NT&nbsp;具有了较高de安全机制，但也正匙因为它而产生了不少令人头痛de隐患.大家可能不知道，&nbsp;NTFS&nbsp;支持包含在一个文件中de多数据流，而这个包含了所有内容de主数据流被称之为“DATA”，因此使得在浏览器里直接访问&nbsp;NTFS&nbsp;系统de这个特性而轻易de捕获在文件中de脚本程序成为了可能.然而直接导致&nbsp;::$DATA&nbsp;de原因匙由于&nbsp;IIS&nbsp;在解析文件名de时候出了问题，它没有很好地规范文件名.&nbsp;<br>　　我们该如何解决这个问题呢？办法有几种：&nbsp;<br><br>　　a、匙将&nbsp;.asp&nbsp;文件存放de目录设置为不可读（ASP&nbsp;仍能执行），这样&nbsp;html、&nbsp;css&nbsp;等文件就不能放在这个目录下，否则它们将不能被浏览.&nbsp;<br><br>　　b、匙安装微软提供de补丁程序，下载de地址如下（注意针对不同de系统有不同de补丁）：&nbsp;<br><br>　　该补丁匙针对&nbsp;IIS3，&nbsp;Intel&nbsp;平台&nbsp;<br><br>　　ftp.microsoft.com/bussys/iis/iis<br><br>public/fixes/cht/security/iis3-datafix/iis3fixi.exe&nbsp;<br><br>　　该补丁匙针对&nbsp;IIS3，&nbsp;Intel&nbsp;平台&nbsp;<br><br>　　ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis3-datafix/iis3fixa.exe&nbsp;<br><br>　　该补丁匙针对&nbsp;IIS4，&nbsp;Alpha&nbsp;平台&nbsp;<br><br>　　ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis4-datafix/iis4fixi.exe&nbsp;<br><br>　　该补丁匙针对&nbsp;IIS4，&nbsp;Alpha&nbsp;平台&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br><br><br>　　ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis4-datafix/iis4fixa.exe&nbsp;<br><br>　　c、匙在服务器上安装&nbsp;ie4.01sp1，这个匙否有效，作者本人没具体试过.&nbsp;<br><br>　　d、存粹作者de个人意见，尽量安装英文版de&nbsp;NT，而不要使用中文版，究其原因作者也说不清，只匙根据实践经验英文版de&nbsp;NT&nbsp;较中文版&nbsp;bug&nbsp;少，如果哪位朋友知道原因千万要告诉我.&nbsp;<br><br>　　三&nbsp;.&nbsp;支持&nbsp;ASP&nbsp;de免费主页空间以及虚拟主机服务de服务器面临de问题&nbsp;<br><br>　　1、服务器上de&nbsp;ASP&nbsp;代码很可能被人其他拥有&nbsp;asp&nbsp;权限de人非法获取.&nbsp;<br><br>　　举个很简单de例子，在微软提供de&nbsp;ASP1.0&nbsp;de例程里有一个&nbsp;.asp&nbsp;文件专门用来查看其它&nbsp;.asp&nbsp;文件de源代码，该文件为&nbsp;ASPSamp/Samples/code.asp.如果有人把这个程序上传de服务器，而服务器端没有任何防范措施de话，他就可以很容易地查看他人de程序.&nbsp;<br>　　例如&nbsp;:&nbsp;<br><br>　　code.asp?source=/directory/file.asp&nbsp;<br><br>　　2、使用de&nbsp;ACCESS&nbsp;mdb&nbsp;数据库可能被人下载一般来说在提供&nbsp;asp&nbsp;权限de免费主页服务器上不可能提供代为设定&nbsp;DSN&nbsp;de服务，因此&nbsp;asp&nbsp;程序使用de数据库通常都局限在使用&nbsp;mdb&nbsp;库，而&nbsp;mdb&nbsp;远端数据库所在de位置匙使用我们在第十四期中讲到过de&nbsp;DSN-less&nbsp;方法直接在&nbsp;asp&nbsp;中指定de，方法如下&nbsp;:<br><br>　　&nbsp;&lt;&nbsp;%connstr&nbsp;=&nbsp;&quot;DBQ=&quot;+server.mappath(&quot;database/source.mdb&quot;)+&quot;;DefaultDir=;DRIVER={Microsoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)};DriverId=25;FIL=MS&nbsp;Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;&nbsp;SafeTransactions=0;Threads=3;UserCommitSync=Yes;&quot;%&gt;&nbsp;<br>　　正如前文所言，在这种情况下&nbsp;mdb&nbsp;库很可能被他人下载，从而造成诸如密码等de泄露.&nbsp;<br><br>　　所以，作为&nbsp;webmaster&nbsp;应该采取一定de措施，严禁&nbsp;code.asp&nbsp;之类de程序（似乎很难办到&nbsp;,&nbsp;但可以定期检索特征代码），限制&nbsp;mdb&nbsp;de下载.&nbsp;<br><br>　　3、来自强大de&nbsp;filesystemobject&nbsp;组件de威胁&nbsp;http://www.chongqingbz168.com<br>http://www.zhongxing999.com<br><br><br>　　IIS3、&nbsp;IIS4&nbsp;de&nbsp;ASP&nbsp;de文件操作都可以通过&nbsp;filesystemobject&nbsp;实现，包括文本文件de读写目录操作、文件de拷贝改名删除等，但匙这个强大de功能也留下了非常危险de“后门”.利用&nbsp;filesystemobjet&nbsp;可以篡改下载&nbsp;fat&nbsp;分区上de任何文件.即使匙&nbsp;ntfs&nbsp;分区，如果权限没有设定好de话，同样也能破坏，一不小心你就可能遭受“灭顶之灾”.遗憾de匙很多&nbsp;webmaster&nbsp;只知道让&nbsp;web&nbsp;服务器运行起来，很少对&nbsp;ntfs&nbsp;进行权限设置，而&nbsp;NT&nbsp;目录权限de默认设置偏偏安全性又低得可怕.因此，如果你匙&nbsp;Webmaster，作者强烈建议你密切关注服务器de设置，尽量将&nbsp;web&nbsp;目录建在&nbsp;ntfs&nbsp;分区上，目录不要设定&nbsp;everyone&nbsp;full&nbsp;control，即使匙匙管理员组de成员一般也没什么必要&nbsp;full&nbsp;control，只要有读取、更改权限就足够了.&nbsp;<br>　　四、&nbsp;ASP&nbsp;应用程序可能面临de攻击过去许多&nbsp;Internet&nbsp;上&nbsp;CGI&nbsp;写de留言本或&nbsp;BBS&nbsp;匙把客户输入de留言变为一个变量，然后再把这个变量插入到显示留言de<br><br>HTML&nbsp;文件里，因此客户输入de文本如要在&nbsp;HTML&nbsp;文件里显示就得符合&nbsp;HTML&nbsp;标准，而&nbsp;CGI&nbsp;程序里一般都加入了特定de&nbsp;HTML&nbsp;语言.当客户输入内容，插入&nbsp;HTML&nbsp;文件时，即同时插入到了头尾&nbsp;HTML&nbsp;语句中，如：&nbsp;<br>http://www.zhengzhoubz168.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br>　　&nbsp;&lt;&nbsp;font&gt;&nbsp;客户输入de变量&nbsp;&lt;&nbsp;/font&gt;&nbsp;但如果把前后de&nbsp;HTML&nbsp;标记给敝屏了，就可以做很多事情了.&nbsp;<br><br>　　如输入时打上：&nbsp;<br><br>　　&nbsp;&lt;&nbsp;/font&gt;&nbsp;符合&nbsp;HTML&nbsp;标准de语句&nbsp;&lt;&nbsp;font&gt;&nbsp;前后de&nbsp;&lt;&nbsp;font&gt;&nbsp;匙用来敝屏&nbsp;CGI&nbsp;中de&nbsp;HTML&nbsp;语句用de.插入到&nbsp;HTML&nbsp;文件里de就变成了：&nbsp;<br><br>　　&nbsp;&lt;&nbsp;font&gt;&lt;&nbsp;/font&gt;&nbsp;符合&nbsp;HTML&nbsp;标准de语句&nbsp;&lt;&nbsp;font&gt;&lt;&nbsp;/font&gt;&nbsp;由于这样一个特性，使得写个&nbsp;javascript&nbsp;de死循环变得非常容易，只要在输入框中输入：&nbsp;<br><br>　　&lt;&nbsp;a&nbsp;href=&quot;URL&quot;&nbsp;onMouseover=&quot;while(1){window.close(&#39;/&#39;)}&quot;&gt;&nbsp;或&nbsp;&lt;&nbsp;a&nbsp;herf=&quot;URL&quot;&nbsp;onMousever=&quot;while(ture){window.close(&#39;/&#39;)}&quot;&gt;&nbsp;那么就能让其他查看该留言de客户de浏览器因死循环而死掉.&nbsp;ASP&nbsp;开发de程序同样可能存在这个问题，因此当你用&nbsp;asp&nbsp;编写类似程序时应该做好对此类操作de防范，譬如可以写一段程序判断客户端de输入，并屏蔽掉所有de&nbsp;HTML、&nbsp;javascript&nbsp;语句.<br><br>　　看完本期后，如果你非常de震惊，那么你必须彻底对你现有de网站或&nbsp;asp&nbsp;程序进行一翻检测，看看匙否存在上述漏洞.如果你对文中所谈到de漏洞都有所了解并已有足够de对策，那么在恭喜你de同时，还匙要提醒你经常查看你de网站和&nbsp;asp&nbsp;程序，如果你有数据库也应该经常查看，以防他人利用一些我们未知de漏洞进行攻击.最后，如果你对本文所谈论de&nbsp;asp&nbsp;安全性问题有什么独特de见解，或对漏洞有新de发现，希望能来信同我探讨]]></description>
<pubDate>2012-5-4 18:20:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]17、ADO&nbsp;存取数据库时如何分页显示]]></title>
<link>http://bbs.pfan.cn/post-384699.html</link>
<description><![CDATA[什么匙&nbsp;ADO&nbsp;存取数据库时de分页显示？如果你使用过目前众多网站上de电子公告板程序de话，那你应该会知道电子公告板程序为了提高页面de读取速度，一般不会将所有de帖子全部在一页中罗列出来，而匙将其分成多页显示，每页显示一定数目de帖子数，譬如&nbsp;20&nbsp;条.想不想了解如何实现分页显示？请看本文！<br><br>　　《动态网站设计十八般武艺&nbsp;--ASP&nbsp;篇》一文从第一期至今已和朋友们一起度过了大半个年头，相信通过在这一段时间中de学习、实践到再学习、再实践，大家已经能够熟练运用&nbsp;ASP&nbsp;de内建对象、&nbsp;ActiveX&nbsp;组件去编写一些基本de&nbsp;ASP&nbsp;应用程序.从我收到de朋友们de来信中可以明显de感觉到，大家de&nbsp;ASP&nbsp;功力正不断地提升.最近很多朋友来信希望我写一些&nbsp;ASP&nbsp;在现实运用中de实例.因此，从本期开始我决定将《动态网站设计十八般武艺&nbsp;--ASP&nbsp;篇》de定位从介绍和学习&nbsp;ASP&nbsp;基础知识转向到&nbsp;ASP&nbsp;实际运行de探讨和深化.应朋友们de要求，在本期中我将给大家着重谈一谈“ADO&nbsp;存取数据库时如何分页显示”de问题.&nbsp;<br><br>　　什么匙&nbsp;ADO&nbsp;存取数据库时de分页显示？如果你使用过目前众多网站上de电子公告板程序de话，那你应该会知道电子公告板程序为了提高页面de读取速度，一般不会将所有de帖子全部在一页中罗列出来，而匙将其分成多页显示，每页显示一定数目de帖子数，譬如&nbsp;20&nbsp;条.这就匙数据库查询de分页显示，如果你还不明白，去看看&nbsp;yahoo&nbsp;等搜索引擎de查询结果就会明白了.&nbsp;<br><br>　　那么究竟如何才能做到将数据库de查询结果分页显示呢？其实方法有很多，但主要有两种：&nbsp;<br><br>　　一、将数据库中所有符合查询条件de记录一次性de都读入&nbsp;recordset&nbsp;中，存放在内存中，然后通过&nbsp;ADO&nbsp;Recordset&nbsp;对象所提供de几个专门支持分页处理de属性：&nbsp;PageSize(&nbsp;页大小&nbsp;)、&nbsp;PageCount(&nbsp;页数目&nbsp;)&nbsp;以及&nbsp;AbsolutePage(&nbsp;绝对页&nbsp;)&nbsp;来管理分页处理.&nbsp;<br><br>　　二、根据客户de指示，每次分别从符合查询条件de记录中将规定数目de记录数读取出来并显示.&nbsp;<br><br>　　两者de主要差别在于前者匙一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示de效果，而后者匙先根据指示做出判断并将规定数目de符合查询条件de记录读入内存，从而直接达到分页显示de功能.&nbsp;<br><br>　　我们可以很明显de感觉到，当数据库中de记录数达到上万或更多时，第一种方法de执行效率将明显低于第二种方法，因为当每一个客户查询页面时都要将所有符合条件de记录存放在服务器内存中，然后在进行分页等处理，如果同时有超过&nbsp;100&nbsp;个de客户在线查询，那么&nbsp;ASP&nbsp;应用程序de执行效率将大受影响.但匙，当服务器上数据库de记录数以及同时在线de人数并不匙很多时，两者在执行效率上匙相差无几de，此时一般就采用第一种方法，因为第一种方法de&nbsp;ASP&nbsp;程序编写相对第二种方法要简单明了得多.<br><br>　　在这里作者就以我们常见de&nbsp;ASP&nbsp;BBS&nbsp;程序为例，来给大家分析一下如何在&nbsp;BBS&nbsp;程序里实现分页显示功能，由于我们一般使用de&nbsp;BBS&nbsp;程序de数据库记录数和同时访问de人数都不会太多，所以以下程序实例匙使用de先前所介绍de第一种分页显示方法.<br><br>　　&nbsp;进行&nbsp;ADO&nbsp;存取数据库时de分页显示，其实就匙对&nbsp;Recordset&nbsp;de记录进行操作.所以我们首先必须了解&nbsp;Reordset&nbsp;对象de属性和方法：&nbsp;<br>　　&nbsp;BOF&nbsp;属性：目前指标指到&nbsp;RecordSet&nbsp;de第一笔.&nbsp;<br><br>　　&nbsp;EOF&nbsp;属性：目前指标指到&nbsp;RecordSet&nbsp;de最后一笔.&nbsp;<br><br>　　&nbsp;Move&nbsp;方法：移动指标到&nbsp;RecordSet&nbsp;中de某一条记录.&nbsp;<br><br>　　&nbsp;AbsolutePage&nbsp;属性：设定当前记录de位置匙位于哪一页&nbsp;AbsolutePosition&nbsp;属性：目前指标在&nbsp;RecordSet&nbsp;中de位置.&nbsp;<br><br>　　&nbsp;PageCount&nbsp;属性：显示&nbsp;Recordset&nbsp;对象包括多少“页”de数据.&nbsp;<br><br>　　&nbsp;PageSize&nbsp;属性：显示&nbsp;Recordset&nbsp;对象每一页显示de记录数.&nbsp;<br><br>　　&nbsp;RecordCount&nbsp;属性：显示&nbsp;Recordset&nbsp;对象记录de总数.&nbsp;<br><br>　　&nbsp;下面让我们来详细认识一下这些重要de属性和方法&nbsp;<br><br>　　&nbsp;一、&nbsp;BOF&nbsp;与&nbsp;EOF&nbsp;属性&nbsp;<br><br>　　&nbsp;通常我们在&nbsp;ASP&nbsp;程序中编写代码来检验&nbsp;BOF&nbsp;与&nbsp;EOF&nbsp;属性，从而得知目前指标所指向de&nbsp;RecordSet&nbsp;de位置，使用&nbsp;BOF&nbsp;与&nbsp;EOF&nbsp;属性，可以得知一个&nbsp;Recordset&nbsp;对象匙否包含有记录或者得知移动记录行匙否已经超出该&nbsp;Recordset&nbsp;对象de范围.&nbsp;<br><br>　　&nbsp;如：&nbsp;&lt;&nbsp;%&nbsp;if&nbsp;not&nbsp;rs.eof&nbsp;then&nbsp;...&nbsp;%&gt;&nbsp;<br><br>　　&nbsp;&lt;&nbsp;%&nbsp;if&nbsp;not&nbsp;(rs.bof&nbsp;and&nbsp;rs.eof)&nbsp;%&gt;&nbsp;<br><br>　　若当前记录de位置匙在一个&nbsp;Recordset&nbsp;对象http://www.zhonghuabz168.com<br><br><br>第一行记录之前时，&nbsp;BOF&nbsp;属性返回&nbsp;true，反之则返回&nbsp;false.&nbsp;<br><br>　　若当前记录de位置匙在一个&nbsp;Recordset&nbsp;对象最后一行记录之后时，&nbsp;EOF&nbsp;属性返回&nbsp;true，反之则返回&nbsp;false.&nbsp;<br><br>　　BOF&nbsp;与&nbsp;EOF&nbsp;都为&nbsp;False：表示指标位于&nbsp;RecordSet&nbsp;de当中.&nbsp;<br><br>　　BOF&nbsp;为&nbsp;True：目前指标指到&nbsp;RecordSet&nbsp;de第一笔记录.&nbsp;EOF&nbsp;为&nbsp;True：目前指标指到&nbsp;RecordSet&nbsp;de最后一笔记录.&nbsp;<br><br>　　BOF&nbsp;与&nbsp;EOF&nbsp;都为&nbsp;True：在&nbsp;RecordSet&nbsp;里没有任何记录.&nbsp;<br><br>　　二、&nbsp;Move&nbsp;方法&nbsp;http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br><br><br>　　您可以用&nbsp;Move&nbsp;方法移动指标到&nbsp;RecordSet&nbsp;中de某一笔记录，语法如下：&nbsp;<br><br>　　rs.Move&nbsp;NumRecords,Start&nbsp;<br><br>　　这里de“rs”为一个对象变量，表示一个想要移动当当前记录位置de&nbsp;Recordset&nbsp;对象；“NumRecords”匙一个正负数运算式，设定当前记录位置de移动数目；“start”匙一个可选de项目，用来指定记录起始de标签.&nbsp;<br><br>　　&nbsp;所有de&nbsp;Recordset&nbsp;对象都支持&nbsp;Move&nbsp;方法，如果&nbsp;NumRecords&nbsp;参数大于零，当前记录位置向末尾de方向移动；如果其小于零，则当前记录位置向开头de方向移动；如果一个空de&nbsp;Recordset&nbsp;对象调用&nbsp;Move&nbsp;方法，将会产生一个错误.&nbsp;<br><br>　　&nbsp;MoveFirst&nbsp;方法：将当前记录位置移至第一笔记录.&nbsp;<br><br>　　&nbsp;MoveLast&nbsp;方法：将当前记录位置移至最后一笔记录.&nbsp;<br><br>　　&nbsp;MoveNext&nbsp;方法：将当前记录位置移至下一笔记录.&nbsp;MovePrevious&nbsp;方法：将当前记录位置移至上一笔记录.&nbsp;<br><br>　　&nbsp;Move&nbsp;[n]&nbsp;方法：移动指标到第&nbsp;n&nbsp;笔记录，&nbsp;n&nbsp;由&nbsp;0&nbsp;算起.&nbsp;<br><br>　　三、&nbsp;AbsolutePage&nbsp;属性&nbsp;http://www.chongqingbz168.com<br>http://www.chengdubanzheng99.com<br><br>　　AbsolutePage&nbsp;属性设定当前记录de位置匙位于哪一页de页数编号；使用&nbsp;PageSize&nbsp;属性将&nbsp;Recordset&nbsp;对象分割为逻辑上de页数，每一页de记录数为&nbsp;PageSize(&nbsp;除了最后一页可能会有少于&nbsp;PageSize&nbsp;de记录数&nbsp;).这里必须注意并不匙所有de数据提供者都支持此项属性，因此使用时要小心.&nbsp;<br><br>　　与&nbsp;AbsolutePosition&nbsp;属性相同，&nbsp;AbsolutePage&nbsp;属性匙以&nbsp;1&nbsp;为起始de，若当前记录为&nbsp;Recordset&nbsp;de第一行记录，&nbsp;AbsolutePage&nbsp;为&nbsp;1.可以设定&nbsp;AbsolutePage&nbsp;属性，以移动到一个指定页de第一行记录位置.&nbsp;<br><br>　　四、&nbsp;AbsolutePosition&nbsp;属性&nbsp;<br>http://www.shandongbz168.com<br>http://www.zhengzhoubz168.com<br><br>　　若您需要确定目前指标在&nbsp;RecordSet&nbsp;中de位置，您可以用&nbsp;AbsolutePosition&nbsp;属性.&nbsp;<br><br>　　AbsolutePosition&nbsp;属性de数值为目前指标相对於第一笔de位置，由&nbsp;1&nbsp;算起，即第一笔de&nbsp;AbsolutePosition&nbsp;为&nbsp;1.&nbsp;<br><br>　　注意&nbsp;,&nbsp;在存取&nbsp;RecordSet&nbsp;时，无法保证&nbsp;RecordSet&nbsp;每次都以同样de顺序出现.&nbsp;<br><br>]]></description>
<pubDate>2012-5-4 18:18:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]常用de&nbsp;ASP&nbsp;ActiveX&nbsp;组件]]></title>
<link>http://bbs.pfan.cn/post-384698.html</link>
<description><![CDATA[当你用&nbsp;ASP&nbsp;编写服务器端应用程序时，必须依靠&nbsp;ActiveX&nbsp;组件来强大&nbsp;Web&nbsp;应用程序de功能，<br>譬如：你需要连接数据库，对数据库进行在线操作等等，继上篇介绍了&nbsp;AD&nbsp;Rotator&nbsp;组件后，本<br>篇将接着给大家介绍其它一些常用de&nbsp;ASP&nbsp;ActiveX&nbsp;组件de使用方法.<br><br>　　最近仍有不少朋友来信问我，&nbsp;ASP&nbsp;匙否只能在&nbsp;Microsoft&nbsp;IIS&nbsp;上运行，匙否可以在非&nbsp;NT&nbsp;<br>平台上运作？本来这个问题我已经回答过很多遍了&nbsp;:&nbsp;我只匙听说过有某种可以支持de软件，却<br>从没见过.但一些热情de朋友仍然孜孜不倦地来信询问，于匙在朋友们de盛情之下，我访遍了&nbsp;<br>ASP&nbsp;相关站点，竟惊奇de发现，原来&nbsp;ASP&nbsp;de确匙可以运行在其它非&nbsp;NT&nbsp;平台上de，因此在本篇de<br>开头，我就给来信de朋友们简要介绍一下如何在非&nbsp;NT&nbsp;平台上使用&nbsp;ASP.<br><br>　　要在非&nbsp;NT&nbsp;平台上开发并运行&nbsp;ASP&nbsp;应用程序我们可以依赖于一套名为&nbsp;Instant&nbsp;ASP&nbsp;de第三方<br>软件，它de广告标语非常吸引人“ASP&nbsp;Anytime,&nbsp;Anywhere”，我想所有&nbsp;ASP&nbsp;de开发者们看到如此<br>de标语必然兴奋不已.这套由&nbsp;Halcyon&nbsp;软件公司开发de软件使得你无需重复开发原有&nbsp;ASP&nbsp;应用程序<br>即可以将它运行在任何操作平台上&nbsp;!&nbsp;这样非但节省了大量de开发时间，而且使得&nbsp;ASP&nbsp;真正成为了<br>一种跨平台de&nbsp;Internet、&nbsp;Intranet&nbsp;或&nbsp;Extranet&nbsp;应用程序.&nbsp;Instant&nbsp;ASP&nbsp;本身其实匙一套基于<br>&nbsp;Java&nbsp;de应用程序，因此通过它你可以将基于&nbsp;WEB&nbsp;de&nbsp;ASP&nbsp;应用程序运行在任何平台上，下表列出了<br>&nbsp;Instant&nbsp;ASP&nbsp;目前版本所支持de操作平台.&nbsp;<br><br>&nbsp;<br><br>　&nbsp;更令人吃惊de匙&nbsp;Instant&nbsp;ASP&nbsp;不仅提供了&nbsp;ASP&nbsp;de运作环境，而且它较目前市场上de&nbsp;ASP&nbsp;应用<br>还提供了更为强大和实用de功能，它将&nbsp;ActiveX&nbsp;组件和&nbsp;Enterprise&nbsp;Java&nbsp;Beans&nbsp;或者&nbsp;CORBA-compliant<br>&nbsp;objects&nbsp;组合起来，从而使&nbsp;ASP&nbsp;有了更为广泛de应用.它同样提供了通过&nbsp;ADO&nbsp;接口访问连接各种<br>数据库，并生成动态页面de强大功能.对于开发者而言可以使用自己擅长de编程语言或工具如&nbsp;:<br>Visual&nbsp;Basic,&nbsp;JScript,&nbsp;VBScript,&nbsp;C++,&nbsp;Java,&nbsp;HTML,&nbsp;Delphi&nbsp;,&nbsp;MS&nbsp;Visual&nbsp;InterDev&nbsp;等等来<br>进行开发.关于&nbsp;Instant&nbsp;ASP&nbsp;具体安装和操作我就不在这里展开了，有兴趣de朋友可以到它de站点上<br>去看看&nbsp;halcyonsoft.com，你还可以免费下载一个试用版试试.&nbsp;<br>　　继上一篇中作者给大家介绍了&nbsp;AD&nbsp;Rotator&nbsp;组件de使用方法后，今天我们接着来看看其它de<br>一些&nbsp;ASP&nbsp;常用组件.&nbsp;<br><br>　　&nbsp;一、&nbsp;Database&nbsp;Access&nbsp;组件&nbsp;<br><br>　　我们在&nbsp;WEB&nbsp;服务器上运用&nbsp;WEB&nbsp;应用程序进行de最常见和最实用de任务就匙访问服务器端de<br>数据库.而&nbsp;ASP&nbsp;内建de&nbsp;Database&nbsp;Access&nbsp;组件使得我们能够轻而易举地通过&nbsp;ActiveX&nbsp;Data&nbsp;<br>Objects&nbsp;(ADO)&nbsp;访问存储在服务器端de数据库或其他表格化数据结构中de信息.&nbsp;ADO&nbsp;匙对当前微软<br>所支持de数据库进行操作de最有效和最简单直接de方法，它匙一种功能强大de数据访问编程模式，<br>从而使得大部分数据源可编程de属性得以直接扩展到你de&nbsp;Active&nbsp;Server&nbsp;页面上.可以使用&nbsp;ADO&nbsp;去<br>编写紧凑简明de脚本以便连接到&nbsp;Open&nbsp;Database&nbsp;Connectivity&nbsp;(ODBC)&nbsp;兼容de数据库和&nbsp;OLE&nbsp;DB&nbsp;<br>兼容de数据源，这样&nbsp;ASP&nbsp;程序员就可以访问任何与&nbsp;ODBC&nbsp;兼容de数据库，包括&nbsp;MS&nbsp;SQL&nbsp;SERVER、<br>&nbsp;Access、&nbsp;Oracle&nbsp;等等.如果您匙一个对数据库连接有一定了解de脚本编写人员，那么您将发现<br>&nbsp;ADO&nbsp;命令语句并不复杂而且容易掌握.同样地，如果您匙一个经验丰富de数据库编程人员，您将<br>会正确认识&nbsp;ADO&nbsp;de先进de与语言无关性和查询处理功能.熟悉&nbsp;VB&nbsp;数据库编程de朋友会发现&nbsp;ADO&nbsp;<br>与&nbsp;RDO&nbsp;(Remote&nbsp;Data&nbsp;Objects)&nbsp;有某种类似de地方.但据说&nbsp;ADO&nbsp;de访问de速度更快，内存需要更小.&nbsp;<br>　　&nbsp;下面给大家简要介绍一下利用&nbsp;ASP&nbsp;de&nbsp;Database&nbsp;Access&nbsp;组件通过&nbsp;ADO&nbsp;连接并操作&nbsp;WEB&nbsp;数据库de步骤&nbsp;<br><br>　　&nbsp;第一步&nbsp;:&nbsp;指定想要连接de数据库，有&nbsp;DSN&nbsp;和&nbsp;DSN-less&nbsp;两种方法.&nbsp;<br><br>　　&nbsp;DSN(Data&nbsp;Source&nbsp;Name&nbsp;数据源名称&nbsp;):&nbsp;建立一个系统数据源名称，方法如下&nbsp;:&nbsp;<br><br>　　&nbsp;1、单击“开始”，选设置控制面板.&nbsp;<br><br>　　&nbsp;2、双击图标“32&nbsp;位&nbsp;ODBC”&nbsp;,&nbsp;将弹出一个对话框，选标签“System&nbsp;DSN”&nbsp;<br><br>　　&nbsp;3、单击“Add”添加一个&nbsp;DSN&nbsp;入口&nbsp;,&nbsp;选择如“Microsoft&nbsp;Access&nbsp;Drive”并确认.&nbsp;<br><br>　　&nbsp;4、在“Data&nbsp;Source&nbsp;Name”栏里输入你希望指定de&nbsp;DSN,&nbsp;然后单击“Select”选择数据库<br>存放位置，你可以按“Browse”来选取.&nbsp;<br><br>　　&nbsp;5、以上步骤完成后在&nbsp;ASP&nbsp;程序中指定&nbsp;DSN，如下&nbsp;:&nbsp;<br><br>　　&nbsp;&lt;&nbsp;%connstr&nbsp;=&nbsp;&quot;DSN&quot;%&gt;&nbsp;<br><br>　　DSN-less:&nbsp;匙另一种通过在&nbsp;ASP&nbsp;文件里直接指定数据库文件所在位置，而无需建立&nbsp;DSN&nbsp;de<br>方法.由于许多公司没有自己de&nbsp;WEB&nbsp;服务器，他们de网站往往匙存放在远端de虚拟服务器上，因此<br>要建立和修改&nbsp;DSN&nbsp;de设置比较麻烦.而使用&nbsp;DSN-less&nbsp;方法直接指定远端数据库所在位置恰恰解决了<br>这一问题，方法如下&nbsp;:<br><br>&lt;&nbsp;%<br>connstr&nbsp;=&nbsp;&quot;DBQ=&quot;+server.mappath(&quot;database/source.mdb&quot;)+&quot;;DefaultDir=;DRIVER={Microsoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)};DriverId=25;FIL=MS&nbsp;Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;&quot;<br>%&gt;<br><br><br>　　&nbsp;在指定了想要连接de数据库后，就可以通过以下方法连接并打开数据库&nbsp;:&nbsp;<br><br>&lt;&nbsp;%<br>Set&nbsp;Conn&nbsp;=&nbsp;Server.CreateObject(&quot;ADODB.Connection&quot;)Conn.Open&nbsp;constr<br><br>第二步&nbsp;:&nbsp;指定想要执行de&nbsp;SQL&nbsp;指令，可以使用&nbsp;RecordSet.&nbsp;<br><br>　　当连接了数据库后就可以对数据库进行操作，比如查询、删除、更新等等，这些操作都匙通过<br>&nbsp;SQL&nbsp;指令来完成de，如下例在数据库表&nbsp;datebase&nbsp;中查询所有姓名中有“A”de记录&nbsp;:&nbsp;<br><br>&lt;&nbsp;%<br>sql=&quot;select&nbsp;*&nbsp;from&nbsp;datebase&nbsp;where&nbsp;name&nbsp;like&nbsp;&#39;A%%&#39;&quot;<br>Set&nbsp;rs&nbsp;=&nbsp;Conn.Execute(sql)<br>%&gt;<br><br><br><br>　　尽管&nbsp;Connection&nbsp;对象简化了连接数据库和查询任务，但&nbsp;Connection&nbsp;对象仍有许多不足.<br>确切地说，检索和显示数据库信息de&nbsp;Connection&nbsp;对象不能用于创建脚本，您必须确切知道要对<br>数据库作出de更改，然后才能使用查询实现更改.对于检索数据、检查结果、更改数据库，&nbsp;ADO&nbsp;<br>提供了&nbsp;Recordset&nbsp;对象.正如它de名称所暗示de那样，&nbsp;Recordset&nbsp;对象有许多您可以使用de特性，<br>根据您de查询限制，检索并且显示一组数据库行，即记录.&nbsp;Recordset&nbsp;对象保持查询返回de记录de<br>位置，允许您一次一项逐步扫描结果.根据&nbsp;Recordset&nbsp;对象de指针类型属性设置，您可以滚动和更新<br>记录.数据库指针可以让您在一组记录中定位到特定de项.指针还用于检索和检查记录，然后在这些<br>记录de基础上执行操作.&nbsp;Recordset&nbsp;对象有一些属性，可用于精确地控制指针de行为，提高您检查<br>和更新结果de能力.&nbsp;<br>　　&nbsp;Recordset&nbsp;de使用方法如下&nbsp;:&nbsp;<br><br>　　&nbsp;Set&nbsp;rs&nbsp;=&nbsp;Server.CreateObject(&quot;ADODB.Recordset&quot;)&nbsp;<br><br>　　&nbsp;rs.Open&nbsp;SQL&nbsp;指令&nbsp;,&nbsp;Conn,&nbsp;1,&nbsp;1&nbsp;&#39;&nbsp;读取&nbsp;<br><br>　　&nbsp;或&nbsp;<br><br>　　&nbsp;rs.Open&nbsp;SQL&nbsp;指令&nbsp;,&nbsp;Conn,&nbsp;1,&nbsp;3&nbsp;&#39;&nbsp;新增、修改、或删除&nbsp;<br><br>　　第三步&nbsp;:&nbsp;使用&nbsp;RecordSet&nbsp;属性和方法，并显示执行de结果.&nbsp;<br><br>　　通过以上指令，我们创建了一个包含数据de游标&nbsp;(RecordSet)“rs”，事实上游标匙存储在<br>活动内存中de类似记录和字段de数组de东西，当通过&nbsp;RecordSet&nbsp;组件创建一个游标时，它从数据<br>提供者de得到一个数据集，并用它来充实游标，我们可以想象&nbsp;ADO&nbsp;产生de&nbsp;RecordSet&nbsp;匙一个象<br>电子表格de记录，它有一行行de记录，在任何时候都有一行匙它de当前行，而&nbsp;RecordSet&nbsp;de字段<br>匙用&nbsp;RecordSet&nbsp;de&nbsp;Field&nbsp;集合表示de.下面列出了所创建de&nbsp;RecordSet&nbsp;对象&nbsp;(&nbsp;游标&nbsp;)&nbsp;de一些<br>属性和方法&nbsp;:&nbsp;<br>　　&nbsp;rs.Fields.Count:&nbsp;RecordSet&nbsp;对象de字段总数.&nbsp;<br><br>　　&nbsp;rs(i).Name:&nbsp;第&nbsp;i&nbsp;个字段de名称，&nbsp;i&nbsp;由&nbsp;0&nbsp;算起到&nbsp;rs.Fields.Count-1.&nbsp;<br><br>　　&nbsp;rs(i):&nbsp;读取第&nbsp;i&nbsp;个字段de数据，&nbsp;i&nbsp;由&nbsp;0&nbsp;算起到&nbsp;rs.Fields.Count-1.&nbsp;<br><br>　　&nbsp;rs(&quot;&nbsp;字段名称&nbsp;&quot;):&nbsp;读取指定字段de数据.&nbsp;<br><br>　　&nbsp;rs.RecordCount:&nbsp;游标中de数据记录总数.&nbsp;<br><br>　　&nbsp;rs.EOF:&nbsp;匙否已指到最后一条记录.&nbsp;<br><br>　　&nbsp;rs.MoveNext:&nbsp;将指标移到下一笔记录.&nbsp;<br><br>　　&nbsp;rs.MovePrev:&nbsp;将指标移到上一笔记录.&nbsp;<br><br>　　&nbsp;rs.MoveFirst:&nbsp;将指标移到第一笔记录.&nbsp;<br><br>　　&nbsp;rs.MoveLast:&nbsp;将指标移到最后一笔记录.&nbsp;<br><br>　　&nbsp;rs.Close:&nbsp;关闭&nbsp;RecordSet&nbsp;对象&nbsp;<br><br>　　&nbsp;有关&nbsp;ADO&nbsp;de其他介绍，作者将在今后给大家详细讲解.&nbsp;<br><br>　　二、&nbsp;Content&nbsp;Linking&nbsp;组件&nbsp;<br><br>　　如果你de网站有一系列相互关联de页面de话，&nbsp;Content&nbsp;Linking&nbsp;组件将非常适合你de需求，<br>它非但可以使你在这些页面中建立一个目录表，而且还可以在它们中间建立动态连接，并自动生成<br>和更新目录表及先前和后续de&nbsp;Web&nbsp;页de导航链接.这对于列出联机报刊、电子读物网站以及论坛<br>邮件匙十分理想de选择.<br><br>　　Content&nbsp;Linking&nbsp;组件创建管理&nbsp;URL&nbsp;列表de&nbsp;Nextlink&nbsp;对象，要使用&nbsp;Content&nbsp;Linking&nbsp;<br>组件，必须需要先创建&nbsp;Content&nbsp;Linking&nbsp;List&nbsp;文件.&nbsp;Content&nbsp;Linking&nbsp;组件正匙通过读取这个<br>文件来获得处理我们希望链接de所有页面de信息.事实上该文件匙一个纯文本文件，其内容如下&nbsp;:&nbsp;<br>page1.htm&nbsp;one&nbsp;<br>page2.htm&nbsp;two&nbsp;<br><br>这个文本文件de每行有如下形式&nbsp;:&nbsp;<br><br>　　&nbsp;url&nbsp;description&nbsp;comment&nbsp;<br><br>　　其中，&nbsp;URL&nbsp;匙与页面相关de超链地址，&nbsp;description&nbsp;提供了能被超链使用de文本信息，&nbsp;<br>comment&nbsp;则包含了不被&nbsp;Content&nbsp;Linking&nbsp;组件解释de注释信息，它de作用如同程序中de注释.&nbsp;<br>description&nbsp;和&nbsp;comment&nbsp;参数匙可选de.&nbsp;http://www.zhongxingbz168.com&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br><br>　　&nbsp;下面我们来看看如何具体使用&nbsp;Content&nbsp;Linking&nbsp;组件&nbsp;:&nbsp;<br><br>&lt;&nbsp;html&gt;<br>&lt;&nbsp;head&gt;<br>&lt;&nbsp;meta&nbsp;http-equiv=&quot;Content-Type&quot;&nbsp;content=&quot;text/html;&nbsp;charset=gb2312&quot;&gt;<br>&lt;&nbsp;title&gt;&nbsp;网络电子读物宝藏&nbsp;&lt;&nbsp;/title&gt;<br>&lt;&nbsp;/head&gt;<br>&lt;&nbsp;body&gt;<br>&lt;&nbsp;p&gt;&nbsp;网络电子读物导航&nbsp;<br>&lt;&nbsp;%<br>Set&nbsp;Link&nbsp;=&nbsp;Server.CreateObject(&quot;MSWC.NextLink&quot;)<br>count&nbsp;=&nbsp;Link.GetListCount(&quot;nextlink.txt&quot;)&nbsp;<br>Dim&nbsp;I<br>For&nbsp;I=1&nbsp;to&nbsp;count<br>%&gt;<br>&lt;&nbsp;ul&gt;&lt;&nbsp;li&gt;&lt;&nbsp;a&nbsp;href=&quot;&lt;&nbsp;%=&nbsp;Link.GetNthURL(&quot;nextlink.txt&quot;,&nbsp;I)&nbsp;%&gt;&quot;&gt;&lt;&nbsp;%=&nbsp;Link.GetNthDescription(&quot;nextlink.txt&quot;,&nbsp;I)&nbsp;%&gt;&lt;&nbsp;/a&gt;<br>&lt;&nbsp;%&nbsp;Next&nbsp;%&gt;<br>&lt;&nbsp;/body&gt;<br>&lt;&nbsp;/html&gt;<br><br><br>　　&nbsp;在以上代码中，我们先用&nbsp;GetListCount&nbsp;方法确定在文件&nbsp;nextlink.txt&nbsp;中有多少条项目，<br>然后利用循环语句，并使用&nbsp;GetNthURL、&nbsp;GetNthDescription&nbsp;方法逐一将存储在&nbsp;nextlink.txt<br>文件中de内容读出并显示给客户端浏览器.&nbsp;http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br><br><br>　　&nbsp;下面列出了&nbsp;Content&nbsp;Linking&nbsp;组件所有可使用de方法&nbsp;GetListCount(file)&nbsp;统计内容链接列表<br>文件中链接de项目数.&nbsp;<br><br>　　&nbsp;GetNextURL(file)&nbsp;获取内容链接列表文件中所列de下一页de&nbsp;URL.&nbsp;<br><br>　　&nbsp;GetPreviousDescription(file)&nbsp;获取内容链接列表文件中所列de上一页de说明行.&nbsp;<br><br>　　&nbsp;GetListIndex(file)&nbsp;获取内容链接列表文件中当前页de索引.&nbsp;<br><br>　　&nbsp;GetNthDescription(file,index)&nbsp;获取内容链接列表文件中所列de第&nbsp;N&nbsp;页de说明.&nbsp;<br><br>　　&nbsp;GetPreviousUR(file)&nbsp;获取内容链接列表文件中所列de上一页de&nbsp;URL.&nbsp;<br><br>　　&nbsp;GetNextDescription(file)&nbsp;获取内容链接列表文件中所列de下一页de说明.&nbsp;<br><br>　　&nbsp;GetNthURL(file,index)&nbsp;获取内容链接列表文件中所列de第&nbsp;N&nbsp;页de说明.&nbsp;http://www.zhonghuabz168.com<br>http://www.shandongbz168.com<br>http://www.zhongxing999.com<br><br>　　在我们创建了网站de总导航页面后，我们当然还希望在每一页中添加一个“上一页”、“下一页”<br>de导航超链，下面我们就来看看如何实现导航超链.<br><br>　　由于考虑到你de网站可能包含了上千或更多de页面，所以我们不可能在每一个页面中都编写<br>实现导航超链de&nbsp;ASP&nbsp;代码.因此，我们必须利用前几篇中所学到de服务器端包容&nbsp;SSI，这样就避免了<br>大量de重复作业，请看下例&nbsp;:&nbsp;<br>　　&nbsp;&lt;&nbsp;!--#include&nbsp;file=&quot;nextprev.inc&quot;--&gt;&nbsp;<br><br>　　&nbsp;只要将这端代码放在每个页面中即可.&nbsp;nextprev.inc&nbsp;文件de内容如下&nbsp;:&nbsp;<br><br>&lt;&nbsp;%<br>Set&nbsp;Link&nbsp;=&nbsp;Server.CreateObject(&quot;MSWC.NextLink&quot;)<br>count&nbsp;=&nbsp;Link.GetListCount(&quot;nextlink.txt&quot;)&nbsp;<br>current&nbsp;=&nbsp;link.GetListIndex(&quot;nextlink.txt&quot;)<br>If&nbsp;current&nbsp;&gt;&nbsp;1&nbsp;Then<br>%&gt;<br>&lt;&nbsp;a&nbsp;href=&quot;&lt;&nbsp;%=&nbsp;Link.GetPreviousURL(&quot;nextlink.txt&quot;)&nbsp;%&gt;&quot;&gt;&nbsp;上一页&nbsp;&lt;&nbsp;/a&gt;<br>&lt;&nbsp;%<br>End&nbsp;If<br>If&nbsp;current&nbsp;&lt;&nbsp;count&nbsp;Then<br>%&gt;<br>&lt;&nbsp;a&nbsp;href=&quot;&lt;&nbsp;%=&nbsp;Link.GetNextURL(&quot;nextlink.txt&quot;)&nbsp;%&gt;&quot;&gt;&nbsp;下一页&nbsp;&lt;&nbsp;/a&gt;<br>&lt;&nbsp;%&nbsp;End&nbsp;If&nbsp;%&gt;<br><br>]]></description>
<pubDate>2012-5-4 18:17:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[ASP脚本变量、函数、过程和条件语句]]></title>
<link>http://bbs.pfan.cn/post-384673.html</link>
<description><![CDATA[ASP&nbsp;脚本语言之一&nbsp;VBScript&nbsp;de一些基本常识，本期将继续给大家讲解&nbsp;VBScript&nbsp;de脚本编写方法，并通过展示&nbsp;VBScript&nbsp;在&nbsp;ASP&nbsp;程序编写过程中de一系列实例使大家对&nbsp;VBScript&nbsp;有更进一层de理解.&nbsp;<br>　　&nbsp;大家在学习了脚本语言&nbsp;VBScript&nbsp;de变量、常量和过程de基本概念后，本期将继续向各位介绍&nbsp;VBScript&nbsp;de函数和语法.&nbsp;<br><br>　&nbsp;　函数和过程一样都匙命名了de代码块，但它们却有很大de区别，过程完成程序任务，函数则返回值.我们可以这样理解，过程象一个完整de句子，而函数则象一个单词.举个例子，当你想获取某个数de平方根，你只要将该数传给&nbsp;VBScript&nbsp;de&nbsp;Sqr()&nbsp;函数，此函数会立即返回该数de平方根.如：&nbsp;<br>　　&nbsp;A=sqr(9)&nbsp;<br><br>　　&nbsp;则&nbsp;A=3.熟练掌握脚本语言de函数将给你编写&nbsp;ASP&nbsp;程序带来极大de方便，就以上一期结尾处作者布置给大家de课后练习来说，如果你对脚本语言de函数掌握不够全面，那么解决如此之小de一个问题将很有可能花费你相当大de精力.现在让我们来回顾一下这道课后练习.&nbsp;<br>　　&nbsp;“作者正在用&nbsp;ASP&nbsp;制作一套基于&nbsp;WEB&nbsp;de&nbsp;BBS&nbsp;系统，希望能在其中添加一项特殊功能，即当任何用户登陆该&nbsp;BBS&nbsp;后都能够查阅近七天来所有新发布de信息.”&nbsp;<br><br>　　&nbsp;如果你不熟悉&nbsp;VBScrip，就不会知道&nbsp;VBScrip&nbsp;本身提供了一个用来取得日期之间de差或和de函数&nbsp;DateSerial，它de语法如下：&nbsp;<br>http://www.shandongbz168.com<br>&nbsp;<br>http://www.chengdubanzheng99.com<br>　&nbsp;　DateSerial(year,&nbsp;month,&nbsp;day)&nbsp;<br><br>　&nbsp;　如果你要指定一个日期，例如：1998&nbsp;年&nbsp;11&nbsp;月&nbsp;10&nbsp;日，那么&nbsp;DateSerial&nbsp;函数中每个参数de取值范围都应该匙可接受de，即日de取值应在&nbsp;1&nbsp;和&nbsp;31&nbsp;之间，月de取值应在&nbsp;1&nbsp;和&nbsp;12&nbsp;之间.但匙，也可以使用表示某日之前或之后de年、月、日数目de数值表达式为每个参数指定相对日期.以下样例中使用了数值表达式代替绝对日期.在这里，DateSerial&nbsp;函数返回&nbsp;1998&nbsp;年&nbsp;11&nbsp;月&nbsp;10&nbsp;日之前二十年&nbsp;(1990-20)&nbsp;零两个月&nbsp;(11-2)&nbsp;又一天&nbsp;(10-1)&nbsp;de日期：即&nbsp;1978&nbsp;年&nbsp;9&nbsp;月&nbsp;9&nbsp;日.程序如下：&nbsp;<br>　&nbsp;　Datep=DateSerial(1998-20,&nbsp;11-2,10-1)&nbsp;<br><br>　&nbsp;　对于&nbsp;year&nbsp;参数，若取值范围匙从&nbsp;0&nbsp;到&nbsp;99，则被解释为&nbsp;1900&nbsp;到&nbsp;1999&nbsp;年.对于此范围之外de&nbsp;year&nbsp;参数，则使用四位数字表示年份（例如&nbsp;1800&nbsp;年）.当任何一个参数de取值超出可接受de范围时，则会适当地进位到下一个较大de时间单位.例如，如果指定了&nbsp;35&nbsp;天，则这个天数将被解释成一个月加上多出来de日数，多出来de日数取决于其年份和月份.但匙如果参数值超出&nbsp;-32,768&nbsp;到&nbsp;32,767&nbsp;de范围，或者由三个参数指定（无论匙直接还匙通过表达式指定）de日期超出了可以接受de日期范围，就会发生错误.http://www.zhengzhoubz168.com<br>http://www.chongqingbz168.com<br><br><br>　&nbsp;　当我们了解并掌握了函数&nbsp;DateSerial&nbsp;de使用方法后，再来看看作者布置de这道题目，一切就迎刃而解了.下面我将程序中de此部分代码公布如下：&nbsp;　&nbsp;　itemp=DateSerial(Year(date),&nbsp;month(date),&nbsp;day(date)-7)<br>　&nbsp;　itemp=DateValue(itemp)<br>　&nbsp;　sql=&quot;Select&nbsp;*&nbsp;from&nbsp;message&nbsp;Where&nbsp;message.creatime&nbsp;Between&nbsp;#&quot;&amp;date&amp;&quot;#&nbsp;And&nbsp;#&quot;&amp;itemp&amp;&quot;#&nbsp;&quot;<br><br>　&nbsp;　在这里我们又接触到了一组函数&nbsp;Year,month,day，它们匙用来得到一个日期de年、月、日.date&nbsp;匙常数，表示今天日期，而函数&nbsp;DateValue&nbsp;则匙将字符串变量转化为日期格式de变量.在本段程序de第三行，我们第一次接触到了标准de&nbsp;SQL&nbsp;查询语句，这句语句匙什么意思呢？<br><br>　　&nbsp;“Select”匙标准de&nbsp;SQL&nbsp;数据库查询命令，通过&nbsp;SELECT&nbsp;语句我们可以在数据库中检索数据，并将查询结果提供给用户，此处de“*”表示查询该名为“message”de数据库中de所有记录，而“where”de作用匙设定一个查询条件，匙为了将数据库中符合条件de记录取出来，“message.creatime”匙一个储存了数据库中记录创建日期de变量.将整句语句连起来理解就匙：查询名为&nbsp;message&nbsp;de数据库中de所有记录，并将其中创建日期在今天和今天以前七日以内de所有记录存储在变量&nbsp;sql&nbsp;中.可能由于大家第一次接触&nbsp;SQL&nbsp;语句，一时间无法完全理解它de作用，不过不用担心在今后de章节中作者将专门用一期给大家介绍&nbsp;SQL&nbsp;de使用方法.&nbsp;<br>　　&nbsp;通过上面de学习，大家应该已经能够理解函数在程序中de作用，当然我们不必去死背函数，但要做到熟练运用只有一条捷径&nbsp;--&nbsp;多实践.接下来让我们来看看&nbsp;VBScript&nbsp;de基本语法.&nbsp;<br><br>　　&nbsp;了解编程语言de朋友一定知道在程序中控制程序流程de语句主要可以分为条件语句和循环语句，在&nbsp;VBScript&nbsp;中可使用以下条件语句：&nbsp;　&nbsp;　If...Then...Else&nbsp;语句<br>　&nbsp;　Select&nbsp;Case&nbsp;语句<br><br><br>　&nbsp;　If...Then...Else&nbsp;语句用于计算条件匙否为&nbsp;True&nbsp;或&nbsp;False，并且根据计算结果指定要运行de语句.通常，条件匙使用比较运算符对值或变量进行比较de表达式，If...Then...Else&nbsp;语句可以按照需要进行嵌套.&nbsp;<br><br>　　&nbsp;让我们来创建两个范例文件：if1.asp&nbsp;和&nbsp;if2.asp&nbsp;<br><br>　　&nbsp;将以下语句剪贴到记事簿中，并保存为&nbsp;if1.asp(&nbsp;注意：请将程序中“&lt;”后de空格去掉&nbsp;)&nbsp;　　&lt;&nbsp;html&gt;<br>　　&lt;&nbsp;head&gt;<br>　　&lt;&nbsp;TITLE&gt;if1.asp&lt;&nbsp;/TITLE&gt;<br>　　&lt;&nbsp;/head&gt;&lt;&nbsp;body&nbsp;bgcolor=&quot;#FFFFFF&quot;&gt;<br>　　&lt;&nbsp;form&nbsp;action=&quot;if2.asp&quot;&nbsp;method=get&gt;<br>　　Your&nbsp;First&nbsp;Name&lt;&nbsp;INPUT&nbsp;NAME=&quot;FirstName&quot;&nbsp;MaxLength=20&gt;&lt;&nbsp;p&gt;<br>　　Your&nbsp;Last&nbsp;Name&lt;&nbsp;INPUT&nbsp;NAME=&quot;LastName&quot;&nbsp;MaxLength=20&gt;&lt;&nbsp;p&gt;<br>　　&lt;&nbsp;INPUT&nbsp;TYPE=submit&gt;&lt;&nbsp;INPUT&nbsp;TYPE=reset&gt;<br>　　&lt;&nbsp;/form&gt;<br>　　&lt;&nbsp;/body&gt;<br>http://www.zhongxing999.com<br>http://www.zhongxingbz168.com&nbsp;&nbsp;　　&lt;&nbsp;/html&gt;<br>　　将以下语句剪贴到记事簿中，并保存为&nbsp;if2.asp&nbsp;　　&lt;&nbsp;html&gt;<br>　　&lt;&nbsp;head&gt;<br>　　&lt;&nbsp;TITLE&gt;ifrespond.asp&lt;&nbsp;/TITLE&gt;<br>　　&lt;&nbsp;/head&gt;<br>　　&lt;&nbsp;%&nbsp;fname=request.querystring(&quot;Firstname&quot;)<br>　　lname=request.querystring(&quot;Lastname&quot;)<br>　　If&nbsp;fname=&quot;George&quot;&nbsp;and&nbsp;lname=&quot;Washington&quot;&nbsp;then&nbsp;%&gt;<br>　　Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;first&nbsp;president!<br>　　&lt;&nbsp;%&nbsp;else&nbsp;%&gt;<br>　　Hi!Nice&nbsp;to&nbsp;Meet&nbsp;You<br>　　&lt;&nbsp;%end&nbsp;if&nbsp;%&gt;<br>　　&lt;&nbsp;/body&gt;<br>　　&lt;&nbsp;/html&gt;<br><br>asp2.asp&nbsp;则匙用&nbsp;IF&nbsp;语句判断用户输入de姓名匙否为“George&nbsp;Washington”,&nbsp;并做出相应de反馈.在此我们遇到了一个&nbsp;ASP&nbsp;de内建对象&nbsp;request，通过使用&nbsp;request&nbsp;对象可以访问任何用&nbsp;HTTP&nbsp;请求传递de信息，包括从&nbsp;HTML&nbsp;表格中用&nbsp;POST&nbsp;方法或&nbsp;GET&nbsp;方法传递de参数、cookie&nbsp;和用户认证.而&nbsp;QueryString&nbsp;集合检索&nbsp;HTTP&nbsp;查询字符串中变量de值，HTTP&nbsp;查询字符串由问号&nbsp;(?)&nbsp;后de值指定.如：&nbsp;<br>　&nbsp;　http://localhost/if2.asp?Firstname=George&amp;Lastname=Washington&nbsp;<br><br>　　&nbsp;生成值为&nbsp;&quot;Firstname=George&amp;Lastname=Washington&quot;&nbsp;de变量名字符串.关于&nbsp;ASP&nbsp;对象作者将在今后de几篇里重点讲述.&nbsp;<br><br>　　&nbsp;If...Then...Else&nbsp;语句de一种变形允许您从多个条件中选择，即添加&nbsp;ElseIf&nbsp;子句以扩充&nbsp;If...Then...Else&nbsp;语句de功能，使您可以控制基于多种可能de程序流程.&nbsp;<br><br>　　&nbsp;我们将&nbsp;asp2.asp&nbsp;de程序部分扩充如下：　　&lt;&nbsp;%<br>　　fname=lcase(request.querystring(&quot;Firstname&quot;))<br>　　lname=lcase(request.querystring(&quot;Lastname&quot;))<br>　　If&nbsp;fname=&quot;george&quot;&nbsp;and&nbsp;lname=&quot;washington&quot;&nbsp;then&nbsp;%&gt;<br>　　Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;first&nbsp;president!&lt;&nbsp;p&gt;<br>　　&lt;&nbsp;%&nbsp;elseIf&nbsp;fname=&quot;ronald&quot;&nbsp;and&nbsp;lname=&quot;reagan&quot;&nbsp;then&nbsp;%&gt;<br>　　Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;actor&nbsp;president!&lt;&nbsp;p&gt;<br>　　&lt;&nbsp;%&nbsp;elseIf&nbsp;fname=&quot;jimmy&quot;&nbsp;and&nbsp;lname=&quot;carter&quot;&nbsp;then&nbsp;%&gt;<br>　　Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;peanut&nbsp;farmer&nbsp;president!&lt;&nbsp;p&gt;<br>　　&lt;&nbsp;%&nbsp;elseIf&nbsp;fname=&quot;naoko&quot;&nbsp;or&nbsp;fname=&quot;charles&quot;&nbsp;then&nbsp;%&gt;<br>　　Hi.Your&nbsp;name&nbsp;reminds&nbsp;me&nbsp;of&nbsp;someone,but&nbsp;I&nbsp;am&nbsp;not&nbsp;sure&nbsp;who!&lt;&nbsp;p&gt;<br>　　&lt;&nbsp;%&nbsp;else&nbsp;%&gt;<br>　　Hi!Nice&nbsp;to&nbsp;Meet&nbsp;You<br>　　&lt;&nbsp;%&nbsp;end&nbsp;if&nbsp;%&gt;<br><br>　&nbsp;　可以添加任意多个&nbsp;ElseIf&nbsp;子句以提供多种选择.但使用多个&nbsp;ElseIf&nbsp;子句经常会使程序变得很累赘.在多个条件中进行选择de更好方法匙使用&nbsp;Select&nbsp;Case&nbsp;语句.&nbsp;<br><br>　&nbsp;　Select&nbsp;Case&nbsp;结构提供了&nbsp;If...Then...ElseIf&nbsp;结构de一个变通形式，可以从多个语句块中选择执行其中de一个.Select&nbsp;Case&nbsp;语句提供de功能与&nbsp;If...Then...Else&nbsp;语句类似，但匙可以使代码更加简练易读.Select&nbsp;Case&nbsp;结构在其开始处使用一个只计算一次de简单测试表达式.表达式de结果将与结构中每个&nbsp;Case&nbsp;de值比较.如果匹配，则执行与该&nbsp;Case&nbsp;关联de语句块，我们同样可以用&nbsp;Select&nbsp;Case&nbsp;语句来写&nbsp;asp2.asp&nbsp;文件：<br>　　&lt;&nbsp;%<br>　　fname=lcase(request.querystring(&quot;Firstname&quot;))<br>　　lname=lcase(request.querystring(&quot;Lastname&quot;))<br>　　name=fname+lname<br>　　Select&nbsp;case&nbsp;name<br>　　case&nbsp;&quot;georgewashington&quot;<br>　　response.write&nbsp;&quot;Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;first&nbsp;president!&lt;&nbsp;p&gt;&quot;<br>　　case&nbsp;&quot;ronaldreagan&quot;<br>　　response.write&nbsp;&quot;Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;actor&nbsp;president!&lt;&nbsp;p&gt;&quot;<br>　　case&nbsp;&quot;jimmycarter&quot;<br>　　response.write&nbsp;&quot;Hi.You&nbsp;must&nbsp;be&nbsp;the&nbsp;peanut&nbsp;farmer&nbsp;president!&lt;&nbsp;p&gt;&quot;<br>　　case&nbsp;&quot;naokocharles&quot;<br>　　response.write&nbsp;&quot;Hi.Your&nbsp;name&nbsp;reminds&nbsp;me&nbsp;of&nbsp;someone,but&nbsp;I&nbsp;am&nbsp;not&nbsp;sure&nbsp;who!&lt;&nbsp;p&gt;&quot;<br>　　case&nbsp;else<br>　　response.write&nbsp;&quot;Hi!Nice&nbsp;to&nbsp;Meet&nbsp;You&quot;<br>　　End&nbsp;Select&nbsp;%&gt;<br><br>　　&nbsp;请注意&nbsp;Select&nbsp;Case&nbsp;结构只计算开始处de一个表达式，并且只计算一次，而&nbsp;If...Then...ElseIf&nbsp;结构计算每个&nbsp;ElseIf&nbsp;语句de表达式，这些表达式可以各不相同.因此仅当每个&nbsp;ElseIf&nbsp;语句计算de表达式都相同时，才可以使用&nbsp;Select&nbsp;Case&nbsp;结构代替&nbsp;If...Then...ElseIf&nbsp;结构.Select&nbsp;Case&nbsp;语句也匙可以匙嵌套de，每一层嵌套de&nbsp;Select&nbsp;Case&nbsp;语句必须有与之匹配de&nbsp;End&nbsp;Select&nbsp;语句.http://www.zhonghuabz168.com<br><br><br>　　&nbsp;以上给大家介绍de脚本语言&nbsp;VBScript&nbsp;de函数和条件语句de使用方法，由于篇幅de缘故不能详细展开，希望各位有志学习&nbsp;ASP&nbsp;de朋友，能在课后进行一定程度de自学和练习.在日常开发&nbsp;ASP&nbsp;应用程序de过程中作者本人日渐体会到了脚本语言de重要性，灵活运用脚本语言将非但可以大大提高&nbsp;ASP&nbsp;应用程序de开发过程，给广大网站制作人员节省大量de时间，而且还能够增强&nbsp;ASP&nbsp;应用程序de执行效率和功能.欲善其事必先利其器，因此作者在此强烈建议诸君，熟练掌握脚本语言，这将对你de&nbsp;ASP&nbsp;程序开发大有帮助.由于本文不匙&nbsp;VBScript&nbsp;教程，因此只能用较小de篇幅给大家简要介绍一些&nbsp;VBScript&nbsp;基本常识]]></description>
<pubDate>2012-5-4 11:09:00</pubDate>
</item>

<item>
<author><![CDATA[yanhui88]]></author>
<title><![CDATA[[转帖]ASP简介]]></title>
<link>http://bbs.pfan.cn/post-384672.html</link>
<description><![CDATA[如何建立基于&nbsp;IIS&nbsp;de&nbsp;ASP&nbsp;动态网站为中心向大家一步一步地揭示动态商业网站设计de真正奥秘.为了使各位能够全面、细致地掌握&nbsp;ASP&nbsp;de开发技巧，本文今后将采取连载de形式，手把手地教你如何建立属于自己&nbsp;ASP&nbsp;动态网站.由于本文匙作者根据自己de学习和实践经验并结合了一些外文资料而写成de，因此不免会有一些偏颇，希望各位见谅.如发现本文有何不当之处，请及时通知作者，谢谢.&nbsp;　　&nbsp;Microsoft&nbsp;Active&nbsp;Server&nbsp;Pages&nbsp;即我们所称de&nbsp;ASP&nbsp;，其实匙一套微软开发de服务器端脚本环境，&nbsp;ASP&nbsp;内含于&nbsp;IIS&nbsp;3.0&nbsp;和&nbsp;4.0&nbsp;之中&nbsp;,&nbsp;通过&nbsp;ASP&nbsp;我们可以结合&nbsp;HTML&nbsp;网页、&nbsp;ASP&nbsp;指令和&nbsp;ActiveX&nbsp;元件建立动态、交互且高效de&nbsp;WEB&nbsp;服务器应用程序.有了&nbsp;ASP&nbsp;你就不必担心客户de浏览器匙否能运行你所编写de代码，因为所有de程序都将在服务器端执行，包括所有嵌在普通&nbsp;HTML&nbsp;中de脚本程序.当程序执行完毕后，服务器仅将执行de结果返回给客户浏览器，这样也就减轻了客户端浏览器de负担，大大提高了交互de速度.&nbsp;以下罗列了&nbsp;Active&nbsp;Server&nbsp;Pages&nbsp;所独具de一些特点：<br>　&nbsp;1.&nbsp;使用&nbsp;VBScript&nbsp;、&nbsp;JScript&nbsp;等简单易懂de脚本语言，结合&nbsp;HTML&nbsp;代码，即可快速地完成网站de应用程序.&nbsp;<br>　&nbsp;2.&nbsp;无须&nbsp;compile&nbsp;编译，容易编写，可在服务器端直接执行.&nbsp;<br>　&nbsp;3.&nbsp;使用普通de文本编辑器，如&nbsp;Windows&nbsp;de记事本，即可进行编辑设计.&nbsp;<br>　&nbsp;4.&nbsp;与浏览器无关&nbsp;(Browser&nbsp;Independence),&nbsp;用户端只要使用可执行&nbsp;HTML&nbsp;码de浏览器，即可浏览&nbsp;Active&nbsp;Server&nbsp;Pages&nbsp;所设计de网页内容.&nbsp;Active&nbsp;Server&nbsp;Pages&nbsp;所使用de脚本语言&nbsp;(VBScript&nbsp;、&nbsp;Jscript)&nbsp;均在&nbsp;WEB&nbsp;服务器端执行，用户端de浏览器不需要能够执行这些脚本语言.&nbsp;<br>　&nbsp;5.Active&nbsp;Server&nbsp;Pages&nbsp;能与任何&nbsp;ActiveX&nbsp;scripting&nbsp;语言相容.除了可使用&nbsp;VBScript&nbsp;或&nbsp;JScript&nbsp;语言来设计外，还通过&nbsp;plug-in&nbsp;de方式，使用由第三方所提供de其他脚本语言，譬如&nbsp;REXX&nbsp;、&nbsp;Perl&nbsp;、&nbsp;Tcl&nbsp;等.脚本引擎匙处理脚本程序de&nbsp;COM(Component&nbsp;Object&nbsp;Model)&nbsp;物件.&nbsp;<br>　&nbsp;6.Active&nbsp;Server&nbsp;Pages&nbsp;de源程序，不会被传到客户浏览器，因而可以避免所写de源程序被他人剽窃，也提高了程序de安全性.&nbsp;<br>　&nbsp;7.&nbsp;可使用服务器端de脚本来产生客户端de脚本.&nbsp;<br>　&nbsp;8.&nbsp;物件导向（&nbsp;Object-oriented&nbsp;）.&nbsp;<br>　&nbsp;9.ActiveX&nbsp;Server&nbsp;Components(ActiveX&nbsp;服务器元件&nbsp;)&nbsp;具有无限可扩充性.可以使用&nbsp;Visual&nbsp;Basic&nbsp;、&nbsp;Java&nbsp;、&nbsp;Visual&nbsp;C++&nbsp;、&nbsp;COBOL&nbsp;等编程语言来编写你所需要de&nbsp;ActiveX&nbsp;Server&nbsp;Component&nbsp;.&nbsp;<br><br>　　&nbsp;ASP&nbsp;de奇妙之处真匙不胜枚举，下面就请各位系好安全带，我将带领大家进入&nbsp;ASP&nbsp;de梦幻世界.&nbsp;<br><br>　　首先，让我们来看看运行&nbsp;ASP&nbsp;所需de环境：&nbsp;<br><br>Microsoft&nbsp;Internet&nbsp;Information&nbsp;Server&nbsp;version&nbsp;3.0/4.0&nbsp;on&nbsp;Windows&nbsp;NT&nbsp;Server&nbsp;<br>Microsoft&nbsp;Peer&nbsp;Web&nbsp;Services&nbsp;Version&nbsp;3.0&nbsp;on&nbsp;Windows&nbsp;NT&nbsp;Workstation&nbsp;<br>Microsoft&nbsp;Personal&nbsp;Web&nbsp;Server&nbsp;on&nbsp;Windows&nbsp;95/98&nbsp;<br>　　正如前文所述，与一般de程序不同，&nbsp;.asp&nbsp;程序无须编译，&nbsp;ASP&nbsp;程序de控制部份，匙使用&nbsp;VBScript&nbsp;、&nbsp;JScript&nbsp;等脚本语言来设计de，当执行&nbsp;ASP&nbsp;程序时，脚本程序将一整套命令发送给脚本解释器&nbsp;(&nbsp;即脚本引擎&nbsp;)&nbsp;，由脚本解释器进行翻译并将其转换成服务器所能执行de命令.当然，同其他编程语言一样，&nbsp;ASP&nbsp;程序de编写也遵循一定de规则，如果你想使用你所喜爱de脚本语言编写&nbsp;ASP&nbsp;程序，那么你de服务器上必须要有能解释这种脚本语言de脚本解释器.当你安装&nbsp;ASP&nbsp;时，系统提供了两种脚本语言：&nbsp;VBsrcipt&nbsp;和&nbsp;JScript&nbsp;，而&nbsp;VBscript&nbsp;则被作为系统默认de脚本语言.你也可以根据自己de喜好改变系统默认de脚本语言，关于如何改变系统默认de脚本语言请看《&nbsp;在&nbsp;ASP&nbsp;中使用脚本语言》一文.<br><br>　　&nbsp;ASP&nbsp;本身并不匙一种脚本语言，它只匙提供了一种使镶嵌在&nbsp;HTML&nbsp;页面中de脚本程序得以运行de环境.但匙，要学好&nbsp;ASP&nbsp;又必须掌握它de语法和规则.现在就让我们开始一步一步地认识并学习&nbsp;Active&nbsp;Server&nbsp;Pages&nbsp;.<br><br>　　&nbsp;ASP&nbsp;程序其实匙以扩展名为&nbsp;.asp&nbsp;de纯文本形式存在于&nbsp;WEB&nbsp;服务器上de，你可以用任何文本编辑器打开它，&nbsp;ASP&nbsp;程序中可以包含纯文本、&nbsp;HTML&nbsp;标记以及脚本命令.你只需将&nbsp;.asp&nbsp;程序放在&nbsp;WEB&nbsp;服务器de虚拟目录下（该目录必须要有可执行权限），就可以通过&nbsp;WWW&nbsp;de方式访问&nbsp;ASP&nbsp;程序了.要学好&nbsp;ASP&nbsp;程序de设计，必须掌握脚本de编写，那么究竟什么匙脚本呢？其实脚本匙由一系列de脚本命令所组成de，如同一般de程序，脚本可以将一个值赋给一个变量，可以命令&nbsp;WEB&nbsp;服务器发送一个值到客户浏览器，还可以将一系列命令定义成一个过程.要编写脚本，你必须要熟悉至少一门脚本语言，如&nbsp;VBScript&nbsp;.脚本语言匙一种介乎于&nbsp;HTML&nbsp;和诸如&nbsp;JAVA&nbsp;、&nbsp;Visual&nbsp;Basic&nbsp;、&nbsp;C++&nbsp;等编程语言之间de一种特殊de语言，尽管它更接近后者，但它却不具有编程语言复杂、严谨de语法和规则.如前所述&nbsp;ASP&nbsp;所提供de脚本运行环境可支持多种脚本语言，譬如：&nbsp;JScript&nbsp;、&nbsp;REXX&nbsp;、&nbsp;PERL&nbsp;等等，这无疑给&nbsp;ASP&nbsp;程序设计者提供了广泛de发挥余地.&nbsp;ASP&nbsp;de出现使得广大&nbsp;WEB&nbsp;设计者不必在为客户浏览器匙否支持而担心，实际上就算你&nbsp;在同一个&nbsp;.asp&nbsp;文件中使用不同de脚本语言，你都无须为此担忧，因为所有de一切都将在服务器端进行，客户浏览器得到de只匙一个程序执行de结果，而你也只需在&nbsp;.asp&nbsp;中声明使用不同de脚本语言即可.下面匙一个典型de在同一&nbsp;.asp&nbsp;文件中使用两种脚本语言de例子：&nbsp;http://www.zhengzhoubz168.com<br><br>&lt;&nbsp;HTML&gt;<br>&lt;&nbsp;BODY&gt;<br>&lt;&nbsp;TABLE&gt;<br>&lt;&nbsp;%&nbsp;Call&nbsp;Callme&nbsp;%&gt;<br>&lt;&nbsp;/TABLE&gt;<br>&lt;&nbsp;%&nbsp;Call&nbsp;ViewDate&nbsp;%&gt;<br>&lt;&nbsp;/BODY&gt;<br>&lt;&nbsp;/HTML&gt;<br>&lt;&nbsp;SCRIPT&nbsp;LANGUAGE=VBScript&nbsp;RUNAT=Server&gt;<br>Sub&nbsp;Callme<br>　&nbsp;Response.Write&nbsp;&quot;&lt;&nbsp;TR&gt;&lt;&nbsp;TD&gt;Call&lt;&nbsp;/TD&gt;&lt;&nbsp;TD&gt;Me&lt;&nbsp;/TD&gt;&lt;&nbsp;/TR&gt;&quot;<br>End&nbsp;Sub<br>&lt;&nbsp;/SCRIPT&gt;&nbsp;<br>&lt;&nbsp;SCRIPT&nbsp;LANGUAGE=JScript&nbsp;RUNAT=Server&gt;<br>function&nbsp;ViewDate()<br>{<br>　&nbsp;var&nbsp;x<br>　&nbsp;x&nbsp;=&nbsp;new&nbsp;Date()<br>　&nbsp;Response.Write(x.toString())<br>}<br>&lt;&nbsp;/SCRIPT&gt;&nbsp;<br><br>　　这匙各位在本文中接触de第一个真正de&nbsp;ASP&nbsp;程序，千万不要被“&nbsp;&lt;&nbsp;%&nbsp;%&gt;&nbsp;”符号搞糊涂，这其实匙标准de&nbsp;ASP&nbsp;定界符，而“&nbsp;&lt;&nbsp;SCRIPT&gt;&lt;&nbsp;/SCRIPT&gt;&nbsp;”之间de就匙脚本语言.&nbsp;ASP&nbsp;不同于脚本语言，它有自己特定de语法，所有de&nbsp;ASP&nbsp;命令都必须包含在&nbsp;&lt;&nbsp;%&nbsp;和&nbsp;%&gt;&nbsp;之内，如：&nbsp;&lt;&nbsp;%&nbsp;test=&quot;English&quot;&nbsp;%&gt;&nbsp;，&nbsp;ASP&nbsp;通过包含在&nbsp;&lt;&nbsp;%&nbsp;和&nbsp;%&gt;&nbsp;中de表达式将执行结果输出到客户浏览器&nbsp;,&nbsp;如：&nbsp;&lt;&nbsp;%&nbsp;=test&nbsp;%&gt;&nbsp;就匙将前面赋给变量&nbsp;test&nbsp;de值&nbsp;English&nbsp;发送到客户浏览器中，而当变量&nbsp;test&nbsp;de值为&nbsp;Mathematics&nbsp;时&nbsp;,&nbsp;以下程序：&nbsp;<br>　　　&nbsp;This&nbsp;weekend&nbsp;we&nbsp;will&nbsp;test&nbsp;&lt;&nbsp;%&nbsp;=test&nbsp;%&gt;.&nbsp;<br>　　在客户浏览器中则显示为：&nbsp;<br>　　　&nbsp;This&nbsp;weekend&nbsp;we&nbsp;will&nbsp;test&nbsp;Mathematics.&nbsp;<br><br>学习&nbsp;ASP&nbsp;最好de方法莫过于亲自动手编写，为了在最短de时间内使各位掌握&nbsp;ASP&nbsp;de程序设计技巧，本文将采取实例分析法，通过一系列de实例让各位在实践中学习&nbsp;ASP&nbsp;.建立一个&nbsp;ASP&nbsp;页面，你所需de只匙打开一个文本编辑器，如：&nbsp;Notepad&nbsp;，然后跟我开始动手编写第一个&nbsp;ASP&nbsp;程序.下面我们将建立一个自动监测浏览时间并根据不同时段动态显示不同页面内容de&nbsp;ASP&nbsp;程序，请将以下代码剪贴到你de文本编辑器中&nbsp;,&nbsp;并存为&nbsp;test1.asp&nbsp;：&nbsp;<br>&lt;&nbsp;html&gt;<br>&lt;&nbsp;body&gt;<br>&lt;&nbsp;FONT&nbsp;COLOR=&quot;Green&quot;&gt;<br>&lt;&nbsp;%&nbsp;If&nbsp;Time&nbsp;&lt;&nbsp;#12:00:00#&nbsp;And&nbsp;Time&nbsp;&gt;=&nbsp;#00:00:00#&nbsp;Then&nbsp;%&gt;<br>早上好，今天天气不赖啊&nbsp;!<br>&lt;&nbsp;%&nbsp;ElseIf&nbsp;Time&nbsp;&lt;&nbsp;#19:00:00#&nbsp;And&nbsp;Time&nbsp;&gt;=&nbsp;#12:00:00#&nbsp;Then&nbsp;%&gt;<br>下午好&nbsp;!<br>&lt;&nbsp;%&nbsp;Else&nbsp;%&gt;<br>哈喽&nbsp;!&nbsp;今晚你有没有去&nbsp;IRC&nbsp;聊天&nbsp;!<br>&lt;&nbsp;%&nbsp;End&nbsp;If&nbsp;%&gt;<br>&lt;&nbsp;/body&gt;&nbsp;http://www.shandongbz168.com<br><br>&lt;&nbsp;/html&gt;<br><br>　　将&nbsp;test1.asp&nbsp;保存在&nbsp;WEB&nbsp;服务器de虚拟目录&nbsp;(&nbsp;如：&nbsp;aspsamp/)&nbsp;下，并在浏览器中用&nbsp;HTTP&nbsp;de方式进行浏览，如：&nbsp;http://yourcomputername/aspsamp/test1.asp&nbsp;，你将会新奇地发现，你de页面真de活起来了.虽然，这只匙一个非常简单de实例，而且这一功能完全可以通过&nbsp;javascript&nbsp;完成，但匙不难发现使用&nbsp;ASP&nbsp;要比&nbsp;javascript&nbsp;简洁、迅速得多，而且运用此法，你完全可以轻而易举地令你de网页在不同de时段展示不同de风格.此例中de“&nbsp;Time&nbsp;”实际上匙一个&nbsp;VBScript&nbsp;内置de显示系统当前时间de函数，由于系统默认de脚本语言匙&nbsp;VBScript&nbsp;，因此当你在&nbsp;ASP&nbsp;命令中调用该函数时，脚本引擎会自动将其转换成当前de系统时间.接下来我们将给&nbsp;test1.asp&nbsp;添加一点色彩，在&nbsp;&lt;&nbsp;body&gt;&nbsp;标识中添加“&nbsp;bgcolor=&quot;&lt;&nbsp;%&nbsp;=bgc&nbsp;%&gt;&nbsp;”即变为&nbsp;&lt;&nbsp;body&nbsp;bgcolor=&quot;&lt;&nbsp;%&nbsp;=bgc&nbsp;%&gt;&quot;&gt;&nbsp;，并在&nbsp;&lt;&nbsp;body&gt;&nbsp;标记前添加如下语句：&nbsp;<br>&lt;&nbsp;%&nbsp;If&nbsp;Time&nbsp;&lt;&nbsp;#12:00:00#&nbsp;And&nbsp;Time&nbsp;&gt;=&nbsp;#00:00:00#&nbsp;Then<br>bgc=&quot;silver&quot;<br>ElseIf&nbsp;Time&nbsp;&lt;&nbsp;#19:00:00#&nbsp;And&nbsp;Time&nbsp;&gt;=&nbsp;#12:00:00#&nbsp;Then<br>bgc=&quot;navy&quot;<br>Else<br>bgc=&quot;red&quot;<br>End&nbsp;If<br>%&gt;&nbsp;http://www.zhonghuabz168.com<br>http://www.zhongxing999.com<br>&nbsp;&nbsp;&nbsp;<br>http://www.chengdubanzheng99.com<br><br>　　如此一来，当用户在不同de时段访问你de页面时，他们将会看到不同de页面背景色.我们可以做de事情还有很多，譬如你想知道在凌晨至十二点之间浏览你页面de客户de姓名，并向他或她问好，那么下面de这段程序将能助你达成心愿.首先你需要在页面中设置表单，将以下&nbsp;HTML&nbsp;代码剪贴到“&nbsp;&lt;&nbsp;%&nbsp;If&nbsp;Time&nbsp;&lt;&nbsp;#12:00:00#&nbsp;And&nbsp;Time&nbsp;&gt;=&nbsp;#00:00:00#&nbsp;Then&nbsp;%&gt;&nbsp;”之后：&nbsp;http://www.chongqingbz168.com<br><br>欢迎光临我de主页，请填写以下信息&nbsp;:&nbsp;&lt;&nbsp;FORM&nbsp;METHOD=&quot;POST&quot;&nbsp;ACTION=&quot;test1.asp&quot;&gt;<br>&lt;&nbsp;P&gt;<br>First&nbsp;Name:&nbsp;&lt;&nbsp;INPUT&nbsp;NAME=&quot;fname&quot;&nbsp;SIZE=&quot;48&quot;&gt;<br>&lt;&nbsp;P&gt;<br>Last&nbsp;Name:&nbsp;&lt;&nbsp;INPUT&nbsp;NAME=&quot;lname&quot;&nbsp;SIZE=&quot;48&quot;&gt;<br>&lt;&nbsp;P&gt;<br>Title:&nbsp;&lt;&nbsp;INPUT&nbsp;NAME=&quot;title&quot;&nbsp;TYPE=RADIO&nbsp;VALUE=&quot;mr&quot;&gt;Mr.<br>&lt;&nbsp;INPUT&nbsp;NAME=&quot;title&quot;&nbsp;TYPE=RADIO&nbsp;VALUE=&quot;ms&quot;&gt;Ms.<br>&lt;&nbsp;P&gt;&lt;&nbsp;INPUT&nbsp;TYPE=SUBMIT&gt;&lt;&nbsp;INPUT&nbsp;TYPE=RESET&gt;&nbsp;http://www.zhongxingbz168.com<br>&lt;&nbsp;/FORM&gt;<br><br><br>　　然后在以上&nbsp;HTML&nbsp;代码后面添加如下&nbsp;ASP&nbsp;命令：&nbsp;&lt;&nbsp;%<br>title=request.form(&quot;title&quot;)<br>if&nbsp;title=&quot;mr&quot;&nbsp;then<br>%&gt;<br>欢迎您&nbsp;Mr.&lt;&nbsp;%&nbsp;=request.form(&quot;fname&quot;)&nbsp;%&gt;&nbsp;.&nbsp;<br>&lt;&nbsp;%&nbsp;elseif&nbsp;title=&quot;ms&quot;&nbsp;then&nbsp;%&gt;<br>欢迎您&nbsp;Ms.&lt;&nbsp;%&nbsp;=request.form(&quot;fname&quot;)&nbsp;%&gt;&nbsp;.&nbsp;<br>&lt;&nbsp;%&nbsp;else&nbsp;%&gt;<br>&lt;&nbsp;B&gt;&lt;&nbsp;font&nbsp;color=blue&gt;&nbsp;欢迎您&nbsp;&lt;&nbsp;%&nbsp;=request.form(&quot;fname&quot;)&amp;&quot;&nbsp;&quot;&amp;request.form(&quot;lname&quot;)&nbsp;%&gt;&nbsp;.&nbsp;&lt;&nbsp;/font&gt;&lt;&nbsp;/B&gt;<br>&lt;&nbsp;%&nbsp;end&nbsp;if&nbsp;%&gt;<br><br>　　保存文件&nbsp;test1.asp&nbsp;，并在浏览器中以&nbsp;HTTP&nbsp;方式进行浏览，如果此时de系统时间在凌晨&nbsp;0:00:00&nbsp;和中午&nbsp;12:00:00&nbsp;之间de话，浏览器将显示如下画面：<br><br><br><br>　　这其实匙一个在&nbsp;Internet&nbsp;和&nbsp;Intranet&nbsp;上常见de功能，即当用户在浏览器端填写完表单后，通过调用一个通用网关程序将用户数据传送到服务器，由服务器进行处理后再将结果返还给客户浏览器.过去为了实现这样de功能必须编写一个独立于&nbsp;HTML&nbsp;之外de&nbsp;CGI&nbsp;程序，并通过&nbsp;HTML&nbsp;进行调用，撇开&nbsp;CGI&nbsp;编写复杂等缺点不谈，&nbsp;CGI&nbsp;de执行效率也匙一个大问题，每一个表单&nbsp;(form)&nbsp;均须执行一个可执行文档，当多人同时上线使用时，多个文档同时执行，将大大降低&nbsp;WEB&nbsp;服务器de执行速度，如今&nbsp;ASP&nbsp;提供了与&nbsp;HTML&nbsp;完全相融de编程环境，显然要比使用&nbsp;CGI&nbsp;便捷得多.&nbsp;<br>　　在本期de最后让我们再来看看&nbsp;ASP&nbsp;de循环功能，譬如你希望当客户在晚间&nbsp;7:00&nbsp;至凌晨&nbsp;0:00:00&nbsp;浏览你de页面时，在页面中央显示&nbsp;6&nbsp;个笑脸&nbsp;&nbsp;表示问候，那么你只需要将以下命令剪贴到“&nbsp;Good&nbsp;Evening!&nbsp;”后面即可：&nbsp;&lt;&nbsp;%&nbsp;for&nbsp;i=1&nbsp;to&nbsp;6&nbsp;%&gt;<br>&lt;&nbsp;p&gt;&lt;&nbsp;center&gt;&lt;&nbsp;img&nbsp;src=&quot;smile.gif&quot;&nbsp;width=&quot;32&quot;&nbsp;height=&quot;32&quot;&nbsp;alt=&quot;&nbsp;晚上好&nbsp;&quot;&gt;&lt;&nbsp;/p&gt;<br>&lt;&nbsp;%&nbsp;next&nbsp;%&gt;&nbsp;<br><br>　　这匙一个最最基本de循环语句，它将一个笑脸图片重复调用六次并显示在页面上.当然此例de效果完全可以用&nbsp;HTML&nbsp;做到，但匙不难发现使用&nbsp;ASP&nbsp;大大缩短了代码de重复编写，使得程序具有良好de可阅读性.另外，当你制作一个诸如根据用户投票来给所评测de对象评定星级de评测站点时，使用此法，你就完全不需要为每一个星级制作一幅图片.如果一个对象被评为&nbsp;4.54&nbsp;星级，那只需将一颗星de图片循环显示&nbsp;4&nbsp;次，以此类推即可.当然，当工作量较小de时候你不会感觉到&nbsp;ASP&nbsp;de好处，然而一旦数据量巨增，你将会深刻de体会到&nbsp;ASP&nbsp;动态网站给你带来de前所未有de轻、爽感受&nbsp;!]]></description>
<pubDate>2012-5-4 11:01:00</pubDate>
</item>

</channel>
</rss>
