|
用户名:hk_zsu 笔名:hk_zsu 地区: 四川-成都 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
计算机思维Computational Thinking
By Jeannette M. Wing
摘自 COMMUNICATIONS,ACM member magazine, 2006年3月刊
相关pdf,http://www.cs.colorado.edu/retreat/images/ComputationalThinking.pdf
代表的是哪里都适用的一种态度和技能,是每个人,而不仅是计算机科学家,都热衷于学习和运用的。
计算机思维建立的基础是计算机处理的能力及其局限性,不管是由人还是机器来执行。计算机方法和模型使我们有勇气去解决问题,设计出无论哪个个人都无法独立 担纲的系统。计算机思维面对着有关机器智能的不解之谜:人做什么比计算机强?计算机什么比人好?最根本的问题是:什么是可以计算机做的?今天,我们对这样 的问题仍然一知半解。
计算机思维是每个人的基本技能,不只属于计算机科学家。在阅读,书写和算术之外,应该把计算机科学加入每个儿童的分析能力培养。和出版社促进了3个 R(阅读,书写和算术Reading, Writing & Arithmetic)的传播相类似,计算机和使用电脑促进了计算机思维的传播。
计算机思维采纳计算机科学的基本理念,可运用于问题的解决,系统设计和理解人类行为。计算机思维包含了一定范围内的思维工具,反映出计算机科学领域的广泛性。
在解决一个问题时,我们会问:这有多难?怎样做是最佳的方法?计算机思维站在坚实的理论地基上给予这样的问题精确的答案。问题的难度要说取决于机器的能力-用来解决问题的计算工具。要考虑机器的指令,资源的约束和运行环境。
为了有效率地解决问题,我们也许要进而问道,貌似的解决方案是不是最好的呢,我们可以随机化优势吗,是否允许主动错误或者被动错误。计算机思维通过简化,嵌入,转换或者模拟,将看来困难的问题转化为可以解决的问题。
计算机思维是递归思维,并行处理。它将代码译为数据,又将数据译成代码。它用维度分析的泛化进行类型检查。承认异化的优缺点。给某个人或物多个名字。它同时意识到间接寻址和程序呼叫的代价和用处。它不只用正确程度和效率来评判一个程序,还判断美感,系统设计的简洁和优雅。
计算机思维利用抽象和分解来对付复杂的大型任务或者来设计复杂的大型系统。它使你远离担忧。它挑出合适的代表性的问题或者给问题的相关方面建模使问 题易于处理。它使用不变量来概要地或者陈述性地描述系统行为。它确信我们无需理解系统的每个细节就可以安全地使用,修改或者影响一个大型复杂的系统。它设 想多个不同的用户建立不同的模块,为了设想的未来的使用进行预加载或缓存。
计算机思维都以最糟糕的情形来考虑预防,保护和复原,方法可以是冗余,容错和纠错。 它采取呼叫高压封锁,死锁或者约定界面的方法。它还学习在发生同步相遇时避免竞争的情形。
计算机思维使用启发式推理找到解决之道。它在不确定的情况下进行计划,学习和安排。它是搜寻,搜寻,再搜寻,找到一长列的网页,赢得游戏的攻略或是一个反例。它是使用大量的数据来提高计算的速度。它是在时间和空间中,在处理能力和存储容量中找到平衡。
来看这些生活中的事例:您女儿早上去上学,她把这一天要用的东西放到背包里;这就是预加载和缓存。当您的儿子弄丢了他的手套,你建议他到经过的地方 找;这是回溯。到什么时候下您会自己买一套而不再租用滑雪用具呢?这是联机算法。在超市排哪条队伍?这是服务器系统的性能建模。为什么停电时电话还可以 用?这是失败的独立性和设计的冗余。那么如何进行用来分辨计算机和人的完全自动化的图灵测试,即CAPTCHAS,人类仿真?;这是利用解决人工智能的难 题来给计算机代理商做宣传的。
计算机思维将植根于每个人的生活当中,那时算法,前置条件等词汇将成为每个人的词汇, 非决定论和垃圾收集不再是计算机科学家使用的含义;人们将会从上往下来画一棵树。
我们目睹了计算机思维对其他学科的影响。例如,机器学习改变了统计学。统计的学习正用于考察问题的规模, 以数据的大小和角度的方式,这在几年前还是不能想像的。各种组织的统计部门都在招聘计算机科学家。计算机学校包围了现有的和新成立的统计部门。
计算机科学家近来对生物学产生了兴趣,因为它们相信,生物学家将可以从计算机思维中获益。计算机科学对于生物学的贡献远不止于可以通过大量搜索序列 数据来寻找图谱。希望的是利用数据结构和算法-计算机的抽象思维和方法, 通过阐述功能来表现出蛋白质的结构。计算机科学家正在改变生物学家的思维方式。 相似的,计算机游戏理论正改变着经济学家的思维方式。量子计算对物理学家也是。
这样的思维不会仅是其他科学家们的技能,它将是每个人的。普适计算的今天就是计算机思维的明天。昨天普适计算还是梦想,今天它已成为了现实。计算机思维在明天也会成为现实。
是什么,不是什么
计算机思维是研究计算的- 什么是可以计算的,怎样进行计算。因此,计算机思维有下面的特点:
是概念化,不是编程
计算机科学不是计算机编程。计算机科学家式的思维不是说给计算机编程。它要求在多个抽象层面进行思考。
是基本技能,不是机械技能
基本的技能是每个人在现代社会都必须学会运用的。机械则意味着机械的重复。具有讽刺意味的是,要是计算机科学家真解决了人工智能的使计算机象人一样思考的大挑战,那时思维可就真要变机械了。
是人的思维方式,不是计算机的
计算机思维是人解决问题的方式,不是要人象计算机一样思考。计算机是愚笨无趣的,人聪明富有想像力。是人类使得计算机令人振奋。使用计算机设备,我们运用才智处理问题,那些在计算机时代之前我们不敢挑战的问题,构建具有只要想像得到的功能的系统。
数学和工程思维的补充和结合
计算机科学源于数学思维。因为向所有科学一样,它是正式建立在数学的基础之上。计算机科学源于工程思维,是
因为我们构建的系统与真实世界是交互的。计算机设备的约束迫使计算机科学家使用计算机的思维,而不是数学思维。构建虚拟世界的自由使得我们可以设计超越现
实世界的系统。
是想法,不是人工产品
不单单是生产的软硬件产品可以真实存在于各处,时刻影响我们的生活,计算机概念可以用来考虑和解决问题,管理我们的日常生活,进行沟通以及和其他人的交往,并且
对任何人,在任何地方
计算机思维都是现实的。它如此融入人们的生活,如明了的哲学。
很多人将计算机科学等同于计算机编程。有些父母以为他们学计算机科学专业的孩子就业的范围是很窄的。很多人认为计算机科学的基础研究已完成,只剩工 程部分了。计算机思维是一个大的愿景,它指导计算机教育者,研究人员和实践者们改变社会对这个领域的印象。 我们尤其需要告诉将要上大学的听众,包括教师,父母和学生,2点:
还有很多亟待理解和解决的智能挑战和有关的科学问题
问题和解决的领域只在于我们有多少好奇心和创造力。
学计算机专业的可以做任何事情
你如果学的是英语或数学,可以从事很多不同的职业。计算机科学也一样。计算机专业的职业可以是医学,法学,商务,政治,任何一种科学或工程学,甚至美学。
计算机专业的教授应该给大学新生上一门课,“怎样象计算机科学家一样思考?”,给非计算机专业的人讲,而不仅是给本专业的人听。还应该让要上大学的 学生了解计算机方法和模型,而不是叹息对计算机感兴趣的人少了,或者计算机科学的研究经费减少了。我们要想办法激发公众的兴趣和对这个领域的智力的探索。 这样我们才可能传播计算机科学的乐趣,地位和力量,普及计算机思维。
(neverdoright 翻译)
走下神坛的项目经理
作者: OneEyeWolf∣来源:BlogJava∣原文地址∣2006-7-16
走下神坛的项目经理
以下的问题,谁看谁解答:
1、很多招聘项目经理的信息上,无异例外的提到:风险控制,以目前国内的开发现状,风险控制是项目经理的责任吗? 你做到了吗
2、对于进度控制,项目工具、理论教条、计划、报告、经验的作用有多大,孰重孰轻,到底是什么是进度控制中的决定性因素。
3、性格决定命运,项目经理的人格魅力,亲和力,沟通技巧是不是项目成败的关键因素?
4、项目经理真的能掌控一切吗,遇到低素质的开发人员,性格怪异的程序员,桀骜不驯的程序员,你真的能搞定他吗,遇到啥也不懂的老总,遇到胡搅蛮缠的客户,怎么去搞定他们。
5、不懂技术,也能带好团队吗?能做好一个项目吗,至少我没有见过这样的案例。
6、项目经理如何能摆脱写作的海洋,要写计划,写需求分析,写进度报告,写设计记录,写会议记录,写考评记录,写....。文档真的就能提高项目质量吗,文档之与开发效率是提高,还是降低?你喜欢做这样的项目经理吗?
7、项目经理在开发期间需不需要写程序?,是审查文档,还是审核代码,需不需要考评(我工作这几年,经历N个公司,考评都流与形式,即浪费了时间,又没有效果,希望能有人给出明灯,照亮迷途)。
8、如果你到了一个新开张的公司开始了第一个新项目,没有测试部门,没有质量管理,没有规范,没有制度,没有企业文化,没有项目积累,团队需要你自己招兵买马(薪资不会很高,中间还有人跑掉),老总又不懂技术,你怎么来带好这个项目?
9、如果团队中没有一个懂得敏捷开发,指望看书,查资料,能应用到项目中去吗?
10、如果新来一个软件学院的硕士,来做你们公司的开发部经理,天天都是软件工程,敏捷开发,测试驱动,RUP,IOC,你们怎样面对这样的开发经理?
11、现在招聘项目经理的条件上,都附上了敏捷开发,RUP等,不懂这些,就不能管理好一个项目吗?
程序员总是骂项目经理,他们人多呀,没办法,他们在人群中高呼,项目经理要爱护程序员,如何去爱护,相爱也难呀,人都是犯贱,你越是给他个好脸,他越不知道自己是谁,什么是都讲究个度,这是最难把握的。
领导老是说,要关心下属,了解他们的能力和缺点、性格与心理,一天就8个小时,十几人的团队,项目经理又不是8爪鱼,又不是心理学家,能做多少事呢。
项目经理能辞退一个人吗,不能,
能选择一个团队吗,不能,
能主动要求公司给骨干成员加薪吗,不能(很多人动不动拿这涨薪资来作为项目经理管理的一条必做的内容,我觉得瞎扯淡,可能吗,薪资结构是公司的上层建
筑,不可动摇,就算动了,也是毛毛雨,我们公司一个骨干,能力很强,在一次工程中,很努力,吃了很多的苦,结束后,公司主动给他涨了200块钱,他觉得是
一种侮辱,就BYE BYE 了,太失败了)
如果在项目进展过程中掌握项目成员情况或平息人民内部矛盾就要多沟通,就要搞活动,请吃饭,
公司不补贴的话,就要自己放血(我自己家里还一大堆人民内部矛盾呢),老总在和我谈话时,总是说要多请他们吃吃钣,唱唱K,我都想抽他。一次两次可以,多
了我也不愿意,做人不能伪大方,最失败的是总见我请别人吃饭,没有请我吃饭。
项目成员要求上班有学习看书的时间,我觉得是扯淡,总不能让我一个人扛着,你们看书吧?我自己已经多长时间没有看书了,我也记不清楚了。
谁没有受过进度上的逼迫,有几个人能做好呢,项目经理不压程序员压谁,总不能被上头骂完后,跟没事的,还乐呵呵的请大家吃饭吧。
有人说项目经理要有骨气,要敢于说不,有几个呢,再说公司接个单也不容易,好不容易来个单,你又搞个一年半载才出来一个beta版,还被客户骂了半死。
我觉得大家都应当把自己的项目,自己的公司的,实情都说出来,不要讲一些书上才能看到的东西,撇开虚伪,敞开胸脯让大家来分析。
我对我们公司成员(包括我自己)的现状大体分析如下,可能有主观成分,大家仁者见仁:
1、并不认同公司的发展,混日子,你要说不想干了就走,他马上拿起包就走,没有一点留恋
2、热衷技术,有一定的软件工程基础,能够参与项目管理决策,能够对自己的分配任务给出合理的时间表(这种人真的很少,论坛中多,现实中少,现在是蓝领泛滥的社会)
3、普通的人,只能写代码,对于别人的事情,就是别人的事情,参与度不高,不愿意多做一项工作,9点钟来,6点钟走(太多了)
4、
对于自己的任务,并不能给出合理的估计与时间表,如果让他做估计,常常是延期完成的,这时,你需要自己去帮他做,如果延误了,你需要要帮助他解决问题,批
评与指责,告状,解决不了任何的问题。(比较多,很多项目经理对于进度,众口一词的说,把任务分解后,让成员来估计,是不是这样呢,他自己都不知道,估计
什么呀!)
5、有困难也不说,死鳖一样,什么也不说,解决不了,就放在那儿,也不反映,如果需求或设计中有错误,知道错了,也不说,就按错的来。(有这样的人,当然不多,谁遇到谁倒霉)
6、有的人,完不成任务,总是一大堆理由,你想批评他一句,他能回十句,烦都烦死了
7、缺乏团队精神的人,别人犯了错,如果影响到自己就大声的骂,如果没有影响到自己,就嘲笑。背后搞鬼搞怪。自己出了错,就隐瞒,害怕别人指出自己的错误,不承认犯错,脸红脖子粗的跟你没有完没了。
8、刚毕业的人,脑子灵巧,基础不扎实,知道一点东西,就不知天高地厚,贪玩,写出来的代码功能虽然实现了,但跟大便差不多,看了都想吐。没有团队精神,没有价值观(公司薪资不高,就只能这样的人,需要加功夫培训雕琢)
9、
传说中的项目经理:有一个平常心的,知道自己缺点不足,不充大,不自大,不吹毛求疵,真正在做项目管理的项目经理,能够真正理解和掌控整个项目进程的管理
者(很少,连基本功能都没做扎实呢,却整天抓这个布局不好,那个颜色不好看,这个类命名不符合规范,程序员说完成了,他就认为完成了,整天只会问这个功能
你需要多长时间完成,那个功能需要多少时间完成,程序员拍胸脯说9天,他就向上面拍胸脯是9天,到底需不需要9天,谁也说不清楚,9天过后完不成了,除了
继续做下去也没折)
得出结论:一只高素质而且有着非长高的向心力的开发团队是传说中才能出现的。
作为公司一个PM,能做的事是非常非常有限的,谁有能力去撼动一个公司的企业文化呢,在百十号人的公司里说句话,有人能深情的看你一眼呢?再说了公司不发展,总不能自己也不发展吧,所以只能离开,去寻找党组织了。到底什么时候才能找到党组织?
[转贴]介绍classpath和package的文章
xxx
1.Google Talk
Google Talk是搜索界巨头Google刚刚推出的一款即时通讯软件,支持文字和语音交流。Google Talk与Gmail进行了整合应用,使用Gmail账号登录,并支持检查Gmail信件。Google Talk一出道便以其先进与人性的通讯理念,以及比Skype更高的通话质量,令QQ、Msn、Yahoo Messenger等聊天软件望尘莫及。据悉,正式版的Google Talk将兼容MSNAIMICQYahoo Messenger等几乎所有的即时通讯软件,并有可能将Google Talk与Google的浏览器与操作系统融合在一起。Google Talk不仅会对其他通讯软件造成致命的打击,也显示了Google“超媒体”战略的前兆。
2.摩托罗拉V3
“渊”自丰富科技,“薄”于尖峰设计,这就是摩托罗拉V3凝聚的艺术造诣。摩托罗拉V3由于是全金属材质,即使是超薄外形,牢固程度也让人放心。其内部的框架采用了镁合金,耐用程度实在大大提高。让这款手机从内而外透露出卓而不凡的品质。
3.索尼豌豆MP3
也许这样的创意让你我都感到惊讶,但是索尼豆子造型MP3确实已经让我们看到了什么叫设计的新异,不管是不是接受它,它真的已经开始销售了。索尼豆子MP3拥有512MB容量,采用闪存存储介质,支持FM调频功能,OLED显示屏,内嵌式USB传输接口,这款产品上市价格为120美元。当然这个价格确实不便宜,但是我们还能在哪里找到这么酷的产品呢?
4.MobiBlu“Cube”
DAH-1500i播放器
全球最小的MP3播放器,重0.65盎司(18.4克),1G容量。除了具备播放功能,它还可以接收FM广播及录音等功能。售价为130美元。
5.iZ
iZ是一种ipod玩具,可以说是ipod的附属产品。这个怪异的小东西看起来好像是由异类和精灵结合的私生子。将ipod连上iZ,它会随着音乐翩翩起舞,发出亮光,转动它的眼睛,还会伴有各种或好或坏的音效。
6.MIRT红外线发射器
出于处理紧急事务需要,交通信号灯基本上都安装有特殊的红外传感器。如果将MIRT安装在汽车上,那么就可以确保汽车所到之处皆为绿灯。目前,该款设备在美国许多州属于非法产品,因此只能私下出售。售价300~500美元。
7.索尼Libré电子书
索尼的Libré使用了E Ink技术,只需4节AA电池便可至少阅读1万页图书。由于未采用液晶显示屏,因此不存在屏幕可视角度的问题。即使侧面阅读,屏幕依然十分清晰。目前,Libré只在日本市场有售,不过相信不久之后登陆全球市场。售价479美元。
xxx
1.Google Earth
2005年,Google正式推出了免费的基于卫星图片的地图软件——Google Earth。Google Earth的功能犹如该公司的在线地图服务——Google Map,用户可以在一副3D地图上放大目的地或获得驾车指南。而Google Earth采用的3D地图定位技术则把Google Map上的最新卫星图片推向了一个新水平。用户可以在3D地图上搜索特定区域,放大缩小虚拟图片。而Google Earth与Google Map最大的不同点是,Google Earth还可以让用户旋转角度来观看地形和建筑物,为地图增添注释。
Google Earth主要通过访问Keyhole的航天和卫星图片扩展数据库来实现这些上述功能。该数据库在不久前进行了更新,它含有美国宇航局提供的大量地形数据,未来还将覆盖更多的地形,涉及田园,荒地等。由于它极其强大的功能,引发了人们对于它会成为恐怖袭击地图指南的担心。
2.IPTV
IPTV(宽带网络数字电视)是当前全球IT圈最热门的技术之一。它运用IP协议来提供包括电视节目在内的多种数字媒体服务及其增值服务,其接入方式有两种:“普通电视机+IP机顶盒”方式以及PC方式。IPTV具有双向互动性,还可以在普通电视机上简单实现多种互联网增值业务。
从2004年开始,全球IPTV业务用户数持续增长,预计市场大规模启动将在2006年,IPTV全球业务收入将达到80亿美元,用户数将达到800万以上。2005年5月,中国广电总局发给了上海文广中国第一块IPTV牌照,UT斯达康、盛大、长虹等厂商都开始摩拳擦掌,争取这块充满诱惑力的大饼。但是,从全球的发展情况来看,由于电信运营商开展IPTV缺乏足够的运营经验,运营市场尚未成熟,用户市场仍需要培育。
3.Sparkle
微软早就看着Macromedia Flash(已被Adobe收购)的利润眼红,所以作为软件巨头的它早已暗中搞起了一个Sparkle来和Flash对抗,最近Sparkle终于初露倪端,而它被称为“Flash杀手”。Sparkle是个基于矢量图的应用系统,是微软计划中的Expression Studio家族中的一员。Expression Studio是专门为Windows Presentation Foundation(WPF)设计的开发工具(WPF之前的代号即Avalon)。Sparkle主要基于XAML语言,由于和微软是一家,会有很多Windows自带的API供它使用。这些都决定了Sparkle天生具备了比Macromedia Flash更强的可编程性。早在2003年底就有关于Sparkle的传言流出,不过微软直到2005年才确认了它的存在。
4.播客
一个麦克风、一台电脑加上制作软件,你就可以自制音频节目并放到网上,向无数人秀你所想秀的一切,这时你就成为了一名“播客”。作为数字广播技术的一种,播客最初借助一个叫“ipodder”的软件与一些便携播放器相结合而实现。而在2005年6月,苹果公司将iTunes软件版本升级到4.9,推出内置的播客支持功能,一夜之间让播客成为主流。播客的新时代来临了。
如果说博客颠覆了受众被动接受文字信息模式的话,那么播客则改变了传统的被动收听模式。任何人都可以在网上选择听谁的、什么时候听、什么地点听,还可以自己制作节目,播客就是新一代广播,播客时代,没有金钱与权利的门槛。
5.甲吧(Jabber)
“甲吧”是英文Jabber的谐音,是一种即时通讯技术的通用平台,兼容与通用性是甲吧的最大优势。很多聊天器的通讯协议是不公开的,各自为阵,结果用户需要下载好几个软件,开好几个窗口和不同的朋友聊。甲吧带给即时通讯的影响则是革命性的,其通讯协议完全公开,服务器原码完全开放,甲吧服务完全免费。由于这样的开放性,甲吧在全球范围内吸引了大批优秀软件开发人员为甲吧写各种应用软件。现在你只要下载一个甲吧聊天软件,就既可以和全球的甲吧用户聊,又可以和MSN,YAHOO,ICQ等其他用户聊天了。Jabber还同时支持windowsMAC OSXLinux等不同的操作系统。Jabber的跨平台软件有Psi、Gaim、Jajc等,目前最受网友追捧的Google Talk即基于Jabber协议。
6.Skype
Skype是一款基于P2P技术的超清晰网络电话软件,它让电脑与电脑之间通话免费,而打国内国际长途电话只需市话费。相对其他即时通信软件,Skype是P2P技术与VOIP的完美结合,Skype有其过人之处,它的语音效果更好,服务成本更低,不过它也有弱点——还没有视频服务。
虽然Skype并不是一项最新的技术,但它是在2005年引来最多话题的技术。在没有任何广告的情况下,Skype已经被下载了一亿五千万次,用户已经超过五千万。这样的业绩撼动了通信行业,它的技术成熟度令传统电信服务商们万分紧张。Skype抛开了传统运营商,直接从通信市场中独自掘金,因此它有可能带来一场全球性的电信革命,也使Skype遭到了全球电信运营商的阻击。它的发展前景会怎样,目前还不好说。
7.网摘
“网摘服务”通俗地说就是一个放在网络上的收藏夹,基于它在网络上的独特优势,它能提供很多本地收藏夹所不能提供的功能。其核心价值已经从保存浏览的网页,发展成了一个新的信息共享的中心,能够真正做到“共享中收藏、收藏中分享”。2005年,国内的网摘服务年迅速普及开来,很多网站纷纷推出自己的网摘服务平台,网友们也开始积极使用各种各样的网摘。
网摘服务作为一种个人的信息整理平台,目前可供选择的既有365Key、和讯网摘、博采中心、新浪ViVi等这样的国货,又有Delicious、Furl等这样的舶来品。Del.icio.us和Furl是国外网摘服务的先行者,国内最早的专业网摘站点是365key,它通过与内容提供商进行合作的模式向国内提供网摘服务。而其他网摘服务领域的生力军,发展潜力都不容忽视。
8.统一威胁管理(UTM)技术
2005年,统一威胁管理(UTM)得到了著名分析机构、信息安全厂商和用户的严重关注。准确地说,统一威胁管理(UTM)技术并不是2005年出现的新技术,它最早由Fortinet公司在2002年就提出了,当时,因为混合威胁的出现,为了满足中小企业对防火墙、IDS、VPN、反病毒等的集中管理需求,Fortinet提出了将这些技术整合进一个盒子里,做出高性能的统一威胁管理(UTM)设备。它的优势在于将企业防火墙、入侵检测和防御以及防病毒结合于一体。直到2005年,UTM技术似乎才真正开始得到用户的关注,并开始大规模的部署,同时,市场上一些传统的防火墙或IPS厂商也开始全面进入UTM领域。IDC的一份调查报告认为,UTM将有可能取代防火墙,成为人们首选的安全设备。到2008年时,它将占有整个信息安全市场的半壁江山,达到 57.6%。
9.维基百科
维基百科是由全球无数志愿学者、玩家、学生等等有知识的人共同建筑的,该计划的参与者叫做维基百科人。直至现在,参与者的人数仍在不断增加,特别是受到良好教育的人士。事实上,维基百科不能说是一种技术,而是一种创造性运用技术的方式,但对一种先进技术来说,能把它用好其实是最重要的事情。
维基百科本身有三个引人注意的特点,这些特点使维基百科与传统的百科全书有所区别:
首先,维基百科将自己定位为一个包含人类所有知识领域的百科全书,而不是一本词典、在线的论坛或其他任何东西。其次,维基百科允许大众的广泛参与,它是一个协作计划。另外,维基百科是一部内容开放的百科全书,它允许任何第三方不受限制地复制、修改及再发布材料的任何部分或全部。在这个讲究参与性的时代,维基百科这样的互动学习模式必将发扬光大。
10.分子磁性
分子磁性是中国科技大学在单分子基础研究领域获得的重大突破。可以设想一个革命性的改变:现在的笔记本电脑,是用半导体材料做的,携带已经很方便了,但是在将来,我们还可以把电脑做得像手表一样戴在手腕上,也可以像手绢一样随意叠起放在衣兜里,可是它的计算能力和存储量却是现在的100倍甚至1000倍。日前中国科技大学对单分子磁性改变和控制的研究,为这种新型电脑的问世打下了重要的基础。2005年9月,中国科技大学用全封闭的超真空显微镜,给比头发丝直径还小一万倍的分子做“手术”,不但使一个没有磁性的分子变成有磁性的,而且还可以控制和改造它。美国《科学》杂志评价说,中国的这项工作开辟了一个新领域,使世界上单分子基础研究迈上了新台阶,它为未来光电器件和生物工程技术的应用提供了广泛的前景。
JSP Model1 Model2
JSP Model1 Model2 在JavaServer Pages - Specification 0.92中的描述
JavaServer Pages Access Model
You can apply the JavaServer Pages technology in two ways:
A user working in a client Web browser makes a request that is sent to a JavaServer Pages (.jsp) file. The .jsp file accesses server components that generate dynamic content and displays the dynamic content in the browser.
A user working a client Web browser makes a request that is sent to a Java Servlet that generates a result and stores the result in component. The servlet then calls a JavaServer Pages file, which accesses the component and displays the dynamic content in the browser.
Model 1: A request sent to a JavaServer Pages file
The user working in a client Web browser can make a request directly of a JavaServer Pages file.

