随笔 - 50  文章 - 0  trackbacks - 0
<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(1)

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜

编者按:2008年8月4日,StackOverflow 网友 Bert F 发帖提问:哪本最具影响力的书,是每个程序员都应该读的?

“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西。”

很多程序员响应,他们在推荐时也写下自己的评语。 以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书。

其实除了前10本之外,推荐数前30左右的书籍都算经典,笔者整理编译这个问答贴,同时摘译部分推荐人的评语。

下面就按照各本书的推荐数排列。

1、《代码大全》 史蒂夫·迈克康奈尔

推荐数:1684

“优秀的编程实践的百科全书,《代码大全》注重个人技术,其中所有东西加起来, 就是我们本能所说的“编写整洁的代码”。这本书有50页在谈论代码布局。” —— Joel Spolsky

对于新手来说,这本书中的观念有点高阶了。到你准备阅读此书时,你应该已经知道并实践过书中99%的观念。– esac

Steve McConnell的原作《代码大全》(第1版)是公认的关于编程的最佳实践指南之一, 在过去的十多年间,本书一直在帮助开发人员编写更好的软件。

现在,作者将这本经典著作全新演绎,融入了最前沿的实践技术,加入了上百个崭新的代码示例, 充分展示了软件构建的艺术性和科学性。 McConnell汇集了来自研究机构、学术界以及业界日常实践的主要知识, 把最高效的技术和最重要的原理交织融会为这本既清晰又实用的指南。

无论您的经验水平如何,也不管您在怎样的开发环境中工作,也无论项目是大是小, 本书都将激发您的思维并帮助您构建高品质的代码。

代码大全(第2版))》做了全面的更新,增加了很多与时俱进的内容,包括对新语言、新的开发过程与方法论的讨论等等。

2、《程序员修炼之道

推荐数:1504

对于那些已经学习过编程机制的程序员来说,这是一本卓越的书。 或许他们还是在校生,但对要自己做什么,还感觉不是很安全。

就像草图和架构之间的差别。虽然你在学校课堂上学到的是画图,你也可以画的很漂亮, 但如果你觉得你不太知道从哪儿下手,如果某人要你独自画一个P2P的音乐交换网络图,那这本书就适合你了。—— Joel

《程序员修炼之道:从小工到专家》内容简介:《程序员修炼之道》由一系列独立的部分组成, 涵盖的主题从个人责任、职业发展,知道用于使代码保持灵活、并且易于改编和复用的各种架构技术, 利用许多富有娱乐性的奇闻轶事、有思想性的例子及有趣的类比, 全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。

无论你是初学者,是有经验的程序员,还是软件项目经理,《程序员修炼之道:从小工到专家》都适合你阅读。

3、《计算机程序的构造和解释

推荐数:916

就个人而言,这本书目前为止对我影响醉倒的一本编程书。

《代码大全》、《重构》和《设计模式》这些经典书会教给你高效的工作习惯和交易细节。 其他像《人件集》、《计算机编程心理学》和《人月神话》这些书会深入软件开发的心理层面。 其他书籍则处理算法。这些书都有自己所属的位置。

然而《计算机程序的构造和解释》与这些不同。 这是一本会启发你的书,它会燃起你编写出色程序的热情; 它还将教会你认识并欣赏美; 它会让你有种敬畏,让你难以抑制地渴望学习更多的东西。

其他书或许会让你成为一位更出色的程序员,但此书将一定会让你成为一名程序员。

同时,你将会学到其他东西,函数式编程(第三章)、惰性计算、元编程、虚拟机、解释器和编译器。

一些人认为此书不适合新手。 个人认为,虽然我并不完全认同要有一些编程经验才能读此书,但我还是一定推荐给初学者。 毕竟这本书是写给著名的6.001,是麻省理工学院的入门编程课程。 此书或许需要多做努力(尤其你在做练习的时候,你也应当如此),但这个价是对得起这本书的。

4、《C程序设计语言

推荐数:774

这本书简洁易读,会教给你三件事:C 编程语言;如何像程序员一样思考;底层计算模型。 (这对理解“底层”非常重要)—— Nathan

《C程序设计语言》(第2版新版)讲述深入浅出,配合典型例证,通俗易懂,实用性强, 适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。

《C程序设计语言》(第2版新版)原著即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的 一本介绍C语言的权威经典著作。 我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。 原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。

人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。

5、《算法导论

推荐数:671

《代码大全》教你如何正确编程; 《人月神话》教你如何正确管理; 《设计模式》教你如何正确设计……

在我看来,代码只是一个工具,并非精髓。 开发软件的主要部分是创建新算法或重新实现现有算法。 其他部分则像重新组装乐高砖块或创建“管理”层。

我依然梦想这样的工作,我的大部分时间(>50%)是在写算法,其他“管理”细节则留给其他人…… —— Ran Biron

  • 经典的算法书,被亚马逊网,《程序员》等评选为2006年最受读者喜爱的十大IT图书之一。
  • 算法领域的标准教材,全球多所知名大学选用
  • MIT名师联手铸就,被誉为“计算机算法的圣经”
  • 编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。

6、《重构:改善既有代码的设计

推荐数:617

《重构:改善既有代码的设计》清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式, 并给出了何时以及何地应该开始挖掘代码以求改善。 书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。

《重构:改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。

《重构:改善既有代码的设计》适合软件开发人员、项目管理人员等阅读, 也可作为高等院校计算机及相关专业师生的参考读物。

我想我不得不推荐《重构》:改进现有代码的设计。—— Martin

我必须承认,我最喜欢的编程语录是出自这本书:任何一个傻瓜都能写出计算机能理解的程序, 而优秀的程序员却能写出别人能读得懂的程序。—— Martin Fowler

7、《设计模式

推荐数:617

自1995年出版以来,本书一直名列Amazon和各大书店销售榜前列。 近10年后,本书仍是Addison-Wesley公司2003年最畅销的图书之一。 中文版销售逾4万册。

就我而言,我认为四人帮编著的《设计模式》是一本极为有用的书。 虽然此书并不像其他建议一样有关“元”编程,但它强调封装诸如模式一类的优秀编程技术, 因而鼓励其他人提出新模式和反模式(antipatterns),并运用于编程对话中。—— Chris Jester-Young

8、《人月神话

推荐数:588

在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。

Brooks博士为人们管理复杂项目提供了最具洞察力的见解。 既有很多发人深省的观点,又有大量软件工程的实践。 本书内容来自Brooks博士在IBM公司System/360家族和OS/360中的项目管理经验。

该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄中等多种语言,全球销量数百万册。 确立了其在行业内的经典地位。

9、《计算机程序设计艺术

推荐数:542

《计算机程序设计艺术》系列著作对计算机领域产生了深远的影响。 这一系列堪称一项浩大的工程,自1962年开始编写,计划出版7卷,目前已经出版了4卷。

《美国科学家》杂志曾将这套书与爱因斯坦的《相对论》等书并列称为20世纪最重要的12本物理学著作。 目前Knuth正将毕生精力投入到这部史诗性著作的撰写中。

这是高德纳倾注心血写的一本书。—— Peter Coulton

10、《编译原理》(龙书)

推荐数:462

