??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成人久久影院,在线观看的av网站,亚洲一区二区黄http://www.aygfsteel.com/michaelwang1978/zh-cnTue, 17 Jun 2025 13:14:30 GMTTue, 17 Jun 2025 13:14:30 GMT60AJAX 的运?/title><link>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/21/16375.html</link><dc:creator>Michael</dc:creator><author>Michael</author><pubDate>Fri, 21 Oct 2005 15:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/21/16375.html</guid><wfw:comment>http://www.aygfsteel.com/michaelwang1978/comments/16375.html</wfw:comment><comments>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/21/16375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/michaelwang1978/comments/commentRss/16375.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/michaelwang1978/services/trackbacks/16375.html</trackback:ping><description><![CDATA[<P>其实Q这个应用是个简单得不能再简单的JavaScript应用Q只不过被冠以了AJAXq个今年2月䆾?A >诞生</A>的名词以后忽然热了v来。AJAXq一个单词,居然可以把一?8q就开始用的技术推到前台来Q成为当今在特定的圈子里最热的词汇Q倒是一个典型的tipping pointQ界点Q的案例。就?9q?A >Netcenter用的RSS</A>l于?002q开始被从blogger捡v来,q在2005q焕发了青春?/P> <P>q些用Javascript+XMLHTTPRequest的做法给我们提供了一个很qK的空_可以有很多的惌。比如,在Q何静态的面里面Q只要加入这D代码也可以拥有这个功能了?BR> <BLOCKQUOTE><script language=Javascript src="http://home.wangjianshuo.com/scripts/php/markit.php"><BR></script></BLOCKQUOTE><BR>把鼠标放在上面还可以知道是从哪个IP在什么时间批注的。值得注意的是Q这只是一个最单的SAJAX应用Q如果把它应用于地图Q以及应用于多个|站之间的联合,会有更让人惊讶的l果出来。估计,以后客齐集的后台的管理系l将会是最早用这些简单但是有效的思想的地斏V? <P></P> <P>注:那些U线Q只是在Word里面随手ȝ?BR>注二Q没有经q测试,FireFox下面什么样子不晓得Q放在其他页面怎么样也不晓得。?/P><img src ="http://www.aygfsteel.com/michaelwang1978/aggbug/16375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/michaelwang1978/" target="_blank">Michael</a> 2005-10-21 23:05 <a href="http://www.aygfsteel.com/michaelwang1978/archive/2005/10/21/16375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样成ؓ优秀的Y件模型设计? http://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15196.htmlMichaelMichaelTue, 11 Oct 2005 01:26:00 GMThttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15196.htmlhttp://www.aygfsteel.com/michaelwang1978/comments/15196.htmlhttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15196.html#Feedback0http://www.aygfsteel.com/michaelwang1978/comments/commentRss/15196.htmlhttp://www.aygfsteel.com/michaelwang1978/services/trackbacks/15196.html
  下列原则应用到你的软g工程中,你会获得立杆见媄的成果?nbsp;

  1. 比技术重?nbsp;

  你开发Y件是Z供别Z用,没有Z用的软g只是没有意义的数据的集合而已。许多在软g斚w很有成就的行家在他们事业的初期却表现q_^Q因Z们那时侯主要精力都集中在技术上。显Ӟ构gQcomponentsQ,EJBQEnterprise Java BeansQ和代理QagentQ是很有的东西。但是对于用h_如果你设计的软g很难使用或者不能满他们的需求,后台用再好的技术也于事无补。多q旉到Y仉求和设计一个用户能很Ҏ理解的界面上?nbsp;
 
  2. 理解你要实现的东?nbsp;

  好的软g设计人员把大多数旉p在徏立系l模型上Q偶写一些源代码Q但那只不过是ؓ了验证设计过E中所遇到的问题。这他们的设计方案更加可行?nbsp;

  3. 谦虚是必ȝ品格 

  你不可能知道一切,你甚臌很努力才能获得够用的知识。Y件开发是一复杂而艰巨的工作Q因Y件开发所用到的工具和技术是在不断更新的。而且Q一个h也不可能了解软g开发的所有过E。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事Y件开发的人来_每天可以学习很多C西(如果愿意的话Q?nbsp;

  4. 需求就是需?nbsp;

  如果你没有Q何需求,你就不要动手开发Q何Y件。成功的软g取决于时_在用戯求的旉内完成)、预和是否满用户的需求。如果你不能切知道用户需要的是什么,或者Y件的需求定义,那么你的工程注定会失败?nbsp;

  5. 需求其实很改变,改变的是你对需求的理解 

  Object ToolSmiths公司Qwww.objecttoolsmiths.comQ的Doug Smith常喜Ƣ说Q“分析是一门科学,设计是一门艺术”。他的意思是说在众多的“正”分析模型中只存在一个最“正”分析模型可以完全满x个具体问题的需要(我理解的意思是需求分析需要一丝不苟、精的完成,而设计的时候反而可以发挥创造力和想象力 - 译者注Q?nbsp;

  如果需求经常改动,很可能是你没有作好需求分析,q不是需求真的改变了?nbsp;

  你可以抱怨用户不能告诉你他们惛_C么,但是不要忘记Q收集需求信息是你工作?nbsp;

  你可以说是新来的开发h员把事情搞得一团糟Q但是,你应该确定在工程的第一天就告诉他们应该做什么和怎样d?nbsp;

  如果你觉得公怸让你与用户充分接触,那只能说明公司的理层ƈ不是真正支持你的目?nbsp;

  你可以抱怨公司有兌Y件工E的理制度不合理,但你必须了解大多同行公司是怎么做的?nbsp;

  你可以借口说你们的竞争Ҏ的成功是因ؓ他们有了一个新的理念,但是Z么你没先惛_呢? 

  需求真正改变的情况很少Q但是没有做好需求分析工作的理由却很多?nbsp;

  6. l常阅读 

  在这个每日都在发生变化的产业中,你不可能在已取得的成׃陉太久?nbsp;

  每个月至读2?本专业杂志或?本专业书c。保持不落伍需要付出很多的旉和金钱,但会使你成ؓ一个很有实力的竞争者?nbsp;

  7. 降低软g模块间的耦合?nbsp;

  高耦合度的pȝ是很隄护的。一处的修改引v另一处甚x多处的变动?nbsp;

  你可以通过以下Ҏ降低E序的耦合度:隐藏实现l节Q强制构件接口定义,不用公用数据结构,不让应用E序直接操作数据库(我的l验法则是:当应用程序员在写SQL代码的时候,你的E序的耦合度就已经很高了)?nbsp;

  耦合度低的Y件可以很Ҏ被重用、维护和扩充?nbsp;

  8. 提高软g的内聚?nbsp;

  如果一个Y件的模块只实C个功能,那么该模块具有高内聚性。高内聚性的软g更容易维护和改进?nbsp;

  判断一个模块是否有高的内聚性,看一看你是否能够用一个简单的句子描述它的功能p了。如果你用了一D话或者你需要用类似“和”、“或”等q词Q则说明你需要将该模块细化?nbsp;

  只有高内聚性的模块才可能被重用?nbsp;

  9. 考虑软g的移植?nbsp;

  UL是Y件开发中一具体而又实际的工作,不要怿某些软g工具的广告宣传(比如java 的宣传口号write once run many ? 译者注Q?nbsp;

  即仅仅对Y件进行常规升U,也要把这看得和向另一个操作系l或数据库移植一样重要?nbsp;

  记得?6位WindowsUL?2位windows的“乐”吗 Q当你用了某个操作pȝ的特性,如它的进E间通信(IPC){略Q或用某数据库专有语a写了存储q程。你的Y件和那个特定的品结合度已l很高了?nbsp;

  好的软g设计者把那些Ҏ的实现细节打包隐藏v来,所以,当那些特性该变的时候,你的仅仅需要更新那个包可以了?nbsp;

  10. 接受变化 

  q是一句老话了:唯一不变的只有变化?nbsp;

  你应该将所有系l将可能发生的变化以及潜在需求记录下?以便来能够实现Q参见“Architecting for Change”,Thinking Objectively, May 1999Q?nbsp;

  通过在徏模期间考虑q些假设的情况,你就有可能开发出_强壮且容易维护的软g。设计强壮的软g是你最基本的目标?nbsp;

  11. 不要低估对Y件规模的需?nbsp;

  Internet 带给我们的最大的教训是你必须在Y件开发的最初阶D就考虑软g规模的可扩充性?nbsp;

  今天只有100人的部门使用的应用程序,明天可能会被有好几万人的l织使用Q下月,通过因特|可能会有几百万Z用它?nbsp;

  在Y件设计的初期Q根据在用例模型中定义的必须支持的基本事务处理,定软g的基本功能。然后,在徏造系l的时候再逐步加入比较常用的功能?nbsp;

  在设计的开始考虑软g的规模需求,避免在用LH然增大的情况下Q重写Y件?nbsp;

  12. 性能仅仅是很多设计因素之一 

  x软g设计中的一个重要因?-性能Q这好象也是用户最兛_的事情。一个性能不佳的Y件将不可避免被重写?nbsp;

  但是你的设计q必d有可靠性,可用性,便携性和可扩展性。你应该在工E开始就应该定义q区分好q些因素Q以便在工作中恰当用。性能可以是,也可以不是优先最高的因素Q我的观ҎQ给每个设计因素应有的考虑?nbsp;

  13. 理接口 

  “UML User Guide”(Grady BoochQIvar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999Q中指出Q你应该在开发阶D늚早期定义Y件模块之间的接口?nbsp;

  q有助于你的开发h员全面理解Y件的设计l构q取得一致意见,让各模块开发小l相对独立的工作。一旦模块的接口定之后Q模块怎样实现׃是很重要了?nbsp;

  从根本上_如果你不能够定义你的模块“从外部看上M是什么样子”,你肯定也不清楚模块内要实C么?nbsp;

  14. 走近路需要更长的旉 

  在Y件开发中没有捷径可以走?nbsp;

  ~短你的在需求分析上q旉Q结果只能是开发出来的软g不能满用户的需求,必须被重写?nbsp;

  在Y件徏模上每节省一周,在将来的~码阶段可能会多花几周时_因ؓ你在全面思考之前就动手写程序?nbsp;

  你ؓ了节省一天的试旉而漏掉了一个bugQ在来的维护阶D,可能需要花几周甚至几个月的旉M复。与其如此,q不如重新安排一下项目计划?nbsp;

  避免走捷径,只做一ơ但要做对(do it once by doing it rightQ?nbsp;

  15. 别信赖Q何h 

  产品和服务销售公怸是你的朋友,你的大部分员工和高层理人员也不是?nbsp;

  大部分品供应商希望把你牢牢l在他们的品上Q可能是操作pȝQ数据库或者某个开发工兗?nbsp;

  大部分的N和承包商只关心你的钱q不是你的工E(停止向他们付ƾ,看一看他们会在周围呆多长旉Q?nbsp;

  大部分程序员认ؓ他们自己比其他h更优UQ他们可能抛弃你设计的模型而用自己认ؓ更好的?nbsp;

  只有良好的沟通才能解册些问题?nbsp;

  要明的是,不要只依靠一家品或服务提供商,即你的公司Q或l织Q已l在建模、文档和q程{方面向那个公司投入了很多钱?nbsp;

  16. 证明你的设计在实践中可行 

  在设计的时候应当先建立一个技术原型, 或者称为“端到端”原型。以证明你的设计是能够工作的?nbsp;

  你应该在开发工作的早期做这些事情,因ؓQ如果Y件的设计Ҏ是不可行的,在编码实现阶D|论采取什么措施都于事无补。技术原型将证明你的设计的可行性,从而,你的设计更Ҏ获得支持?nbsp;

  17. 应用已知的模?nbsp;

  目前Q我们有大量现成的分析和设计模式以及问题的解x案可以用?nbsp;

  一般来_好的模型设计和开发h员,都会避免重新设计已经成熟的ƈ被广泛应用的东西?nbsp;
http://www.ambysoft.com/processPatternsPage.html 收藏了许多开发模式的信息?nbsp;

  18. 研究每个模型的长处和q 

  目前有很多种cȝ模型可以使用,如下图所C。用例捕L是系l行为需求,数据模型则描q支持一个系l运行所需要的数据构成。你可能会试囑֜用例中加入实际数据描qͼ但是Q这对开发者不是非常有用。同P数据模型ҎqY仉求来说是无用的。每个模型在你徏模过E中有其相应的位|,但是Q你需要明白在什么地方,什么时候用它们?nbsp;

  19. 在现有Q务中应用多个模型 

  当你攉需求的时候,考虑使用用例模型Q用L面模型和领域U的cL型?nbsp;

  当你设计软g的时候,应该考虑制作cL型,序图、状态图、协作图和最l的软g实际物理模型?nbsp;

  E序设计人员应该慢慢意识刎ͼ仅仅使用一个模型而实现的软g要么不能够很好地满用户的需求,要么很难扩展?nbsp;

  20. 教育你的听众 

  你花了很大力气徏立一个很成熟的系l模型,而你的听众却不能理解它们Q甚xp-qؓ什么要先徏立模型都不知道。那么你的工作是毫无意义的?nbsp;

  教给你开发h员基本的建模知识Q否则,他们会只看看你画的漂亮图表,然后l箋~写不规范的E序?nbsp;

  另外Q?nbsp;你还需要告诉你的用户一些需求徏模的基础知识。给他们解释你的用例(uses case)和用L面模型,以他们能够明白你要表达Cѝ当每个人都能用一个通用的设计语a的时候(比如UML-译者注Q,你的团队才能实现真正的合作?nbsp;

  21. 带工Lȝq是ȝ 

  你给我CAD/CAM工具Q请我设计一座桥。但是,如果那桥徏成的话,我肯定不惛_W一个从桥上q的人,因ؓ我对建筑一H不通?nbsp;

  使用一个很优秀的CASE工具q不能你成Z个徏模专Ӟ只能使你成ؓ一个优UCASE工具的用者。成Z个优U的徏模专安要多q的U篏Q不会是一周针Ҏ个h值几千美元工L培训。一个优U的CASE工具是很重要Q但你必d习用它Qƈ能够使用它设计它支持的模型?nbsp;

  22. 理解完整的过E?nbsp;

  好的设计人员应该理解整个软gq程Q尽他们可能不是精通全部实现细节?nbsp;

  软g开发是一个很复杂的过E,q记得《object-oriented software process》第36늚内容吗?除了~程、徏模、测试等你擅长工作外Q还有很多工作要做?nbsp;

  好的设计者需要考虑全局。必M长远考虑如何使Y件满用户需要,如何提供l护和技术支持等?nbsp;

  23. 常做试Q早做测?nbsp;

  如果试对你的Y件来说是无所谓的Q那么你的Y件多半也没什么必要被开发出来?nbsp;

  建立一个技术原型供技术评审用,以检验你的Y件模型?nbsp;

  在Y件生命周期中Q越晚发现的错误难修改Q修Ҏ本越昂贵。尽可能早的做测试是很值得的?nbsp;

  24. 把你的工作归?nbsp;

  不值得归档的工作往往也不值得做。归档你的设惻I以及Ҏ设想做出的决定;归档软g模型中很重要但不很明昄部分?nbsp;l每个模型一些概要描qC使别人很快明白模型所表达的内宏V?nbsp;

  25. 技术会变,基本原理不会 

  如果有h说“用某U开发语a、某个工h某某技术,我们׃需要再做需求分析,建模Q编码或试”。不要相信,q只说明他还~Zl验。抛开技术和人的因素Q实际上软g开发的基本原理?0世纪70q代以来没有改变过。你必须q定义需求,建模Q编码,试Q配|,面对风险Q发布品,理工作人员{等?nbsp;

  软g建模技术是需要多q的实际工作才能完全掌握的。好在你可以从我的徏议开始,完善你们自己的Y件开发经验?nbsp;

  以鸡汤开始,加入自己的蔬菜。然后,开始n受你自己的丰盛晚吧

Michael 2005-10-11 09:26 发表评论
]]>
eclipse3.1.1 中文?已可以下?/title><link>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15190.html</link><dc:creator>Michael</dc:creator><author>Michael</author><pubDate>Tue, 11 Oct 2005 01:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15190.html</guid><wfw:comment>http://www.aygfsteel.com/michaelwang1978/comments/15190.html</wfw:comment><comments>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/michaelwang1978/comments/commentRss/15190.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/michaelwang1978/services/trackbacks/15190.html</trackback:ping><description><![CDATA[现在到eclipse|站可以下到中文包了Q?BR>    有两个,分别是:NLpack1-eclipse-SDK-3.1.1a-win32.zip和NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip?BR>    后者是前者的补充?BR>    <BR>    在我的机子上Q这两个中文包只适合eclipse3.1.1版本Q?.1版本都不适合Q但|上有h说可以用Q就不得而知了。eclipse3.1.1版本已经Z一D|日了Q但一直都没有使用q,今天是试用了一下,Lombozq可以用Q但de.strutsbox_20050804׃能用了?BR>    不过Q装上lombozQNLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip׃怎么起作用了?BR><BR>    myeclipseME-4.0GA_E3.1ManualInstall版在q个版本下面也不能用?BR><BR>    eclipse3.1.1在功能上?.1版没什么区别,但对插g兼容׃敢恭l了?BR><BR>    <IMG height=310 alt=eclipse3.1.1.jpg src="http://www.aygfsteel.com/images/blogjava_net/rickhunter/eclipse3.1.1.jpg" width=605 border=0><img src ="http://www.aygfsteel.com/michaelwang1978/aggbug/15190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/michaelwang1978/" target="_blank">Michael</a> 2005-10-11 09:15 <a href="http://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?Net应用UL到Linux上来的Mono工程http://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15189.htmlMichaelMichaelTue, 11 Oct 2005 00:46:00 GMThttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15189.htmlhttp://www.aygfsteel.com/michaelwang1978/comments/15189.htmlhttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/11/15189.html#Feedback0http://www.aygfsteel.com/michaelwang1978/comments/commentRss/15189.htmlhttp://www.aygfsteel.com/michaelwang1978/services/trackbacks/15189.html开放源代码协会通过Linux软g开发公司Ximian开始了一个旨在将微Y.Netq_UL到Linux上来的项目。这个叫做Mono工程的项目包括创Z个开发^台允思h们ؓZLinux和基于Windowspȝ?Net开发应用程序。据Ximian公司的首席技术官员Miguel de Icaza说Mono目的v因是GNOMEC֛特别是Ximain公司对于一个改q的开发工L需要?

但是Mono目的媄响确是更加深q的Q因些开发工hZCLIQ通用语言架构Q和微Y提交l欧z计机刉协会(ECMAQ的CQ实现标准的。如果Mono能够完成Zq些标准创徏一套Linux开发工具集的目标的话,开发者将能够~写同时在Windows和Linux上运行的.NetE序Q这些程序甚臌可能在其它非Windows的操作系l上q行Q比方Unix?

除了实际的开发过E,Mono目的工具必d开放源代码C֛的内部完成而不能违反微软的知识产权专利Q-q实际上意味着开发者们必须Z标准重新构造这些工兯不能查看微软的M源代码?

Mono目包括三个核心的部分:一个CQ语a的编译器Q一个CLI和一个类库?CLI是包含了cd载器的虚拟机Q实时的~译器,和一个运行时环境的垃圾收集器。CLIq个lg允许用CQ编写的应用E序能够在象Linuxq样的非Windows操作pȝ上运行。这与Java世界中Java虚拟够让一个应用程序在不同的操作系l上q行是类似的?

Mono目的类库能够让应用E序完成核心的诸如XML处理Q文件输入输出,和连接网l之cȝd。它会和微软的CLI兼容Q与微Y?Net framework中发布的东西紧密的配套)Q还有一点就是将由开放源代码团体~写的额外的cd也将和CLI兼容?

Ximian公司的de Icaza希望在年底到N目的一个里E碑Q这时编译器能够编译类库了。图形用L面组ӞQ创建GUIE序所需的类库-Q将在明q中完成?

“我们在q个斚w工作的原因是希望升我们的开发^台来创徏我们的Evolution桌面应用E序Q”de Icazo说。Evolution是Ximian公司的电子邮件客L及个人和工作l信息管理程序。“当我们看见.Net framework的时候,我们觉得q些是我们用来开发我们下一代品要使用的工P”他说?

Ximianq不Mono和它自己看作是给Linux开发者一U途径在可用的开发工h面赶上Windows。其实,Linux开发者将更喜Ƣ用他们目前使用的工h~写的编译应用程序。Ximian 另一个开放源代码目QSharpDevelop看作是用来提供与微YVisual Studio .NetcM的集成开发环境的一U途径?

通过以开放源代码的方式开发MonoQ这个项目包含了许多对开发过E拥有广泛兴的Z。虽然Ximian可能希望找一些改q的开发工h加速它的应用程序的开发过E,但其它的开发者可能是希望扑ֈ能够让他们在Windows上编写程序然后在Linuxpȝ上运行它们的开发工兗?

其中的一个大问题是如何避免微软的知识产权保护。“我们避免知识权保护的Ҏ是坚持非研究性的主题q用现有的技术实现其功能Q”de Icaza说。例如,Mono JIT~译器没有用Q何先q的JIT~译器技术。相反Mono的版本是Z老的JIT技术的?

De Icazaq声UMono必须“着眼大处”还不仅仅是dECMA规定了些什么。也是_Ximian计划参与标准的制定过Eƈ创徏cd来提?Net framework的薄׃处,比方说电子邮件管理?

据Giga Information Group的副分析师Stacey QuandtUͼ微Y不太可能支持Mono因ؓ其授权是与GNU 通用公众证书为CQ的授权和GNU 弱公众证书ؓcd和运行库的授权联pd一L?

但即使微软不支持MonoQMono的存在也证实了微软对?Net能够UL到其它^台的声明是正的?

Quandt说面向更q泛的开发团体是Mono面的另一个挑战。例如IBM和Sun都在Java上花费了巨额的投资,自然也就很难容忍竞争行ؓ?/SPAN>

Michael 2005-10-11 08:46 发表评论
]]>
在JavaBean中访问数据库http://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15023.htmlMichaelMichaelSat, 08 Oct 2005 13:28:00 GMThttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15023.htmlhttp://www.aygfsteel.com/michaelwang1978/comments/15023.htmlhttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15023.html#Feedback0http://www.aygfsteel.com/michaelwang1978/comments/commentRss/15023.htmlhttp://www.aygfsteel.com/michaelwang1978/services/trackbacks/15023.htmll合 JavaBean ?JDBC,我们可以~写出结构清晎ͼ使用方便的数据库应用E序?BR>
db cd装了数据库操作,包括建立和关闭连接,以及执行SQL查询操作?BR>empcM用dbcdƈ针对EMP 表完成了Ҏ工号查询员工资料的功能,q提供了员工姓名的getterҎ?BR>
package db;

import java.net.*;
import java.sql.*;
import java.io.*;


public class db {
 Connection conn;
 Statement stmt;
 ResultSet rs;
 
 //数据库连?BR> public void getConnection(){
  try{
   Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
   conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Hotel;User=sa;Password=sa");
  }
  catch (Exception e){
   System.out.println(e.getMessage());
   }
  }
 
 //关闭q接
 public void closeConnection(){
  try{
   if (conn != null){
    conn.close();
   }
  }
  catch(Exception e){
   System.out.println(e.getMessage());
  }
 }
 
 //Ҏ据库q行操作
 public ResultSet executeQuery(String sql){
  rs = null;
  try{
   getConnection();
   if (conn != null){
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
   }
  }
  catch (Exception e){
   System.out.println(e.getMessage());
  }
  return rs;
 }

}

package db;

import java.sql.*;


public class emp extends db {
 private String empno;
 private String ename;
 
 public emp(String em){
  empno = em;
 }
 
 //执行Sql语句 对属性ename赋?BR> public void query(){
  try{
   String sSql = "select * from emp where empno =" + empno;
   ResultSet rs = executeQuery(sSql);
   if (rs.next()){
    ename = rs.getString("ename");
   }
   
  }
  catch (Exception e){
   System.out.println(e.getMessage());
  }
 }
 
 //得到ename
 public String getEname(){
  return ename;
 }

}


package db;

import java.io.*;
import java.sql.*;


public class TestBean {
 public static void main(String args[]){
  String empno;
  emp em;
  
  try{
   System.out.println("误入工?");
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   empno = br.readLine();
   em = new em(empno);
   em.query();
   System.out.println("工号? + empno + "的员工姓名是:" + em.getEname());
   em.closeConnection();
   
  }
  catch (Exception e){
   System.out.println(e.getMessage());
  }
  
 }

}




Michael 2005-10-08 21:28 发表评论
]]>
通过JDBCq接oracle数据库的十大技?/title><link>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15005.html</link><dc:creator>Michael</dc:creator><author>Michael</author><pubDate>Sat, 08 Oct 2005 10:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15005.html</guid><wfw:comment>http://www.aygfsteel.com/michaelwang1978/comments/15005.html</wfw:comment><comments>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/michaelwang1978/comments/commentRss/15005.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/michaelwang1978/services/trackbacks/15005.html</trackback:ping><description><![CDATA[Java数据库连接(JDBCQAPI是一pd能够让Java~程人员讉K数据库的接口Q各个开发商的接口ƈ不完全相同。在使用多年的Oracle公司的JDBC后,我积累了许多技巧,q些技巧能够我们更好地发挥系l的性能和实现更多的功能?BR><BR>  1、在客户端Y件开发中使用Thin驱动E序<BR><BR>  在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?BR><BR>  2、关闭自动提交功能,提高pȝ性能<BR><BR>  在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:<BR><BR>  conn.setAutoCommit(false);<BR><BR>  值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?BR><BR>  3、在动态SQL或有旉限制的命令中使用Statement对象<BR><BR>  在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译。这可能会你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?BR><BR>  此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?BR><BR>  4、利用helper函数对动态SQL命oq行格式?BR><BR>  在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连的?'”号替换O'Reilly中的?”号。完成这些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?BR><BR>  5、利用PreparedStatement对象提高数据库的M效率<BR><BR>  在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译。在~冲Z可以发现预编译的命oQƈ且可以重C用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?BR><BR>  6、在成批处理重复的插入或更新操作中用PreparedStatement对象<BR><BR>  如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?BR>PreparedStatement pstmt3D null;<BR>try {<BR>((OraclePreparedStatement)<BR>pstmt).setExecuteBatch(30);<BR>...<BR>pstmt.executeUpdate();<BR>} <BR><BR><BR>  调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?BR><BR>  7、用Oracle locatorҎ插入、更新大对象QLOBQ?BR><BR>  Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?BR><BR>  8、用SQL92语法调用存储q程<BR><BR>  在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?BR><BR>  9、用Object SQL对象模式{Ud数据库中<BR><BR>  既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ是创建Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?BR><BR>  10、利用SQL完成数据库内的操?BR><BR>  我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?BR><BR>  如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成。当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?img src ="http://www.aygfsteel.com/michaelwang1978/aggbug/15005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/michaelwang1978/" target="_blank">Michael</a> 2005-10-08 18:25 <a href="http://www.aygfsteel.com/michaelwang1978/archive/2005/10/08/15005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java面试?/title><link>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14861.html</link><dc:creator>Michael</dc:creator><author>Michael</author><pubDate>Thu, 06 Oct 2005 04:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14861.html</guid><wfw:comment>http://www.aygfsteel.com/michaelwang1978/comments/14861.html</wfw:comment><comments>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/michaelwang1978/comments/commentRss/14861.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/michaelwang1978/services/trackbacks/14861.html</trackback:ping><description><![CDATA[<P>W一Q谈谈finalQ?finallyQ?finalize的区别?</P> <P>    W二QAnonymous Inner Class Q匿名内部类Q?是否可以extendsQ承)其它c,是否可以implementsQ实玎ͼinterfaceQ接口)Q?</P> <P>    W三QStatic Nested Class ?Inner Class的不同,说得多好Q面试题有的很笼l)?</P> <P>    W四Q?amp;?amp;&的区别?</P> <P>    W五QHashMap和Hashtable的区别?</P> <P>    W六QCollection ?Collections的区别?</P> <P>    W七Q什么时候用assert. </P> <P>    W八QGC是什么? Z么要有GCQ?</P> <P>    W九QString s = new StringQ?xyz"Q;创徏了几个String ObjectQ?</P> <P>    W十QMath.roundQ?1.5Q等於多? Math.roundQ?11.5Q等於多? </P> <P>    W十一Qshort s1 = 1Q?s1 = s1 + 1Q有什么错Q?short s1 = 1Q?s1 += 1Q有什么错Q?</P> <P>    W十二,sleepQ) ?waitQ) 有什么区别? </P> <P>    W十三,Java有没有gotoQ?</P> <P>    W十四,数组有没有lengthQ)q个ҎQ?String有没有lengthQ)q个ҎQ?</P> <P>    W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cdQ?</P> <P>    W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否呢? 是用==q是equalsQ)Q?它们有何区别Q?</P> <P>    W十七,l我一个你最常见到的runtime exception. </P> <P>    W十八,error和exception有什么区别? </P> <P>    W十九,ListQ?SetQ?Map是否l承自Collection接口Q?</P> <P>    W二十,abstract class和interface有什么区别? </P> <P>    W二十一Qabstract的method是否可同时是staticQ是否可同时是nativeQ是否可同时是synchronizedQ?</P> <P>    W二十二Q接口是否可l承接口Q?抽象cL否可实现QimplementsQ接口? 抽象cL否可l承实体c(concrete classQ? </P> <P>    W二十三Q启动一个线E是用runQ)q是startQ)Q?</P> <P>    W二十四Q构造器Constructor是否可被overrideQ?</P> <P>    W二十五Q是否可以承Stringc? </P> <P>    W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方法? </P> <P>    W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后Q?</P> <P>    W二十八Q编E题Q?用最有效率的Ҏ出2乘以8{於几? </P> <P>    W二十九Q两个对象值相同(x.equalsQyQ?== trueQ,但却可有不同的hash codeQ这句话对不对? </P> <P>    W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传递? </P> <P>    W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? </P> <P>    W三十二Q编E题Q?写一个Singleton出来?</P> <P><BR>以下是答?</P> <P>    W一Q谈谈finalQ?finallyQ?finalize的区别?</P> <P>    finalQ修饰符Q关键字Q如果一个类被声明ؓfinalQ意味着它不能再z出新的子c,不能作ؓ父类被ѝ因此一个类不能既被声明?abstract的,又被声明为final的。将变量或方法声明ؓfinalQ可以保证它们在使用中不被改变。被声明为final的变量必d声明时给定初|而在以后的引用中只能dQ不可修攏V被声明为final的方法也同样只能使用Q不能重?BR>finallyQ再异常处理时提?finally 块来执行M清除操作。如果抛Z个异常,那么相匹配的 catch 子句׃执行Q然后控制就会进?finally 块(如果有的话)?</P> <P>    finalizeQ方法名。Java 技术允怋?finalizeQ) Ҏ在垃圾收集器对象从内存中清除出M前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对q个对象调用的。它是在 Object cM定义的,因此所有的c都l承了它。子c覆?finalizeQ) Ҏ以整理系l资源或者执行其他清理工作。finalizeQ) Ҏ是在垃圾攉器删除对象之前对q个对象调用的?</P> <P>    W二QAnonymous Inner Class Q匿名内部类Q?是否可以extendsQ承)其它c,是否可以implementsQ实玎ͼinterfaceQ接口)Q?</P> <P>    匿名的内部类是没有名字的内部cR不能extendsQ承) 其它c,但一个内部类可以作ؓ一个接口,由另一个内部类实现?</P> <P>    W三QStatic Nested Class ?Inner Class的不同,说得多好Q面试题有的很笼l)?</P> <P>    Nested Class Q一般是C++的说法)QInner Class Q一般是JAVA的说法)。Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用上。具体可见httpQ?//www.frontfree.net/articles/services/view.aspQid=704&page=1 </P> <P>    注: 静态内部类QInner ClassQ意味着1创徏一个static内部cȝ对象Q不需要一个外部类对象Q?不能从一个static内部cȝ一个对象访问一个外部类对象 </P> <P>    W四Q?amp;?amp;&的区别?</P> <P>    &是位q算W?amp;&是布逻辑q算W?</P> <P>    W五QHashMap和Hashtable的区别?</P> <P>    都属于Map接口的类Q实C惟一键映到特定的g?</P> <P>    HashMap cL有分cL者排序。它允许一?null 键和多个 null 倹{?</P> <P>    Hashtable cM?HashMapQ但是不允许 null 键和 null 倹{它也比 HashMap 慢,因ؓ它是同步的?</P> <P>    W六QCollection ?Collections的区别?</P> <P>    Collections是个java.util下的c,它包含有各种有关集合操作的静态方法?</P> <P>    Collection是个java.util下的接口Q它是各U集合结构的父接口?</P> <P>W七Q什么时候用assert?nbsp; </P> <P>  断言是一个包含布表辑ּ的语句,在执行这个语句时假定该表辑ּ?true。如果表辑ּ计算?falseQ那么系l会报告一?AssertionError。它用于调试目的Q?nbsp; </P> <P>assert(a > 0); // throws an AssertionError if a <= 0  </P> <P>  断言可以有两UŞ式:  </P> <P>  assert Expression1 ;  <BR>  assert Expression1 : Expression2 ;  </P> <P>  Expression1 应该L产生一个布倹{?nbsp; <BR>  Expression2 可以是得Z个值的L表达式。这个值用于生成显C更多调试信息的 String 消息?nbsp; <BR>断言在默认情况下是禁用的。要在编译时启用断言Q需要?source 1.4 标记Q?nbsp; </P> <P>  javac -source 1.4 Test.java  </P> <P>  要在q行时启用断aQ可使用 -enableassertions 或?-ea 标记?nbsp; <BR>  要在q行旉择用断言Q可使用 -da 或?-disableassertions 标记?nbsp; <BR>  要系l类中启用断aQ可使用 -esa 或?-dsa 标记。还可以在包的基上启用或者禁用断a?nbsp; </P> <P>  可以在预计正常情况下不会到达的Q何位|上攄断言。断a可以用于验证传递给U有Ҏ的参数。不q,断言不应该用于验证传递给公有Ҏ的参敎ͼ因ؓ不管是否启用了断aQ公有方法都必须查其参数。不q,既可以在公有Ҏ中,也可以在非公有方法中利用断言试后置条g。另外,断言不应该以M方式改变E序的状态?nbsp; </P> <P><BR>  W八QGC是什? Z么要有GC? (基础)?nbsp; </P> <P>  GC是垃圾收集器。Java E序员不用担心内存管理,因ؓ垃圾攉器会自动q行理。要h垃圾攉Q可以调用下面的Ҏ之一Q?nbsp; </P> <P>  System.gc()  <BR>  Runtime.getRuntime().gc()  </P> <P>  W九QString s = new String("xyz");创徏了几个String Object?  </P> <P>  两个对象Q一个是“xyx?一个是指向“xyx”的引用对象s?nbsp; </P> <P>  W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?  </P> <P>  Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q回QlongQ?11;  </P> <P>  W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?  </P> <P>  short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int?不能昑ּ转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确?nbsp; </P> <P>  W十二,sleep() ?wait() 有什么区? 搞线E的最?nbsp; </P> <P>  sleep()Ҏ是ɾU程停止一D|间的Ҏ。在sleep 旉间隔期满后,U程不一定立x复执行。这是因为在那个时刻Q其它线E可能正在运行而且没有被调度ؓ攑ּ执行Q除?a)“醒来”的U程h更高的优先Q?b)正在q行的线E因为其它原因而阻塞?nbsp; </P> <P>  wait()是线E交互时Q如果线E对一个同步对象x 发出一个wait()调用Q该U程会暂停执行,被调对象q入{待状态,直到被唤醒或{待旉到?nbsp; </P> <P>  W十三,Java有没有goto?  </P> <P>  Goto?java中的保留字,现在没有在java中用?nbsp; </P> <P>  W十四,数组有没有length()q个Ҏ? String有没有length()q个ҎQ?nbsp; </P> <P>  数组没有length()q个ҎQ有length的属性?nbsp; <BR>  String有有length()q个Ҏ?nbsp; </P> <P>  W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?  </P> <P>  Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重?(Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?nbsp; </P> <P>  W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?  </P> <P>  Set里的元素是不能重复的Q那么用iterator()Ҏ来区分重复与否。equals()是判M个Set是否相等?nbsp; </P> <P>  equals()?=Ҏ军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?nbsp; </P> <P>  W十七,l我一个你最常见到的runtime exception?nbsp; </P> <P>  ArithmeticException, <BR>ArrayStoreException, <BR>BufferOverflowException, <BR>BufferUnderflowException,  <BR>CannotRedoException,    <BR>CannotUndoException,  <BR>ClassCastException, <BR>CMMException,   <BR>ConcurrentModificationException,   <BR>DOMException, <BR>EmptyStackException, <BR>IllegalArgumentException,  <BR>IllegalMonitorStateException,   <BR>IllegalPathStateException,  <BR>IllegalStateException,   <BR>ImagingOpException,   <BR>IndexOutOfBoundsException,  <BR>MissingResourceException,  <BR>NegativeArraySizeException,  <BR>NoSuchElementException,   <BR>NullPointerException,  <BR>ProfileDataException, <BR>ProviderException,  <BR> RasterFormatException,  <BR>SecurityException, <BR>SystemException, <BR>UndeclaredThrowableException,   <BR>UnmodifiableSetException,  <BR>UnsupportedOperationException   </P> <P>  W十八,error和exception有什么区?  </P> <P>  error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?</P> <P>  exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?nbsp; </P> <P><BR>  W十九,List, Set, Map是否l承自Collection接口?  </P> <P>  ListQSet?nbsp; </P> <P>  Map不是  </P> <P>  W二十,abstract class和interface有什么区?  </P> <P>  声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?nbsp; </P> <P>  接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?nbsp; </P> <P>  W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?  </P> <P>  都不?nbsp; </P> <P>  W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?  </P> <P>  接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?nbsp; </P> <P>  W二十三Q启动一个线E是用run()q是start()?  </P> <P>  启动一个线E是调用start()ҎQɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。run()Ҏ可以产生必须退出的标志来停止一个线E?nbsp; </P> <P> </P> <P>  W二十四Q构造器Constructor是否可被override?  </P> <P>  构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?nbsp; </P> <P>  W二十五Q是否可以承Stringc?  </P> <P>  StringcLfinalcL不可以ѝ?nbsp; </P> <P>  W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?  </P> <P>  不能Q一个对象的一个synchronizedҎ只能׃个线E访问?nbsp; </P> <P>  W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?  </P> <P>  会执行,在return前执行?nbsp; </P> <P>  W二十八Q编E题: 用最有效率的Ҏ出2乘以8{於?  </P> <P>  有C背景的程序员特别喜欢问这U问题?nbsp; </P> <P>  2 << 3  </P> <P>  W二十九Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?  </P> <P>  不对Q有相同的hash code?nbsp; </P> <P>  W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?  </P> <P>  是g递。Java ~程语言只由g递参数。当一个对象实例作Z个参数被传递到Ҏ中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?nbsp; </P> <P><BR>  W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?  </P> <P>  switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 switch ?case 语句的参数应该是 int?short?char 或?byte。long,string 都不能作用于swtich?nbsp; </P> <P>  W三十二Q编E题: 写一个Singleton出来?</P> <P>  Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?nbsp; </P> <P>  一般Singleton模式通常有几U种形式:  </P> <P>  W一UŞ? 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ获取对它的引?l而调用其中的Ҏ?nbsp; </P> <P>public class Singleton {  <BR>  private Singleton(){}  <BR>  //在自己内部定义自׃个实例,是不是很奇怪?  <BR>  //注意q是private 只供内部调用  <BR>  private static Singleton instance = new Singleton();  <BR>  //q里提供了一个供外部讉K本class的静态方法,可以直接讉K    <BR>  public static Singleton getInstance() {  <BR>    return instance;     <BR>   }  <BR>}  </P> <P>  W二UŞ?  </P> <P>public class Singleton {  <BR>  private static Singleton instance = null;  <BR>  public static synchronized Singleton getInstance() {  <BR>  //q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一ơ       <BR>  //使用时生成实例,提高了效率!  <BR>  if (instance==null)  <BR>    instanceQnew Singleton();  <BR>return instance;   }  <BR>}  </P> <P>  其他形式:  </P> <P>  定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?nbsp; </P> <P>  一般认为第一UŞ式要更加安全?nbsp; </P> <P>  W三十三 Hashtable和HashMap  </P> <P>  Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?nbsp; </P> <P>  HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允?nbsp; </P> <P>  q有是QHashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解?nbsp; </P> <P>  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap必Mؓ之提供外同步?nbsp; </P> <P>  Hashtable和HashMap采用的hash/rehash法都大概一P所以性能不会有很大的差异?nbsp; </P> <P>版权声明  本篇文章Ҏ是否有帮助?  投票Q??nbsp;   ?nbsp;    投票l果Q?nbsp;    24       0<BR> <BR> <BR> <BR>作者其它文章: <BR>Java多线E程序设?<BR>前R之覆Q后车之?--开源项目经验谈 <BR>Resin服务器的使用 <BR>用Java的加密机制来保护你的数据 <BR>使用XML装数据库操作语句的实现 <BR>作者全部文?nbsp;    查看作者的Blog  <BR> <BR> <BR>  评论人:onefox    参与? 40162    专家? 965  发表旉: 2005-03-21 21:21  <BR>很有自信的能回答的,大概?30%题目?/P> <P>其他很多涉及的问题^旉用自q一套过滤掉了?/P> <P>没有仔细研究q?nbsp; <BR> <BR>  评论人:javasleepless    参与? 312    专家? 10  发表旉: 2005-03-25 19:27  <BR>8错,可以借此Z弄清那些h的概?nbsp; <BR> <BR>  评论人:andersonmao    参与? 94    专家? 0  发表旉: 2005-05-12 10:51  <BR>关于26,没有说详l?BR>=============================================<BR>  W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?  <BR>  不能Q一个对象的一个synchronizedҎ只能׃个线E访问?nbsp; <BR>=============================================关于26,没有说详l?BR>=============================================<BR>    W二十六Q当一个线E进入一个对象的一个synchronizedҎ后,其它U程是否可进入此对象的其它方?  <BR>    不能Q一个对象的一个synchronizedҎ只能׃个线E访问?nbsp; <BR>=============================================<BR>    一个对象的所有synchronizedҎ在同一个时间只能由一个线E访问。这个对象的其它不是synchronizedҎ不受q个限制。就是说</P> <P>当一个线E正在执行这个对象的一个synchronized时。这个对象的所有synchronizedҎ都不能被其它U程讉KQ但是这个对象的不是</P> <P>synchronized的方法可以被其它U程讉K?BR>    例子:<BR>SynObject.java<BR>====<BR>public class SynObject{    <BR>    public synchronized void SynMethod(int index){<BR>        System.out.println("Thread Index="+index+" In SynMethod - Begin");<BR>        try{<BR>            Thread.sleep(100);<BR>        }catch(Exception e){<BR>        }<BR>        System.out.println("Thread Index="+index+" In SynMethod - End");<BR>    }<BR>    public void NoneSynMethod(int index){<BR>        System.out.println("Thread Index="+index+" In NoneSynMethod");<BR>    }<BR>}<BR>====<BR>ThreadTest.java<BR>====<BR>public class ThreadTest extends Thread{<BR>    int threadNo;<BR>    static SynObject obj=new SynObject();<BR>    public void run(){<BR>        System.out.println("Thread No="+threadNo+" Begin run");<BR>        for(int i=0;i<3;i++){<BR>            obj.SynMethod(threadNo);<BR>            obj.NoneSynMethod(threadNo);<BR>        }<BR>    }<BR>    public ThreadTest(int No){<BR>        threadNo=No;<BR>    }<BR>    public static void main(String[] a){<BR>        Thread th1=new ThreadTest(1);<BR>        Thread th2=new ThreadTest(2);<BR>        th1.start();<BR>        th2.start();<BR>    }    <BR>}<BR>====<BR>q行 java ThreadTest<BR>可能的结果ؓ(因ؓU程相关Q结果可能不一?:<BR>Thread No=1 Begin run<BR>Thread Index=1 In SynMethod - Begin<BR>Thread No=2 Begin run<BR>Thread Index=1 In SynMethod - End<BR>Thread Index=2 In SynMethod - Begin<BR>Thread Index=1 In NoneSynMethod            //在Thread 2 执行SynMethod() q程?Thread 1 执行?NoneSynMethod()<BR>Thread Index=2 In SynMethod - End<BR>Thread Index=2 In NoneSynMethod<BR>Thread Index=1 In SynMethod - Begin<BR>Thread Index=1 In SynMethod - End<BR>Thread Index=2 In SynMethod - Begin<BR>Thread Index=1 In NoneSynMethod<BR>Thread Index=2 In SynMethod - End<BR>Thread Index=1 In SynMethod - Begin<BR>Thread Index=2 In NoneSynMethod<BR>Thread Index=1 In SynMethod - End<BR>Thread Index=1 In NoneSynMethod<BR>Thread Index=2 In SynMethod - Begin<BR>Thread Index=2 In SynMethod - End<BR>Thread Index=2 In NoneSynMethod</P> <P><BR>1. 使类可能短精悍,而且只解决一个特定的问题。下面是对类设计的一些徏议: </P> <P>  一个复杂的开兌句:考虑采用"多Ş"机制Q?<BR>  数量众多的方法涉及到cd差别极大的操作:考虑用几个类来分别实玎ͼ <BR>  许多成员变量在特征上有很大的差别Q考虑使用几个c.</P> <P><BR>2. 在多U程环境中,隐私是特别重要的一个因?-只有private字段才能在非同步使用的情况下受到保护?/P> <P>3. M时候只要发现类与类之间l合得非常紧密,需要考虑是否采用内部c,从而改善编码及l护工作Q参见第14?4.1.2节?用内部类改进代码"Q?<BR> <BR> <BR> </P> <P><BR>   </P><img src ="http://www.aygfsteel.com/michaelwang1978/aggbug/14861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/michaelwang1978/" target="_blank">Michael</a> 2005-10-06 12:05 <a href="http://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 分页查询http://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14857.htmlMichaelMichaelThu, 06 Oct 2005 03:05:00 GMThttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14857.htmlhttp://www.aygfsteel.com/michaelwang1978/comments/14857.htmlhttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/06/14857.html#Feedback0http://www.aygfsteel.com/michaelwang1978/comments/commentRss/14857.htmlhttp://www.aygfsteel.com/michaelwang1978/services/trackbacks/14857.html//ҎMessage 对象所装的查询条件分|询Message对象QS
public List getPageinMessage(Message message,int startRow,int rows) throws DAOException {       
        StringBuffer queryString=new StringBuffer(" from Message as message where ");
        //ActionExceptionHandler actionHandler=new ActionExceptionHandler();
        if(message.getSource()!=null){
            queryString.append("message.source.id="+message.getSource().getId());
            queryString.append(" and senderDelFlag=0");
        }else if(message.getTarget()!=null){
            //if message's target is not null query message base on target's id
            logger.debug("query inbox==================");
            queryString.append("message.target.id="+message.getTarget().getId());
            queryString.append(" and receiverDelFlag=0");
        } else{
            throw new BusinessException("未选定消息发送者或接受?); 
        }
        queryString.append(" order by message.creatDate DESC");
        Query query=null;
        List messageList=null;
        Session session=this.getSession();       
        try {
            query=session.createQuery(queryString.toString());
            query.setFirstResult(startRow);
            query.setMaxResults(rows);
            logger.debug("first row===="+startRow+"===row amount==="+rows);
            messageList=query.list();
            if(messageList.size()>0){
                Message message2=(Message)messageList.get(0);              
                logger.debug("messageList's length==="+message2);           
                logger.debug("messageList's length==="+messageList.size());
            }
        } catch (HibernateException e) {
            // TODO Auto-generated catch block          
            e.printStackTrace();
            throw new BusinessException("d面数据发生错误"); 
        }finally{
            if(session!=null&&session.isOpen()){
                try {
                    session.close();
                } catch (HibernateException e1) {
                    e1.printStackTrace();
                    throw new BusinessException("会话关闭异常");                   
                }
            }
        }          
        return messageList;       
    }


Michael 2005-10-06 11:05 发表评论
]]>
jsp和Servlet的异同和L不同的作?/title><link>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14838.html</link><dc:creator>Michael</dc:creator><author>Michael</author><pubDate>Wed, 05 Oct 2005 12:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14838.html</guid><wfw:comment>http://www.aygfsteel.com/michaelwang1978/comments/14838.html</wfw:comment><comments>http://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/michaelwang1978/comments/commentRss/14838.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/michaelwang1978/services/trackbacks/14838.html</trackback:ping><description><![CDATA[<P>Java Servlet及其特点</P> <P>  Servlet是Java技术对CGI~程的回{。ServletE序在服务器端运行,动态地生成Web面。与传统的CGI和许多其他类似CGI的技术相比,Java Servleth更高的效率,更容易用,功能更强大,h更好的可UL性,更节省投资?/P> <P>      高效</P> <P>  在传l的CGI中,每个h都要启动一个新的进E,如果CGIE序本n的执行时间较短,启动q程所需要的开销很可能反而超q实际执行时间。而在Servlet中,每个h׃个轻量的JavaU程处理(而不是重量的操作系l进E??/P> <P>  在传lCGI中,如果有N个ƈ发的对同一CGIE序的请求,则该CGIE序的代码在内存中重复装载了N?而对于ServletQ处理请求的是N个线E,只需要一份ServletcM码。在性能优化斚wQServlet也比CGI有着更多的选择Q比如缓冲以前的计算l果Q保持数据库q接的活动,{等?/P> <P>   其实CGI是Common Gateway Interface(公共|关接口)</P> <P>  方便</P> <P>  Servlet提供了大量的实用工具例程Q例如自动地解析和解码HTML表单数据、读取和讄HTTP头、处理Cookie、跟t会话状态等?/P> <P>  功能强大</P> <P>  在Servlet中,许多使用传统CGIE序很难完成的Q务都可以L地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGIE序不能。Servletq能够在各个E序之间׃n数据Q得数据库q接池之cȝ功能很容易实现?/P> <P>  可移植性好</P> <P>  Servlet用Java~写QServlet APIh完善的标准。因此,为I-Planet Enterprise Server写的Servlet无需M实质上的改动卛_UL到Apache、Microsoft IIS或者WebStar。几乎所有的L服务器都直接或通过插g支持Servlet?/P> <P>  节省投资</P> <P>  不仅有许多廉L臛_费的Web服务器可供个人或规模网站用,而且对于现有的服务器Q如果它不支持Servlet的话Q要加上q部分功能也往往是免费的(或只需要极的投资)?/P> <P> </P> <P><BR> JSP及其特点</P> <P>  JavaServer Pages(JSP)是一U实现普通静态HTML和动态HTML混合~码的技?/P> <P>许多由CGIE序生成的页面大部分仍旧是静态HTMLQ动态内容只在页面中有限的几个部分出现。但是包括Servlet在内的大多数CGI技术及其变U,L通过E序生成整个面。JSP使得我们可以分别创徏q两个部分。例如,下面是一个简单的JSP面:</P> <P>Q?DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"Q?BR>QHTMLQ?BR>QHEADQ<TITLEQ欢q访问网上商店</TITLEQ</HEADQ?BR>QBODYQ?BR>QH1Q欢q</H1Q?BR>QSMALLQ欢q?<BR>Q?-- 首次讉K的用户名字ؓ"New User" --Q?BR>Q? out.println(Utils.getUserNameFromCookie(request)); %Q?BR>要设|帐号信息,L?BR>QA HREF="Account-Settings.html"Q这里</AQ</SMALLQ?BR>QPQ?BR>面的其余内宏V?<BR>Q?BODYQ</HTMLQ?/P> <P>  下面是JSP和其他类似或相关技术的一个简单比?</P> <P>  JSP和Active Server Pages(ASP)相比</P> <P>  Microsoft的ASP是一U和JSPcM的技术。JSP和ASP相比h两方面的优点。首先,动态部分用Java~写Q而不是VB Script或其他Microsoft语言Q不仅功能更强大而且更易于用。第二,JSP应用可以UL到其他操作系l和非Microsoft的Web服务器上?/P> <P>  JSP和纯Servlet相比</P> <P>  JSPq没有增加Q何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便Q不必再?println语句来输出每一行HTML代码。更重要的是Q借助内容和外观的分离Q页面制作中不同性质的Q务可以方便地分开:比如Q由面设计专家q行HTML设计Q同时留ZServletE序员插入动态内容的I间?/P> <P>  JSP和服务器端包?Server-Side IncludeQSSI)相比</P> <P>  SSI是一U受到广泛支持的在静态HTML中引入外部代码的技术。JSP在这斚w的支持更为完善,因ؓ它可以用Servlet而不是独立的E序来生成动态内宏V另外,SSI实际上只用于单的包含Q而不是面向那些能够处理表单数据、访问数据库的“真正的”程序?/P> <P>  JSP和JavaScript相比</P> <P>  JavaScript能够在客L动态地生成HTML。虽然JavaScript很有用,但它只能处理以客L环境为基的动态信息。除了Cookie之外QHTTP状态和表单提交数据对JavaScript来说都是不可用的。另外,׃是在客户端运行,JavaScript不能讉K服务器端资源Q比如数据库、目录信息等{?/P><img src ="http://www.aygfsteel.com/michaelwang1978/aggbug/14838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/michaelwang1978/" target="_blank">Michael</a> 2005-10-05 20:06 <a href="http://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP避免Form重复提交三种Ҏhttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14837.htmlMichaelMichaelWed, 05 Oct 2005 12:04:00 GMThttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14837.htmlhttp://www.aygfsteel.com/michaelwang1978/comments/14837.htmlhttp://www.aygfsteel.com/michaelwang1978/archive/2005/10/05/14837.html#Feedback0http://www.aygfsteel.com/michaelwang1978/comments/commentRss/14837.htmlhttp://www.aygfsteel.com/michaelwang1978/services/trackbacks/14837.html

1 javascript Q设|一个变量,只允许提交一ơ。 

  <script language="javascript">

   var checkSubmitFlg = false;

   function checkSubmit() {

   if (checkSubmitFlg == true) {

   return false;

   }

   checkSubmitFlg = true;

   return true;

   }

   document.ondblclick = function docondblclick() {

   window.event.returnValue = false;

   }

   document.onclick = function doconclick() {

   if (checkSubmitFlg) {

   window.event.returnValue = false;

   }

   }

  </script>
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
  

  2 q是javascriptQ将提交按钮或者image|ؓdisable  

   <html:form action="myAction.do" method="post"

   onsubmit="getElById('submitInput').disabled = true; return true;">   

   <html:image styleId="submitInput" src="images/ok_b.gif" border="0" /> 

   </html:form>  

  3 利用struts的同步o牌机制  

  利用同步令牌QTokenQ机制来解决Web应用中重复提交的问题QStruts也给Z一个参考实现?

  基本原理Q 

  服务器端在处理到辄h之前Q会请求中包含的o牌g保存在当前用户会话中的o牌D行比较,看是否匹配。在处理完该h后,且在{复发送给客户端之前,会产生一个新的o牌,该o牌除传给客户端以外,也会用户会话中保存的旧的o牌进行替换。这样如果用户回退到刚才的提交面q再ơ提交的话,客户端传q来的o牌就和服务器端的令牌不一_从而有效地防止了重复提交的发生。 

  if (isTokenValid(request, true)) {

   // your code here

   return mapping.findForward("success");

  } else {

   saveToken(request);

   return mapping.findForward("submitagain");

  } 

  StrutsҎ用户会话ID和当前系l时间来生成一个唯一Q对于每个会话)令牌的,具体实现可以参考TokenProcessorcM的generateToken()Ҏ。  

  1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌Q防止两ơ提?

  2. 在action中:  

   //<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"

   // value="6aa35341f25184fd996c4c918255c3ae">

   if (!isTokenValid(request)) errors.add(ActionErrors.GLOBAL_ERROR,

   new ActionError("error.transaction.token"));

   resetToken(request); //删除session中的令牌  

  3. action有这L一个方法生成o牌  

   protected String generateToken(HttpServletRequest request) {  

   HttpSession session = request.getSession();

   try {

   byte id[] = session.getId().getBytes();

   byte now[] =

   new Long(System.currentTimeMillis()).toString().getBytes();

   MessageDigest md = MessageDigest.getInstance("MD5");

   md.update(id);

   md.update(now);

   return (toHex(md.digest()));

   } catch (IllegalStateException e) {

   return (null);

   } catch (NoSuchAlgorithmException e) {

   return (null);

   }

   }



Michael 2005-10-05 20:04 发表评论
]]>
վ֩ģ壺 | ۽| | Ҫ| | ͷ| ׷| | | | | ľ| | | | | ԣ| մ| ͬ| ɽ| | Ҫ| Ϫ| | ɽ| | | | | Ƹ| | ƫ| Ϫ| ͷ| ʡ| | Ӷ| ͨɽ| ɽ| ԭ| |