After receiving the client request, the JavaServer Pages file requests information from a JavaBean. The JavaBean can in turn request information from an Enterprise JavaBean or a database. Once the JavaBean generates content (perhaps working with an Enterprise JavaBean, a database, or both), the JavaServer Pages file can query and display the Bean's content.
Model 2: A request sent to a Java Servlet
Another way to to use JavaServer Pages is to send a request to a Java Servlet.

In this example, the client makes a request that is handled by a Java Servlet. The servlet generates the dynamic content -- in this example, the servlet uses JDBC to communicate with a database to obtain the content. The servlet then wraps the dynamic content into a bean. The JavaServer Pages file accesses the dynamic content from the bean and displays the content in the client web browser.
Common to both access models
In either Model 1 or Model 2, the JavaServer Pages file is identified to the server by a .jsp extension -- this tells the server that special handling is required. The first time a request is made for such a file -- either directly from a client browser or from a servlet -- the .jsp file is compiled into an object. (For that reason, there can be a slight delay on the first request for a .jsp page.) The output from the object is standard HTML which the browser interprets and displays as usual.

After compilation, the compiled-page object is stored in memory on the server. On subsequent requests for that page, the server checks to see if the .jsp file has changed. If it has not changed, the server uses the compiled-page object stored in memory to generate the response to the client. (Because the object is stored in memory, the response is very fast.) If the .jsp file has changed, the server automatically recompiles the page file and replaces the object in memory.
Some examples of components that can be called from a JavaServer Pages file are JDBCTM or JavaTM BlendTM components. The results are obtained from the components by the JavaServer Pages, using standard Bean property readers, and are displayed using HTML.
正则表达式之全部符号解释
标题 正则表达式之全部符号解释 选择自 kgdiwss 的 Blog
关键字 正则表达式之全部符号解释
出处
字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
appfuse
Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架,它继承了流行的Spring、Hibernate、ibatis、struts、Xdcolet、junit等基础框架,最新的1.7版更是提供了对Taperstry和JSF的支持。在持久层,AppFuse采用了Hibernate O/R映射工具(http://www.hibernate.org);在容器方面,它采用了Spring Framework(http://www.springframework.org)。用户可以自由选择Struts、Spring/MVC,Webwork,Taperstry、JSF这几个web框架。采用TDD的开发方式,使用JUnit测试各层,甚至测试 jsp 输出的 w/o 错误。为了简化开发,预定义好了一套目录结构、基类、用来创建数据库、配置Tomcat、测试部署应用的 Ant 任务,帮助快速自动生成源程序和自动维护部分配置文件。
参考资料:
在https://appfuse.dev.java.net/可以下载Appfuse,目前的版本是1.7。
Appfuse的参考资料和文档可以在http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse查看。
Struts中使用Validator框架
Struts中使用Validator框架(1)
作者: Chuck Cavaness
每个应用程序都有责任确保它们插入到后台资料库的数据是合法有效的,毕竟,如果这些应用程序所依赖的数据一旦遭到了破坏,那将是灾难性的,那应用程序还能拿什么来使自己正常运转呢?比如说,使用正规关系数据库的一个应用程序,数据库中的每个字段都有自己一定的规则和约束,来保证存储在其中的数据在一定程度上的正确性。任何要使用后台资料库数据的应用程序都有责任保护它们提交的数据的完整性。
任何试图插入或更新不符合标准的数据的操作都有可能被发现并拒绝。这种检测可能遍布在整个应用程序的每个角落,在表现层可能进行一些验证,在业务逻辑层,商业逻辑对象一般也有商业逻辑的验证,还有在后台资料库也要对数据进行检查。
不幸的是,由于这种验证在应用程序中无处不在,造成了应用程序在一定程度上的验证数据的代码冗余。这并不是应用程序所希望的,因为这种在多处的重复劳动,使得应用程序的部署和维护要花去更多的时间。如果在整个应用程序中,这些验证规则可以重复使用,将使得应用程序更加富有弹性,换句话说就是,部署更快捷,定制更容易,程序更灵活。
Jakarta Commons 项目Validator框架简介
Validator是由David Winterfeldt创建的开源项目,它也是Jakarta Commons的一个子项目。Commons项目主要是提供一些像Validator这样的一些可重用组件。其他著名的Commons组件还有如BeanUtils,Digester,Logging框架等。Validator 1.0版本发布于2002年11月初。
使用Validator的好处
.使用Validator框架比一般的在应用程序的代码中定义验证规则有好多优点,如:
.可以在一处为应用程序定义验证规则;
.验证规则和应用程序是松耦合的;
.服务器端和客户端的验证规则可以在同一处定义;
.配置新验证规则或修改已有验证规则变得更加简单;
.支持国际化;
.支持正则表达式;
.可以用于Web应用程序也可用于标准的Java应用程序;
.采用声明的方法实现而不是编程实现;
除了之外,Validator最大的特征就是自身支持可插性(pluggability)。在文章的后面你将会看到使用Validator框架内置的验证规则来更好地完成你的工作,而更重要的是,Validator框架允许你自定义验证程序,并插入到框架中。
Struts和Validator的关系
应该指出的是Validator框架本身是因Struts框架而建立的。Validator的创建者David Winterfeldt在使用Struts的过程中发现,在许多ActionForm类中需要反复使用同一个验证规则,这样造成了大量的代码冗余。于是他决定创建Validator框架来消除这种冗余,这样Validator就诞生了。
尽管Validator架构最初是为Struts架构而生,但它还是被设计和构造成了可以独立于Struts架构而单独使用。这一个特征使得你可以在任何的应用程序中使用这个框架,不必管它是不是Struts架构的。并不会因为你不使用Struts框架而影响Validator架构对你的应用程序作用。事实上,这就是为什么Validator是Jakarta Commons项目的一部分而不直接是Struts项目的一部分。
现在,我们来将这个框架整合应用到像基于Struts构架这样的Web应用程序上。在文章的最后中我们再介绍如何把它应用到其他类型的应用程序中,如基于EJB的应用程序。
Validator组件概述
Validator架构有下面这些组件组成:
Validators;
配置文件;
资源绑定;
JSP自定义标签;
Validator Form类;
什么是Validators?
一个Validator就是,执行一个验证规则时Validator框架调用的一个Java类。框架根据配置文件中定义的方法签名来调用这个Validaotor类。一般情况下,每个Validator类提供一个单独的验证规则,然后这些规则可以组合成更复杂的规则集。
注意:有时出于方便,一个Validator类也可以定义多个验证规则,而每个规则是一个静态方法且并不包含任何客户端状态信息。
框架提供了14种默认的验证规则,有时候这些规则也被称为Validator框架的“基本规则”,这些基本规则如表一:
名称 描述
byte,short,integer,long,float,double 检验值是否能被转换成对应的基本数据类型
creditCard 检验输入域是否是一个合法的信用卡号码
date 检验输入域是否是一个合法日期
email 检验输入是否是一个合法Email地址
mask 检验输入域是否能成功匹配一个正则表达式
maxLength 检验值的长度是否小于等于给定的最大长度
minLength 检验值的长度是否大于等于给定的最小长度
range 检验值的范围是否在最大值和最小值之间
required 检验输入域是否为不为空,或不包含空格值的长度是否大于零
正像你在表一中看到的,Validator框架提供了Web应用程序需要的大多数的验证规则。你可以使用这些现有的验证规则来创建自己验证配置文件。尽管这样,也正如我们前面提到的,和后面要讲到的,你可以根据你的需要随意的增加更多的Validator。
现在,让我们来讨论如何在一个基于Struts架构的应用程序中配置使用这些基本的Validator。
使Validator框架具有弹性的原因在于所有的验证规则和其具体细节都是通过在外部文件中配置声明实现的。你的应用程序并不必要知道这些具体的验证规则。这一特征使得规则集的发生扩展和修改时,你并不用去动你应用程序的源代码。这一点对你要进行每次的个性化安装或当需求发生变化时来说是非常重要的。
如果你使用Struts1.1的Validator框架,你会用到这样两个配置文件,一个叫validator- rules.xml,另一个叫validation.xml;其实你也可以随意的给他们命名,甚至可以把它们合并成一个XML文件。但是,你还是最好把它们分开,因为它们各有各的用途。
注意:如果你从Jakarta网站上下载Validator,并不包含这两个文件。只有在包含的Validator框架的Struts的下载中才可以找到这两个文件。
validator-rules.xml文件
validator-rules.xml文件定义应用程序可以使用的Validator。validator-rules.xml充当模板的作用,定义所有应用程序可能要用到的Validator。
注意:这个xml文件和我们下面要讨论的另一个xml文件都应该放到类加载器可以找得到的地方。当我们在Web应用程序中使用Validator框架时,正确的位置应该是在WEB-INF下。
validator-rules.xml文件服从validator- rules_1_1.dtd的管理,validator- rules_1_1.dtd可以在jakarta.apache.org/struts/dtds/validator- rules_1_1.dtd下载到。我们并不想花太多的时间放在研究这个文件的具体细节上,我们在这儿只作一些基本的介绍。
validator-rules.xml文件中最重要的元素包含在元素中,例如,例一:
例一:一个简单的validator-rules.xml文件
classname="org.apache.struts.util.StrutsValidator"
method="validateRequired"
methodparams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>
method="validateMinLength"
methodparams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends="required"
msg="errors.minlength"/>
应用程序使用的每个Validator对应一个元素。在例一中给大家展示了两个Validator,一个是请求Validator,另一个是最小长度Validator。元素支持许多属性。这些属性是必要的,用于告知框架这个Validator应当调用哪个正确的类和方法。例如,例一中的请求Validator元素表明这个Validator将调用org.apache.struts.util.StrutsValidator类的validateRequest()方法。Validator也可能要依赖另一个Validator,如例一中的最小长度的Validator就是这样一个例子,它包含一个depends属性,用它来表示这个Validator将依赖于请求Validator。msg属性用一个键值指定一个资源绑定,框架将用它来生成正确的错误信息。资源绑定的使用有益于错误信息的本地化。
元素还支持子元素,允许你指定一个客户端运行的javascript函数。这样服务器端和客户端验证可以在同一处指定,这使应用程序的维护变得简单。
validation.xml文件
Validator框架的第二个配置文件就是这个叫validation.xml的文件。其实你可以随意把它命名为你喜欢的任何名字,也可以把它放到validator-rules.xml文件中。
validation.xml用于把你在validator-rules.xml中定义的各个Validator和你的应用程序中的组件映射起来。由于我们在这里讨论的是在Struts中使用Validator框架,那么在这里validation.xml就是把这些Validator和Struts的ActionForm类建立映射。ActionForm类其实是一个类似JavaBean一样的类,在Struts中用于捕捉用户输入并帮助传输这些输入到下一级应用程序组件。ActionForm也提供了在用户输入被传到业务逻辑层之前验证这些输入的便利场所。例二是一个简单的validation.xml:
例二:一个简单的validation.xml文件
depends="required">
例二向大家展现了一个name属性叫checkoutForm的一个form元素。checkoutForm是一个在Struts配置文件中定义的一个ActionForm Bean。所以,例二的XML文件就是把这个ActionForm Bean和请求Validator建立映射,Bean的firstName和lastName属性分别对应XML文件中相应的firstName和lastName field元素。
其实它还有许多其它作用,如可以在validation.xml中定义常量和全局变量,用于在整个文件中使用,当你想使时可以方便的反复使用。对于validation.xml的元素和属性更详细的解释,可以下载jakarta.apache.org/struts/dtds/validation_1_1.dtd参阅。
资源绑定
资源绑定用于帮助消息本地化和一些其它文本信息的本地化处理。由于它减少了应用程序的许多冗余的硬编码,故对应用程序有很大益处。比如,如果你要在JSP页面中要使用一个“Name”标签时,你可以把这个字符串放到一个资源绑定中,然后使用资源绑定的一个逻辑键值引用这个字符串,而不是直接使用这个字符串,这样做的好处在于,当你想把这个字符串改为“First Name”时,你只需在资源绑定中修改一处即可,而不必修改整个应用程序的全部代码。
对于Validator框架,当验证规则失败的时候,可以从资源绑定中创建错误信息。Validator框架提供几种默认消息,同一般的应用程序消息资源放在一起。如下:
#Normal resource bundle messages
label.firstName=First Name
label.lastName=Last Name
#Error messages used by the Validator
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
...
当一个验证规则失败时,这个验证规则创建一个错误信息。框架将自动给消息插入参数。比如说,我们使用例一和例二的验证规则,当checkoutForm的firstName属性为空时,我们会看到这样的错误信息:
First Name is required.
你也可以修改绑定或配置文件来显示你喜欢的消息。
“挂”Validator到Struts上
现在我们已经了解了Validator框架,感觉蛮不错吧!下面我们将快速的讲一下我们是如何轻松地在Struts框架中使用Validator框架的。
首先要做的就是让Struts框架认识Validator框架。你可以使用Struts1.1的Plug-in新特性来实现它。只要在Struts配置文件中增加下面代码即可:
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
这样Struts就可以自动识别Validator框架了。
另外一个必需的步骤就是创建ActionForm Bean(标准的或是动态的)和确保Validator框架的配置文件是可用的,这样就搞定了。并不需要作一些调用验证规则或做其他具体的事情,Struts框架会自动完成这些工作,这就是所谓的基于声明的配置。然后当验证规则失败的时候,你就可以用JSP标签看到显示的错误信息了。
创建自己的Validator
尽管Validator框架已为大家提供了Web应用程序需要的大多数验证规则,但有时我们还是需要创建一些自己的验证规则。幸运的,Validator框架的扩展性相当好,为你提供了这种便利,而这样做对程序造成的影响相当小的。
创建自己的Validator并不是一件难事,只要创建一个实现这个规则的Java类即可。比如,(在国外)要去超市买二锅头,要验证顾客是否达到合法饮酒年龄。你可以使用已有的验证规进行验证,但我们觉得创建一个验证规则进行验证要更加直截了一些。验证饮酒年龄规则Validator Java代码如下:
例三:自定义验证规则
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.util.StrutsValidatorUtil;
public class NewValidator implements Serializable{
public static boolean validateDrinkingAge( Object bean,
ValidatorAction va,
Field field,
ActionErrors errors, HttpServletRequest request) {
String value = null;
if (isString(bean)) {
value = (String) bean;
} else {
value =
ValidatorUtil.getvalueAsString(bean, field.getProperty());
}
String sMin = field.getVarvalue("drinkingAge");
if (!GenericValidator.isBlankOrNull(value)) {
try {
int ivalue = Integer.parseInt(value);
int drinkingAge = Integer.parseInt(sMin);
if ( ivalue < drinkingAge ){
errors.add(field.getKey(),
StrutsValidatorUtil.getActionError(request, va, field));
return false;
}
} catch (Exception e) {
errors.add(field.getKey(),
StrutsValidatorUtil.getActionError(request, va, field));
return false;
}
}
return true;
}
private static boolean isString(Object o) {
if (o == null) {
return (true);
}
return (String.class.isInstance(o));
}
}
你创建完新的Validator之后,你只要把他加到现存的Validator框架的validator-rules.xml的列表中,你就可以像使用基本验证规则一样使用你自己创建的验证规则。
在非Struts应用程序中使用Validator框架
正像我们在前面谈到的,Validator框架最初是为在Struts框架中使用而设计的。可是,Validator框架设计的相当灵活,并没有直接把它耦合在Struts框架中,这样你就可以在普通的应用程序中也可以使用Validator框架来进行验证。但是,你必须执行一些必需的步骤。
你可以利用像在Web应用程序中一样使用配置文件。这也是使用Validatoe框架的另一个优点。你可以在Struts框架使用插件的方式来定位和装载这些文件。而在非Struts应用程序中你必须人为地手动的定位和装载这些配置文件。下面就是应用程序在启动时一般要调的方法:
...
ValidatorResources resources = new ValidatorResources();
InputStream rules =
ValidateExample.class.getResourceAsStream("validator-rules.xml");
ValidatorResourcesInitializer.initialize(resources, in);
InputStream forms =
ValidateExample.class.getResourceAsStream("validation.xml");
ValidatorResourcesInitializer.initialize(resources, forms);
...
这段代码片断创建了一个ValidatorResources实例,并根据两个配置文件进行了初始化。然后你就可以在你应用程序使用这个ValidatorResources对象验证你配置的JavaBean了。
例四向你展示如何使用已初始化的ValidatorResources对象来验证一个Person Bean。
例四:如何使用Validator验证你的Bean。
//假设我们已经创建和装配了一个CheckoutForm Bean对象
CheckoutForm form = new CheckoutForm();
//使用chekoutForm创建一个Validator
Validator validator = new Validator(resources, "checkoutForm");
//告诉Validator要验证哪个Bean
validator.addResource(Validator.BEAN_KEY, form);
//验证checkoutForm对象并存储验证结果
ValidatorResults results = validator.validate();
在例四中,我们看到我们把checkoutForm JavaBean的名字传给Validator类的构造器,这是为了告诉Validator实例使用哪套验证规则来验证这个Bean。
正如你看到的一样,在非Struts应用程序中使用Validator框架显得有点不自动化,但是它还是提供了比较灵活的解决方案。使用Validator框架的另一个好处就是把验证从源代码中分离到外部的配置文件中。这使我们可以把更多的时间放在我们的业务逻辑开发上。
客户端VS服务器端Validator
最后我们简单的阐述一下Validator框架对javascript的支持。因为有些应用程序需要执行一些客户端验证,在某些时候使用javascript进行一些客户端的验证是很有必要的。这里的客户端我们一般特指Web浏览器。
Validator框架提供使用配置文件中的规则动态和自动生成javascript验证规则的支持。对于每个元素,它可以有一个子元素和包含一些javascript代码。当包含一些自定义标签的JSP页面被解释时,javascript也被解释,并当表单提交时执行这些验证规则。这些叫javascriptValidatorTag的标签被包含在Struts的标签集中。这些标签可以像这样进行使用:
笔者认为在需要时使用一定的javascript是可以接受的。当你需要执行一些客户端的验证时,使用Validator框架标签是也是一种不错的选择,而且支持根据用户的区域进行本地化。
结束语
到此为止,我给大家简单地介绍了Validator框架,这些其实是框架的一些表面的东西。这个框架的内容深不可测,仅正则表达式就可以写一本小册子。
像任何一个框架一样,Validator框架为大家提供的是一个基础的架构,你可以根据你的需求对其进行扩展和个性化。使用像Validator的框架的最重要的一点就是它们是经过千锤百炼,是技术的精华。你并不需重蹈前人失败的覆辙,你可以节省下时间把更多的精力集中在对业务逻辑的开发上。