我很奇怪,居然没人提到龙书。(或许已有推荐,我没有看到)。 我从没忘过此书的第一版封面。 此书让我知道了编译器是多么地神奇绝妙。- DB

11、《深入浅出设计模式

推荐数:445

强大的写作阵容。

  • 《Head First设计模式》(中文版) 作者Eric Freeman;
  • ElElisabeth Freeman是作家、讲师和技术顾问。
  • Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。
  • Kathy Sierra(javaranch.com的创始人)FHBert Bates是畅销的HeadFirst系列书籍的创立者,也是Sun公司Java开发员认证考试的开发者。

本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里, 不容易被遗忘。

本书的编写方式采用引导式教学,不直接告诉你该怎么做,而是利用故事当作引子,带领读者思考并想办法解决问题。 解决问题的过程中又会产生一些新的问题,再继续思考、继续解决问题,这样可以加深体会。

作者以大量的生活化故事当背景,例如第1章是鸭子,第2章是气象站,第3章是咖啡店, 书中搭配大量的插图(几乎每一页都有图),所以阅读起来生动有趣,不会感觉到昏昏欲睡。

作者还利用歪歪斜斜的手写字体,增加“现场感”。 精心设计许多爆笑的对白,让学习过程不会太枯燥。 还有模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。 每一章都有数目不等的测验题。 每章最后有一页要点整理,这也是精华所在,我都是利用这一页做复习。

我知道四人帮的《设计模式》是一本标准书,但倒不如先看看这部大部头,此书更为简易。 一旦你了解了解了基本原则,可以去看四人帮的那本圣经了。- Calanus

12、《哥德尔、艾舍尔、巴赫书:集异璧之大成

推荐数:437

如果下昂真正深入阅读,我推荐道格拉斯·侯世达(Douglas Hofstadter)的《哥德尔、艾舍尔、巴赫书》。 他极为深入研究了程序员每日都要面对的问题:递归、验证、证明和布尔代数。 这是一本很出色的读物,难度不大,偶尔有挑战,一旦你要鏖战到底,将是非常值得的。 – Jonik

13、《代码整洁之道

推荐数:329

细节之中自有天地,整洁成就卓越代码

尽管糟糕的代码也能运行,但如果代码不整洁,会使整个开发团队泥足深陷, 写得不好的代码每年都要耗费难以计数的时间和资源。 然而这种情况并非无法避免。

著名软件专家RoberfC.Marlin在《代码整洁之道》中为你呈现出了革命性的视野。 Martin携同ObjectMetltor公司的同事,从他们有关整洁代码的最佳敏捷实践中提炼出软件技艺的价值观, 以飨读者,让你成为更优秀的程序员——只要你着手研读《代码整洁之道》。

阅读《代码整洁之道》需要你做些什么呢?你将阅读代码——大量代码。 《代码整洁之道》促使你思考代码中何谓正确,何谓错误。 更重要的是,《代码整洁之道》将促使你重新评估自己的专业价值观,以及对自己技艺的承诺。

从《代码整洁之道》中可以学到:

  • 好代码和糟糕的代码之间的区别;
  • 如何编写好代码,如何将糟糕的代码转化为好代码;
  • 如何创建好名称、好函数、好对象和好类;
  • 如何格式化代码以实现其可读性的最大化;
  • 如何在不妨碍代码逻辑的前提下充分实现错误处理;
  • 如何进行单元测试和测试驱动开发。

虽然《代码整洁之道》和《代码大全》有很多共同之处,但它有更为简洁更为实际的清晰例子。 – Craig P. Motlin

14、《Effective C++》和《More Effective C++

推荐数:297

在我职业生涯早期,Scott Meyer的《Effective C++》和后续的《More Effective C++》都对我的编程能力有着直接影响。 正如当时的一位朋友所说,这些书缩短你培养编程技能的过程,而其他人可能要花费数年。

去年对我影响最大的一本书是《大教堂与市集》,该书教会我很有关开源开发过程如何运作,和如何处理我代码中的Bug。 – John Channing

15、《编程珠玑

推荐数:282

多年以来,当程序员们推选出最心爱的计算机图书时,《编程珠玑》总是位列前列。 正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力, 从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”, 成为世界计算机界名刊《ACM通讯》历史上最受欢迎的专栏, 最终结集为两部不朽的计算机科学经典名著,影响和激励着一代又一代程序员和计算机科学工作者。

本书为第一卷,主要讨论计算机科学中最本质的问题:如何正确选择和高效地实现算法。

尽管我不得不羞愧地承认,书中一半的东西我都没有理解,但我真的推荐《编程珠玑》,书中有些令人惊奇的东西。 – Matt Warren

16、《修改代码的艺术》by Michael Feathers

