SQL Server性能调优入门(图文版)

第一步,在业务高峰期抓取样本数据(2个小时左右)。采用的工具是sqlserver自带的profiler,也叫事件探查器,如下图:

进入后,点击最左面的按钮,建立一个新的跟踪:

登录需要用DBO权限,所以可以用sa登录,也可以用windows集成验证方式(如果当前登录的就是sqlserver的话)

新建跟踪,一共有4个tab页进行配置,首先看第一个。跟踪名称不用更改,默认的即可。保存一共有两种方式,一是文件,扩展名是.trc(这种方式方便你把客户那里的跟踪结果发给你),其二是数据库中的表。

为了分析方便,我们把它另存为表。此时sql提示你重新进行登录,这里我们把表保存到master中

假设表名字叫做jq(如果有重复的,系统会提示是否覆盖)

确定后回到了刚才的第一个tab页中:

然后切换到第二个选项卡中:

左面列出了各种事件类(Event Class),右面是当前已有的事件类。对于性能调优,我们不需要安全审核、会话信息,点击删除按钮即可:

继续切换到第三个tab页上,这里的数据列默认就够了,当然,如果你看着不顺眼,可以把Appname/NT username等都删除。

最后一个tab页上,我们需要把系统自己产生的事件ID屏蔽掉:

把那个排除系统ID进行check即可,如下图:

所有项目配置好后,点击“运行”按钮。持续运行两个小时左右即可(业务高峰期,能典型的反应客户最近一段时间内的业务模式)

好了,第一步的准备工作完成了,等待一段时间后,我们开始检查刚才自动保存到master中的表jq。

第二步,开始查找影响速度的地方。

打开查询分析器(sql analyzer),登录到master中,从 表jq里面按照I/O倒序,读取若干个sql。根据我的习惯,一般是读取1000条记录。为什么根据I/O来找呢,而不是根据时间来找呢?原因很简单,一句SQL执行,“稳定”的是I/O,而duration是一个不稳定的因素。我们进行sql调优的目的,就是降低I/O成本,从而提高效率。(一般而言,I/O降低了,duration自然就会降低)详细内容,参考我以前的post:http://blog.joycode.com/juqiang

执行完成后,我们仔细看下面的输出。

1、 XL_TALLY_Proc04这个sp的reads最大,将近100w,duration也达到了25秒多。

2、 Erp_IM_GMBill_GetBill这个sp的I/O不算大,才7w,duration平均都在1秒多点。但是这个sp执行的次数非常多。

经过询问客户,XL_TALLY_Proc04这个sp执行的频度很低,一天也就一两次,但是Erp_IM_GMBill_GetBill大概5分钟就要一次。这样整体I/O就占用的非常大。

所以这里我们要重点分析Erp_IM_GMBill_GetBill这个sp,而不是第一个!

总结一个原则就是:调整的重点是客户最关心的内容,是执行频度最高、看起来I/O又比较大的那种。I/O最大的,不一定是我们要优先解决的内容。

第三步,开始分析刚才看到的那个语句。既然我们要分析I/O,那么就要把I/O打开,这样每次调整sql,我们都能随时看到I/O的变化情况。这句很有用处地:set statistics io on

单纯看I/O变化,我们会晕倒的。因为我们不知道自己做的任何改动,对I/O是如何产生影响的。所以,还要看sql的执行计划是怎佯的。 在查询分析器中,我们按Ctrl+K,或者如下图的菜单,check上即可。

好了,准备工作都做好了,下面开始干活了。

我们首先看sql语句的调优,假设下面这条sql语句性能低下:

上面的sql一共读取了6636条数据,逻辑读是1126。那么这个I/O是否合理呢?大了还是小了?还有改进的余地吗?我们看执行计划:

哦,一共4个咚咚在里面。Index seek的成本占了2%, index scan的占了47%,hash match占了51%,select最终是0%。我们应该牢记第二个原则,所有的index,尽可能的都走index seek。

我们看一下billsoflading的索引信息:

当前索引为什么走scan,这里就不说了,感兴趣的可以随便找一本介绍数据库索引的书籍来看看即可。根据我以前那篇blog的描述,我们知道应该建立一个复合索引(也叫convered index):boldate+companyid+bolcode

然后我们重新执行sql,看看I/O变化情况:

Ooh,非常cool!logical reads降低到了50。为什么会这样呢?我们看一下执行计划:

原来是index scan变成了index seek,效率自然大大的提升!

Sql语句在index上调优的方法,基本就是这样。我们继续看sp的。

 

对于sp的调优,有一点是和sql调优不同的:sp内部的逻辑处理可能非常复杂。单纯从查询分析器中,我们无法得知哪一小块的sql执行的I/O最大,我们只能看到一个总体的描述。所以,我们要知道sp内部的信息。

首先,了解自己当前的spid是多少。一种方法是select @@spid,另一种方法是看查询分析器下面的status bar的信息。

Ooh,我的spid是101。(上图的最下面那个tips)

然后我重新打开profiler(事件探查器),重新建立一个跟踪,这里面要修改第二个tab页的信息,把左面事件列“存储过程”中的SmtpCompleted加上

增加后的样子如下:

然后修改第4个tab页,把刚才看到的spid=101的信息填上:

点击运行后,这样profiler只能抓到在查询分析器中,spid=101那个窗口发送的sql。我们切换回查询分析器,执行有问题的sp,执行完成后,我们再回到profiler,点停止按钮。一个sp内部所有执行的sql,都被分开了!

这次的结果假设保存在了jq2表中,我们把所有执行的小片sql都列出来:

第一个是sp执行后的总体结果,I/O为62328,就是这个sp自己的。第二个是向临时表中插入数据,I/O为61514,我们很容易看到,这一句占用了整个sp的大概95%以上的成本。如果我们把这句insert into #temptable搞定,整个sp的成本自然就下来了。所以我们需要把这句insert搞出来。

但是慢着!default情况下,sqlserver的results只显示很少的字符,第二行的sql,我们根本抓不全的,所以我们需要修改一下设置。在查询分析器的工具-选项菜单中,切换到“结果”这个tab页,修改每列最多字符个数为8192(这是最大的允许值),然后点击“确定”按钮,重新从jq2中读取信息。也许你会问,如果某个sql特别长,怎么办?其实很简单,在你的代码中把这句sql单独写到log中,或者直接修改sp,把这句print出来即可。

Ok,我们把这句insert sql抓下来后,放到查询分析器中。因为temptable我们没有它的结构,所以我们把insert部分注释掉,看后面的select语句。执行后,ooh,在goodsmovement表上的成本是57834。

老办法,我们继续看执行计划:

其实,现在又回归到了sql调优的步骤,下面的工作我就不写啦!

 

这个步骤,看起来很简单,希望大家对于sql调优(索引部分)心中都有这么一个概念,知道第一步作什么,第二步作什么。还是那句话,索引调优,基本上是最简单的。但是貌似简单的东西,我们越应该重视。你随便找一个应用跟踪一下,各种效率低下的索引,会让你实在#¥*#(**……¥

打不开删不掉的特殊文件夹的建立与删除等

附创建一个打不开删不掉文件的方法

以建一个6618.文件夹为例:
1、在命令提示符下输入:
md 6618../

2、你就会发现建成了一个6618.的文件夹。

3、这个文件夹双击打不开也删不掉,同时普通模式下也删不掉。
如下两幅图:

 

 

 

 

 

 

 

4、那如何放文件进去呢?可以用COPY命令复制文件进去。
copy 文件名 d:/6618../

5、那如何打开这个文件夹呢?
在运行中输入完整的路径和文件夹的名称就行了,如下2幅图:

6、那如何删除呢?看下图:

原理:用了windows的非法命名
好处:自已想吧
用过矮人DOS5.0版的朋友应该就知道,装了它后,分区中有一个argho.的文件名,其生成原理我这里发的帖子是一样的。这个是nt系列系统的bug,在dos或者win9x下就可以正常访问nt系统创建的这种文件夹,但不能创建此类文件夹。如果是NTFS格式,9X就无能为力了。病毒利用MS的其他BUG进行攻击,矮人利用MS的这个BUG进行备份GHO,最了不起的是:GHOST.EXE在DOS下能认识这样的文件夹——兼容MS的这个BUG。

再有一种文件夹是可以正常打开不能删的

创建:MD "D:/6618 / "

删除:RD /Q /S "D:/6618 / "

注意:引号最好要有,还有空格,如:"D:/6618空格/空格"

再来个看不见的

MD D:/…/

RD /Q /S D:/…/

注意:这个文件夹在资源管理器里是看不见的,命令提示符就能看见
打开方式:运行(win+r)输入D:/…/

注意哦使用RD /s /q D:/…/少个.会把D盘文件都删除了!!!!!!!!!!

补充一个,可以正常打开当然也是不能通过资源管理器删除
大家都知道在资源管理器里是不能用空格命名文件夹的

创建:MD "D:/ / "

删除:RD /Q /S "D:/ / "

注意:引号最好要有,还有空格,如:"D:/空格/空格"

 

补充说明:

一、

如果你建个md 6618../这样的非法文件夹。

再在资源管理器中建个6618的文件夹。原来的6618.就可以打开。不过看不到里面的文件。而且可以删除6618.文件夹。不过删了6618.文件夹的话。里面原来的文件会跑到后面建的6618文件夹里去。这个6618文件夹也会变得无法删除。无法打开。

但如果是运行*:/6618../的话,还是可以看到里面的文件。

6618.文件夹和6618文件夹同时存在的时候,可以给6618.文件夹改名成6618文件夹.这时就同时存在两个6618文件夹
但如果你删除其中的一个文件夹后,刷新后,还是会返回成6618.文件夹
在xp的命令行可以轻松建立这样删不掉的文件夹,可在纯dos下却不行!

md 6618../

二、

建一个不带"."   功能与带"."   的"bug文件夹":