本书是继《重构》和《重构与模式》之后探讨修改代码技术的又一里程碑式的著作, 而且从涵盖面和深度上都超过了前两部经典。 书中不仅讲述面向对象语言(Java、C#和C++)代码,也有专章讨论C这样的过程式语言。

作者将理解、测试和修改代码的原理、技术和最新工具(自动化重构工具、单元测试框架、仿对象、集成测试框架等), 与解依赖技术和大量开发和设计优秀代码的原则、最佳实践相结合,许多内容非常深入,而且常常发前人所未发。

书中处处体现出作者独到的洞察力,以及多年开发和指导软件项目所积累的丰富经验和深厚功力。 通过这部集大成之作,你不仅能掌握最顶尖的修改代码技术,还可以大大提高对代码和软件开发的领悟力。

我认为没有任何一本书能向这本书一样影响了我的编程观点。 它明确地告诉你如何处理其他人的代码,含蓄地教会你避免哪些(以及为什么要避免)。- Wolfbyte

同意。很多开发人员讨论用干净的石板来编写软件。 但我想几乎所有开发人员的某些时候是在吃其他开发人员的狗食。– Bernard Dy

17、《编码:隐匿在计算机软硬件背后的语言

这是一本讲述计算机工作原理的书。

不过,你千万不要因为“工作原理”之类的字眼就武断地认为,它是晦涩而难懂的。 作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。 更重要的是,你会因此而获得对计算机工作原理较深刻的理解。 这种理解不是抽象层面上的,而是具有一定深度的,这种深度甚至不逊于“电气工程师”和“程序员”的理解。

不管你是计算机高手,还是对这个神奇的机器充满敬畏之心的菜鸟, 都不妨翻阅一下《编码:隐匿在计算机软硬件背后的语言》,读一读大师的经典作品,必然会有收获。

我推荐Charles Petzold的《编码》。 在这个充满工具和IDE的年代,很多复杂度已经从程序员那“抽取”走了,这本书一本开眼之作。 – hemil

18、《禅与摩托车维修艺术 / Zen and the Art of Motorcycle Maintenance

对我影响最大的那本书是 Robert Pirsig 的《禅与摩托车维修艺术》。 不管你做什么事,总是要力求完美,彻底了解你手中的工具和任务,更为重要的是, 要有乐趣(因为如果你做事有乐趣,一切将自发引向更好的结果)。 – akr

19、《Peopleware / 人件集:人性化的软件开发

Demarco 和 Lister 表明,软件开发中的首要问题是人,并非技术。 他们的答案并不简单,只是令人难以置信的成功。 第二版新增加了八章内容。 – Eduardo Molteni

20、《Coders at Work / 编程人生

这是一本访谈笔录,记录了当今最具个人魅力的15位软件先驱的编程生涯。 包括DonaldKnuth、Jamie Zawinski、Joshua Bloch、Ken Thompson等在内的业界传奇人物,为我们讲述了 他们是怎么学习编程的,在编程过程中发现了什么以及他们对未来的看法, 并对诸如应该如何设计软件等长久以来一直困扰很多程序员的问题谈了自己的观点。

一本非常有影响力的书,可以从中学到一些业界顶级人士的经验,了解他们如何思考并工作。 – Jahanzeb Farooq

21、《Surely You’re Joking, Mr. Feynman! / 别闹了,费曼先生!》

虽然这本书可能有点偏题,但不管你信不信,这本书曾在计算机科学专业课程的阅读列表之上。 一个优秀的角色模型,一本有关好奇心的优秀书籍。 – mike511

22、《Effective Java 中文版

此书第二版教你如何编写漂亮并高效的代码,虽然这是一本Java书,但其中有很多跨语言的理念。 – Marcio Aguiar

23、《Patterns of Enterprise Application Architecture / 企业应用架构模式

很奇怪,还没人推荐 Martin Fowler 的《企业应用架构模式》- levi rosol

24、《The Little Schemer》和《The Seasoned Schemer》 nmiranda

这两本是LISP的英文书,尚无中文版。 美国东北大学网站上也有电子版。

25、《交互设计之路》英文名:《The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity》该书作者:Alan Cooper,人称Visual Basic之父,交互设计之父。

本书是基于众多商务案例,讲述如何创建更好的、高客户忠诚度的软件产品和基于软件的高科技产品的书。 本书列举了很多真实可信的实际例子,说明目前在软件产品和基于软件的高科技产品中,普遍存在着“难用”的问题。

作者认为,“难用”问题是由这些产品中存在着的高度“认知摩擦”引起的, 而产生这个问题的根源在于现今软件开发过程中欠缺了一个为用户利益着想的前期“交互设计”阶段。 “难用”的产品不仅损害了用户的利益,最终也将导致企业的失败。

本书通过一些生动的实例,让人信服地讲述了由作者倡导的“目标导向”交互设计方法在解决“难用”问题方面的有效性, 证实了只有改变现有观念,才能有效地在开发过程中引入交互设计,将产品的设计引向成功。

本书虽然是一本面向商务人员而编写的书,但也适合于所有参与软件产品和基于软件的高科技产品开发的专业人士, 以及关心软件行业和高科技行业现状与发展的人士阅读。

他还有另一本中文版著作:《About Face 3 交互设计精髓》

26、《Why’s (Poignant) Guide to Ruby 》

如果你不是程序员,阅读此书可能会很有趣,但如果你已经是个程序员,可能会有点乏味。

27、《Unix编程艺术》

It is useful regardless operating system you use. – J.F. Sebastian

不管你使用什么操作系统,这本书都很有用。 – J.F. Sebastian

28、《高效程序员的45个习惯:敏捷开发修炼之道

45个习惯,分为7个方面:工作态度、学习、软件交付、反馈、编码、调试和协作。

每一个具体的习惯里,一开始提出一个谬论,然后展开分析,之后有正队性地提出正确的做法,并设身处地地讲出了正确做法给你个人的“切身感受”,最后列出几条注意事项,帮助你修正自己的做法(“平衡的艺术”)。

29、《测试驱动开发

前面已经提到的很多书都启发了我,并影响了我,但这本书每位程序员都应该读。 它向我展示了单元测试和TDD的重要性,并让我很快上手。 – Curro

我不关心你的代码有多好或优雅。 如果你没有测试,你或许就如同没有编写代码。 这本书得到的推荐数应该更高些。 人们讨论编写用户喜欢的软件,或既设计出色并健壮的高效代码,但如果你的软件有一堆bug,谈论那些东西毫无意义。– Adam Gent

30、《点石成金:访客至上的网页设计秘笈

可用性设计是Web设计中最重要也是难度最大的一项任务。 《点石成金-访客至上的网页设计秘笈(原书第二版)》作者根据多年从业的经验,剖析用户的心理, 在用户使用的模式、为扫描进行设计、导航设计、主页布局、可用性测试等方面提出了许多独特的观点, 并给出了大量简单、易行的可用性设计的建议。

本书短小精炼,语言轻松诙谐,书中穿插大量色彩丰富的屏幕截图、趣味丛生的卡通插图以及包含大量信息的图表, 使枯燥的设计原理变得平易近人。

本书适合从事Web设计和Web开发的技术人员阅读,特别适合为如何留住访问者而苦恼的网站/网页设计人员阅读。 这是一本关于Web设计原则而不是Web设计技术的书。

本书作者是Web设计专家,具有丰富的实践经验。 他用幽默的语言为你揭示Web设计中重要但却容易被忽视的问题,只需几个小时, 你便能对照书中讲授的设计原则找到网站设计的症结所在,令你的网站焕然一新。

取决于你所追求的目标。 我喜欢《代码大全》是因纯编程,《点石成金》是一本有关UI设计的卓越书籍。 – Justin Standard

posted @ 2012-08-14 17:46 justjavac(迷渡) 阅读(201) | 评论 (0)编辑 收藏
php新手开发的作品通常都有以下不足:

1、网站目录不合理,无法分辨各个功能的文件夹及文件,没有系统内核。

2、网站未经过初始化,没有安全过滤,没有统一入口。

3、基本没有class,甚至连function都很难找到,冗余代码多,并有大量的重复文件。

4、PHP代码混编,非MVC模式。

发现了自己的不足,就要针对不足之处加强技术学习,多从成熟的系统作品中学习,

解决以上几个方面的问题,再多了解最新的php安全漏洞,以及编程技巧,你就会

逐渐成为开发高手!

最后一点,php上手虽快,但没有系统学习过软件专业的课程和知识是肯定不够的,

无 论你是哪一种语言工具的开发者,算法设计与分析是你一定要精通的,认真

扎实地学过数据结构、算法、编绎原理这些专业课程后,你会发现:

你 不论学什么开发,都会感到的自己的悟性非凡!
posted @ 2010-07-02 11:54 justjavac(迷渡) 阅读(146) | 评论 (0)编辑 收藏

1. CI中的controller都应当小写。刚开始为了区分单词,把第二个单词大写了,结果就是不认default_controller。事实证明这是错误的。放到linux下面就不灵了,应该全部小写,如果你大写了,CI会认为这是libraries里面的东西。不管怎样都应该全部小写,至少可以避免linux下区分大小写的问题。

 

2. 分页的问题。CI的官方论坛下提供了一些源代码,怎样写分页函数我就不多说了,可以直接看高手的。关键是传递页面参数的时候,不要忘了修改segment。一开始怎么传都不对,后来才想起来我的网址已经是localhost/codeigniter/aaa/bbb/3/10了,这样segment也要相应改变。分页参数在第几个/后,他就是uri->segment(几)。如果是搜索之后的分页,那么$config['total_rows']就不是count_all了,而是加入where之后的query的记录数。想起来倒是有一个问题还没解决,就是在你点search之后,一般需要用JS把网址转换成CI固有的模式,但是怎样使这个js生成的网址包含到site_url中,我没有解决,只能手工了(仔细想想还是挺简单的呵呵,自己造网址不用site_url)。

 

3. MVC模式我已经比较适应了。将页面都放在view中,控制语句放在controller中,而函数放在model中。刚开始有很多人和我一样想要在view或者control中加一些语句,只能说,不行,也不规范。最好的办法是写成helper,如果是数据库的二次调用的话,可以用inner join合并。

 

4. htaccess的问题。很多人肯定和我一样,一开始接触的时候就是感兴趣怎样可以去掉index.php。虽然网上已经泛滥了,但是我再写一次吧。其实就两个工作,第一,在根目录写一个.htaccess的文档,第二,开启apache中的rewrite模块。

1)htaccess的写法很多。这是基于你对CI各层目录的安排决定的。我的安排:除了application中的内容外。将其他所有东西放在根目录下的www目录下,其中图片放在www/images/下,flash放在www/flash/下,xml放在www/xml下,js放在www/js下。。。。总之全堆在www里面。所有views在title下面加上<base href="<?=base_url()?>" />这句话,系统就能识别你的根目录了,所有链接改成site_url()就可以保证路径不会出错了。于是,我的htaccess是这样的:

RewriteEngine on  

RewriteCond $1 !^(index\.php|www|uploadfiles|robots\.txt)  

RewriteRule ^(.*)$ /index.php/$1 [L] [L]

第一行是将rewrite打开,第二行是不rewrite的例外,包括index.php本身,www目录,uploadfiles(这个参见5),还有robots搜索,第三行自然就是将index.php隐藏的rewrite规则了,即剩下的网址由于原来都是localhost/codeigniter/index.php/aaa/bbb的模式,现在可以去掉index.php了。而www下的网址不涉及index.php,用不到这个规则,所以要排除。

2)首先找到apache下面的http.conf,路径是apache的conf目录下。找到这一行:LoadModule rewrite_module modules/mod_rewrite.so,将前面的#去掉,也就是说开启这个module。另外需要找到rewrite的目录行,将AllowOverride设置为All,其实就是roadmodule下面的那个directory.

    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride All

3)在CI的config目录下的config.php中,将$config['index_page'] = "index.php"改为$config['index_page'] = “”,这样就大功告成啦!!不用输入index.php也可以访问了。其实更关键的是你的各个目录的路径安排。

5.FCKEditor的问题。应该说我在应用的时候没有遇到任何麻烦,除了上传时候的路径让我一顿好找。我觉得设置成根目录下的/uploadfiles是不错的选择,当然别忘了在htaccess中把uploadfiles也放在不rewrite的队伍中。因为我现在的习惯是所有的文件编码都设置成utf-8,所以网上经常说的乱码的现象没有遇到。

基本上就是这些基本的问题了,我做的其实就是简单的企业网站,没有高级应用,所以也没有遇到更复杂的问题。等考完GT可以尝试做一个更复杂的网站,和AJAX结合后再写一些心得。下次要再做这样的CMS,后台直接搞定,省了不少时间。而且对于我这样的PHP烂人来说,CI帮我解决了很多安全问题,同时也提高了效率。

有点过度兴奋了,写得超级乱,我自己都不愿意回过头去细细检查了,具体问题可以再联系我,只要我能解答。最后上传一个验证码的helper吧,版权归CI论坛上的同学所有,我只是转一下,顺便写一下用法。。。

点击下载此文件

1)首先在controller中引用getcode_helper.php, $this->load->helper('getcode');

建立一个function比如

Php代码 
  1. function createcode()  
  2. {  
  3.     code();  
  4. }  

 

2)验证码图片链接地址:<img id="codeimage" src="<?=site_url('controller路径/createcode')?>

3)表单提交时验证函数:

Php代码 
  1. function seccode_check($str)  
  2. {  
  3.     if(chk_code($str))  
  4.     {  
  5.         return TRUE;  
  6.     }  
  7.     else  
  8.     {   
  9.         return FALSE;  
  10.     }  
  11. }  

 


posted @ 2010-07-02 11:53 justjavac(迷渡) 阅读(226) | 评论 (0)编辑 收藏

在与许多客户的接触中,我发现有必要建立一套SOA的基本原则。下面的部分将介绍SOA中应有的基本原则。这些并非绝对真理,它们更像一个用于SOA相关讨论的参考框架。你会发现:前四项衍生自Don Box提出的四项原则,尽管随着时间的流逝,这四项原则的描述可能已经有了些变化。
相关厂商内容

1. 明确边界:服务被调用时,与实现其功能相关的内容都应被传递过来。对服务的所有访问都应该通过公共接口进行。调用服务时,非隐含的假设是必须的。“服务与消息紧密联系,因为参数进出服务的唯一方式是通过消息进行的”。作为通用的模式,服务调用不应依赖于共享的上下文,而应被作为无状态的模块。契约描述了服务的功能性与非功能性的能力和特点,管理着服务提供的接口。服务调用是一个具有业务逻辑效果的行为,可能有大量的资源开销,并且导致一系列不同于本地方法调用和远程过程调用的错误。服务的调用绝非远程过程调用。

服务的使用和提供应该尽可能地简单,因此与服务间的交互没必要被隐藏得太多。在SOA中,服务发送和接收的消息、服务契约以及服务本身都应当是最好的构件。这就意味着,例如,被用到的编程模型和工具至少应该提供一个API,这个API会帮助服务的编程人员了解上述概念。总的来说,一个明确的接口会封装服务的内在实现,而服务通过该接口发布自己的功能;与服务交互是一个具体的行为,它依赖于服务使用者和提供者之间消息的传递。

2. 共享契约和架构,而不是类:基于一份服务描述(一份契约),服务使用者和服务提供者都可以获得使用或提供服务的全部所需。根据松耦合原则,服务提供者不能依靠服务使用者来重用那些依赖于使用者环境的代码。毕竟,服务使用者可能使用不同的开发环境和运行环境。这条原则给SOA体系中所能交换的数据加上了严格的限制。理想的情况是,数据以符合一种或多种模式的XML文档形式被交换,因为这种方式可应用于任何你能想到的编程环境。因此,因为这条原则在基于DCOM和基于RMI的环境中是不可能被遵守的,所以这两种环境基本上无法成为SOA的可用选项。

3. 策略驱动:为了与服务交互,必须满足以下两组不同的要求:

  • 提供者提供的功能、语法和语义必须适应使用者的需求;
  • 技术能力与需要必须匹配。
例如,一个服务提供者提供了能够精确满足用户需求的服务,但该服务是基于JMS的,可使用者只能使用HTTP方式(比如,服务被应用于.NET平台)。服务提供者可能要求消息级别的加密采用XML加密标准,而使用者只支持采用SSL技术来保障传输层上的安全。即使在那些交互双方都拥有足够能力的案例中,它们的这些能力仍旧需要被“启用”。例如,提供者可能根据不同的使用者需求,对响应的消息使用不同的算法进行加密。