1.md 建立一个带"."文件夹,如:md 6618../
2.建立一个普通文件夹(名称同上面带''.",没点,如普通方法右键建里文件夹 6618)
3.普通方法删除带点的文件夹
4.后面留下的6618文件夹也是普通方法打不开,删不掉,同原6618.文件一样用,就是名称上看起来没"."

三、再来伪装"bug文件夹"

1.建6618.文件
2.copy命令复制文件进6618.文件
3.普通建6618文件
4.此时可以打开6618.与6618,且两文件夹似乎使用的是同样的磁盘空间,普通方法复制进其中一个文件夹,另一个文件夹会有同样的文件出现.但是在第2步中copy进文件夹的文件不会显示.
5.两个文件都可以用普通方法删除,但是不管是删除哪个(6618.或是6618),剩下的那个文件夹(6618或是6618.)与第1步中建立的6618.具有相同功能,普通方法不能打开,不能删除.
6.命令删除,添加文件方法,就是大家一起在讨论的
7.所以可以建立名称如同普通文件夹一样的"bug文件夹"(只是名称看起来一样而已),可以把一些想保护起来的文件放到里面,免于误删,被该等问题.

一些有意思的现象:

1、如果把文件拖到这个*.文件夹里。那么,他马上会生成个*(同名文件夹)并且拖进去的文件可见,但是见不到之前用在运行D:/*../拷进去的文件。并且。如果在拖进文件之后用D:/*../进去看。是看不到拖进去的文件。你把这同名的两文件夹删掉其中之一后,用运行D:/*../进去看。还是看不到拖进去的文件。

2、我们可以先建立一个如wuyou的文件夹。再把其设为隐藏属性,然后再利用WINRAR这个软件来对其文件夹命名为WUYOU../至此大功告成,其文件夹达到一般不可删除,隐藏的的功能.再把文件夹选项设为不显示隐藏文件.

3、现在只是在2000里运行里用*../进入不了文件夹,在XP里就可以进入

4、在分区建立资源管理器看不见的这个目录,分区必须是FAT32格式,NTFS是无法建立的

5、其实分区里面*.文件是可以删除的,(注意是文件不是文件夹)
方法如下,
用DIR/X来获取*.文件的短文件名.
再用DEL来删除.
看演示

dir /X 显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,短名称插在长名称前面。如果没有短名称,在其位置则显示空白。

请不要忽视健康体检的重要性

  定期体检是一种保障健康的有效手段。有些原来自认为健康的人,被发现患病时,已经出现了肾衰竭;有些自认为没病的人,被发现肝硬化;有的乙肝病人被查出转氨酶很高,处于传染期,急需住院隔离……这样的事例还有很多,而如果能做到定期体检,就可及早发现潜在的致病因子、早期病灶或功能异常等情况,达到早期发现、早期治疗的目的。

  健康体检是一种新的自我保健方式,它可以变被动看病为主动检查,变消极治病为积极防病。医疗专家认为,看似健康的人也应该每年或至少两年进行一次体检,因为定期体检能够早期发现一些无痛或症状不明显的疾病。

  某单位职工健康体检,被检总人数为1462人,其中妇女506人。通过这次体检,查出高血压182人,占17.4%;高血脂208人,占14.2%;脂肪肝167人,占11.4%;糖尿病64人,占4.3%;肝癌2人,占0.14%;乳房疾病54人,其中乳腺癌1人,占10.6%(体检妇女)。另据中科院某研究所的一次健康体检发现:被检查的66名中年知识分子,有35人程度不同地患有各种疾病,其中有2人为早期肿瘤。再如深圳市某保健中心对全市26000名青年干部职工的健康档案的调查分析表明:30~45岁年龄段中,高血压发病率近10%,高血脂发病率约占25%,脂肪肝发病率约占20%。以上数字是触目惊心的。健康体检的重要性就在于使这些潜伏在身体里的“定时炸弹”及早暴露,并及时治疗,这对逆转病情,恢复健康,提高生活质量至关重要。花最少的钱获取健康的最佳效益,定期体检不失为上策。(数据来自网上资料)

  从医学角度讲,疾病的发生可分为五个阶段:

  (1)易感染期:此时疾病尚未发生,但危险因子已经存在了;如超重、肥胖、抽烟、酗酒、血压过高等情形的人。

  (2)临床前期:此时疾病因子已在人体内某部位产生病理上变化,但在外观及日常生活尚未有症状出现。

  (3)临床期:此时疾病的症状逐渐地显现出来。

  (4)残障期:疾病晚期。

  (5)死亡:功能的破坏影响生理代谢作用,引发身体重要器官步入衰退期,导致死亡。

  在一般情况下,一个人都会等到疾病的症状已出现时才会想到去找医师,其实那时的疾病已达到临床期了。然而,大部分的慢性疾病,若在临床期之前发现,就应及早治疗,治疗效果会远比症状显现后才治疗要好,而且康复几率也比较高。假若疾病到临床期才发现,所花费的时间与精力就会相对地增加,而且治愈率较低。

  因此我们做健康检查的目的就是趁着疾病潜在人体中尚未有症状时,通过早期检查,做到早期发现,早期治疗。只有这样才能增加医疗效果,减少疾病继续恶化,保证身体的健康。总而言之,做健康检查的目的可归为下列三点:

  (1)早期发现潜在的致病因子,及时有效的治疗。

  (2)观察身体各项功能反应,适时予以调整改善。

  (3)加强对自我身体功能的了解,改变不良的生活习惯,避免危险因子的产生,提高健康水平

  我们说说的“定期”,就是要每隔一定的时间体检一次,其长短可视不同情况而有所不同。年轻人可以一年查一次,而中老年人最好半年体检一次。当然,定期体检要因人而异,根据检查追踪的项目而定。定期体检还有一项好处,就是可以建立自己的“参考值”,作为推断自己身体健康状况的参考,从测定数值的变化中能了解更多的东西。因此,每年的定期体检不可或缺。

  基因图谱的研究预测人们寿命将会更长。不过,根据目前的条件来看,我们如何才能活得更长寿呢?答案就是:1、要有良好的环境,健康的饮食和生活方式等,尽量阻止疾病的发生;2、定期体检。有许多病待到有症状时才就医治疗的话,往往为时已晚。例如癌症,待到长得很大有症状才手术切除,往往已有转移而存活不久。但是如果早期发现经过手术切除后复发率就很低。还有一些病如高血压、高血脂、糖尿病等,在早期并无症状,只有靠检查才能发现。而到晚期有症状而且有并发症时,治疗就很棘手。因此,无论如何,及早发现疾病是治疗成功的关键。因此定期体检是必要也是必须的。

  那么定期体检究竟应该从何时开始,间隔几年,做哪些检查呢?根据网上查找的资料,以下意见可以作为参考。

  21岁就要定期测血压。30岁以上定期测血脂。40岁以上定期测血糖。具体来说,有这些病的家族史和这些病的风险因子者就应早开始,隔一、二年查一次。如工作、生活紧张者考虑高血压;体胖、营养过剩者考虑高血脂;年老体胖者考虑糖尿病等。妇女在20~39岁应由专科医生每3年查一次乳房,40岁以上间隔短些,以排除乳腺癌。中年以上生育过妇女应每3年查一次子宫颈刮片,以排除宫颈癌。男性50岁以上应每年检查一次前列腺,包括肛门指检及抽血查前列腺特异抗原(PSA)。因为男性癌症中前列腺癌是名列前茅的。此外,体检中应包括胸部X线透视以排除肺癌,以及抽血测甲胎蛋白及癌胚抗原等以排除肝癌等。必要时作B超检查肝、肾及前列腺等部位。

  另外,美国梅奥医学中心的专家们还为您提供了一个定期健康体检的清单。它一共涉及9个项目。这张清单就会告诉您什么时候应该去做什么检查。

  1、牙齿检查:从一岁起,每年至少做一次牙齿检查。

  2、视力检查:从三岁起,第一次检查视力。以后视情况每3-5年检查一次。

  3、血压检查:在您10岁的时候,应该做第一次血压检查,以后至少每两年做一次。

  4、宫颈涂片检查:如果您是女性,在您18岁的时候(或者性行为以后)做第一次宫颈涂片检查。以后1-3年检查一次。在获得连续三次阴性结果后,检查间隙可以延长。

  5、胆固醇检查:在您20岁的时候,做第一次血胆固醇检查,以后每五年做一次。

  6、乳房检查:如果您是女性,在您40岁的时候,做第一次由医生进行的乳房检查。

  7、前列腺检查:如果您是男性,在您50岁的时候,第一次做前列腺检查。注意有些医生希望您在40岁时就做。

  8、乳房造影检查:如果您是女性,在您50岁的时候,第一次做乳房造影检查。注意有些医生希望您在40岁就做。

  9、直肠镜检查:在您50岁的时候,您开始做第一次直肠镜检查,以后3-5年做一次。

  最后建议:亚裔大肠癌发生率低,但胃癌发生率高,故此项宜改为做胃镜检查为宜。

经常运动究竟能给人带来什么?

  毋庸置疑,科学的运动是对抗衰老,强身健体最有效,最安全的方法。

  科学家通过对长寿老人进行的调查结果表明,长寿老人80%是坚持劳动和体育运动的。现代运动心理学的研究也证明了劳动与运动对保持健康和提高器官生理功能的重要性。适当的劳动和运动可以促进新陈代谢过程,延缓衰老。

  瑞典科学家对3206名65岁以上的老年人做了长达12年的追踪调查,发现每周坚持锻炼可以延年益寿。运动项目包括骑单车和步行运动。如果偶尔锻炼一下,也许可以降低死亡机会,而每周坚持锻炼几次则可降低死亡机会达40%。在俄罗斯鞑靼共和国妇女中开展的“我的年龄就是我的财富”的竞赛中,108岁的阿明娜·哈努姆·希加波娃荣登榜首。希加波娃经常在家里勤恳劳动,锻炼身体。她健康的秘诀是一句话:“谁不运动谁就不会长寿。”

  国外医学家对健康长寿问题,提出六个方面的情况要人们引起重视。

  1、保持神经系统的稳定性,并尽量保持良好情绪。

  2、不断增强心血管系统功能:心血管系统是现代人生命保障体系中最薄弱的一环,增强其功能的有效手段是竞走、跑步、游泳、滑雪、划船和骑自行车。这些活动脊益于心血管系统,对人体的神经、呼吸及其他系统也有积极作用。

  3、保持正常的体重:体重超过正常标准,极易导致各种器官提早衰老。要战胜肥胖症只有两种可靠的办法:一是食物的热量有所限制,但营养成分要充足(宜多食用天然蔬菜和水果,少吃面食与甜食);二是以循环性锻炼(竞走、跑步、游泳、滑雪、骑自行车)为主的积极运动。

  4、加强锻炼,增强身体的抵抗力:身体的抵抗力越强,受疾病的侵害就越少。锻炼的唯一途径,就是经常进行体温调节机制的锻炼(一年四季以轻装为宜,冷疗法、冷热水淋浴等)。

  5、促进呼吸器官日益强健,并抛弃有害健康的习惯:首先是吸烟与喝酒。其目的大都是改善大脑供血系统和其他器官的功能,也可使免疫系统得以增强。

  6、强化骨骼肌肉组织和各关节功能:这一条对所有内脏器官来说都极其重要。甚为发达的骨骼肌肉能使内脏器官的机能加强。要使这些器官经常处于训练状态,其手段是通过体操和按摩来增强双手、背部、腹部、胸部、双腿、脖子等部位肌肉,并有助于改善体态和使关节灵活!

  从以上六条大家都能看出健康与运动息息相关。

  经常运动能给人带来什么呢?

  1、运动促使皮肤健康。运动能增加皮肤的血液循环,促进新陈代谢,提高感觉的灵敏度,加强皮肤如毛孔、汗腺、皮脂腺等对冷热刺激的适应能力,从而增强人体的防御能力及免疫力。

  2、运动可增强心血管系统的功能。爱好运动的人,心肌纤维增粗,心脏收缩力增强,营养心脏的冠状动脉血管管壁弹性增高,从而使心脏的供血得到改善,使心脏功能增强。这样可预防或推迟心血管疾病,如动脉硬化、高血压、冠心病等发生。

  3、运动可改善呼吸系统功能。经常运动,呼吸肌强壮有力,吸气时胸廓充 分扩张,使更多的肺泡张开而收人更多的氧气,呼气时胸廓尽量压缩,排出更多的二氧化碳和废气,通过长期的锻炼,人的呼吸变成深而慢,便呼吸肌得到充分 的休息。呼吸功能好可使人体维持旺盛的精力,从而推迟身体的老化过程。

  4、运动可提高消化系统的功能。人在运动中会增强体内营养物质的消耗, 使整个机体的血液循环加速,新陈代谢旺盛,从而提高食欲,还会促进胃肠蠕动,消化液分泌增加,吸收增加,改善肝脏的功能,从而为中老年人的健康提供良 好的物质保证。

  5、运动改善神经系统的功能。运动时各部分肌肉有规律而协调地收缩,对 神经系统是一个很好的锻炼,使机体灵活,动作迅速,精力充沛,机体保持良好的防御机能。科学家研究证明,经常参加体育锻炼能增强体质,减少疾病,促进 健康,运动可使人体血液畅通,新陈代谢旺盛,使身体的各个器官的互相联系更 加密切而协调,还能使大脑的紧张状态得到缓和,提高大脑的工作效率。

  6、运动可改善骨骼系统的功能。经常运动可使肌纤维变粗而坚韧有力,其 中所含蛋白质及糖元等的储备量增加,血管畅通,血液循环及新陈代谢改善,动作的耐力、速度、灵活性、正确性都增强。肌肉附着于骨骼,经常运动会改善骨 骼的血液循环和代谢,使骨外层的密质增厚,骨质更加坚固,延缓骨质疏松和脱 钙等老化过程,从而提高了骨骼系统抗折断、弯曲、扭转的能力。

  如何通过运动来健康长寿

  健身跑

  健身跑是最常见的一种中老年人的健身锻炼方法。健身跑的保健作用在于使心肺功能得以增强,氧的摄取和血流量得到改善。

  年轻时最好天天锻炼,每次跑步距离在2000—3000米左右。在中年以后改为每周锻炼5次,将跑步的距离加长了些,但强度减小了些;到了60岁以后改为隔日锻炼,每次锻炼跑5000米左右。如果腿感觉不舒服时,就将跑步改为大步长距离走,强度以感觉舒适为准。

  实际上,健身跑的形式不用过分拘泥,可以多采用些如快走、后踢腿跑、扩胸展臂、深呼吸等辅助动作,增加锻炼时的欢乐和兴趣。此外,健身跑时要讲究心理卫生,排除一切杂念,保持愉快心理状态。为了提高锻炼者的兴趣和调节运动量,健身跑主要有以下几种形式:

  走跑交替。这种形式适合初练健身的人。开始时用一般速度走一段距离,再慢跑一段距离,这样走跑交替进行,随着锻炼者体力、耐力的提高,可逐渐缩短走的距离加长跑的距离。

  慢速放松跑。经过走跑交替一段时间的锻炼以后,可采用慢速放松跑。开始时速度不宜快,而且要匀速,呼吸深长细缓,并与脚步配合,有一定的节奏,可两步一吸,两步一呼或三步一吸,三步一呼。跑时摆臂要自然,上体要正直,眼向前看,步伐保持轻快,通体放松。跑的路线、距离和时间要固定,随着体力、耐力的提高可适当增加。

  变速跑。这种方法适合已经有一定基础的健身跑锻炼者。变速跑是慢跑和中速跑交替进行。慢跑主要是调整体力和呼吸,中速跑是适当加大运动强度。这种方法能提高锻炼者的兴趣和增强其体力和耐力。随着锻炼效果的提高,可适当缩短慢跑距离,增加中速跑的距离。

  限定跑。分为三种,一种是不限跑的速度和距离,只规定跑的时间,如20分钟、30分钟、1小时定时跑。一种是只规定一次跑的距离,如3000米、5000米。还有一种是既规定时间又规定距离,如用30分钟跑完5000米。这种方法可提高体力和耐力,培养意志,但要求较高。

  原地跑。这种方法一般多在因气候因素不能在室外进行时采用,即在原地跑步,为了提高运动强度和兴趣,可增加动作幅度和难度,如原地小步跑,原地抬腿跑,原地踢腿跑,也可采用一定时间计数跑,如1分钟可以一共跑多少步等等。

  需要注意的是,对于中老年人来说,虽然健身跑有益健康,但必须科学、适量,从自身身体状况出发。即使对于那些健康的中老年人朋友们来说,也要注意在参加大运动负荷的活动或比赛之前,都必须经过两三个月以上时间的专门准备并且进行医务监督,以保证安全;之后还要十分注意休息,只有完全恢复体力后方开始正式锻炼。

  散步

  散步能健身治病、益寿延年,已被科学实践证实。美国盐湖城老年人健康中心曾做过一项实验,让部分55—70岁老人每周3次、每次散步一小时。持续4个月后,老人与整天坐着不动的人相比身体反应的速度加快、视力提高、心脏功能增强、原有的病痛减轻,甚至还增强了记忆。另一所美国圣路易斯州的华盛顿大学,也做了一项实验,让患有骨质疏松妇女服用适量的钙片,配合每周3次,每次一小时的散步。持续22个月,脊椎骨密质增加6%,她们的身体骨质更加结实了。

  但对于中老年人而言,要得到更好的效果,还得根据个人不同的情况对环境加以选择。如心情不畅的人,应选择到鸟语花香的公园散步,以借景消郁;心火较重,心情烦躁者,宜到海边或森林密布的地方散步,以吸收阴凉的空气,滋润心神;患有风湿性关节炎或水肿病的人,则应到沙地干燥处散步,以燥湿消肿。对季节、气候的选择,如春天宜在早晨到野外散步,以吸收万物之生气,焕发机体阴阳滋生;夏天宜在鸡鸣起床,到荷塘柳河边散步,以取凉润之气而防暑;秋天宜在金色晚霞散步,以收敛大地之精气而备冬;冬天宜在走廊、室内散步,以活跃阳气,抵御风寒。还有一种新兴时尚是在霏霏细雨中散步,经科学研究认为:毛毛细雨不仅能净化污染日趋严重的城市空气,而且在雨前残阳中产生的大量负离子还具有安神舒气、降低血压的功能。

  游泳

  游泳是一种很好的健身运动项目,游泳的有益健康和强健体魄的作用,主要是由于在游泳时,水对胸廓有很大的压力,呼吸肌必须额外地克服此种阻力才能正常呼吸。因此,经常游泳可增加肺活量,促进呼吸系统功能;游泳时,水会对人体皮肤和血管赋予压、打、拍击的“按摩”作用,并且游泳时全身的关节肌肉都能得到锻炼,从而促进血液循环,加强心脏的功能。此外,游泳池的水温一般低于体温,对皮肤的寒冷刺激可增强机体对气温变化的适应能力,所以游泳还可以预防感冒和呼吸道疾病,例如扁桃体炎、支气管炎、肺炎等。

  但是老年人的体质毕竟比较弱,全身的器官组织有不同程度的衰退,还经常伴有多种慢性病,因此最好能经过医生的允许。游泳时必须注意的是游泳池的水温不能太低,太冷的水会使血管急剧收缩,血压会突然升高,严重时有可能导致心脏病或脑中风等意外;入水前一定要做好准备活动,如做徒手操、体操、慢跑等活动,使身体发热,微微出汗后再入水;游泳入水不要过猛,动作要缓慢,距离不要过长,以免发生头晕、恶心、呕吐等不良反应

[asp]让你知道codepage的重要

作者:萧萧小雨

这几天研究UTF-8编码,太晕了,把我的看法和各位讨论讨论。
欢迎来批啊。以下都是我的想法,哪里有不对的请不吝赐教,帮忙指出来。

相关的题外话:

一、操作系统
window系统内部都是unicode的。文件夹名,文件名等都是unicode的,任何语言系统下都能正常显示。

二、输入法:
微软拼音输出的是Unicode的,智能ABC输出是简体中文的(所以智能ABC在非简体中文系统根本不能用,只能打英文)。

三、网页的textarea
网页的textarea是用unicode显示的。所以往里打什么字都能显示。而一些flash做的输入框就不行了。

四、Access2000
access里面保存的数据是unicode的,在任何语言系统下都能显示。
如果数据视图查看有些字符不正常,那是因为显示所用的字体不是Unicode字体,
换用Arial Unicode MS 字体就能全部显示了。(access帮助,搜索,输入unicode,有说明)

五、Word
word里的繁简转换,简体转换到繁体后,内码仍是简体中文的,其实只是简体中的繁体字。

六、ASP内部是Unicode的,所有文本都是Unicode存储的。需要时转换到指定字符集。

首先说下结论:
<%@ codepage=936%>简体中文
<%@ codepage=950%>繁体中文
<%@ codepage=65001%>UTF-8

codepage指定了IIS按什么编码读取传递过来的串串(表单提交,地址栏传递等)。

也指定了所有文本变量从Unicode转换到的编码,
也就指定了从数据库取出的数据从Unicode转换到的编码。(注意这个,很重要。)

关键字:
读取:一个串串,按简体读取是一些字,按繁体读取是一些字,串串本身编码没有变。

转换:系统主动的转换,比如从Unicode的“化”字到Big5的“化”字,内码变成Big5的。如果Big5没有对应的字,保留Unicode形式(&#xxxx;)

简体中文:化六个结论
Unicode16进制形式:化六个结论
Unicode10进制形式:化六个结论

下面是我推测出来的编码转换的过程:
客户端:输入法Unicode–输入框unicode–从Unicode按charset转换到对应编码()–表单发送编码

服务器端:IIS解开表单编码–按codepage指定编码读取–转换到对应的Unicode–可以用request("")读取了–进行一些处理–以Unicode编码保存到数据库

服务器端:读取数据库的Unicode数据,转换到codepage指定编码—生成源代码–IE按charset读取显示。

下面举例说明:
例一:
假设有三个asp页面,典型的留言页面:
1.write.asp 简单的输入表单,提交到add.asp。
<META http-equiv="Content-Type" content="text/html; charset=big5">
2.add.asp 接收留言,保存到数据库
<%@ codepage=936%>
3.read.asp 从数据库取得留言,显示。
<%@ codepage=936%> charset=GB2312 或
<%@ codepage=950%> charset=big5

大家可以猜一猜,我在write.asp里用微软拼音输入法输入“化六个讨论”。最后在read.asp里会显示什么样?
是不是晕了。让我们从头分析。

例二:
把例一的add.asp的<%@ codepage=936%>改为<%@ codepage=950%>,又会怎么样呢?

到这里发现了什么?
1.如果输入的文字和Charset对应的不同,一转换,就可能出现Unicode形式的字了。这里就是原因所在。以后整个过程都保留着。
2.Add.asp里codepage决定了保存到数据库的文字,用的是哪个语言对应的Unicode.如codepage=936,
那么数据库保存的就是简体中文的Unicode(数据库拿回简体中文系统,一切正常的),
codepage=950保存的就是繁体中文的Unicode.(拿回简体中文系统,就不对了)。

3.注意一下串串的变化过程:

1)输入法—CharsetUnicode—-指定字符集的映射
2)Charset—-表单编码串串简单编码
3)表单解码上步的逆过程,两步抵消了。
4)串串à按codepage读取串串没变,这步有可能“误会读取”
5)转为对应的Unicode Codepage指定字符集—-Unicode映射
6)中间处理,进数据库无变化,直接以Unicode形式进入
7)按codepage读取数据库 Unicode—-codepage指定字符集的映射
8)显示,按Charset指定字符集读取串串没变。

以例一说明:

例二:

晕了。现在来用用知识。

案例1。
简体中文系统下跑的好好的代码,放到国外空间上,数据库里乱码,原有的数据也乱码。
分析:因为大多数人平时用的都是简体中文系统,默认的codepage=936,所以平时大家不写也没有关系。
但到了国外空间问题就出来了。从数据库里的Unicode转换到英文编码去了,所以数据库原有的简体中文转换到英文后,按GB显示自然乱码。
如图,新输入的文字显示正常,但数据库里保存的是英文的Unicode的。
解决方法:全部加上<%@codepage=936即可%>。
全程只有简体中文与对应Unicode间的转换。

案例二:
简体中文的代码和数据,想转为完全的繁体版,该怎么办?
分析:1。代码文件编码全部改为Big5的,文件本身保存编码选繁体。
2.<%@ codepage=936 %>
3.Charset=big5
4.access版本无所谓,因为access里的数据是Unicode的。
5.好了,代码可以在纯繁体系统下跑了。
6.遗留问题:原有的简体中文数据读出会有一些问号。效果同例一的950读取,big5显示。因为从简体中文的Unicode转换到繁体中文了,有些字繁体中没有,就会出问号。
7.解决:用一个临时asp页,codepage=65001,读出为简体中文的Unicode,用一个Unicode->Big5的函数,转为繁体中文,然后写回数据库,应该行了吧?

两个案例完全是我按照理论推导出来了,未经证实。
有类似经历的欢迎批评指正。

ISAPI_Rewrite Examples

Examples
Emulating host-header-based virtual sites on a single site
For example you have registered two domains www.site1.com and www.site2.com. Now you can create two different sites using single physical site. Add the following rules to your httpd.ini file:

[ISAPI_Rewrite]

#Fix missing slash char on folders
RewriteCond Host: (.*)
RewriteRule ([^.?]+[^.?/]) http://$1$2/ [I,R]

#Emulate site1
RewriteCond Host: (?:www.)?site1.com
RewriteRule (.*) /site1$1 [I,L]

#Emulate site2
RewriteCond Host: (?:www.)?site2.com
RewriteRule (.*) /site2$1 [I,L]

Now just place your sites in /site1 and /site2 directories.

or you can use more generic rules:

[ISAPI_Rewrite]

#Fix missing slash char on folders
RewriteCond Host: (.*)
RewriteRule ([^.?]+[^.?/]) http://$1$2/ [I,R]

RewriteCond Host: (www.)?(.+)
RewriteRule (.*) /$2$3

The directory names for sites should be like /somesite1.com, /somesite2.info, etc.

Using different namespaces on development and live servers
Suppose you are developing rules for a website that will be deployed to a /livesite/ folder on a live server. However, on a development machine you need to store files in the /develop/ folder. In this case you could use UriMatchPrefix and UriFormatPrefix directives to minimize a number of changes those will be needed for a namespace change:

[ISAPI_Rewrite]

#specify namespaces with UriMatchPrefix and UriFormatPrefix
UriMatchPrefix /develop
UriFormatPrefix /develop

#rules are going here

#really we are checking for /develop/sampleN.htm and formatting to /develop/sampleN.asp
RewriteRule /sample1.htm /sample1.asp [I,L]
RewriteRule /sample2.htm /sample2.asp [I,L]
RewriteRule /sample3.htm /sample3.asp [I,L]

#reset namespaces to default
UriMatchPrefix
UriFormatPrefix

The only things you will need to change before a deployment to a live server are values of UriMatchPrefix and UriFormatPrefix.

Using loops (Next flag) to convert request parameters
Suppose you wish to access physical URLs like http://www.myhost.com/foo.asp?a=A&b=B&c=C using requests like http://www.myhost.com/foo.asp/a/A/b/B/c/C and the number of parameters may vary from one request to another.

There exist at least two possible solutions. You could simply add a separate rule for each possible number of parameters or you could use a technique demonstrated by the following example.

[ISAPI_Rewrite]
RewriteRule (.*?.asp)(?[^/]*)?/([^/]*)/([^/]*)(.*) $1(?2$2&:?)$3=$4$5 [NS,I]

Note that this rule may break page-relative links to CSSs, images, etc. This is due to a change in the base path (parent folder of the page) that is being used by a browser to calculate complete resource URI. There are three possible solutions:

Use the rule given below. It does not affect base path.
Directly specify correct base path for a page with the help of tag.
Change all page-relative links to either root-relative or absolute form.

This rule will extract one parameter from request URL, append it to the end of the request string and restart rules processing from the beginning. So it will loop until all parameters will be moved to the right place (or until the RepeatLimit will be exceeded).

There also exist many variations of this rule with different separator characters. For example, to use URLs like http://www.myhost.com/foo.asp~a~A~b~B~c~C the following rule could be implemented:

[ISAPI_Rewrite]
RewriteRule (.*?.asp)(?[^~]*)?~([^~]*)~([^~]*)(.*) $1(?2$2&:?)$3=$4$5 [NS,I]

Running servers behind IIS
Assume we have internet server running IIS and several corporate servers running other platform. These servers are not directly accessible from the internet but only from our corporate network. Here is a simple example how to map another server into the IIS site’s namespace using proxy flag:

[ISAPI_Rewrite]
RewriteProxy /mappoint(.+) http://sitedomain$1 [I,U]

Moving sites from UNIX to IIS
This rules can help change the URL from /~username to /username and /file.html to /file.htm. It can be useful if you just moved your site from UNIX to IIS and keep getting hits to the old pages from search engines and other external pages.

[ISAPI_Rewrite]

#redirecting to update old links
RewriteRule (.*).html $1.htm
RewriteRule /~(.*) http://myserver/$1 [R]

Moving site location
Many webmasters asked for a solution to the following problem: They want to redirect all requests to one web server to another web server. Such problems usually arise when you need to establish a newer web server which will replace the old one over time. The solution is to use ISAPI_Rewrite on the old web server:

[ISAPI_Rewrite]

#redirecting to update old links
RewriteRule (.+) http://newwebserver$1 [R]

Browser-dependent content
It is sometimes necessary to provide browser-dependent content at least for important top-level pages, i.e. one has to provide a full-featured version for the Internet Explorer, a minimum-featured version for the Lynx browsers and an average-featured version for all others.

We have to act on the HTTP header “User-Agent”. The sample code does the following: If the HTTP header “User-Agent” contains “MSIE”, the target foo.htm is rewritten to foo.IE.htm. If the browser is “Lynx” or “Mozilla” of version 1 or 2 the URL becomes foo.20.htm. Other browsers receive page foo.32.html. All this is done by the following ruleset:

[ISAPI_Rewrite]

RewriteCond User-Agent: .*MSIE.*
RewriteRule /foo.htm /foo.IE.htm [L]

RewriteCond User-Agent: (?:Lynx|Mozilla/[12]).*
RewriteRule /foo.htm /foo.20.htm [L]

RewriteRule /foo.htm /foo.32.htm [L]

Dynamically generated robots.txt
robots.txt is a file that search engines use to discover URLs that should or should not be indexed. But creation of this file for large sites with lot of dynamic content is a very complex task. Have you ever dreamed about dynamically generated robots.txt? Let's write robots.asp script:

<%@ Language=Jscript EnableSessionState=False%>
<%

//The script must return plain text
Response.ContentType=”text/plain”;

/*
Place generation code here
*/

%>

Now make it robots.txt using single rule:

[ISAPI_Rewrite]

RewriteRule /robots.txt /robots.asp

Making search engines to index dynamic pages
Content of the site stored in XML files. There is /XMLProcess.asp file that processes XML files on server and returns HTML to end user. URLs to the documents have a form of:
http://www.mysite.com/XMLProcess.asp?xml=/somdir/somedoc.xml
But many popular search engines will not index such documents because URLs contain question mark (document is dynamically generated). ISAPI_Rewrite can competely eliminate this problem.

[ISAPI_Rewrite]

RewriteRule /doc(.*).htm /XMLProcess.asp?xml=$1.xml

Now to access documents use URL like http://www.mysite.com/doc/somedir/somedoc.htm. Search engines will never know that physically there is no somedoc.htm file and content is dynamically generated.

Negative e­xpressions (NOT)
Sometimes you need to apply rule when some pattern not matches. In this case you may use so called Forward Lookahead Asserts in regular e­xpressions.

For example you need to move all users not using Internet Explorer to the other location:

[ISAPI_Rewrite]
# Redirect all non Internet Explorer users
# to another location
RewriteCond User-Agent: (?!.*MSIE).*
RewriteRule (.*) /nonie$1

Dynamic authentication
For example we have some members area on the site and we need password-protect files in this area but we don't like to use built-in server security. In this case it is possible to create ASP script (call it proxy.asp) that will proxy all requests to the members area and check for required permissions. Here is a simple template for this page where you can put your own authorization code:

<%@ Language=Jscript EnableSessionState=False%>
<%
function Authorize()
{

//Check if the user is authorized to view a resource here
//Return true if user has a required permission, otherwise return false

return true;
}
if(!Authorize())
{
//Redirect to the login page
Response.Redirect(“http://mysite.com/LoginPage.asp?ref=”+Request.QueryString.Item);
Response.End()
}
var WinHttpReq = new ActiveXObject(“WinHttp.WinHttpRequest.5”);
WinHttpReq.Open(Request.ServerVariables(“REQUEST_METHOD”).Item, Request.QueryString.Item, true);
var headers=String(Request.ServerVariables(“ALL_RAW”)).split(”
“);
for(i=0; i<headers.length && headers[i]; i++)
{
header = headers[i].match(/([w-.]+):s*([ S]*)/);
if(header)
WinHttpReq.SetRequestHeader(header[1],header[2]);
}
if(lngCount = Request.TotalBytes)
{
var data=Request.BinaryRead(lngCount);
WinHttpReq.Send(data);
} else {
WinHttpReq.Send();
}
if(!WinHttpReq.WaitForResponse(15))
{
WinHttpReq.Abort();
Response.Status=”408 Request Timeout”;
} else {
Response.Status = “” + WinHttpReq.Status + ” ” + WinHttpReq.StatusText;
headers=String(WinHttpReq.GetAllResponseHeaders()).split(”
“);
for(i=0; i<headers.length && headers[i]; i++)
{
header = headers[i].match(/([w-.]+):s*([ S]*)/);
if(header)
Response.AddHeader(header[1],header[2]);
}
Response.Write(WinHttpReq.ResponseText);
}
%>

Now we need to configure ISAPI_Rewrite to proxy requests through this page:

[ISAPI_Rewrite]
# Proxy all requests through proxy.asp
RewriteRule /members(.+) /proxy.asp?http://mysite.com/members$1

Blocking inline-images (stop hot linking)
Assume we have some pages with inlined GIF graphics under http://www.mysite.com/. These graphics are nice, so others directly incorporate them via hyperlinks to their pages. We don't like this practice because it adds useless traffic to our server.

While we cannot 100% protect the images from inclusion, we can at least restrict the cases where the browser sends a HTTP Referer header.

[ISAPI_Rewrite]
RewriteCond Host: (.+)RewriteCond Referer: (?!http://1.*).*RewriteRule .*.(?:gif|jpg|png) /block.gif [I,O]

Regular Expressions Testing Tool
RXTest utility could be used to simulate rule …

ISAPI_rewrite中文手册

配置:
在NT 2000 XP和2003平台上,在系统帐户下应该INETINFO程序应该与IIS5以共存模式过滤器运行。所以系统帐户应该给予对所有的ISAPI-REWIRITE DLLS 和所有的HTTPD。INI文件至少可读权限,我们也推荐对给予系统帐户对于所有包括HTTPD。INI文件的文件夹的可写权限,这将允许产生HTTP。PARSE。ERRORS文件,这些文件包含配置文件语法错误。对于PROXY模块也需要额外的权限,因为它将运行于连接池或HIGH-ISPLATED应用模式,IIS帐户共享池和HIGH-ISOLATION池应被给予 对RWHELPERE。DLL的可读权限。缺省情况下IWAM-《计算机名》被用于所有的池,在相应的COM+应用设置中应借助COM+ADMINISTRATION MMC SNAP-IN建立池帐户
配置文件格式化:

有两种形式的配置文件-GLOBAL(SERVER-LEVEL)和INDIVIDUAL(SITE-LEVAL)文件,GLOBAL配置文件应被命名为HTTPD.INI并出现在ISAPI-REWRITE安装目录中,文件的快捷方式通过开始菜单提供,INDIVIDUAL配置文件应名为HTTPD。INI并且能够出现在虚拟站点的物理根目录中,两种类型的格式化是相同的并是标准的WINDOWS。INI文件,所有的指令都应该放在这一部分并且所有指令都应该以分隔线放置,任何这一部分以外的文本都将被忽略

HTTPD.INI文件示例

[ISAPI_Rewrite]

# This is a comment

# 300 = 5 minutes
CacheClockRate 300
RepeatLimit 20

# Block external access to the httpd.ini and httpd.parse.errors files
RewriteRule /httpd(?:.ini|.parse.errors) / [F,I,O]

# Block external access to the Helper ISAPI Extension
RewriteRule .*.isrwhlp / [F,I,O]

# Some custom rules
RewriteCond Host: (.+)

RewriteCond 指令

Syntax:(句法) RewriteCond TestVerb CondPattern [Flags]
这一指令定义一个条件规则,在 RewriteRule 或者 RewriteHeader或 RewriteProxy指令前预行RewriteCond指令,后面的规则 只有它的,模式匹配URI的当前状态并且额外的条件也被应用才会被应用。

TestVerb

Specifies verb that will be matched against regular expression.
特别定义的动词匹配规定的表达式
TestVerb=(URL | METHOD | VERSION | HTTPHeaderName: | %ServerVariable) where:

URL – returns Request-URI of client request as described in RFC 2068 (HTTP 1.1);
返回客户端在RFC2068中描述的需求的Request-URI
METHOD – returns HTTP method of client request (OPTIONS, GET, HEAD, POST, PUT, Delete or TRACE);
返回客户端需求(OPTIONS, GET, HEAD, POST, PUT, Delete or TRACE)的HTTP方法
VERSION – returns HTTP version;
返回HTTP版本
HTTPHeaderName – returns value of the specified HTTP header. HTTPHeaderName can be any valid HTTP header name. Header names should include the trailing colon “:”. If specified header does not exists in a client's request TestVerb is treated as empty string.
返回特定义的HTTP头文件的值
HTTPHeaderName =
Accept:
Accept-Charset:
Accept-Encoding:
Accept-Language:
Authorization:
Cookie:
From:
Host:
If-Modified-Since:
If-Match:
If-None-Match:
If-Range:
If-Unmodified-Since:
Max-Forwards:
Proxy-Authorization:
Range:
Referer:
User-Agent:
Any-Custom-Header
得到更多的关于HTTP头文件的和他们的值的信息参考RFC2068

ServerVariable 返回特定义的服务器变量的值 。例如服务器端口,全部服务器变量列表应在IIS文档中建立,变量名应用%符预定;
CondPattern
The regular expression to match TestVerb
规则表达式匹配TestVerb
[Flags]
Flags is a comma-separated list of the following flags:

O (nOrmalize)
Normalizes string before processing. Normalization includes removing of an URL-encoding, illegal characters, etc. This flag is useful with URLs and URL-encoded headers
RewriteRule 指令
Syntax: RewriteRule Pattern FormatString [Flags]
这个指令可以不止发生一次,每个指令定义一个单独的重写规则,这些规则的定义命令很重要,因为这个命令在应用运行时规则是有用途的

I (ignore case)
不管大小写强行指定字符匹配,这个FLAG影响RewriteRule指令和相应的RewriteCond 指令
F (Forbidden)
对客户端做反应,停止REWRITING进程并且发送403错误,注意在这种情况下FORMATSTRING 是无用的并可以设置为任何非空字符串。
L (last rule)
不应用任何重写规则在此停止重写进程,使用这个FLAG以阻止当前被重写的URI被后面的规则再次重写
N (Next iteration)
强制REWRITINGENGINE调整规则目标并且从头重启规则检查(所有修改将保存),重启次数由RepeatLimit指定的值限制,如果这个数值超过N FLAG将被忽略
NS (Next iteration of the same rule)
以N标记工作不从相同的规则重启规则规则进程(例如强制重复规则应用),通过RepeatLimit指令指定一个反复实行某一规则的最大数目,
P (force proxy)
强制目的URI在内部强制为代理需求并且立即通过ISAPI扩展应付代理需求,必须确认代理字符串是一个有效的URI包括协议 主机等等否则代理将返回错误
R (explicit redirect)
强制服务器对客户端发出重定向指示即时应答,提供目的URI的新地址,重定向规则经常是最后规则
RP (permanent redirect)
几乎和[R]标记相同但是发布301HTTP状态而不是302HTTP状态代码
U (Unmangle Log)
当URI是源需求而不是重写需求时记载URI
O (nOrmalize)
在实行之前标准化字符串。标准化包括URL-ENCODING,不合法的字符的再移动等,这个标记对于URLS和URLS-ENDODED头是有用的
CL (Case Lower)
小写
CU (Case Upper)
大写
RewriteHeader directive
Syntax: RewriteHeader HeaderName Pattern FormatString [Flags]
这个指令是RewriteRule的更概括化变种,它不仅重写URL的客户端需求部分,而且重写HTTP头,这个指令不仅用于重写。生成,删除任何HTTP头,甚至改变客户端请求的方法
HeaderName
指定将被重写的客户头,可取的值与 RewriteCond 指令中TestVerb参数相同

Pattern
限定规则表达式以匹配Request-URI,
FormatString
限定将生成新的URI的FormatString
[Flags]
是一个下列FLAGS的命令分隔列表
I (ignore case)
不管大小写强行指定字符匹配,这个FLAG影响RewriteRule指令和相应的RewriteCond 指令
F (Forbidden)
对客户端做反应,停止REWRITING进程并且发送403错误,注意在这种情况下FORMATSTRING 是无用的并可以设置为任何非空字符串。
L (last rule)
不应用任何重写规则在此停止重写进程,使用这个FLAG以阻止当前被重写的URI被后面的规则再次重写
N (Next iteration)
强制REWRITINGENGINE调整规则目标并且从头重启规则检查(所有修改将保存),重启次数由RepeatLimit指定的值限制,如果这个数值超过N FLAG将被忽略

NS (Next iteration of the same rule)
以N标记工作不从相同的规则重启规则规则进程(例如强制重复规则应用),通过RepeatLimit指令指定一个反复实行某一规则的最大数目,

R (explicit redirect)
强制服务器对客户端发出重定向指示即时应答,提供目的URI的新地址,重定向规则经常是最后规则
RP (permanent redirect)
几乎和[R]标记相同但是发布301HTTP状态而不是302HTTP状态代码
U (Unmangle Log)
当URI是源需求而不是重写需求时记载URI
O (nOrmalize)
在实行之前标准化字符串。标准化包括URL-ENCODING,不合法的字符的再移动等,这个标记对于URLS和URLS-ENDODED头是有用的
CL (Case Lower)
小写
CU (Case Upper)
大写

要重移动头,FORMAT STRING模式应该生成一个空字符串,例如这一规则将从客户请求中重移代理信息
RewriteHeader User-Agent: .* $0
并且这一规则将把OLD-URL HEADER 加入请求中。
RewriteCond URL (.*)RewriteHeader Old-URL: ^$ $1
最后一个例子将通过改变请求方法定向所有的WEBDAV请求到/WEBDAV。ASP
RewriteCond METHOD OPTIONS
RewriteRule (.*) /webdav.asp?$1
RewriteHeader METHOD OPTIONS GET
RewriteProxy directive
Syntax: RewriteProxy Pattern FormatString [Flags]
强制目的URI在内部强制为代理需求并且立即通过ISAPI扩展应付代理需求,这将允许IIS作为代理服务器并且重路由到其他站点和服务器
Pattern
限定规则表达式以匹配Request-URI,
FormatString
限定将生成新的URI的FormatString
[Flags]
是一个下列FLAGS的命令分隔列表
D (Delegate security)
代理模式将试图以当前假冒的用户资格登陆远程服务器,
C (use Credentials)
代理模式将试图一在URL或基本授权头文件中指定的资格登陆远程服务器,用这个标记你可以使用http://user:password@host.com/path/ syntax 作为URL
F (Follow redirects)
缺省情况下ISAPI_Rewrite 将试图将MAP远程服务器返回的重定向指令到本地服务器命名空间,如果远程服务器返回重定向点到那台服务器其他的某个位置,ISAPI_Rewrite 将修改这一重定向指令指向本服务器名,这将避免用户看到真实(内部)服务器名称
使用F标记强制代理模式内部跟踪远程服务器返回的重定向指令,使用这个标记如果你根本不需要接受远程服务器的重定向指令,在WINHTTP设置中有重定向限制以避免远程重定向循环
I (ignore case)
不管大小写强行指定字符匹配
U (Unmangle Log)
当URI是源需求而不是重写需求时记载URI
O (nOrmalize)
在实行之前标准化字符串。标准化包括URL-ENCODING,不合法的字符的再移动等,这个标记对于URLS和URLS-ENDODED头是有用的
CacheClockRate directive
Syntax: CacheClockRate Interval
这个指令只在GLOBAL配置内容中出现,如果这个指令在SITE-LEVEL内容中出现将被忽略并把错误信息写入httpd.parse.errors 文件
ISAPI_Rewrite caches每次在第一次加载时配置,使用这个指令你可以限定当一个特定站点从缓存中清理的不活动周期,把这个参数设置的足够大你可以强制ISAPI_Rewrite 永不清理缓存,记住任何配置文件的改变将在下次请求后立即更新而忽略这个周期
Interval
限定特定配置被清理出缓存的不作为时间(以秒计),缺省值3600(1小时)
EnableConfig and DisableConfig directives
Syntax:
EnableConfig [SiteID|”Site name”]
DisableConfig [SiteID|”Site name”]
对所选站点激活或不激活SITE-LEVEL配置或者改变缺省配置,缺省SITE-LEVEL配置不激活,这个指令只出现在GLOBAL配置内容中
SiteID
Numeric metabase identifier of a site

Site name
Name of the site as it appears in the IIS console
不用参数使用这个命令将改变缺省配置到ENABLE/DISABLE配置进程
例子
下面例子将使配置仅作用于ID=1(典型是缺省站点)名字是MY SITE的站点
DisableConfig
EnableConfig 1
EnableConfig”My site”
下边例子将激活名称为SOMESITE配置因为它分割设置重载了缺省设置
EnableConfig”Some site”
DisableConfig
EnableRewrite and DisableRewrite directives
Syntax:
EnableRewrite [SiteID|”Site name”]
DisableRewrite [SiteID|”Site name”]
对所选站点激活或不激活重写或者改变缺省配置,缺省重写配置激活,这个指令只出现在GLOBAL配置内容中
SiteID
Numeric metabase identifier of a site

Site name
Name of the site as it appears in the IIS console.

不使用参数这个命令将全部激活或者不激活
RepeatLimit directive
Syntax: RepeatLimit Limit
这个指令可以出现在GLOBAL和SITE-LEVEL配置文件中,如果出现在GLOBAL配置文件中竟改变GLOBAL对于所有站点的限制,出现在SITE-LEVEL配置中竟只改变对于这个站点的限制并且这个限制不能超过GLOBAL限制
ISAPI_Rewrite在实行规则时允许循环,这个指令允许限制最大可能循环的数量,可以设置为0或1而不支持循环,
LIMIT
限制最大循环数量,缺省32
RFStyle directive
Syntax: RFStyle Old | New
Configuration Utility
ISAPI_Rewrite Full包括配置功用(可以在 ISAPI_Rewrite 程序组中启动),它允许你浏览测试状态并输入注册码(如果在安装过程中没有注册),并且调整部分与代理模式操作相关的产品功能,UTILITY是由三个页面组成的属性表
Trial page允许你浏览TIRAL状态并输入注册码(如果在安装过程中没有注册)
Settings page
这页包含对下列参数的编辑框

Helper URL
这个参数影响过滤器和代理模块之间的联系方式,它即可以是以点做前缀的文件扩展名(如 .isrwhlp)也可以是绝对路径,
第一种情况下扩展名将追加在初始请求URI上并且代理模块竟通过SCRIPT MAP激活,缺省扩展名isrwhlp在安装进程中加在global script map 中,如果你改变这个扩展名或者你的应用不继承global script map 设置你应该手动添加向script map 所需求的入口。这个应该有如下参数
Executable: An absolute path to the rwhelper.dll in the short form
Extension: Desired extension (.isrwhlp is default)
Verbs radio button: All Verbs
Script engine checkbox: Checked
Check that file exists checkbox: Unchecked
我们已经创建了一个WSH script proxycfg.vbs ,可以简单在一个a script maps中注册,她位于安装文件夹并且可以在命令行一如下方式运行
cscript proxycfg.vbs [-r] [MetabasePath]
Optional -r 强制注册扩展名
Optional MetabasePath parameter allows specification of the first metabase key to process. By default it is “/localhost/W3SVC”.
要在所有现存的 script maps 中注册你可以以如下命令行激活 script
cscript proxycfg.vbs -r
第二种情况下你应该提供一个URI作为'Helper URL'的值,你也应该map 一个 ISAPI_Rewrite的安装文件夹作为美意个站点的虚拟文件家
注意:根据顾客反应,IIS5(也许包括IIS4)对长目录名有问题。所以我们强烈推荐使用短目录名
Worker threads limit
这个参数限制在代理扩展线程池中工作线程数,缺省为0意味着这个限制等于处理器数量乘以2
Active threads limit
这个参数限制当前运行线程数,这个数量不可大于”Worker threads limit”. 缺省0意思是等于处理器数量
Queue size 这个参数定义最大请求数量,如果你曾经看到Queue timeout expired” 信息在 the Application event log中你可以增加这个参数
Queue timeout
这个参数定义你在内部请求队列中防止新请求的最大等待时间,如果你曾经看到Queue timeout expired” 信息在 the Application event log中你可以增加这个参数
Connect timeout
以毫秒设定代理模块连接超时
Send timeout
以毫秒设定代理模块发送超时
Receive timeout
以毫秒设定代理模块发送超时
About page.
It contains copyright information and a link to the ISAPI_Rewrite's web site.

Regular expression syntax
这一部分覆盖了 ISAPI_Rewrite规定的表达句法
Literals
所有字符都是原意除了 “.”, “*”, “?”, “+”, “(“, “)”, “{“, “}”, “[“, “]”, “^” and “$”.,这些字符在用“”处理时是原意,原意指一个字符匹配自身
Wildcard
The dot character “.” matches any single character except null character and newline character
以下为句法
Repeats
A repeat is an expression that is repeated an arbitrary number of times. An expression followed by “*” can be repeated any number of times including zero. An expression followed by “+” can be repeated any number of times, but at least once. An expression followed by “?” may be repeated zero or one times only. When it is necessary to specify the minimum and maximum number of repeats explicitly, the bounds operator “{}” may be used, thus “a{2}” is the letter “a” repeated exactly twice, “a{2,4}” represents the letter “a” repeated between 2 and 4 times, and “a{2,

策划人凭什么策划

  “凡事预则立,不预则废”。对于策划,古代早已有知,所谓策划就是一个谋划达成目标或事情的成功而先发的设想及其创造思维的过程,也是确保实现会管理活动决策和计划而进行有科学运作程序的谋划、构思和设计过程,是运用脑力的理性行为。策划已成为当今社会非常时髦的词语,与此产生的策划人也成了市场的高薪群体和关注度较高的人物,但对于策划人,凭什么策划?

  当前市场的策划人员,主要由以下几个方面的人群组成,一是出自媒体、记者行业的,由于长期在市场一线,拥有广泛的接触和见识,具有敏锐的洞察与思考;二是来自“海龟”,在国外接触了较新的理念和模式,认为可以指导企业实际;三是一批从国内知名企业或国外大公司出来的,认为掌握了先进的管理理念和市场运作,可以模仿创新运用;四是来自高校和研究机构的,将研究成果、理论与实际有限结合起来。由于背景、经历和学识各有不同,造成市场策划人士风格间的差异性,那么,是不是谁都可以成为策划人呢?策划人凭什么策划?

  一、从策划人的能力分析

  策划要根据现实的情况和信息进行谋划;具有明确的目的性;具有选择性和弹性;是按程序运作的系统工程,研究的根本是了解和掌握人的消费行为特征和消费心理特征,目的是通过了解和掌握人的消费行为特征和消费心理特征,预测和设计符合自己心愿的目标。从个人的能力上来说,我认为一个优秀的策划人士至少需要具备以下几个方面的能力:

  一是个人阅历与经历。策划人士需要足够的学历、丰富的工作经验、人生经历、广泛的社会关系和足以实践的社会空间。

  二是学习能力。策划人士需要勤奋的学习能力和科学的学习方式与方法,特别是借鉴别人的成功经验和失败的教训,需要实现知识储备和读万卷书的能力,需要与时俱进,不断学习新的知识和理念,因为策划人士是靠智力生存,需要比他人看得更深、更远、更广,这些都需要不断的思考和学习。

  三是思考能力。策划人的创意和创新,可以是模仿性的,可以是原创性的,需要具备联系思维、侧向移入和移出的思维、类比思维等,需要对于成功和失败的案例具有思考和总结的能力。

  四是团队协作精神。策划人需要具备合作精神,团队间的协作、部门间的协作和朋友、同事间的合作是策划人成功的必须条件。因为策划需要在不同的层面展开,需要不同部门之间的配合,需要整合资源和多学科之间的协调与探讨。

  五是创新能力。策划必须要有创新,具有创意。如做事的非常规思路、非常规的资源整合能力,善于在不同层面开展创新,如设计方面、事件营销方面、消费行为的洞察与了解方面、潜在需求的激发与引导方面等等,如对于递增需求,要寻求顾客对现有产品(或服务)的不满之处;对于派生需求,要寻求由主体消费引发的关联消费,同时对要素分析,分析全面开发产品潜在的功能要素。

  六是机会的把握和分析能力。首先善于分析不同的市场机会,具有敏锐的分析和对机会的把握能力,如对显在的市场机会要采用填补法,如差量填补、功能填补、结构填补;前兆型的市场机会要采用追随法,如梯度追随、时尚追随、关联追随;诱发型的市场机会要采用诱导法:如开发产品、营造概念、转变观念。突发型的市场机会要捕着。这要求策划人士对基本的分析工具如PEST环境扫描、SWOT分析、五力模型分析、产业分析、价值链分析、鱼骨架分析、雷达图等等,需要随时掌握市场信息情报资料;拥有适当的资源整合和个人鱼团队竞争实力;具有高度的进取心和敏感性。

  对于策划人,在策划过程中需要系统思考,全程运作,要设定目标、测定现状、为明确的活动设计计划。要区别策划和计划,计划是具体实施的细则,尤其是行动计划。任何策划都要最终落实到一个或多个计划来实施,不是所有的计划都隶属于某一策划;区别策划与决策,决策是做决定,重在优选方案,以抉择为重点;策划重在设想方案,以创造为主;区别策划和出点子,点子一般是解决某个具体问题,缺乏全局性、整体性和系统性,点子不具备可操作性,出点子只是策划的一部分。

  二、从策划人创意素质的培育分析

  策划需要创新和创意,既要低头拉车,又要抬头看路,在创意能力和思维的培育过程中,需要掌握相关的理论,如魔岛理论,认为创意的产生,有时象魔岛一样,在策划人的脑海中悄然浮现,不可捉摸,但它在人的潜意识中,也是经过无数的孕育过程,最后才得到结果;迁移理论认为迁移就是创意,当人们用不同的眼光去看原有的东西,眼光是新的,因而东西也是新的;拼图游戏,将不相干的东西象做拼图游戏那样组合起来,就是创意。在创意思考的过程中,利用刺激联想(风桶法),如日本有句俗话:“风吹时,卖木桶的会赚钱。”风吹,灰尘扬起—-盲人增多—-盲人要学三弦琴谋生—-三弦琴的需要量增加—-三弦琴要用猫皮做,猫皮的需要量随之增加—-猫的数目骤减,老鼠便增加—-木桶被咬坏的也多—-卖木桶的生意兴隆,赚钱;学会转换思考,需要不断换位,以假设状况为前提,进行正面刺激,换角度思考问题,如一老农西瓜地的瓜经常被盗,他采取了许多方法来惩治,写了许多标语,违者罚款,但收效甚微,一智者路过,提醒他换个角度,从惩罚改为谁看见有人偷西瓜,奖励多小钱,发动了众人的积极性,取得了很好的效果。需要信息组合,进行期望点或缺点列举。如在给企业策划品牌命名时,可以根据产品所提供的利益和主要功能、主要成份、外观特点命名;根据产品创始人或企业名命名;根据名人、名地或名胜命名;根据外语读音命名;根据数字或无意义的杜撰文字命名;根据激发积极联想的文字命名等等。

  策划的创意与创新可以来自传统管理故事的思考,如对龟兔赛跑的故事创新;对木梳卖给和尚的故事创新;对固定路径的依赖;高原现象;不拉马的士兵;短板理论、破窗理论、粘鱼效应等等;策划需要借势和造势;需要利用公关事件;策划需要吸引眼球的注意力;需要获取影响效应;如一小说的作者为了推广其所写的小说,在许多杂志上刊登了征婚启示,号称一身价过亿的富豪,想征婚,要求女主人应该向其小说中所描述的主人公那样,具有相应的标准,使该小说很快在市场上小说一空。

  策划人创意与创新能力的培育,关键在于思维和思路,在于对资源的整合和换位思考,在于寻求差异化和借助外部力量,在于思路的转变和思维的创新。如市场理念创新,从满足需要到引导和创造顾客需要;市场定位观念方面从传统的寻找商品用户转向追寻企业免受竞争的“知识经营”领域;市场占有观念从注重市场份额转向追寻提高客户价值份额和企业主导市场的能力;竞争观念从你死我活到共生共赢与竞合;人才观念从注重培养专业人才转向培养有创造性的复合型人才;营销资源观念从以内部资源创造营销效益转向利用内部和外部资源创造营销效益。正如有人说的那样,创意的培育要经历“四境”,一是准备过程,昨夜西风凋碧树,独上高楼,望尽天涯路;二是酝酿过程,衣带渐宽终不悔,为伊消得人憔悴;三是顿悟过程,众里寻他千百度,暮然回首,那人却在灯火阑珊处;四是验证过程,需要大胆假设,小心求证。

  总之,策划人是凭借脑力进行思考和生存的,策划人凭的是阅历和创新能力,凭借的是敏锐的洞察与分析能力。随着社会的不断向前发展,策划行业会面临来自不同方面的竞争,竞争的日趋激烈,策划正在朝区域化、专业化的方向发展,策划人因相应地进行转型与重新定位,而且随着客户整体素质和实力地提升,门槛会越练越高,希望策划行业中杜绝李鬼与李逵并存、滥竽充数的现象,少一些欺骗,多务实和创新,真正提升客户的价值,创造价值,让生活因策划而更加精彩。

作者:王唤明

web交互界面易用性设计和验收的指导性原则

. 输入控件的自动聚焦和可用键盘切换输入焦点

使用JavaScript实现页面加载完成后立即自动聚焦(focus)到第一个输入控件。可用TAB键(IE缺省实现)或方向键切换聚焦到下一个输入控件。

  输入控件指WEB页面表单(&lt;form&gt;)中显式的,需要用户进行修改、编辑操作的表单元素。对于这些控件,如果没有自动聚焦操作,不可避免的出现一次用户鼠标定位操作(如果用户此前处于键盘输入操作状态或鼠标定位后需要进行键盘输入操作,实际上是键盘鼠标切换操作)。如果鼠标定位后需要进行键盘输入操作,如果不能键盘切换输入焦点,那么不可避免的在切换输入焦点时需要反复的键盘鼠标切换操作,这是很繁琐的。

  如果实现了页面加载完成即自动聚焦到第一个输入控件,并且可以键盘切换输入焦点标定位操作,那么对于用户来说整个页面的输入操作可能都不需要鼠标操作,或次数较少,这是一种便利。毕竟频繁的键盘鼠标切换操作是比较累人的。

  对于有输入栏的对话框或网页,在不干预的情况下就应将当前控制焦点定位在待输入的输入栏上;如果输入栏在一般情况下不需要更改其中的内容,则应直接将焦点定在&ldquo;确定&rdquo;按钮上;在几个输入栏之间应支持tab,shift+tab切换操作,&ldquo;确定&rdquo;和&ldquo;取消&rdquo;应该是切换操作的终点,与具体所在位置无关。

  2. 可用Enter(或Ctrl+Enter)键提交,确保和点击提交按钮的效果是相同的

  不要在提交按钮上加入onClick=&rdquo;&hellip;&rdquo;这样的JavaScript代码。

  用Enter键提交页面是原则1的自然延伸,而且这也是浏览器所缺省支持的。只所以单独列出来是因为实际上有些设计者设计的页面不能达到这种效果,结果导致使用Enter键提交和点击&ldquo;确定&rdquo;按钮提交带来的效果不一样。大部分情况下是设计者在&ldquo;确定&rdquo;按钮上加入了onClik=&rdquo;&hellip;&rdquo;这样的代码,通过点击&ldquo;确定&rdquo;按钮后,会执行一段JavaScript代码,比如对某些hidden类型的input元素设值。而使用Enter键提交时就不会执行这段代码。

  正确的做法是把这段代码移到表单标签&lt;form&gt;中,以onSubmit=&rdquo;&hellip;&rdquo;属性引入。

  对于&lt;textarea&gt;表单元素,它会消耗Enter键,因此会使得Enter键提交失效。可以引入JavaScript代码捕捉Ctrl+Enter复合键,一旦捕捉到即执行表单的submit()方法。对于需要频繁提交的场合,比如BBS上,这种代码是很有必要的。

  3. 鼠标动作提示和回应

  对用户的鼠标定位操作,当移动到可响应的位置上时,应给予视觉或听觉的提示。

  动作回应的最简单形式就是鼠标ICON变成手状。浏览器只对具有href属性的HTML标签会自动进行这种变换ICON的行为。对于没有href属性(或没有设置href属性)的标签,可以通过JavaScript设置style属性的cursor为hand。

  目标区域发生变化是更为主动的响应形式。当鼠标指针移到目标区域,此时指针图形改变或文字颜色发生改变均能较大的减轻用户搜索定位目标区域的注意力负担。在按钮上增添直观的图形,尽可能的增大按钮面积;按钮间保持适当的距离,太近增加了用户区别它们之间界限以防误操作的负担,太远增加了用户搜索定位按钮的负担。

  4.尽可能早的在客户端完成输入数据合法性验证

  输入数据的合法性检验应该在客户端使用JavaScript进行验证。除非验证只能在服务器端完成,否则验证工作应在最早能完成的情况下进行。

  在客户端完成数据合法性验证,可以避免一次服务器请求和回复通讯,这种通讯是需要用户等待的,如果用户等待很长时间后从服务器返回的结果提示出现的错误是在输入时即可发现的,那么这种设计就是不友好的。诸如密码长度限制,用户名允许字符限制等等,显然应该在客户端提交前就应该进行验证。

  5. 根据应用场景决定在表单页面和提交后返回页面间是否使用中间过渡页面

  根据应用场景,决定是否显示接收表单页面(表单页面和提交后返回页面间的中间过渡页面),以及使用何种方式显示接收表单页面。

  表单页面和接收表单页面是大部分WEB交互操作赖以实现的配合模式。关于表单页面和接收表单页面的相互关系的设计,要做如下几个方面的考虑。

  一,对于需要频繁操作的场合,从操作便利和快捷性出发,尽可能的减少服务器和客户端交互次数,应该避免使用中间过渡页面。提交完毕直接返回原来的表单页面或默认页面。在这种情况下要考虑到数据安全和可恢复性。

  如果因为用户输入的数据不合格,需要重新输入,那么,去除中间页面,把错误信息直接显示在原表单页面上的设计方式,将是最简洁的处理方式。用户只需要根据错误提示进行更正即可。当然这样做稍微增加了编程负担。在表单接收页面上需要包含原表单页面的内容,而且输入数据项都必须用服务器端代码或客户端JavaScript设置成用户输入的值。为了开发快捷,可以这样做:表单页面和接收表单页面用同一个服务器端脚本页面实现。这个页面按如下流程完成原来两个页面的工作:

页面脚本初始化

检查&ldquo;提交&rdquo;变量是否设置
┠已设置,做数据验证
┃ ┠验证通过-&gt;业务逻辑处理-&gt;使用包含页面方式或重定向方式返回到特定页面&nbsp;
┃ ┗验证不通过-&gt;保存用户输入的数据-&gt;退出表单提交处理到表单页面流程中
┗未设置,做表单页面流程,如有来自提交流程中产生的用户输入数据,则显示出来

  其中,使用包含页面方式返回到特定页面可以避免一次客户端重定向过程,比客户端重定向过程还要快捷和稳定一些。但是有些情况下因为代码变量冲突或其他原因,使用包含页面方式可能并不方便,这时候可以使用服务器端重定向技术,在ASP里是Server.Transfer方法,在Java Servlet里是RequestDispatcher.forward()方法。不要使用Response.Redirect或者HttpServletResponse.sendRedirect()这种客户端HTTP重定向方法。不使用中间过渡页面也就意味着用户不能后退浏览原先已经填好的表单页面,因为使用的是同一个URL。所以在验证不通过情况下保存用户输入的数据就是必不可少的。

  不使用中间过渡页面带来的另一个问题就是使用包含页面方式或服务器端重定向方式返回会使得URL和页面内容不能一一对应。对于用户可能会直接用这个URL(会收藏这个URL)访问返回页面的情况,他会发现实际上到达的是表单页面,不是他想要的那个返回结果页面。所以,去除中间过渡页面,确实会带来URL和内容含混不清的情况,因而不适合需要URL和页面内容一一对应的场合。

  二,从技术角度考虑,使用中间过渡页面能保证URL和页面内容一一对应,简化页面开发工作。

  为了保证页面内容总是和固定的URL联系起来,必须使用客户端重定向:

提交 业务逻辑处理 (中间过渡页面)
表单页面――――-&gt;接收表单页面―――――――――&gt;显示处理结果―――&gt;客户端重定向到特定页面

  客户端重定向分几种情况:1,使用HTTP Header重定向,Location:http://www.netall.com.cn,这种定向是最快的,在窗口一片空白的情况下就迅速访问(GET)另一个页面。这种方式实际上不能显示处理结果,只能说是向第一种快速重定向方式的一种折衷处理;2,HTML标签刷新,&lt;META HTTP-EQUIV=&quot;Refresh&quot; CONTENT=&quot;5;URL=http://www.netall.com.cn&quot;&gt;,这种定向比较友好,在这个页面加载完毕后访问另一个页面。很多设计者把这个作为一个技巧使用,在载入一个大页面前放置一个缓冲页面以避免用户乏味的等待;3,JavaScript重定向。由于是用代码控制重定向,可以做的更灵活。比如根据用户习惯,控制操作完毕后的转向流程。4,被动式的重定向。在页面上放置按钮或链接,由用户手动决定返回到特定页面。这种情况适合于处理结果的显示页面包含相当多的信息,需要用户仔细浏览,而决定下一步的操作。

  在使用中间过渡页面的情况下,不能再使用页面过期失效了。否则一旦出现错误,需要用户重新输入表单数据,用户就不能用后退按钮恢复此前填写的表单数据了。除非设计者有意禁止这种恢复。

  6. 防止表单重复提交处理

  对提交按钮点击后做变灰处理避免在网络响应较慢情况下用户重复提交同一个表单。使用页面过期失效避免用户后退浏览重复提交表单。

  有些复杂的应用会导致需要较长时间的等待才会返回处理结果。而在较慢的网络环境中,这种情况更是频繁发生。焦急等待的用户往往会重复点击提交按钮。这种情况是设计者所不希望看到的。

  使用JavaScript在点击提交按钮后使按钮失效变灰是一个最直接的办法(根据原则2这段代码应该放在&lt;form&gt;标签里onSubmit=&rdquo;&hellip;&rdquo;做)。此外,在表单页面上,用服务器端脚本设置HTTP Header的Expires为立即过期可以保证用户没办法使用后退浏览恢复表单页面。注意这样做的代价可能是用户辛辛苦苦填写很长的内容,结果一旦操作失误就没法恢复。所以应该避免在包含&lt;textarea&gt;表单元素的页面上使用页面过期失效。

  应该说,更严格的方法是,服务器端脚本就应该具备抵抗重复提交的能力。例如,为这个表单分配一个唯一ID或一个使用一次即失效的验证码。此外,这个表单处理还应具有事务性质,如果表单不被接受,所做的改变还是能恢复的。在金融应用场合,重复提交同一笔交易是肯定不被允许的。能在重复提交中获利的一方总是会想办法绕过浏览器的限制,所以不能依赖于客户端的技术。

  7. 页面链接是打开新窗口、使用原窗口还是弹出窗口的原则

  一般而言,首页上链接可以使用target=&rdquo;_blank&rdquo;属性打开新窗口,而其他页面上的链接都应使用原窗口或弹出窗口。如果链接页面内容相对原页面来说不重要,是附属性质的,可以使用弹出窗口方式。

  一般情况下应该使用原窗口,把是否保留原窗口内容的权利留给用户。除非设计者相信原页面是如此重要,在用户发出点击指令后还有使用上的价值,以至于不能被随便更新或覆盖。一般来说,只有首页才会处于这样一个地位,用户在首页上打开一个链接后,一般还会在这个首页上去打开另一个链接。比如首页包含极多链接的门户网站,或者搜索引擎的搜索结果页面。Google.com以前的搜索结果页面上的链接是使用原窗口的,后来他们意识到用户会反复使用这个页面,而改成打开新窗口了。一般的网站如果首页链接不多,就不必使用新窗口,这是用户友好的设计原则。

  上述情形的一个极端情况就是新页面内容比起原页面内容的重要性差很多,以至于都未必需要打开一个新页面。这时候使用弹出窗口比较合适。用JavaScript弹出窗口有好几种:一个是window.open()函数。这里有个技巧。应该使用window.open()先打开一个空白窗口,再使用location.replace()用目标页面替换。这样做可以避免在打开新页面的过程中导致原页面失去响应。Window.open()将打开一个新的浏览器窗口进程,因此资源消耗比较大。另一个是由微软DynamicHTML规范中扩充的方法createPopup()。createPopup()可以创建无边框的弹出窗口,消耗系统资源较小。还有一个就是用页面中隐藏的层&lt;div&gt;来模拟一个弹出页面。后两种可以使用JavaScript代码填充弹出窗口内容。如果需要下载网页作为其内容的话,需要微软DynamicHTML规范中的&lt;download&gt;标签。