为了使尽可能多的形形色色的使用者能对服务进行访问,一种策略机制已经被作为SOA工具集的一部分引入了。在服务接口对功能进行描述的同时,策略对不同的,非功能性的能力和需求进行了指定。(译者注:策略指定的是服务之外的补充信息,是对服务使用者提出的特征要求)。

4. 自治:与明确边界原则相关,服务自治意味着,接口成为服务与外界联系的唯一方式,至少从SOA的角度来看是这样的。需要注意的是,服务的运行环境一定是可变的。例如,在丝毫不影响使用者的情况下,就可以从轻量级的原型实现转换到成熟的、基于应用服务器的协同组件集。服务能够被彼此独立的修改、部署、发布新版本和管理。服务提供者不能寄希望于服务使用者,期望它们依靠自己的能力迅速适应新版本的服务,有的使用者可能甚至没这个能力或者根本不愿去适应新版本的服务接口(尤其是当这些服务接口超出了服务提供者控制范围的时候)。

5. 采用可传输的协议格式,而非API:服务通常采用协议格式来发布,协议格式应该是明确的、可传输的并且被服务所支持的。这一点与前两条原则非常相关,但却带来了新的见解:为保证一个服务最大程度的可访问性(及长期的可用性),只要交互过程遵守为该服务定义的策略,那么由任何依照服务接口进行消息交换的平台都可以访问该服务。例如,通过以这一原则来测试主流的动态编程语言(如Perl、Python或Ruby),我们可以去考虑该语言能否使用或提供一个特定的服务。虽然,在现有的技术实现里,这条原则可能还没有发挥作用,但这个思路可以作为下列准则的试金石:
  • 使用开放的标准或者可阅读的描述来描述所有消息格式。
  • 不需要特定的资源就可以创造出符合这些合理的模式的消息。
  • 成功通信所必需的附加信息,例如包含安全性或可靠性约束的头信息,它们的语义和语法要遵循公开的规范和标准。
  • 服务交互时所使用的传输(或传递)协议中至少有一个是标准的网络协议,或它可以通过标准的网络协议来访问。

6. 面向文档:服务交互时,数据是以文档的形式来传递的。文档是一个被明确模块化的,有层次结构的数据容器。面向文档的一个重要特征就是自描述。最理想的情况下,文档是对现实世界中的文件(如订单、发票或帐单)的建模。文档应该被设计来确保它在问题域的上下文中发挥作用,这意味着它们可能应用于一个或更多的服务。

与现实世界的纸制文档相似,和服务交换信息的文档将包含冗余的信息。例如,文档中可能同时包含了客户ID和客户地址信息(尽管客户ID可能已经足够了)。这种冗余是可以接受的,因为它将服务使用者和提供者双方的服务接口和隐含数据模型隔离开来。应用面向文档的模式的同时,服务调用成为有意义的业务逻辑消息的交换,而非上下文无关的RPC调用。虽然通常可以认为XML将被作为服务文档的格式和语法,但它还没有成为标准。

在一个SOA连接中,参与者之间的消息流转于不同的系统,使得各个系统之间彼此独立。松耦合原则要求参与者对共知的依赖越少越好。当消息在分布式对象或RPC基础架构中发送时,客户端和服务器端使用由同一个接口描述文档生成的代理类(stub和skeleton)。如果不是这种情况的话,当契约不支持双方的交互时,通讯就会停止。因为这个原因,RPC风格的基础架构要求客户端和服务器端程序代码的同步运行。

7. 松耦合:多数SOA的倡导者都认为松耦合是一个很重要的概念。不幸的是,对于究竟哪些特征造成一个系统松耦合,有许多不同的看法。一个系统可以在多个维度表现为松耦合或紧耦合,它依赖于具体的要求和上下文,系统可能会在一些维度是松耦合的,在另一些维度是紧耦合的。这些维度包括:

  • 时间:当参与者在时间上是松耦合时,它们不需要在同一时间启动并进行通讯。这要求两者之间采用某种缓冲或队列机制,尽管这种机制与松耦合无关。当参与的一方向另一方发送消息时,交互的继续不依赖于逻辑上或物理上能否立即返回应答消息。
  • 位置:如果一方参与者查询与之通信的另一方参与者的地址,另一方的地址可以透明地进行变更,不需要重新编程、重新配置或者甚至不需要通信伙伴的重新启动。这意味着查找(lookup)过程采用某种目录或地址来存储服务终端的地址。(对应SOA提供的目录服务)
  • 类型:同静态与动态,弱类型与强类型这些编程的概念类似,参与者既可以全部依赖也可以部分依赖文档结构来实现它的功能。
  • 版本:参与者可以依赖服务接口的特定版本,也可以兼容某个范围内的版本。所需匹配的版本越确切,参与者在这个方面上的松耦合性就越差。一个好的原则是遵循Postel法则(译者注:Postel’s Law——“Be liberal in what you accept, and conservative in what you send.”):服务提供者应尽可能兼容许多不同的版本,这将使它更加健壮(可能甚至需要容错),服务使用者应尽可能遵循精确的语法和文档类型。这将增加整个系统的稳定性和灵活性。
  • 基数:服务消费者和提供者可能是1对1的关系,尤其是在请求或响应交互发生时,或队列被明确使用的情况下。在别的情况下,服务使用者(在这种情况下,称作“消息发送者”或“事件源”更为合理)可能既不知道也不关心有多少人接受了消息。
  • 查找(Lookup):参与者打算调用服务时,既可以依赖服务提供者的物理名或逻辑名,也可以先通过一组功能描述来执行查找(lookup)操作。这意味着存在一个注册表和(或)仓库,对存储其中的使用者需求和提供者能力进行直接或间接的匹配。
  • 接口:参与者可能要绑定到一个特定的服务接口或是支持一个通用的接口。如果使用通用接口,所有该接口的使用者都能与所有该接口的提供者进行交互。尽管可能乍看起来这有些笨拙,但单一通用(统一)接口的原则就是WWW架构的核心。
创造一个满足以上所有维度的松耦合系统,既不可行,也没必要。不同类型的服务要做不同的取舍。Carlos Perez的经典之作中(如这里和这里)有更多的关于松耦合各个维度的讨论。

8. 遵循标准:一个SOA应用中应遵循的一个关键原则是,信赖标准而非专有的API和格式。标准存在于技术方面,如数据格式、元数据、传输协议;也存在于业务层面,如文档的类型。(例如,UBL中所提到的那些)(译者注:UBL定义了业务文档的通用XML库,UBL的文档类型包括订单、发票等)

很显然,一些人认为专有的解决方案,如一些EAI或消息服务提供商提供的方案,都遵循SOA原则。这个原则不遗余力地强调标准的重要性。当然,由于有太多可供选择的标准,什么情况用何种标准成了颇具争议的问题。标准的一个重要方面是它的可接受性(在Web服务的标准中,基本上可以认为“Microsoft肯定要插上一脚”)。

9. 独立于软件供应商:任何架构性的原则都不应依赖特定供应商的产品。将抽象的概念转化为具体的,可运行的系统的过程中,不可避免的要决定使用何种具体的产品,包括商业的或者免费开源的软件。这些决定都不应影响架构层。这就意味着要尽可能的依赖互操作性和可移植性的标准。因此,要应用支持适当标准的技术来构建服务提供者和使用者,不要受限于任何软件供应商的技术路线。

10. 元数据驱动:SOA中所有的元数据对象都需要被按照一种方式储存起来,这种方式将确保元数据对象能够在设计和运行时被发现、检索和解释。元数据对象包括对服务接口、参与者、端点和绑定信息、组织单元和职责、文档类型或模式、使用者或提供者关系等的描述。这些对象的用途应当是被代码自动生成或者解释,成为服务和参与者生命周期的一部分。

以上是我的原则列表。 即使你不完全同意——而坦率地讲,我也不希望你完全同意, 至少不是全部都同意——我希望你能带着它们来引发一些讨论!
posted @ 2010-07-02 11:53 justjavac(迷渡) 阅读(179) | 评论 (0)编辑 收藏

引领科技为您讲解配置 codeigniter,codeigniter 基本配置信息在 application/config/config.php 文件,本文详细讲解每一个基本配置选项,从而快速掌握 codeigniter 进行开发。

$config['base_url'] = "http://www.example.com/"

您网站的网址,codeigniter 会根据这个网址来生成链接、表单地址等。

$config['index_page'] = "index.php"

codeigniter 根目录下的 index.php 文件名,codeigniter 会使用它来生成链接地址。如果使用隐藏 index.php 的 URL,将其设置为空字符串:$config['index_page'] = ""。

$config['uri_protocol'] = "AUTO"

codeigniter 生成 URL 使用的格式,设置为“AUTO”自动探测。如果链接不能正常工作,可以尝试以下值:
PATH_INFO、QUERY_STRING、REQUEST_URI、ORIG_PATH_INFO。

$config['url_suffix'] = ""

codeigniter 产生链接时使用的 URL 后缀,如果要实现伪静态,可以设置 $config['url_suffix'] = ".html"。

$config['language'] = "english"

codeigniter 程序默认使用的语言

$config['charset'] = "UTF-8"

codeigniter 程序默认使用的字符集

$config['enable_hooks'] = FALSE

是否启用钩子,钩子功能使得您可以在不修改系统核心文件的基础上来改变或增加系统的核心运行功能。

$config['subclass_prefix'] = 'MY_'

设置扩展 codeigniter 类库时使用的类名前缀

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'

设置 codeigniter URL 中允许使用的字符,这是一个正则表达式。当访问者试图访问的 codeigniter URL 包含其它字符时,会得到一个警告。应该尽量限制 codeigniter URL 使用的字符来提高安全性,可以有效的过滤注入攻击。如果设置为空,允许使用所有字符,强烈建议不要这么做。

$config['enable_query_strings'] = FALSE

codeigniter URL 默认使用分段的 URL,此选项也允许 codeigniter 开启查询字符串形式 URL。您可以使用查询字符串来传递要访问的控制器和函数。例如: index.php?c=controller&m=method。codeigniter 默认使用分段的 URL,查询字符串的 URL 很多特性不被支持。

$config['controller_trigger'] = 'c'

codeigniter 将查询字符串中此选项对应的值当做 codeigniter 控制器的名字。

$config['function_trigger'] = 'm'

codeigniter 将查询字符串中此选项对应的值当做 codeigniter 控制器方法的名字

$config['log_threshold'] = 0

启用错误日志,设置记录哪些类型的错误。

0 = 关闭错误日志记录
1 = 记录错误信息
2 = 记录调试信息
3 = 记录通知信息
4 = 记录所有信息

$config['log_path'] = ''

如果您不想使用默认的错误日志记录目录配置(system/logs/),可以设置完整的服务器目录。

$config['log_date_format'] = 'Y-m-d H:i:s'

codeigniter 错误日志时间格式

$config['cache_path'] = ''

如果您不想使用默认的缓存目录(system/cache/)来存储缓存,可以设置完整的服务器目录

$config['encryption_key'] = ""

codeigniter 使用的密钥

$config['global_xss_filtering'] = FALSE

是否对输入数据(GET、POST)自动过滤跨脚本攻击

$config['compress_output'] = FALSE

启用Gzip压缩达到最快的页面加载速度

$config['time_reference'] = 'local'

设置时间格式:"local"、"GMT"

$config['rewrite_short_tags'] = FALSE

如果您想要使用短标记,但 PHP 服务器不支持,codeigniter 可以通过重写短标记来支持这一功能。

$config['proxy_ips'] = ''

如果访问者通过代理服务器来访问您的网站,您必须设置代理服务器 IP 列表,以识别出访问者真正的 IP

posted @ 2010-07-02 11:49 justjavac(迷渡) 阅读(1330) | 评论 (0)编辑 收藏

EL表达式
1、EL简介
1)语法结构
       ${expression}
2)[]与.运算符
     EL 提供.和[]两种运算符来存取数据。
     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:
         ${user.My-Name}应当改为${user["My-Name"] }
     如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
         ${sessionScope.user[data]}中data 是一个变量
3)变量
     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为
username的变量。
     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、
Application范围查找。
     假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,
就回传null。
     属性范围在EL中的名称
         Page         PageScope
         Request         RequestScope
         Session         SessionScope
         Application     ApplicationScope
4) 1--EL表达式用${}表示,可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码.
2--EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有${param}和${paramValues}.
${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组
值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话
范围内的变量.applicationScope表示应用范围的变量.
3 --<%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁
止.JSP2.0中默认的启用EL语言.
             4-- EL语言可显示 逻辑表达式如${true and false}结果是false     关系表达式如${5>6} 结
果是false     算术表达式如 ${5+5} 结果是10
             5--EL中的变量搜索范围是:page request session application   点运算符(.)和"[ ]"都是
表示获取变量的值.区别是[ ]可以显示非词类的变量

2、EL隐含对象
1)与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和
applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得
其他相关信息。
例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
     session.getAttribute("username") 取得username的值,
在EL中则使用下列方法
     ${sessionScope.username}
2)与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
     request.getParameter(String name)
     request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
     ${param.name}
     ${paramValues.name}

3.其他隐含对象
1)cookie
JSTL并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}     来
取得它。
2)header和headerValues
header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得
这些值。
3)initParam
initParam取得设定web站点的环境参数(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
     可以使用 ${initParam.userid}来取得名称为userid
4)pageContext
pageContext取得其他有关用户要求或页面的详细信息。
     ${pageContext.request.queryString}         取得请求的参数字符串
     ${pageContext.request.requestURL}         取得请求的URL,但不包括请求之参数字符串
     ${pageContext.request.contextPath}         服务的web application 的名称
     ${pageContext.request.method}           取得HTTP 的方法(GET、POST)
     ${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0)
     ${pageContext.request.remoteUser}         取得用户名称
     ${pageContext.request.remoteAddr }         取得用户的IP 地址
     ${pageContext.session.new}             判断session 是否为新的
     ${pageContext.session.id}               取得session 的ID
     ${pageContext.servletContext.serverInfo}   取得主机端的服务信息
   4) 条件标签>
1.算术运算符有五个:+、-、*或$、/或div、%或mod
2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
3.逻辑运算符有三个:&&或and、||或or、!或not
4.其它运算符有三个:Empty运算符、条件运算符、()运算符
     例:${empty param.name}、${A?B:C}、${A*(B+C)}
5) EL函数(functions)
语法:ns:function( arg1, arg2, arg3 …. argN)
其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置
       6) 补充:
<%@ taglib prefix="c" http://java.sun.com/jstl/core_rt">http://java.sun.com/jstl/core_rt" %>
FOREACH:
<c:forEach items="${messages}"
var="item"
begin="0"
end="9"
step="1"
varStatus="var">
……
</c:forEach>
OUT:
<c:out value="/${logininfo.username}"/>
c:out>将value 中的内容输出到当前位置,这里也就是把logininfo 对象的
username属性值输出到页面当前位置。
${……}是JSP2.0 中的Expression Language(EL)的语法。它定义了一个表达式,
其中的表达式可以是一个常量(如上),也可以是一个具体的表达语句(如forEach循环体中
的情况)。典型案例如下:
? ${logininfo.username}
这表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引
用对象的属性,也可以用“[]”引用对象属性,如${logininfo[username]}
与${logininfo.username}达到了同样的效果。
“[]”引用方式的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”,
此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免
这一现象的出现)。
与之等同的JSP Script大致如下:
LoginInfo logininfo =
(LoginInfo)session.getAttribute(“logininfo”);
String username = logininfo.getUsername();
可以看到,EL大大节省了编码量。
这里引出的另外一个问题就是,EL 将从哪里找到logininfo 对象,对于
${logininfo.username}这样的表达式而言,首先会从当前页面中寻找之前是
否定义了变量logininfo,如果没有找到则依次到Request、Session、
Application 范围内寻找,直到找到为止。如果直到最后依然没有找到匹配的
变量,则返回null.
如果我们需要指定变量的寻找范围,可以在EL表达式中指定搜寻范围:
${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
在Spring 中,所有逻辑处理单元返回的结果数据,都将作为Attribute 被放
置到HttpServletRequest 对象中返回(具体实现可参见Spring 源码中
org.springframework.web.servlet.view.InternalResourceView.
exposeModelAsRequestAttributes方法的实现代码),也就是说Spring
MVC 中,结果数据对象默认都是requestScope。因此,在Spring MVC 中,
以下寻址方法应慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
? ${1+2}
结果为表达式计算结果,即整数值3。
? ${i>1}
如果变量值i>1的话,将返回bool类型true。与上例比较,可以发现EL会自
动根据表达式计算结果返回不同的数据类型。
表达式的写法与java代码中的表达式编写方式大致相同。
IF / CHOOSE:
<c:if test="${var.index % 2 == 0}">
*
</c:if>
判定条件一般为一个EL表达式。
<c:if>并没有提供else子句,使用的时候可能有些不便,此时我们可以通过<c:choose>
tag来达到类似的目的:
<c:choose>
<c:when test="${var.index % 2 == 0}">
*
</c:when>
<c:otherwise>
!
</c:otherwise>
</c:choose>
类似Java 中的switch 语句,<c:choose>提供了复杂判定条件下的简化处理手法。其
中<c:when>子句类似case子句,可以出现多次。上面的代码,在奇数行时输出“*”号,
而偶数行时输出“!”。
经验:1、如果EL表达式无法解析:– <%@ page isELIgnored="false" %>

一、           JSTL

1、EL运算符>;
       2)var指定变量,并把EL运算结果赋值给该变量值为true/false;
       3)scope:指定 var变量的范围;


6、迭代标签
语法:<c:forEach items=“collection” var=“name” varStatus=“status” begin=“int“
end=”int” step=“int” >
           //循环体
           </c:forEach>
     说明:1)items:是集合,用EL表达式;
       2)var:变量名,存放items
       3)varStatus: 显示循环状态的变量
①index:从0开始;
                     ②count:元素位置,从1开始;
                     ③first:如果是第一个元素则显示true;
                     ④last:如果是最后一个元素则显示true;
       4)begin:循环的初始值(整型);
       5)end: 循环结束 ;
       6)step:步长,循环间隔的数值;
7、<c:otherwise>标签
     例:
如果user.wealthy值true,则显示user.wealthy is true.
<c:choose>
<c:when test="">
user.generous is true.
</c:when>
<c:when test="">
user.stingy is true.
</c:when>
<c:otherwise>
user.generous and user.stingy are false.
</c:otherwise>
</c:choose>
说明:只有当条件user.generous返回值是true时,才显示user.generous is true.
只有当条件user.stingy返回值是true时,才显示user.stingy is true.
其它所有的情况(即user.generous和user.stingy的值都不为true)全部显示user.generous and
user.stingy are false.
由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>、
<c:when>和<c:otherwise>标签共同来完成了。
8、c:forTokens>标签
说明:  
items 进行循环的项目 是 无
delims 分割符 是 无
begin 开始条件 否 0
end 结束条件 否 集合中的最后一个项目
step 步长 否 1
var 代表当前项目的变量名 否 无
varStatus 显示循环状态的变量 否 无
例子:
<c:forTokens items="a:b:c:d" delims=":" var="token">
<c:out value=""/>
</c:forTokens>
这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,
token是循环到当前分割到的字符串。
9、<c:redirect>标签
     说明:标签将请求重新定向到另外一个页面,它有以下属性 属性 描 述 是否必须 缺省值
url url地址 是 无
context /后跟本地web应用程序的名字 否 当前应用程序
例子:
<c:redirect /'>http://www.yourname.com/login.jsp"/>
将请求重新定向到http://www.yourname.com/login.jsp页,相当于response.setRedirect
("http://www.yourname.com/login.jsp");
10、<c:param>标签
     说明:<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性属 性 描 述 是否
必须 缺省值
name 在request参数中设置的变量名 是 无
value 在request参数中设置的变量值 否 无
例子:
<c:redirect url="login.jsp">
<c:param name="id" value="888"/>
</c:redirect>
将参数888以id为名字传递到login.jsp页面,相当于login.jsp?id=888
11、<fmt:>格式化标签
     说明:需要导入   <%@ taglib prefix="fmt" http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt" %>
      1)格式化日期<fmt:formatDate value=“” pattern=“yyyy-MM-dd HH:mm:ss”/>
               Value:通过EL表达式或<%new Date() %> 取的日期值;
               Pattern:输出的日期格式;                      

    2) 格式化数字<fmt:formatNumber
value="${n}" pattern="###,###.##" />

posted @ 2010-07-02 11:41 justjavac(迷渡) 阅读(896) | 评论 (0)编辑 收藏
<!-- --> 这样是行注释的。也可以用作多行。。但是 可能有些浏览器 不支持CSS的 则跳过 <!-- --> 里面的内容继续执行。。
/* */ 是 块注释的

jsp 注释 // <!-- --> 已测试

HTML 注释 <!-- -->    已测试,有的说这个/* */也能,但我试了好几次它还是显示

asp 注释 '   已测试

css 注释 <!-- -->   /* */

java 注释 //     /* */     /**   */     已测试
posted @ 2010-07-02 11:38 justjavac(迷渡) 阅读(132) | 评论 (0)编辑 收藏

1.你可以打开一个窗口然后点击,工具—文件夹选项—查看—显示所有文件夹
选择所要文件,右键属性,将“隐藏”前面的勾去掉就可以。
还有另外一种方法,就是在开始-程序-附件-命令提示符下用dir -a 查看就可以看见隐藏的文件,
然后你再用Attrib -s -h -r “路径和文件名”其中-s 表示减去系统属性 -h 表示减去隐藏属性 -r 表示减去只读属性。
另外你如果愿意的话还可以为文件加上以上的属性,把-号变成+号就可以了。

2.选择“工具→文件夹选项→查看→显示所有文件和文件夹”,点确定。本来应该就把隐藏的文件显示出来的,但是隐藏的文件并没有显示出来,重复上次操作发现“查看”中“隐藏文件和文件夹”一栏中它自动又跳为“不显示隐藏文件和文件夹”这让我很苦恼,因为我因此找不到我所有已经设置为隐藏的文件……

解决方法有三:
a.
   运行regedit,找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL],将CheckedValue的值改为1

b.
   将下面的内容复制到记事本,保存为reg的注册表信息文件,然后双击导入:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL]
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"
"Text"="@shell32.dll,-30500"
"Type"="radio"
"CheckedValue"=dword:00000001

c.
   如果操作后还是无法显示隐藏文件,可以复制下列内容到记事本中,另存为一个reg文件,然后双击运行即可。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\NOHIDDEN]
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"
"Text"="@shell32.dll,-30501"
"Type"="radio"
"CheckedValue"=dword:00000002
"ValueName"="Hidden"
"DefaultValue"=dword:00000002
"HKeyRoot"=dword:80000001
"HelpID"="shell.hlp#51104"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL]
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"
"Text"="@shell32.dll,-30500"
"Type"="radio"
"CheckedValue"=dword:00000001
"ValueName"="Hidden"
"DefaultValue"=dword:00000002
"HKeyRoot"=dword:80000001
"HelpID"="shell.hlp#51105"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\SuperHidden]
"Type"="checkbox"
"Text"="@shell32.dll,-30508"
"WarningIfNotDefault"="@shell32.dll,-28964"
"HKeyRoot"=dword:80000001
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"
"ValueName"="ShowSuperHidden"
"CheckedValue"=dword:00000000
"UncheckedValue"=dword:00000001
"DefaultValue"=dword:00000000
"HelpID"="shell.hlp#51103"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\SuperHidden\Policy]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\SuperHidden\Policy\DontShowSuperHidden]
@=""


说明:
       将选项 CheckedValue 的值改成 0 然后再将系统属性设置成不显示隐藏文件,这样,你隐藏的文件就彻底隐藏了,即使显示全部文件,你隐藏的文件也不会显示的。不仅如此,电脑里面所有隐藏文件将全部不被显示。如果需要显示,只要将选项 CheckedValue 的值改成 1 ,再将系统属性设置成显示全部文件即可。

3.问题:
          我使用的是Windows2000系统,我把"文件夹选项"中的"查看"设为"不显示隐藏的文件和文件夹"时,电脑上隐藏的文件反而能看见,设为"显示所有文件和文件夹"时,这些文件反而隐藏了,这是怎么回事?

解决:
     在运行中输入regedit,打开注册表编辑器.定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\NOHIDORSYS,将CheckedValue设置为0;再定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL,将CheckedValue设置为1即可。

posted @ 2010-07-02 11:36 justjavac(迷渡) 阅读(134) | 评论 (0)编辑 收藏
  <一>
你不会有那美丽的相逢,除非之前,你能忍受等待的孤独.
你不会有那明朗的清晨,除非之前,你的睡梦能忍受黑夜的迷雾。
你也不会赢得任何东西,除非你敢于投下赌注.
赌注,生命的赌注,就是你的脚步!
但是你不会找到路,除非你敢于迷路.
因为,只有让你迷路的地方,才是你真正的出路!


<二>
有多少次此刻的离别,就有多少次彼时的相逢.
有多少次此刻的酒醉,就有多少次彼时的痛醒.
所以你应该理解一个人的沉默,就是一个人最多的话语.
你也应该理解一个人的忧伤,之所以忧伤,一定是因为他不肯舍弃某些快乐.


<三>
暖一壶茶,在寒冷的冬季里,让温气升腾,但朋友,别忘了,除了炉火,还有那寒风赐予了这壶茶以温度.
我相信,最温暖来自寒冷.我相信,最温暖,其实是对寒冷的一种谅解.


<四>
生命确实有两层-----
一个浪打礁石,海鸟惊逃,以为是一次谋杀,
一个浪扑上海滩,孩子欢喜,以为是大海开出了鲜花.
同样的事物,有不同样的感受.
所以世界是什么样的,并不重要,重要的是生命的心灵。
世界往往是什么样子,往往取决于你的心灵是什么样子.
莫要过分误解这个世界,请先看看自己的心灵的模样.


<五>
爱的方式有许多种,
而爱是一种动机,爱的动机是诚实而纯洁的,
但爱的方式却不可靠。
即使你有爱,你爱着,可你爱的方式是否避免着偏执---
朋友,请不要采摘那些花朵,除非你能保证,一起搬走整个森林的田野   >>>>>>查看
posted @ 2010-07-02 11:34 justjavac(迷渡) 阅读(141) | 评论 (0)编辑 收藏
        当母亲带着疲惫的微笑将你捧给世界,你已经是一座高山,是一片大海了。性别交给你一副重担,指给你一条路,对你说:走吧,你这男子汉!于是你便要长一副铮铮铁骨,把脚下坚实的土地踏得咚咚作响,去完成你的使命、你的光荣、你的答卷。

        当洪水涌来的时候,你要退在最后;当大火燃烧的时候,你却要扑在前边。因为你是男人,你就应该有一副侠肝义胆!

        当朋友成功的时候,你要大碗喝酒;与女友分手时,要真诚地说声道歉。因为你是男人,你就应该如此气壮心宽。

        因为你是男人,所以,对女儿你应是一棵结满故事的大树,对妻子你应是一片金色的沙滩,对父母更该是一座物产丰富的大山。

        因为你是男人,一生就要有所成就。不懒惰,不侥幸,不虚荣,不欺骗,不流泪,不妒嫉,不后悔,不自卑,不献媚,不投机,不唯利是图,不 抱怨,男人就应该堂堂正正、磊磊落落、风度翩翩。

        做个好男人也是一项事业啊。一个民族仅有女人的光荣是不够的,阴盛阳衰对每个男人来说都应该觉得行秽自惭。

        也许你很矮,但好男人博大的胸怀才情会使你顶天立地;也许你很弱,但好男人坚定的意志品格将赋予你狭义铁肩;也许你恶疾缠身,但好男人的字典里根本没有伤残。

        男人,光荣的性别。这光荣的全部内涵就在于去承担责任和义务做出牺牲和奉献。做个好男人吧!你别无选择,因为你已经是个男人了。    >>>>>>>查看
posted @ 2010-07-02 11:33 justjavac(迷渡) 阅读(153) | 评论 (0)编辑 收藏