中文字幕亚洲欧美专区,日本亚洲高清乱码中文在线观看,亚洲欧美日韩高清中文在线http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團(tuán)論壇什么是JAVA,JAVA的詳細(xì)介紹。http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2493&Page=1wangxinxin2010-12-11 10:37:22有人說(shuō),咖啡館是一個(gè)叫人學(xué)會(huì)放慢步伐、享受生活的地方。這句話不無(wú)道理。港人常把飲咖啡稱為嘆咖啡,這個(gè)字就有欣賞、品味的含義,舒適的環(huán)境,自然是招徠顧客之道。香港雖然寸金尺土,但無(wú)論在鬧市或是在風(fēng)景區(qū),都不難找到精巧雅致的咖啡館,它們或具歐陸情懷,或富英式韻味,大都環(huán)境優(yōu)美、擺設(shè)得體、席位舒適、氣派不凡。

一、序言                   
  許多人想學(xué)習(xí)編程,但不知道從哪里開(kāi)始。在這個(gè)連載中,我將為你介紹java編程技術(shù),以及java程序的開(kāi)發(fā)方法,從零開(kāi)始,循序漸進(jìn),希望能夠讓你親自品味Java這種咖啡的香醇與濃郁。
如果說(shuō)看完這個(gè)連載你便能全面掌握Java技術(shù),我絕不敢打這樣的保票。喝再多咖啡,我也無(wú)法把Java的博大精深濃縮成一個(gè)連載。咖啡館本來(lái)就是休閑的地方,所以,我將有選擇地為你介紹Java技術(shù)的重要組成部分,涉獵面廣,但不見(jiàn)得都非常深入。所以,如果想真正在Java技術(shù)上有所造詣,也需要你自己的努力和汗水。畢竟,咖啡聞起來(lái)香,但本身是苦的,只有不嫌棄這點(diǎn)苦,才能品嘗到真味道。
  不過(guò)你也不必把這個(gè)連載看作古板的教程。Java技術(shù)從問(wèn)世到如今,已有近10年的歷史。在Java技術(shù)成長(zhǎng)過(guò)程中,涌現(xiàn)了數(shù)不盡的英雄人物,幫助Java技術(shù)創(chuàng)造了史詩(shī)般的輝煌。在這個(gè)Java咖啡館中,我們還準(zhǔn)備了許多有趣的傳記或故事,稱之為黃糖故事。本來(lái)嘛,編程即創(chuàng)造,本身就有無(wú)窮樂(lè)趣
二、什么是Java
  或許你會(huì)把Java理解為印度尼西亞的爪哇島,那里是早期印度-爪哇文化的中心,盛產(chǎn)具有良質(zhì)酸味的阿拉比卡咖啡。然而在計(jì)算機(jī)業(yè)界中,一提起Java,人們的神經(jīng)細(xì)胞就會(huì)立即興奮起來(lái),因?yàn)?/span>SunJava技術(shù)實(shí)在火得不得了!
  首先你應(yīng)該理解人們說(shuō)的Java究竟是指什么。先說(shuō)明一下,如果你是初學(xué)者,下面某些新名詞難免會(huì)讓你打問(wèn)號(hào)。我希望你能夠耐心看完并努力去理解,因?yàn)椋@些名詞會(huì)對(duì)你理解并喜愛(ài)Java有相當(dāng)幫助。
  當(dāng)人們談起Java,他們或許是指這些概念中的一種:
  Sun公司的Java編程語(yǔ)言,一種面向?qū)ο蟮?/span>(Object OrientedOO)編程語(yǔ)言。Java語(yǔ)言是C++Smalltalk等計(jì)算機(jī)語(yǔ)言的衍生物。學(xué)習(xí)Java語(yǔ)言,類(lèi)似于學(xué)習(xí)一門(mén)自然語(yǔ)言(比如英語(yǔ))的語(yǔ)法。
  Java虛擬機(jī)(Java Virtual MachineJVM)Java語(yǔ)言編寫(xiě)的程序運(yùn)行在虛擬機(jī)上,Java虛擬機(jī)是Java程序和操作系統(tǒng)間的中間層,所以Java程序可以運(yùn)行在所有支持Java虛擬機(jī)的電子設(shè)備上(注意,不僅僅是個(gè)人電腦哦,電子設(shè)備還包括手機(jī)、PDA以及信息家電等),而且不需要任何額外的操作,這是其他計(jì)算機(jī)語(yǔ)言無(wú)法比擬的優(yōu)點(diǎn)。Sun公司推廣Java的口號(hào)便是一次編寫(xiě),隨處運(yùn)行Java虛擬機(jī)便是這句口號(hào)的基石。
  Java應(yīng)用程序編程接口(Application Programming InterfaceAPI)Java API是預(yù)先編寫(xiě)好提供給程序員調(diào)用的函數(shù),比如磁盤(pán)讀寫(xiě)、網(wǎng)絡(luò)調(diào)用、繪制圖形等。如果把Java語(yǔ)言比作一門(mén)自然語(yǔ)言的語(yǔ)法,那么API便是一部滿是好文佳句的書(shū)籍,用它可以幫助我們更方便地進(jìn)行寫(xiě)作而不必樣樣從頭寫(xiě)起。
  Java技術(shù)的應(yīng)用。哇!你的這部手機(jī)支持Java呢!還是RPG游戲?!趕快給我玩,否則……”沒(méi)錯(cuò),由于Java語(yǔ)言創(chuàng)造性的優(yōu)點(diǎn),又是行業(yè)標(biāo)準(zhǔn),所以受到各大企業(yè)的追捧,有廣泛的應(yīng)用。詳細(xì)介紹請(qǐng)參考第三節(jié)。
黃糖故事
  面向?qū)ο?/strong>(Object OrientedOO)
  JavaC++語(yǔ)言中的面向?qū)ο缶幊虣C(jī)制被認(rèn)為是繼CFORTRAN等過(guò)程式語(yǔ)言之后的又一大進(jìn)步。使用OO開(kāi)發(fā)軟件,程序?qū)⒏?jiǎn)單、更健壯,所以OO是迄今為止最成功的編程機(jī)制。實(shí)際上, Smalltalk才是第一個(gè)完全面向?qū)ο蟮膭?dòng)態(tài)計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,Smalltalk的發(fā)明者Alan Kay今年419日還榮獲2003年度有計(jì)算機(jī)界諾貝爾獎(jiǎng)美譽(yù)的ACM圖靈獎(jiǎng)。值得一提的是,Alan Kay在投身計(jì)算機(jī)行業(yè)之前,曾經(jīng)是職業(yè)音樂(lè)家,他的講演以多姿多彩著稱。
  OO的學(xué)習(xí)曲線比較陡峭,所以,如果你已經(jīng)掌握其他OO語(yǔ)言,那么學(xué)習(xí)Java便輕松許多,否則還是需要下一番功夫的。如果你沒(méi)有接觸過(guò)OO,也不用著急,我們將會(huì)在教程中慢慢接觸OO。不過(guò),千萬(wàn)不要知難而退而跳過(guò)OO這個(gè)重要環(huán)節(jié)。學(xué)習(xí)Java語(yǔ)法不難,但寫(xiě)出地道的OO代碼,需要對(duì)OO有相當(dāng)?shù)念I(lǐng)悟。
 
]]>
編程語(yǔ)言解惑:學(xué).Net還是學(xué)Javahttp://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2492&Page=1wangxinxin2010-12-11 10:33:32
  做為一個(gè).Net、Java、Delphi、Python、PHP等語(yǔ)言都進(jìn)行過(guò)有一定復(fù)雜度的項(xiàng)目開(kāi)發(fā)的人來(lái)說(shuō),我對(duì)任何一門(mén)語(yǔ)言都沒(méi)有宗教式狂熱崇拜,因此我也相對(duì)理性的對(duì)整個(gè)問(wèn)題進(jìn)行分析。

  從北京、廣州、上海等地區(qū)2010年的就業(yè)統(tǒng)計(jì)數(shù)據(jù)(由于沒(méi)有找到更權(quán)威的數(shù)據(jù),這些數(shù)據(jù)是我對(duì)主流招聘網(wǎng)站和技術(shù)網(wǎng)站的相關(guān)數(shù)據(jù)進(jìn)行的并不是太嚴(yán)謹(jǐn)?shù)姆治?來(lái)看,.Net和Java的職位數(shù)量比例為2:3,從就業(yè)網(wǎng)站和主要技術(shù)社區(qū)數(shù)據(jù)來(lái)看,2010年.Net和Java的學(xué)習(xí)人員數(shù)量比例為1:3。從數(shù)據(jù)上看,.Net的職位絕對(duì)數(shù)量比Java低一些,不過(guò)Java學(xué)習(xí)人員數(shù)量比.Net學(xué)習(xí)人員高出3倍,因此.Net職位的競(jìng)爭(zhēng)激烈程度低于 Java。

  由于.Net秉承了微軟技術(shù)的入門(mén)簡(jiǎn)單的特點(diǎn),經(jīng)過(guò)短時(shí)間的學(xué)習(xí)就可以掌握拖拉控件的快速開(kāi)發(fā)方式,很多人被.Net的快速開(kāi)發(fā)方式所滿足,認(rèn)為自己“學(xué)成了”,不再深入研究,因此人才市場(chǎng)上充斥著很多只會(huì)拖控件、而不懂.Net更深入一步技術(shù)的.Net開(kāi)發(fā)人員,比如很多 ASP.Net的書(shū)上都是講ASP.Net服務(wù)端控件,很多所謂“精通ASP.Net”的人連什么是Http、HTML、JavaScript、Dom等基本概念都稀里糊涂,實(shí)際公司項(xiàng)目中很多功能點(diǎn)的實(shí)現(xiàn)不是簡(jiǎn)單的拖一個(gè)ASP.Net服務(wù)端控件就能搞定的,因此看似學(xué)習(xí).Net的人非常多,但是真正滿足企業(yè)要求的人則比較少;而Java則入門(mén)門(mén)檻比較高,如果想要配置一個(gè)Hello World級(jí)別的學(xué)習(xí)環(huán)境就會(huì)涉及到很多技術(shù),開(kāi)發(fā)環(huán)境也要學(xué)習(xí)者自行配置,對(duì)于初學(xué)者來(lái)說(shuō)可能花費(fèi)一周時(shí)間都無(wú)法配置一個(gè)最簡(jiǎn)單的環(huán)境出來(lái),Java的開(kāi)發(fā)環(huán)境也不像.Net開(kāi)發(fā)環(huán)境那么可用性強(qiáng),Java和.Net的區(qū)別就像Windows和Linux的區(qū)別,正因?yàn)镴ava學(xué)習(xí)門(mén)檻非常高,很多學(xué)習(xí)者被淘汰了下來(lái),這樣能夠撐過(guò)一個(gè)個(gè)難關(guān)學(xué)習(xí)下來(lái)的開(kāi)發(fā)人員都是水平比較高的人員。因此.Net初級(jí)開(kāi)發(fā)人員的工資平均是比Java初級(jí)開(kāi)發(fā)人員的工資平均略低的。但是由于.Net中高級(jí)人才非常缺乏,因此掌握.Net深入技術(shù)的開(kāi)發(fā)人員在企業(yè)內(nèi)部是非常吃香的,招聘人員經(jīng)常發(fā)出這樣的感嘆“招合適的 Java工程師能招來(lái)一堆,招合適的.Net工程師一個(gè)月都招不來(lái)幾個(gè)”。

  .Net入門(mén)快,在.Net中微軟為開(kāi)發(fā)人員提供了一套最佳的技術(shù)架構(gòu)搭配、集成的開(kāi)發(fā)環(huán)境,用微軟的技術(shù)架構(gòu)開(kāi)發(fā)出的系統(tǒng)就可以保證最好的效果,而不用像Java開(kāi)發(fā)人員那樣去學(xué)很多開(kāi)源框架再去學(xué)習(xí)搭建技術(shù)架構(gòu)、開(kāi)發(fā)環(huán)境,因此.Net學(xué)習(xí)周期比Java短,有了語(yǔ)言基礎(chǔ)后再進(jìn)行集訓(xùn)式的就業(yè)班學(xué)習(xí),那么.Net學(xué)習(xí)者學(xué)習(xí)3個(gè)月可以進(jìn)入就業(yè),Java學(xué)習(xí)者需要5個(gè)月可以進(jìn)入就業(yè)。
]]>
面向 Ajax 和 Web 應(yīng)用程序開(kāi)發(fā)的新技術(shù)http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2491&Page=1wangxinxin2010-12-11 10:32:20
以下內(nèi)容含腳本,或可能導(dǎo)致頁(yè)面不正常的代碼
說(shuō)明:上面顯示的是代碼內(nèi)容。您可以先檢查過(guò)代碼沒(méi)問(wèn)題,或修改之后再運(yùn)行.
]]>
Java在Linux上會(huì)成為占統(tǒng)治地位的語(yǔ)言嗎?http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2490&Page=1wangxinxin2010-12-11 10:29:14  除了為Java取得GPL許可,Sun公司的Swing團(tuán)隊(duì)在Java 6中,還在力圖使Linux桌面的外觀看上去更美觀。關(guān)于這樣做的效果,我們不妨比較兩幅截圖。一幅取自真正的Linux GNOME桌面,另一幅則是利用Swing制作的。事實(shí)上,你將看難看出這兩者的區(qū)別。Swing現(xiàn)在大量采用了GNOME正在應(yīng)用的色彩和設(shè)計(jì)風(fēng)格。雖然Swing還不是Linux平臺(tái)上開(kāi)發(fā)者的首選,但它確實(shí)沒(méi)有其他Linux上的Java工具的弱點(diǎn)。
  Java基于GPL的開(kāi)源確實(shí)來(lái)得不是時(shí)候,但幸好微軟在這時(shí)發(fā)布了他們的Vista。當(dāng)Windows桌面的開(kāi)發(fā)者面對(duì)著難用而且安全性存在缺陷C 或C++,他們紛紛轉(zhuǎn)向了Visual Basic。但在Vista上,微軟傾向于所有的桌面應(yīng)用利用.Net管理代碼,這一策略收到了奇效。但在Linux桌面上,開(kāi)發(fā)者仍在延用C或C++語(yǔ)言,這樣開(kāi)發(fā)者就不得不面對(duì)令人棘手的安全問(wèn)題和復(fù)雜的內(nèi)存分配問(wèn)題。很顯然,Linux桌面的開(kāi)發(fā)者也需要一場(chǎng)類(lèi)似的轉(zhuǎn)變,并且我們不得不說(shuō),這已是一場(chǎng)遲到的轉(zhuǎn)變。而當(dāng)Linux桌面的開(kāi)發(fā)者著手類(lèi)似于Windows平臺(tái)的轉(zhuǎn)變時(shí),他們會(huì)發(fā)現(xiàn),他們面臨的只有兩個(gè)選擇;其中之一是由Novell所支持的Mono,另一個(gè)就是Java。
  對(duì)我來(lái)說(shuō),更傾向于選擇Java出于以下幾方面的原因。首先,Java的發(fā)展時(shí)間比Mono長(zhǎng)得多。盡管Mono成長(zhǎng)迅速,但Java早在此之前已成為了一個(gè)穩(wěn)定、成熟的平臺(tái)。其次,Java包含了許多大量的開(kāi)源工具和庫(kù)文件。再次,Java擁有許多大型開(kāi)發(fā)社區(qū),并且在SourceForge上的開(kāi)源項(xiàng)目大多數(shù)采用了Java做為開(kāi)發(fā)語(yǔ)言。在FreshMeat.net的情況也大致此,采用Java開(kāi)發(fā)的項(xiàng)目達(dá)到了5383個(gè),而采用C#的只有 284個(gè)。此外,Mono還存在一個(gè)發(fā)展瓶頸,這就是它的更新必須要滯后于.Net平臺(tái)。而Java則是基于GPL發(fā)布的,隨時(shí)可以保持更新。在協(xié)議方面,Mono同樣存在一個(gè)陷阱,因?yàn)樗念?lèi)庫(kù)是基于MIT協(xié)議發(fā)布的,因此軟件的開(kāi)發(fā)者或所有者不能名正言順地為利用到庫(kù)的修正申請(qǐng)專利。
  如果你對(duì)我的觀點(diǎn)持有異議,就還是請(qǐng)你原諒我對(duì)Java語(yǔ)言的偏愛(ài)吧。但我還是認(rèn)為以上的觀點(diǎn)還是有客觀依據(jù)的,并且說(shuō)明了Java將成為L(zhǎng)inux桌面應(yīng)用開(kāi)發(fā)首選語(yǔ)言的主要原因。在開(kāi)源平臺(tái)上利用Java卻有點(diǎn)名不正言不順的日子再也不會(huì)來(lái)了。
  還有一點(diǎn),Java與Linux將是一種互相促進(jìn)的關(guān)系。桌面Linux希望在整個(gè)桌面市場(chǎng)上占有更大的市場(chǎng)份額,而Java能提高一個(gè)更高效、更安全、更容易排錯(cuò)的開(kāi)發(fā)平臺(tái),并且利用這一平臺(tái),開(kāi)發(fā)出的應(yīng)用同樣能跑在Windows上面。這不僅會(huì)促進(jìn)Linux達(dá)成它的目標(biāo),還會(huì)最大可能地保護(hù)開(kāi)發(fā)者的利益。從這個(gè)角度看,Java與桌面Linux可以說(shuō)是天生的一對(duì),地造的一雙。
]]>
(五).NET VS Java將有更好的動(dòng)態(tài)語(yǔ)言支持http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2489&Page=1wangxinxin2010-12-11 10:25:34
以下內(nèi)容含腳本,或可能導(dǎo)致頁(yè)面不正常的代碼
說(shuō)明:上面顯示的是代碼內(nèi)容。您可以先檢查過(guò)代碼沒(méi)問(wèn)題,或修改之后再運(yùn)行.
]]>
Java開(kāi)發(fā)語(yǔ)言規(guī)律http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2488&Page=1wangxinxin2010-12-11 10:19:38      在尋找普遍規(guī)律之前,讓我們先看看Java的發(fā)展歷程:
      (1)SUN的主流技術(shù)的發(fā)展
      GUI界面:Java AWT API--〉Java Swing API
      JavaWeb: Servlet--〉JSP--〉JSF
      持久化層:JDBC--〉CMP EJB或BMP EJB或JDO
      分布式應(yīng)用:Socket--〉RMI--〉J2EE或Java Web Service

      (2)主要Java開(kāi)源軟件的種類(lèi)
      JavaWeb容器: Tomcat、Resin
      EJB容器: JBoss
      框架: Java Web框架(Struts)、業(yè)務(wù)邏輯層框架(Spring)
      持久化層: DAO、ORM映射工具(如Hibernate、OJB)
      工程管理工具:ANT、Eclipse
      日志輸出工具: Log4J
      JavaWeb服務(wù)工具:Apache Axis

      促成Java世界如此絢麗多姿的基本動(dòng)力在于以下核心思想:

      接口與實(shí)現(xiàn)

      不同的軟件系統(tǒng)之間通過(guò)接口來(lái)交互。軟件系統(tǒng)只對(duì)外公開(kāi)接口,封裝實(shí)現(xiàn)細(xì)節(jié)。接口描述了軟件系統(tǒng)具備的功能,也就是指定軟件系統(tǒng)能夠做什么,但是沒(méi)有指明怎么去做。接口具有三大作用:

      (1)對(duì)于接口制訂者:SUN公司通過(guò)定義接口,來(lái)制定新的軟件系統(tǒng)的規(guī)范,例如Servlet規(guī)范、EJB規(guī)范和JDO規(guī)范,這些規(guī)范主要以接口的形式描述了軟件系統(tǒng)必須具備的功能。通過(guò)制定規(guī)范,SUN公司指引著Java技術(shù)的發(fā)展方向,同時(shí)給接口的實(shí)現(xiàn)者提供了自由發(fā)揮的廣闊空間。

      (2)對(duì)于接口實(shí)現(xiàn)者:接口實(shí)現(xiàn)者以特定的方式實(shí)現(xiàn)標(biāo)準(zhǔn)的規(guī)范。例如一些開(kāi)放源代碼軟件,如Tomcat和Resin分別以不同的實(shí)現(xiàn)方式,實(shí)現(xiàn)了標(biāo)準(zhǔn)的Servlet規(guī)范。同一個(gè)接口允許有多種實(shí)現(xiàn),使得Java領(lǐng)域保持著百花齊放、百家爭(zhēng)鳴的良好勢(shì)頭,

      (3)對(duì)于接口調(diào)用者:接口調(diào)用者的程序具有良好的可移植性。以JavaWeb應(yīng)用為例,由于Tomcat和Resin遵守同樣的規(guī)范,因此用戶開(kāi)發(fā)的JavaWeb應(yīng)用能夠順利的從Tomcat容器移植到Resin容器中。

      封裝與抽象

      封裝指的是在一個(gè)大系統(tǒng)中包含一個(gè)小系統(tǒng),大系統(tǒng)是建立在已有小系統(tǒng)的基礎(chǔ)上的更為復(fù)雜、功能更強(qiáng)大的系統(tǒng)。例如,Hibernate對(duì)JDBC API進(jìn)行了封裝,在Hibernate內(nèi)部依賴JDBC API來(lái)操縱數(shù)據(jù)庫(kù),但是Hibernate API比JDBC API具有更強(qiáng)大的功能,例如JDBC API只具有連接和操縱數(shù)據(jù)庫(kù)的功能,而Hibernate不僅具備這一功能,還具有對(duì)象-關(guān)系映射的功能。

      抽象是指從已經(jīng)存在的具有相似功能、但不同接口的系統(tǒng)中抽取共性,提煉出統(tǒng)一的接口。例如,Hibernate Transaction API是對(duì)JDBC
      Transaction API和Java Transaction API(JTA)的抽象。 

      繼承與擴(kuò)展

      繼承與擴(kuò)展是一對(duì)孿生兄弟,當(dāng)兩個(gè)類(lèi)之間存在繼承關(guān)系,那么必定也存在擴(kuò)展關(guān)系。繼承的優(yōu)點(diǎn)在于提高代碼的可重用性,子類(lèi)會(huì)繼承父類(lèi)的所有public和protected類(lèi)型的屬性和方法,在子類(lèi)的程序代碼中,無(wú)需重復(fù)定義這些屬性和方法。擴(kuò)展的優(yōu)點(diǎn)在于使軟件應(yīng)用具有可伸縮性,能夠在已有功能的基礎(chǔ)上擴(kuò)展新的功能。

      Struts框架充分運(yùn)用了擴(kuò)展思想。Struts框架中的許多類(lèi)都是供應(yīng)用程序擴(kuò)展的,其中最主要的一個(gè)是Action類(lèi),在Action類(lèi)中已經(jīng)定義了一些通用的方法,采用Struts框架的JavaWeb應(yīng)用將擴(kuò)展Action類(lèi),創(chuàng)建負(fù)責(zé)特定流程或業(yè)務(wù)的客戶化的Action類(lèi)。

      對(duì)象的生命周期

      當(dāng)一個(gè)對(duì)象通過(guò)new語(yǔ)句創(chuàng)建后,它就會(huì)擁有一塊固定的內(nèi)存空間,如果沒(méi)有任何變量引用它,它就會(huì)結(jié)束生命周期,它占用的內(nèi)存空間隨時(shí)可能被JVM的垃圾回收器回收。

      應(yīng)用程序如何管理對(duì)象的生命周期呢?目前比較流行的做法是把對(duì)象存放在一個(gè)“范圍”內(nèi)。例如在JavaWeb應(yīng)用中,JavaBean可以存放在request、session或application范圍內(nèi)。每個(gè)范圍對(duì)應(yīng)一個(gè)對(duì)象,例如request范圍對(duì)應(yīng)HttpServletRequest對(duì)象,session范圍對(duì)應(yīng)HttpSession對(duì)象,application范圍對(duì)應(yīng)ServletContext對(duì)象。把一個(gè)JavaBean存放在request范圍內(nèi),實(shí)質(zhì)上是在HttpServletRequest對(duì)象的一個(gè)集合屬性中加入這個(gè)JavaBean的引用,這個(gè)集合屬性也被稱為HttpServletRequest對(duì)象的緩存。


      把一個(gè)JavaBean存放在request范圍內(nèi),等價(jià)于以下兩種說(shuō)法:
      把一個(gè)JavaBean加入到HttpServletRequest對(duì)象的緩存中
      把一個(gè)JavaBean和HttpServletRequest對(duì)象關(guān)聯(lián)

      當(dāng)JavaBean位于request范圍內(nèi),這個(gè)JavaBean的生命周期依賴于HttpServletRequest對(duì)象的生命周期,當(dāng)HttpServletRequest對(duì)象結(jié)束生命周期,并且這個(gè)JavaBean也不被應(yīng)用程序中的其他變量引用,那么它就會(huì)結(jié)束生命周期。

      那么HttpServletRequest對(duì)象本身的生命周期由誰(shuí)管理呢?這是由JavaWeb容器(也稱Servlet容器)來(lái)管理的。對(duì)于每個(gè)HTTP請(qǐng)求,JavaWeb容器會(huì)自動(dòng)創(chuàng)建一個(gè)HttpServletRequest對(duì)象,當(dāng)HTTP請(qǐng)求的響應(yīng)完畢,JavaWeb容器就會(huì)結(jié)束這個(gè)對(duì)象的生命周期。同理,當(dāng)每個(gè)HTTP會(huì)話開(kāi)始,JavaWeb容器會(huì)自動(dòng)創(chuàng)建一個(gè)HttpSession對(duì)象,當(dāng)這個(gè)會(huì)話結(jié)束,JavaWeb容器就會(huì)結(jié)束這個(gè)對(duì)象的生命周期;當(dāng)每個(gè)JavaWeb應(yīng)用啟動(dòng)時(shí),JavaWeb容器會(huì)自動(dòng)創(chuàng)建一個(gè)ServletContext對(duì)象,當(dāng)這個(gè)應(yīng)用被關(guān)閉,JavaWeb容器就會(huì)結(jié)束這個(gè)對(duì)象的生命周期。

      在Hibernate中,在net.sf.hibernate.Session范圍內(nèi)加入一個(gè)持久化對(duì)象,實(shí)質(zhì)上是在Session對(duì)象的集合屬性中加入這個(gè)持久化對(duì)象的引用。以下幾種說(shuō)法是等價(jià)的:
      在Session范圍內(nèi)加入一個(gè)持久化對(duì)象
      在Session的緩存中加入一個(gè)持久化對(duì)象
      把一個(gè)持久化對(duì)象與Session關(guān)聯(lián)

      值得注意的是,Hibernate的Session不僅能管理緩存中持久化對(duì)象的生命周期,還會(huì)負(fù)責(zé)按照持久化對(duì)象的狀態(tài)的變化,來(lái)同步更新數(shù)據(jù)庫(kù)。

      集成開(kāi)源軟件的基本步驟

      在開(kāi)發(fā)Java應(yīng)用時(shí),為了提高開(kāi)發(fā)效率,縮短開(kāi)發(fā)周期,常常需要集成第三方提供的Java軟件,如ORM映射工具Hibernate、MVC框架Struts、日志工具Log4J和Web服務(wù)軟件Apache
      AXIS等。在自己的應(yīng)用中集成這些第三方軟件時(shí),大體步驟都很相似。
      (1) 把它們的JAR文件拷貝到classpath中。
      (2) 創(chuàng)建它們的配置文件(XML格式的文件或者Java屬性文件),這些配置文件通常也位于classpath中。
      (3) 在程序中訪問(wèn)它們的接口。

      接口與配置文件,是軟件系統(tǒng)對(duì)外公開(kāi)的兩個(gè)主要窗口。無(wú)論是Tomcat、Struts還是Hibernate,都離不開(kāi)配置文件,與編寫(xiě)程序代碼相比,配置文件能提高軟件的可維護(hù)性,更加靈活的適應(yīng)用戶變化的需求,但是,配置文件不擅長(zhǎng)表達(dá)非常復(fù)雜的邏輯,在這種情況下,必須求助于程序代碼。作為軟件使用者,如果僅僅想快速掌握一個(gè)新的Java軟件的使用方法,而不打算深入了解軟件內(nèi)在原理和結(jié)構(gòu),無(wú)非就是了解它的接口以及配置文件的使用方法。當(dāng)然,如果想對(duì)軟件的運(yùn)用達(dá)到得心應(yīng)手的地步,還應(yīng)該了解軟件本身的實(shí)現(xiàn)原理和結(jié)構(gòu),而這些軟件無(wú)非就是通過(guò)抽象、封裝和實(shí)現(xiàn)等手段,從簡(jiǎn)單的小系統(tǒng)出發(fā),構(gòu)造出更加復(fù)雜,但是對(duì)外有著簡(jiǎn)潔統(tǒng)一的接口的大系統(tǒng)

]]>
用java語(yǔ)言實(shí)現(xiàn)的迷你型的http服務(wù)器代碼http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2487&Page=1wangxinxin2010-12-11 10:16:36package  positron.harness;

import  java.io.BufferedReader;
import  java.io.ByteArrayInputStream;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.io.PrintWriter;
import  java.io.UnsupportedEncodingException;
import  java.net.ServerSocket;
import  java.net.Socket;
import  java.net.URLEncoder;
import  java.util.Date;
import  java.util.Enumeration;
import  java.util.HashMap;
import  java.util.Locale;
import  java.util.Map;
import  java.util.Properties;
import  java.util.StringTokenizer;
import  java.util.TimeZone;

/**
 * A simple, tiny, nicely embeddable HTTP 1.0 server in Java
 *
 * This class has been trivially modified from its original form, taken from
 * 
http://elonen.iki.fi/code/nanohttpd/NanoHTTPD.java
 *
 * <p> NanoHTTPD version 1.1,
 * Copyright &copy; 2001,2005-2007 Jarno Elonen (elonen@iki.fi, 
http://iki.fi/elonen/ )
 *
 * <p><b>Features + limitations: </b><ul>
 *
 *    <li> Only one Java file </li>
 *    <li> Java 1.1 compatible </li>
 *    <li> Released as open source, Modified BSD licence </li>
 *    <li> No fixed config files, logging, authorization etc. (Implement yourself if you need them.) </li>
 *    <li> Supports parameter parsing of GET and POST methods </li>
 *    <li> Supports both dynamic content and file serving </li>
 *    <li> Never caches anything </li>
 *    <li> Doesn't limit bandwidth, request time or simultaneous connections </li>
 *    <li> Default code serves files and shows all HTTP parameters and headers</li>
 *    <li> File server supports directory listing, index.html and index.htm </li>
 *    <li> File server does the 301 redirection trick for directories without '/'</li>
 *    <li> File server supports simple skipping for files (continue download) </li>
 *    <li> File server uses current directory as a web root </li>
 *    <li> File server serves also very long files without memory overhead </li>
 *    <li> Contains a built-in list of most common mime types </li>
 *    <li> All header names are converted lowercase so they don't vary between browsers/clients </li>
 *
 * </ul>
 *
 * <p><b>Ways to use: </b><ul>
 *
 *    <li> Run as a standalone app, serves files from current directory and shows requests</li>
 *    <li> Subclass serve() and embed to your own program </li>
 *    <li> Call serveFile() from serve() with your own base directory </li>
 *
 * </ul>
 *
 * See the end of the source file for distribution license
 * (Modified BSD licence)
 
*/
public   class  NanoHTTPD
{
    
//  ==================================================
    
//  API parts
    
//  ==================================================

    
/**
     * Override this to customize the server.<p>
     *
     * (By default, this delegates to serveFile() and allows directory listing.)
     *
     * @parm uri    Percent-decoded URI without parameters, for example "/index.cgi"
     * @parm method    "GET", "POST" etc.
    
]]>
Java語(yǔ)言出現(xiàn)的背景 影響及前景http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2486&Page=1wangxinxin2010-12-11 10:13:55一、背景  1991年 ,SUN MicroSystem公司的 Jame Gosling、 Bill Joe等人 ,為在電視、控制烤面包箱等家用消費(fèi)類(lèi)電子產(chǎn)品上進(jìn)行交互式操作而開(kāi)發(fā)了一個(gè)名為Oak的軟件 (即一種橡樹(shù)的名字 ),但當(dāng)時(shí)并沒(méi)有引起人們的注重 ,直到 1994年下半年 ,Internet的迅猛發(fā)展 ,環(huán)球信息網(wǎng) WWW的快速增長(zhǎng) ,促進(jìn)了 Java語(yǔ)言研制的進(jìn)展 ,使得它逐漸成為 Int ernet上受歡迎的開(kāi)發(fā)與編程語(yǔ)言 ,一些聞名的計(jì)算機(jī)公司紛紛購(gòu)買(mǎi)了 Java語(yǔ)言的使用權(quán) ,如 Mi-croSoft、 IBM、 Netscape、 Novell、Apple、 DEC、 SGI等 ,因此 ,Java語(yǔ)言被美國(guó)的聞名雜志 PC Magazine評(píng)為 1995年十大優(yōu)秀科技產(chǎn)品 ,(計(jì)算機(jī)類(lèi)就此一項(xiàng)入選 ),隨之大量出現(xiàn)了用 Java編寫(xiě)的軟件產(chǎn)品 ,受到工業(yè)界的重視與好評(píng) ,認(rèn)為 "Java是八十年代以來(lái)計(jì)算機(jī)界的一件大事 ",微軟總裁比爾&#8226;蓋茨在靜靜地觀察了一段時(shí)間后 ,不無(wú)感慨地說(shuō) :"Java是長(zhǎng)時(shí)間以來(lái)最卓越的程序設(shè)計(jì)語(yǔ)言 ",并確定微軟整個(gè)軟件開(kāi)發(fā)的戰(zhàn)略從 PC單機(jī)時(shí)代向著以網(wǎng)絡(luò)為中心的計(jì)算時(shí)代轉(zhuǎn)移 ,而購(gòu)買(mǎi) Java則是他的重大戰(zhàn)略決策的實(shí)施部署。

  因此 ,Java的誕生必將對(duì)整個(gè)計(jì)算機(jī)產(chǎn)業(yè)發(fā)生深遠(yuǎn)的影響 ,對(duì)傳統(tǒng)的計(jì)算模型提出了新的挑戰(zhàn)。SUN MicroSystem公司的總裁 Scott McNealy認(rèn)為 Java為 Internet和 WWW開(kāi)辟了一個(gè)嶄新的時(shí)代。環(huán)球信息網(wǎng) WWW的創(chuàng)始人 Berners-Lee說(shuō) :"計(jì)算機(jī)事業(yè)發(fā)展的下一個(gè)浪潮就是 Java,并且將很快會(huì)發(fā)生的"。

  看來(lái) ,使用 Java已成大勢(shì)所趨 !MicroSoft和 IBM兩大公司都計(jì)劃在 Internet上銷(xiāo)售用 Java編寫(xiě)的軟件。

  Apple、 HP、 IBM、 MicroSoft、 Novell、 SGI、 SCO、 Tandem等公司均計(jì)劃將 Java并入各自開(kāi)發(fā)的操作系統(tǒng) ,而負(fù)責(zé)開(kāi)發(fā)并推廣 Java技術(shù)的 SunSoft公司 (這是 SUN下屬的一個(gè)子公司 ),將通過(guò)頒發(fā)許可證的辦法來(lái)答應(yīng)各家公司把Java虛擬機(jī)和 Jav a的 Applets類(lèi)庫(kù)嵌入他們開(kāi)發(fā)的操作系統(tǒng) ,這樣各類(lèi)開(kāi)發(fā)人員就能更輕易地選擇多種平臺(tái)來(lái)使用 Java語(yǔ)言編程 ,不同的用戶也就可以脫離 Web瀏覽器來(lái)運(yùn)行 Java應(yīng)用程序 ,這無(wú)疑是很受廣大用戶歡迎的 ,也為 Java語(yǔ)言的應(yīng)用開(kāi)拓了極為廣闊的前景。 (當(dāng)然 ,各類(lèi) JavaOS之間的兼容性必須得到重視 ,好在 JavaSoft已保證將監(jiān)督這種兼容性 )。

  另外 ,由 JavaSoft推出的完全用 Java編寫(xiě)的 Internet上新型瀏覽器HotJava,比去年 alpha版更為實(shí)用 ,不僅能編制動(dòng)態(tài)的應(yīng)用軟件 ,而且能編制完整的成套桌面應(yīng)用軟件 ,將來(lái)還會(huì)提供更多的能幫助編制動(dòng)態(tài)應(yīng)用軟件的模塊 ,顯然 ,這也是為 Java的應(yīng)用提供了有力的例證。

  去年 6月 7日 ,由 SUN公司和臺(tái)灣經(jīng)濟(jì)事務(wù)部信息發(fā)展局、臺(tái)灣信息技術(shù)研究所等單位牽頭 ,成立了一個(gè)"Java聯(lián)盟 ",參加的有 22個(gè)在臺(tái)灣相當(dāng)聞名的計(jì)算機(jī)公司 ,并在臺(tái)北建立一個(gè) "Java開(kāi)發(fā)中心 ",在新竹建立一個(gè)"Java語(yǔ)言實(shí)驗(yàn)室", 以掀起臺(tái)灣開(kāi)發(fā)與應(yīng)用 Java語(yǔ)言的熱潮。

  香港則在去年 4月就舉行了全島的 Java杯比賽 ,在計(jì)算機(jī)界掀起了學(xué)習(xí)Java的熱潮 (尤其是在大學(xué)生們中 ,出現(xiàn)了一批 Java迷 )。

  有人預(yù)言 :Java將是網(wǎng)絡(luò)上的 "世界語(yǔ) ",今后所有的用其他語(yǔ)言編寫(xiě)的軟件統(tǒng)統(tǒng)都要用 Java語(yǔ)言來(lái)改寫(xiě)。

  二、 Java語(yǔ)言對(duì)軟件開(kāi)發(fā)技術(shù)的影響

  工業(yè)界不少人預(yù)言 :"Java語(yǔ)言的出現(xiàn) ,將會(huì)引起一場(chǎng)軟件革命 ",這是因?yàn)閭鹘y(tǒng)的軟件往往都是與具體的實(shí)現(xiàn)環(huán)境有關(guān) ,換了一個(gè)環(huán)境就需要作一番改動(dòng) ,耗時(shí)費(fèi)力 ,而 Java語(yǔ)言能在執(zhí)行碼 (二進(jìn)制碼 )上兼容 ,這樣以前所開(kāi)發(fā)的軟件就能運(yùn)行在不同的機(jī)器上 ,只要所用的機(jī)器能提供 Java語(yǔ)言解釋器即可。

  Java語(yǔ)言將對(duì)未來(lái)軟件的開(kāi)發(fā)產(chǎn)生影響 ,可從如下幾個(gè)方面考慮 :

  1 軟件的需求分析:可將用戶的需求進(jìn)行動(dòng)態(tài)的、可視化描述 ,以提供設(shè)計(jì)者更加直觀的要求。而用戶的需求是各色各樣的 ,不受地區(qū)、行業(yè)、部門(mén)、愛(ài)好的影響 ,都可以用 Java語(yǔ)言描述清楚。

  2 軟件的開(kāi)發(fā)方法:由于 Java語(yǔ)言的面向目標(biāo)的特性 ,所以完全可以用 O-O 的技術(shù)與方法來(lái)開(kāi)發(fā) ,這是符合最新的軟件開(kāi)發(fā)規(guī)范要求的。

  3 Java語(yǔ)言的動(dòng)畫(huà)效果遠(yuǎn)比 GUI技術(shù)更加逼真 ,尤其是利用 WW W提供的巨大動(dòng)畫(huà)資源空間 ,可以共享全世界的動(dòng)態(tài)畫(huà)面的資源。

  4 軟件最終產(chǎn)品:用 Java語(yǔ)言 開(kāi)發(fā)的軟件可以具有可視化、可聽(tīng)化、可操作化的效交互、動(dòng)畫(huà)與動(dòng)作 ",要它停就停 ,要它繼續(xù)就繼續(xù) ,而這是在電影與電視播放過(guò)程中難以做到的。

  5 其它:使用 Java語(yǔ)言對(duì)開(kāi)發(fā)效益、開(kāi)發(fā)價(jià)值都有比較明顯的影響。   三、工業(yè)界對(duì) Java語(yǔ)言的評(píng)價(jià)


  1996年 5月 29~ 31日 ,在美國(guó)舊金山召開(kāi)了一個(gè)全世界 Java語(yǔ)言開(kāi)發(fā)者大會(huì) ,(JavaOne Developer Confer-ence),出席會(huì)議的多達(dá) 6500多人 ,來(lái)自工業(yè)界的超過(guò)一半 ,有人評(píng)價(jià)說(shuō) :"這是近年來(lái)計(jì)算機(jī)界最光輝的一次盛會(huì) ",一些工業(yè)界的老總們相當(dāng)看好 Java語(yǔ)言 ,認(rèn)為它的使用將會(huì)引起一場(chǎng)軟件革命。從軟件的設(shè)計(jì)風(fēng)格、設(shè)計(jì)方法、設(shè)計(jì)目標(biāo)到設(shè)計(jì)過(guò)程 ,都會(huì)產(chǎn)生徹底的變革 ,"甚至?xí)淖兇诵乔虻纳罘绞?"。

  在這次會(huì)上 ,Java的創(chuàng)始人之一 James Gosling說(shuō) :"Java不僅僅只是applets,它能做任何事情 ",Dta咨詢公司的高級(jí)軟件工程師 Rich Kadel說(shuō) :"Java不僅僅是一種程序設(shè)計(jì)語(yǔ)言 ,更是現(xiàn)代化軟件再實(shí)現(xiàn)的基礎(chǔ) ;Java還是未來(lái)新型OS的核心 ;將會(huì)出現(xiàn) Java芯片 ;將構(gòu)成各種應(yīng)用軟件的開(kāi)發(fā)平臺(tái)與實(shí)現(xiàn)環(huán)境 ,是人們必不可少的開(kāi)發(fā)工具 ,……"。

  由于各界都看好它 ,因此 ,各大公司都紛紛表示支持 Java, Intel、Xerox公司聲言將把 Java嵌入到他們的產(chǎn)品中去。就連華爾街金融界也在投入資金人力用 Java開(kāi)發(fā)電子貿(mào)易、金融軟件。

  所以有人說(shuō) :"現(xiàn)在第三方的開(kāi)發(fā)商都團(tuán)結(jié)在 Java大旗四周了 !",紛紛推出用 Java開(kāi)發(fā)的各種軟件產(chǎn)品 ,以期盡快地占領(lǐng)市場(chǎng)。

  四、 Java語(yǔ)言的應(yīng)用前景

  Java語(yǔ)言有著廣泛的應(yīng)用前景 ,大體上可以從以下幾個(gè)方面來(lái)考慮其應(yīng)用;

  1 所有面向?qū)ο蟮膽?yīng)用開(kāi)發(fā) ,包括面向?qū)ο蟮氖录枋觥⑻幚怼⒕C合等;

  2 計(jì)算過(guò)程的可視化、可操作化的軟件的開(kāi)發(fā);

  3 動(dòng)態(tài)畫(huà)面的設(shè)計(jì) ,包括圖形圖像的調(diào)用;

  4 交互操作的設(shè)計(jì) (選擇交互、定向交互、控制流程等;

  5 Internet的系統(tǒng)治理功能模塊的設(shè)計(jì) ,包括 Web頁(yè)面的動(dòng)態(tài)設(shè)計(jì)、治理和交互操作設(shè)計(jì)等;

  6 Intranet(企業(yè)內(nèi)部網(wǎng) )上的軟件開(kāi)發(fā) (直接面向企業(yè)內(nèi)部用戶的軟件;

  7 與各類(lèi)數(shù)據(jù)庫(kù)連接查詢的 SQL語(yǔ)句實(shí)現(xiàn);

  8 其它應(yīng)用類(lèi)型的程序。
]]>
Java在Web開(kāi)發(fā)語(yǔ)言上敗給了PHPhttp://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2485&Page=1wangxinxin2010-12-11 10:12:59PHP的主要語(yǔ)言開(kāi)發(fā)者之一、Zend公司的創(chuàng)始人之一Andi Gutmans最近在blog中直言不諱地批評(píng)了Java語(yǔ)言。他指出,目前Java廠商試圖在JVM上提供動(dòng)態(tài)語(yǔ)言實(shí)現(xiàn)的路子根本不對(duì),Java已經(jīng)輸?shù)袅薟eb開(kāi)發(fā)語(yǔ)言的戰(zhàn)爭(zhēng),PHP是事實(shí)上的標(biāo)準(zhǔn)和勝利者。

Gutmans的這篇文章在技術(shù)界引發(fā)了強(qiáng)烈爭(zhēng)議,很對(duì)人對(duì)此有不同的意見(jiàn),我在這里就闡述一下我對(duì)PHP和Java兩種語(yǔ)言的看法。

首先對(duì)比一下PHP和Java的異同,PHP是一種解釋執(zhí)行的腳本語(yǔ)言,語(yǔ)法和C語(yǔ)言類(lèi)似,易學(xué)易用,不懂電腦的非專業(yè)人員稍經(jīng)學(xué)習(xí)也能使用PHP.而Java要先編譯成Class文件,然后在Java虛擬機(jī)上執(zhí)行,Java開(kāi)發(fā)需要熟悉Java語(yǔ)法以及一些核心的架構(gòu),從而實(shí)現(xiàn)一種可復(fù)用的、跨平臺(tái)的軟件,Java比PHP要難學(xué)的多。

實(shí)際上,從技術(shù)架構(gòu)來(lái)說(shuō),Java語(yǔ)言相比PHP有明顯的優(yōu)勢(shì),Java使用的是面向?qū)ο蟮南到y(tǒng)設(shè)計(jì)方法,而PHP還是采用面向過(guò)程的開(kāi)發(fā)方法。PHP只能實(shí)現(xiàn)簡(jiǎn)單的分布式兩層或三層的架構(gòu),而JAVA可以實(shí)現(xiàn)多層架構(gòu)。數(shù)據(jù)庫(kù)層(持久化層)、應(yīng)用(業(yè)務(wù))邏輯層、表示邏輯層彼此分開(kāi),而且現(xiàn)在不同的層都已經(jīng)有一些成熟的開(kāi)發(fā)框架的支持。例如Struts就是利用Java的web開(kāi)發(fā)技術(shù)實(shí)現(xiàn)了MVC的設(shè)計(jì)模式,而在業(yè)務(wù)邏輯層也有Spring框架,數(shù)據(jù)庫(kù)持久化層有Hibernate等框架。這些框架可以方便開(kāi)發(fā)者高效、合理、科學(xué)得架構(gòu)多層的商業(yè)應(yīng)用。從數(shù)學(xué)運(yùn)算和數(shù)據(jù)庫(kù)訪問(wèn)速度來(lái)講,Java的性能也優(yōu)于PHP.實(shí)際上,對(duì)于跨平臺(tái)的大型的企業(yè)應(yīng)用系統(tǒng)來(lái)講,Java幾乎已經(jīng)成為唯一的選擇(微軟.NET不支持跨平臺(tái)),但是在于Web網(wǎng)站應(yīng)用開(kāi)發(fā)來(lái)講,Java卻面臨著被PHP邊緣化的危險(xiǎn),幾乎所有的虛擬主機(jī)都支持PHP+MySQL,而支持Java的卻少之又少,在資源上,網(wǎng)上有不計(jì)其數(shù)的PHP資源,很多著名的大型網(wǎng)站(例如Facebook、Mediawiki等)都是基于PHP的,而成功的Java網(wǎng)站卻寥寥無(wú)幾,這又是什么原因呢?

Java的理念是“一次編寫(xiě),到處運(yùn)行”,Java在應(yīng)用框架底下的架構(gòu)是無(wú)與倫比的,遠(yuǎn)勝過(guò)其他任何語(yǔ)言,Java的框架利于大型的協(xié)同編程開(kāi)發(fā),系統(tǒng)易維護(hù)、可復(fù)用性較好。而PHP很容易自學(xué),讓熱備能快速簡(jiǎn)潔地編寫(xiě)代碼,適合于快速開(kāi)發(fā),中小型應(yīng)用系統(tǒng),開(kāi)發(fā)成本低。在調(diào)試、發(fā)布上,PHP也較Java簡(jiǎn)單。

理念上的不同導(dǎo)致了Java和PHP在Web應(yīng)用開(kāi)發(fā)上顯示了不同的結(jié)果,盡管Java的數(shù)學(xué)計(jì)算和數(shù)據(jù)庫(kù)訪問(wèn)都有優(yōu)勢(shì),架構(gòu)也相當(dāng)完美,但是PHP卻可以簡(jiǎn)單輕松地支持高強(qiáng)度Web訪問(wèn),能夠快速開(kāi)發(fā)應(yīng)用,支持PHP的虛擬主機(jī)多如牛毛,使得用PHP開(kāi)發(fā)一個(gè)網(wǎng)站比用Java開(kāi)發(fā)一個(gè)網(wǎng)站要快得多,容易的多。Java所擁有的優(yōu)點(diǎn)只適合傳統(tǒng)的以軟件項(xiàng)目為核心的開(kāi)發(fā)模式,而PHP更適合于以客戶為核心的SaaS的開(kāi)發(fā)模式,因此,PHP目前在Web網(wǎng)站開(kāi)發(fā)的優(yōu)勢(shì)完全是因?yàn)閃eb網(wǎng)站開(kāi)發(fā)的特殊性而導(dǎo)致的,并非編程語(yǔ)言特性所決定。

因此,PHP在Web網(wǎng)站開(kāi)發(fā)語(yǔ)言的戰(zhàn)爭(zhēng)中已經(jīng)慢慢將Java拋在了后面,Java要想在Web網(wǎng)站開(kāi)發(fā)上奮起直追,的確應(yīng)該多聽(tīng)聽(tīng)Andi Gutmans的意見(jiàn),徹底改變一下思路才行,否則兩者的差距只能是越來(lái)越遠(yuǎn)。

另外,雖然在國(guó)際上LAMP(Linux+Apache+Mysql+Php)架構(gòu)已經(jīng)占領(lǐng)了統(tǒng)治地位,但是在中國(guó)國(guó)內(nèi)還有一個(gè)怪胎,就是基于微軟的Windows Server+IIS+SqlServer+ASP/ASP.NET的架構(gòu),從理論上說(shuō),微軟的這一套架構(gòu)也能實(shí)現(xiàn)不錯(cuò)的性能,只可惜Windows和SqlServer價(jià)格不菲,整個(gè)架構(gòu)在性能上比起LAMP不僅沒(méi)有什么優(yōu)勢(shì),反而還有不少劣勢(shì),因此微軟的這一套家伙在國(guó)際市場(chǎng)上吃不開(kāi)。而國(guó)內(nèi)使用微軟盜版則可以忽略成本,而ASP的易學(xué)易用性不遜于PHP,甚至連IT外行都能夠使用,因此在國(guó)內(nèi)也有不小的市場(chǎng)。但是隨著中國(guó)在保護(hù)知識(shí)產(chǎn)權(quán)方面的日趨完善,免費(fèi)的LAMP依舊是未來(lái)的趨勢(shì)。
]]>
嵌入式系統(tǒng)用Java語(yǔ)言http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2484&Page=1wangxinxin2010-12-11 10:11:39Java是在C++基礎(chǔ)上改進(jìn)了的面向?qū)ο蟮恼Z(yǔ)言。它可以得到類(lèi)的封裝、繼承、多態(tài)等的優(yōu)異重用性的好處,Java的小應(yīng)用程序(Java Applet)還特別適合于上網(wǎng)。看來(lái),用Java開(kāi)發(fā)上的網(wǎng)的嵌入式應(yīng)用應(yīng)是很理想的,可惜,實(shí)現(xiàn)起來(lái)受嵌入式設(shè)備硬件在速度、存儲(chǔ)器容量、和其它資源的限制,加上桌面Java語(yǔ)言操作不到硬件,和執(zhí)行時(shí)間的不確定性,使Java應(yīng)用于嵌入式系統(tǒng)遇到新的問(wèn)題。Sun公司按PersonalJava規(guī)范開(kāi)發(fā)的J2ME(Java 2 Micro Edition),是專用研制用于開(kāi)發(fā)嵌入式的上網(wǎng)個(gè)人消費(fèi)類(lèi)設(shè)備的。因此J2ME除有面向?qū)ο蟮膬?yōu)點(diǎn)外,還包含了Web能力。J2ME使用的是Java API的一個(gè)子集,它僅保留了API的關(guān)鍵特性并適當(dāng)?shù)刈髁撕?jiǎn)化。同時(shí),又規(guī)定了兩種可有存儲(chǔ)模式:一個(gè)模式的內(nèi)存為128~256KB,另一種模式是 256KB以上的。其他,如類(lèi)包也根據(jù)存儲(chǔ)模式選用。

下面為避免混淆,在文中凡未加特殊說(shuō)明的Java,統(tǒng)指桌面Java而言。

一、 問(wèn)題提出

*常用的解釋性Java(Java Applet)的執(zhí)行速度慢,不適于嵌入式的應(yīng)用。

*Java要求過(guò)大的內(nèi)存。

*嵌入式設(shè)備要求操作硬件。因Java廢棄了C語(yǔ)言所使用的指針,且在Web環(huán)境下使用了Java虛擬機(jī)(JVM),使Java無(wú)力直接甚至間接地用指針操作硬件。

*Java使用一些自動(dòng)功能會(huì)引起執(zhí)行時(shí)間的不確定性,成為嵌入式的大忌。如垃圾自動(dòng)收集器。本是對(duì)于C的重大改進(jìn),但卻因程序自動(dòng)地回收垃圾,從而引入了實(shí)時(shí)的時(shí)間不確定性。

二、解決方案

使用AOT編譯器

為解決解釋性Java(Java Applet)執(zhí)行速度過(guò)慢的問(wèn)題,發(fā)展了AOT(ahead-of-time)編譯器。大家喜歡在Internet上使用Java的一個(gè)原因是其字節(jié)碼具有跨平臺(tái)性,即同一Java代碼可以運(yùn)行于PC、Mac、Solaris,甚至于主機(jī)之上。為此,在英文叫它WORA(寫(xiě)一次即可通行于任意機(jī))。這是因?yàn)槊恳徊僮飨到y(tǒng)平臺(tái)上都有符合自己機(jī)型的專用Java虛擬機(jī)(JVM),由它對(duì)字節(jié)碼進(jìn)行解釋運(yùn)行。因?yàn)榻忉尦绦蛐柘缺唤忉屧俦粓?zhí)行,多了解釋環(huán)節(jié),延誤數(shù)秒鐘時(shí)間。如果是撥打電話,這個(gè)時(shí)間足以令人生厭。現(xiàn)在使用AOT(ahead-of-time)超前編譯器,提前將解釋碼轉(zhuǎn)換為本平臺(tái)所用的并經(jīng)優(yōu)化過(guò)的二進(jìn)制碼,速度提高很多。現(xiàn)有Cygnus公司聲稱,它開(kāi)發(fā)的AOT編譯器執(zhí)行速度是原解釋程序的8倍。NewMonics說(shuō)它的 QuickPERC編譯器是原解釋程序的20倍。當(dāng)然,AOT編譯器也有不足,就是他犧牲了Java的WORA。

減少內(nèi)存的占用

所有的面向?qū)ο笳Z(yǔ)言,比C及匯編語(yǔ)言點(diǎn)用內(nèi)存都多。這個(gè)問(wèn)題對(duì)于桌面系統(tǒng)早已不再是考慮的因素了,如服務(wù)器平均占用數(shù)GB的內(nèi)存已司空見(jiàn)慣。但是,對(duì)于嵌入式系統(tǒng)卻不能不考慮。用Java開(kāi)發(fā)的信息家電產(chǎn)品可能需要把內(nèi)存限制到512KB以下。如果嵌入式系統(tǒng)使用的是規(guī)模為1MB的核心類(lèi)庫(kù),那就是說(shuō),一句代碼尚未寫(xiě),內(nèi)存早就不夠用了。

為此,需要把用不到的類(lèi)、類(lèi)方法和代統(tǒng)統(tǒng)從程序中剔除。(AOT超前編譯器可以幫助解決這個(gè)問(wèn)題。)再就是自己開(kāi)發(fā)本平臺(tái)專用的,既短小高效、又符合Java API標(biāo)準(zhǔn)的Java核心類(lèi)庫(kù)。

開(kāi)發(fā)能混合編程的IDE

一般認(rèn)為,用C語(yǔ)言寫(xiě)的程序,指鍺使用不當(dāng)引起的缺陷占總?cè)毕莸?0%左右。Java語(yǔ)言,出于安全的考慮,才廢棄了使用指針。但是,指針卻能夠最直接地訪問(wèn)到存儲(chǔ)器和真實(shí)的硬件。現(xiàn)在,為在嵌入式Java中能夠訪問(wèn)到硬件,不得不改用本地接口,即從嵌入式Java中利用能夠訪問(wèn)到硬件的C語(yǔ)言函數(shù)來(lái)實(shí)行交叉編程。這就意味著增加了復(fù)雜性。開(kāi)發(fā)人員需要具備多語(yǔ)言以及多層次的混合編程和混合調(diào)試的能力。發(fā)展多語(yǔ)言多層次混合編程的IDE,無(wú)疑十分有助于一般開(kāi)發(fā)人員完成這一相當(dāng)復(fù)雜的課題。Metrowerks的CodeWorrior和IBM的VisualAge就是新開(kāi)發(fā)的基于J2ME的這樣的IDE。

克服時(shí)間的不確定性

Java 最主要的問(wèn)題是時(shí)間不確定性,主要來(lái)源于存儲(chǔ)器殘?jiān)淖詣?dòng)收集再生器。這種垃圾收集再生器工作的時(shí)候,自動(dòng)地決定何時(shí)停下其他程序的執(zhí)行,再根據(jù)當(dāng)時(shí)殘?jiān)膶?shí)際情況或長(zhǎng)或短地完成任務(wù)。所以,它嚴(yán)重地干擾實(shí)時(shí)應(yīng)用所要求的時(shí)間確定性。為解決這一問(wèn)題,不同公司采用不同的方法和垃圾收集的算法。 NewMonics的Real Time Executives和Windriver的FastJ都是保證絕對(duì)的確定時(shí)間,Sun公司用不同的辦法但也保證具有實(shí)時(shí)的確定性。采用不同的編程技巧,譬如使用類(lèi)型確定的線程局部存儲(chǔ),也可以避免因垃圾收集引發(fā)的沖突。

需保持跨平臺(tái)的必要

AOT 編譯器生成的Java代碼喪失了Java在其他操作平臺(tái)上的執(zhí)行能力。要想把Java的源代碼再向其他平臺(tái)移植,需要附加很大的勞動(dòng)。面向?qū)ο蟮囊粋(gè)基本設(shè)計(jì)原理就是只要保持接品不變,那么,與接口交談的代碼在移植時(shí)就不受影響。所謂高級(jí)邏輯接口的隔離手法,事實(shí)上,就是將平臺(tái)敏感的內(nèi)容同移值無(wú)關(guān)的代碼分離開(kāi)來(lái),并且分別提供同樣功能的平臺(tái)敏感程序。現(xiàn)在,針對(duì)嵌入式Java,目前還沒(méi)有人做這項(xiàng)工作。

三、實(shí)際應(yīng)用

Java是良好的嵌入式編程語(yǔ)言嗎?

還不能這么說(shuō),至少現(xiàn)在是這樣。因?yàn)樵谇度胧较到y(tǒng)中,Java如何應(yīng)用要看具體情況而定。對(duì)于需要管理中斷來(lái)完成重要任務(wù)的應(yīng)用系統(tǒng),就不宜于選用Java 進(jìn)行開(kāi)發(fā),譬如引導(dǎo)登外星的飛行器系統(tǒng)就是這樣。對(duì)于要求輕型、高效、任務(wù)重要、時(shí)間確定性要求極高的系統(tǒng),也是只能局限于使用C語(yǔ)言和匯編。比如,點(diǎn)燃登陸外星的制動(dòng)火箭系統(tǒng),定時(shí)通過(guò)串行口獲取關(guān)鍵信息一邊做出決定的系統(tǒng),定時(shí)報(bào)告航天器方位的系統(tǒng)等都不能使用Java。但是,需要不斷與他人通信聯(lián)系,以便對(duì)貨運(yùn)進(jìn)行有效管理的手持系統(tǒng),又最適合使用Java編程。因?yàn)椋劝l(fā)揚(yáng)了Java Applet固有的跨平臺(tái)應(yīng)用地Web環(huán)境的特點(diǎn),又能充分利用服務(wù)器端的現(xiàn)成軟件。

使用Java有時(shí)也并不完全取決于技術(shù)

立足于經(jīng)濟(jì)上的考慮,比單獨(dú)的技術(shù)考慮更為重要。譬如,對(duì)于服務(wù)器,為了支持使用Java,寧愿多花費(fèi)數(shù)千元擴(kuò)大存儲(chǔ)器是正確的。因?yàn)椋瑥耐度?產(chǎn)出的分析也得出同樣的結(jié)論。又如手機(jī),若為支持使用Java,哪性僅只需要多花一元錢(qián)去擴(kuò)大存儲(chǔ)器也是不可行的。因?yàn)椋謾C(jī)的生產(chǎn)是以行百萬(wàn)件的產(chǎn)量來(lái)考慮的,多花一元線,就意味著多花千百萬(wàn)元,諾大的數(shù)字遠(yuǎn)比技術(shù)的先進(jìn)更為重要,是顯而易見(jiàn)的。

實(shí)施嵌入式Java時(shí)需注意

Java 用于嵌入式還是瓣生事物,需要探路前進(jìn),摸著石頭過(guò)河,忌冒進(jìn)和全面開(kāi)花。應(yīng)試探性地從使用現(xiàn)成的嵌入式J2ME開(kāi)始,在它的通用性的開(kāi)發(fā)環(huán)境下運(yùn)行本平臺(tái)的字節(jié)碼。盡可能地順著J2MME向前走,盡可能地順著J2ME向前走,盡可能地走得遠(yuǎn)一點(diǎn),只有在遇到特殊問(wèn)題時(shí)才導(dǎo)求新的解決辦法。新方法的采用并不一定能夠解決問(wèn)題,比如,AOT或半自動(dòng)的垃圾收集器等可能并沒(méi)有解決你的問(wèn)題,也勿驚慌,要總結(jié)經(jīng)驗(yàn)做出評(píng)價(jià),繼續(xù)前進(jìn),使嵌入式Java日罄完善。

要重視IDE的選用,好的IDE絕對(duì)是良好的助手。否則,你是單槍匹馬,披荊斬棘,艱苦良多。

]]>
web開(kāi)發(fā)語(yǔ)言的選擇:PHP or JAVAhttp://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2483&Page=1wangxinxin2010-12-11 10:10:43最近在書(shū)店里看到了一本新書(shū),書(shū)名叫《Java Web整合開(kāi)發(fā)王者歸來(lái)》,上千頁(yè)的一本大部頭,簡(jiǎn)單翻看了一下目錄,書(shū)中涵蓋了JSP Servlet Struts Hibernate Spring EJB等開(kāi)發(fā)技術(shù)及框架。然而對(duì)于一個(gè)沒(méi)有任何java語(yǔ)言基礎(chǔ)的人,通過(guò)學(xué)習(xí)這本書(shū)就能掌握web開(kāi)發(fā)么?這里我不是批評(píng)這本書(shū),這本書(shū)可以給有一定J2SK基礎(chǔ)的人去邁入web開(kāi)發(fā)的大門(mén)。我想表達(dá)的是:一個(gè)沒(méi)有java語(yǔ)言基礎(chǔ)的人,想學(xué)習(xí)使用java語(yǔ)言進(jìn)行web開(kāi)發(fā),其學(xué)習(xí)路徑是陡峭的。.NET框架的C#也是如此。web開(kāi)發(fā)不只是有了以上知識(shí)的掌握就可以搞定。java,c#或PHP掌管的范圍主要在服務(wù)器端,另外有一些知識(shí)也是web開(kāi)發(fā)不可或缺的。比如html,css,javascript,數(shù)據(jù)庫(kù)設(shè)計(jì)等。全力去了解java語(yǔ)言,并熟悉《Java Web整合開(kāi)發(fā)王者歸來(lái)》中提到的技術(shù)及框架,容易使我們的web開(kāi)發(fā)“跑了題”,也容易使我們因?yàn)殡y度太大而半途而廢。
       PHP相比java,c#等是比較容易入門(mén)的語(yǔ)言,主要應(yīng)用于web服務(wù)器端的開(kāi)發(fā)。和各家廠商的數(shù)據(jù)庫(kù)有天然的集成,用不了多長(zhǎng)時(shí)間即可掌握基本的語(yǔ)法,學(xué)習(xí)她可以直奔web主題,講解php的書(shū)上來(lái)會(huì)直接講解處理表單,操作數(shù)據(jù)庫(kù),產(chǎn)生html,與javascript打交道等web世界的內(nèi)容。掌握了基本的語(yǔ)法后,再選擇一個(gè)易用的MVC框架,比如Yii,不到半年即可開(kāi)發(fā)一些小型的web應(yīng)用。
       但是話又說(shuō)回來(lái),php也有她的缺點(diǎn),比如代碼隨意,缺少命名規(guī)范,結(jié)構(gòu)話思維過(guò)程過(guò)多,大量使用全局變量,弱類(lèi)型語(yǔ)言,過(guò)于靈活,不利于嚴(yán)謹(jǐn)風(fēng)格代碼的形成等。數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)模式都使用java,c++等語(yǔ)言來(lái)描述就是一個(gè)例證。PHP網(wǎng)上可以利用的資源很多,從某種角度來(lái)說(shuō),這也是一種缺點(diǎn),對(duì)于一些初學(xué)者來(lái)說(shuō),可能導(dǎo)致懶散,實(shí)現(xiàn)某個(gè)功能,順手拈來(lái),導(dǎo)致思維能力退化。然而關(guān)鍵還是在于人,在于自己的把握。
       那么說(shuō)來(lái)說(shuō)去到底該做如何選擇呢?我認(rèn)為:
       對(duì)于有一定java語(yǔ)言基礎(chǔ)的,堅(jiān)持使用java,學(xué)習(xí)java web整合開(kāi)發(fā)中提到的技術(shù)是一種不錯(cuò)的選擇。而對(duì)于沒(méi)有java語(yǔ)言基礎(chǔ)的,如果有其他語(yǔ)言的基礎(chǔ),比如c/c++,有面向?qū)ο笏枷氲模瑢W(xué)習(xí)使用PHP是一種不錯(cuò)的選擇。既能快速擁抱web,又不至于被PHP“帶壞”。如果對(duì)于一個(gè)沒(méi)有任何語(yǔ)言基礎(chǔ)的程序新手呢,如果不想進(jìn)入web開(kāi)發(fā)領(lǐng)域,那么各種語(yǔ)言,做何選擇均可,隨緣吧。如果想進(jìn)入web開(kāi)發(fā)領(lǐng)域,可以選擇php快速進(jìn)入web的世界,當(dāng)你覺(jué)得用php進(jìn)行web開(kāi)發(fā)已經(jīng)很熟練的時(shí)候,不要沾沾自喜,java,c++有很多我們要學(xué)習(xí)的地方。
]]>
Java語(yǔ)言在軟件開(kāi)發(fā)中的幾個(gè)認(rèn)識(shí)誤區(qū)http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2482&Page=1wangxinxin2010-12-11 10:09:12軟件的生命性

  軟件是有生命的,這可能是老調(diào)重彈了,但是因?yàn)樗玛P(guān)分層架構(gòu)的原由,反復(fù)強(qiáng)調(diào)都不過(guò)分。

  一個(gè)有生命的軟件首先必須有一個(gè)靈活可擴(kuò)展的基礎(chǔ)架構(gòu),其次才是完整的功能。

  目前很多人對(duì)軟件的思想還是焦點(diǎn)落在后者:完整的功能,覺(jué)得一個(gè)軟件功能越完整越好,其實(shí)關(guān)鍵還是架構(gòu)的靈活性,就是前者,基礎(chǔ)架構(gòu)好,功能添加只是時(shí)間和工作量問(wèn)題,但是如果架構(gòu)不好,功能再完整,也不可能包括未來(lái)所有功能,軟件是有生命的,在未來(lái)成長(zhǎng)時(shí),更多功能需要加入,但是因?yàn)榛A(chǔ)架構(gòu)不靈活不能方便加入,死路一條。

  正因?yàn)槠胀ㄈ藢?duì)軟件存在短視誤區(qū),對(duì)功能追求高于基礎(chǔ)架構(gòu),很多吃了虧的老程序員就此離開(kāi)軟件行業(yè),帶走寶貴的失敗經(jīng)驗(yàn),新的盲目的年輕程序員還是使用老的思維往前沖。其實(shí)很多國(guó)外免費(fèi)開(kāi)源框架如ofbiz compiere和slide也存在這方面陷阱,貌似非常符合胃口,其實(shí)類(lèi)似國(guó)內(nèi)那些幾百元的盜版軟件,擴(kuò)展性以及持續(xù)發(fā)展性嚴(yán)重不足。

  那么選擇現(xiàn)在一些流行的框架如Hibernate、Spring/Jdonframework是否就表示基礎(chǔ)架構(gòu)打好了呢?其實(shí)還不盡然,關(guān)鍵還是取決于你如何使用這些框架來(lái)搭建你的業(yè)務(wù)系統(tǒng)。

  存儲(chǔ)過(guò)程和復(fù)雜SQL語(yǔ)句的陷阱

  首先談?wù)劥鎯?chǔ)過(guò)程使用的誤區(qū),使用存儲(chǔ)過(guò)程架構(gòu)的人以為可以解決性能問(wèn)題,其實(shí)它正是導(dǎo)致性能問(wèn)題的罪魁禍?zhǔn)字唬騻(gè)比喻:如果一個(gè)人頻臨死亡,打一針可以讓其延長(zhǎng)半年,但是打了這針,其他所有醫(yī)療方案就全部失效,請(qǐng)問(wèn)你會(huì)使用這種短視方案嗎?

  為什么這樣說(shuō)呢?如果存儲(chǔ)過(guò)程都封裝了業(yè)務(wù)過(guò)程,那么運(yùn)行負(fù)載都集中在數(shù)據(jù)庫(kù)端,要中間J2EE應(yīng)用服務(wù)器干什么?要中間服務(wù)器的分布式計(jì)算和集群能力做什么?只能回到過(guò)去集中式數(shù)據(jù)庫(kù)主機(jī)時(shí)代。現(xiàn)在軟件都是面向互聯(lián)網(wǎng)的,不象過(guò)去那樣局限在一個(gè)小局域網(wǎng),多用戶并發(fā)訪問(wèn)量都是無(wú)法確定和衡量,依靠一臺(tái)數(shù)據(jù)庫(kù)主機(jī)顯然是不能夠承受這樣惡劣的用戶訪問(wèn)環(huán)境的。(當(dāng)然搞數(shù)據(jù)庫(kù)集群也只是五十步和百步的區(qū)別)。

  從分層角度來(lái)看,現(xiàn)在三層架構(gòu):表現(xiàn)層、業(yè)務(wù)層和持久層,三個(gè)層次應(yīng)該分割明顯,職責(zé)分明:持久層職責(zé)持久化保存業(yè)務(wù)模型對(duì)象,業(yè)務(wù)層對(duì)持久層的調(diào)用只是幫助我們激活曾經(jīng)委托其保管的對(duì)象,所以,不能因?yàn)槌志脤邮潜9苷撸覀兙鸵云錇楹诵膰@其編程,除了要求其歸還模型對(duì)象外,還要求其做其做復(fù)雜的業(yè)務(wù)組合。打個(gè)比喻:你在火車(chē)站將水果和盤(pán)子兩個(gè)對(duì)象委托保管處保管,過(guò)了兩天來(lái)取時(shí),你還要求保管處將水果去皮切成塊,放在盤(pán)子里,做成水果盤(pán)給你,合理嗎?

  上面是談過(guò)分依賴持久層的一個(gè)現(xiàn)象,還有一個(gè)正好相反現(xiàn)象,持久層散發(fā)出來(lái),開(kāi)始擠占業(yè)務(wù)層,腐蝕業(yè)務(wù)層,整個(gè)業(yè)務(wù)層到處看見(jiàn)的是數(shù)據(jù)表的影子(包括數(shù)據(jù)表的字段),而不是業(yè)務(wù)對(duì)象。這樣程序員應(yīng)該多看看OO經(jīng)典PoEAA。PoEAA 認(rèn)為除了持久層,不應(yīng)該在其他地方看到數(shù)據(jù)表或表字段名。

  當(dāng)然適量使用存儲(chǔ)過(guò)程,使用數(shù)據(jù)庫(kù)優(yōu)點(diǎn)也是允許的。按照Evans DDD理論,可以將SQL語(yǔ)句和存儲(chǔ)過(guò)程作為規(guī)則Specification一部分。

  Hibernate等ORM問(wèn)題

  現(xiàn)在使用Hibernate人也不少,但是他們發(fā)現(xiàn)Hibernate性能緩慢,所以尋求解決方案,其實(shí)并不是 Hibernate性能緩慢,而是我們使用方式發(fā)生錯(cuò)誤:

  “最近本人正搞一個(gè)項(xiàng)目,項(xiàng)目中我們用到了struts1.2+hibernate3, 由于關(guān)系復(fù)雜表和表之間的關(guān)系很多,在很多地方把lazy都設(shè)置false,所以導(dǎo)致數(shù)據(jù)一加載很慢,而且查詢一條數(shù)據(jù)更是非常的慢。”

  Hibernate是一個(gè)基于對(duì)象模型持久化的技術(shù),因此,關(guān)鍵是我們需要設(shè)計(jì)出高質(zhì)量的對(duì)象模型,遵循DDD領(lǐng)域建模原則,減少降低關(guān)聯(lián),通過(guò)分層等有效辦法處理關(guān)聯(lián)。如果采取圍繞數(shù)據(jù)表進(jìn)行設(shè)計(jì)編程,加上表之間關(guān)系復(fù)雜(沒(méi)有科學(xué)方法處理、偵察或減少這些關(guān)系),必然導(dǎo)致 系統(tǒng)運(yùn)行緩慢,其實(shí)同樣問(wèn)題也適用于當(dāng)初對(duì)EJB的實(shí)體Bean的CMP抱怨上,實(shí)體Bean是Domain Model持久化,如果不首先設(shè)計(jì)Domain Model,而是設(shè)計(jì)數(shù)據(jù)表,和持久化工具設(shè)計(jì)目標(biāo)背道而馳,能不出問(wèn)題嗎?關(guān)于這個(gè)問(wèn)題N多年就在Jdon爭(zhēng)論過(guò)。

 
]]>在 AIX Version 5.3 中使用 Java 和 PHP 技術(shù)進(jìn)行開(kāi)發(fā) (6)http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2481&Page=1wangxinxin2010-12-11 10:06:56  本教程面向那些希望在 Web 應(yīng)用程序開(kāi)發(fā)中快速集成 PHP 和 Java? 的 AIX? 5.3 開(kāi)發(fā)人員。在本教程中,您將完成一個(gè)解決方案的構(gòu)建過(guò)程,其中使用 PHP 作為前端,而使用問(wèn)卷調(diào)查應(yīng)用程序的 Java 類(lèi)作為后端。在您研究后端 Java 類(lèi)的 PHP 接口的最終解決方案之前,您還將研究 Web 服務(wù)和 PHP Java Bridge 接口之間的區(qū)別、以及 PHP 和 Java 開(kāi)發(fā)方法之間的區(qū)別。您應(yīng)該具有基本的 Java 編程能力,并對(duì)基本的 Web 開(kāi)發(fā)環(huán)境有所了解。

  關(guān)于本系列

  PHP 是一種非常優(yōu)秀的 Web 開(kāi)發(fā)語(yǔ)言,而在商業(yè)應(yīng)用程序開(kāi)發(fā)方面,Java 編程語(yǔ)言十分流行。因此,為了在 AIX Version 5.3 操作系統(tǒng)上充分利用它們的優(yōu)勢(shì),專門(mén)開(kāi)發(fā)了 PHP Java Bridge。本系列文章向 AIX 5.3 開(kāi)發(fā)人員介紹了如何在他們的 Web 應(yīng)用程序開(kāi)發(fā)中集成 PHP 和 Java 技術(shù)。

  為了說(shuō)明這一點(diǎn),您將按照典型的開(kāi)發(fā)過(guò)程來(lái)構(gòu)建一個(gè)簡(jiǎn)單的問(wèn)卷調(diào)查應(yīng)用程序,具體內(nèi)容包括:

  開(kāi)發(fā)主要的 Java 應(yīng)用程序

  通過(guò) Servlet 將 Java 應(yīng)用程序公開(kāi)為基于 Java 的 Web 應(yīng)用程序

  添加在數(shù)據(jù)庫(kù)中存儲(chǔ)信息的支持

  將原始應(yīng)用程序公開(kāi)為 Web Services,并為該應(yīng)用程序提供 PHP 接口

  使用專門(mén)的 PHP Java Bridge 重新開(kāi)發(fā) PHP 接口

  本系列文章共分為六個(gè)部分:

  第 1 部分介紹了一個(gè)應(yīng)用程序,并為構(gòu)建 Java 應(yīng)用程序以及使用 Tomcat 執(zhí)行基于 Java 的 Web 應(yīng)用程序搭建了相應(yīng)的環(huán)境。

  第 2 部分介紹了主要的應(yīng)用程序代碼以及一個(gè)簡(jiǎn)單的 Java Servlet 的開(kāi)發(fā),以便為信息提供一個(gè) Web 接口。

  第 3 部分將核心應(yīng)用程序連接到 DB2? 數(shù)據(jù)庫(kù),以便對(duì)問(wèn)卷調(diào)查的問(wèn)題和回答進(jìn)行存儲(chǔ)。

  第 4 部分對(duì)原始應(yīng)用程序進(jìn)行轉(zhuǎn)換,使其能夠作為 Web Services 進(jìn)行訪問(wèn),并且它為 PHP 接口提供了基礎(chǔ)。

  第 5 部分使用 PHP Java Bridge 為 Java 應(yīng)用程序構(gòu)建 PHP 接口。

  第 6 部分對(duì)這個(gè)應(yīng)用程序進(jìn)行重新開(kāi)發(fā),以便使用 PHP Java Bridge 來(lái)代替 Web Services 接口。

  關(guān)于本教程

  本教程是這個(gè)系列文章的最后一個(gè)部分,在本教程中,您將了解如何組合使用 PHP 和 Java 技術(shù),以便為支持問(wèn)卷調(diào)查應(yīng)用程序的原始 Java 類(lèi)構(gòu)建 Web 接口。這個(gè)最終解決方案使用 PHP Java Bridge 以使得您可以為在本系列文章的前面幾個(gè)部分中所開(kāi)發(fā)的 Java 類(lèi)構(gòu)建基于 PHP 的接口。

  您首先將了解 PHP Java Bridge、以及它的操作與最初開(kāi)發(fā)的 Web 服務(wù)方法之間的區(qū)別,從而對(duì)這幾種不同的技術(shù)進(jìn)行比較。然后,在研究原始 Java 類(lèi)的 PHP 接口的最終備選方法之前,您將研究幾種不同的集成您的基于 PHP 和 Java 的解決方案。

  先決條件

  為了學(xué)習(xí)本教程,您需要安裝下列軟件:

  IBM pSerIEs? 服務(wù)器(本文中的代碼使用 AIX Version 5.3 進(jìn)行了測(cè)試。)

  Apache Tomcat 系統(tǒng)

  Eclipse IDE

  Java 5 64-bit SDK(要下載這個(gè)包,您需要進(jìn)行注冊(cè),但注冊(cè)是免費(fèi)的。)

  Mozilla Web browser for AIX

  幾種不同連接技術(shù)的比較

  問(wèn)卷調(diào)查應(yīng)用程序所使用的 Web 服務(wù)方法為您提供了極大的靈活性,而 PHP Java Bridge 以不同的方式提供了類(lèi)似的靈活性。在您更深入地研究開(kāi)發(fā)過(guò)程之前,讓我們更仔細(xì)地分析一下它們之間的區(qū)別和相似之處。

  Web 服務(wù)方法

  您對(duì)原始應(yīng)用程序進(jìn)行了轉(zhuǎn)換,這樣一來(lái),在本系列文章的第四部分中(請(qǐng)參見(jiàn)參考資料),就可以將其作為 Web Services 進(jìn)行訪問(wèn)。除了可訪問(wèn)性之外,Web Services 模型還具有許多其它的優(yōu)點(diǎn)。通過(guò) Web Services 接口來(lái)公開(kāi)類(lèi),您可以保證互操作性,因?yàn)閹缀跛械恼Z(yǔ)言都支持某些形式的 Web Services ,無(wú)論是 XML-RPC 還是簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (SOAP)。

  這也就帶來(lái)了極大的靈活性。現(xiàn)在,您的 Java 后端可以由采用 C、Perl、Java 語(yǔ)言、PHP、JavaScript 和許多其他編程語(yǔ)言所編寫(xiě)的腳本和應(yīng)用程序來(lái)進(jìn)行訪問(wèn);然而,實(shí)現(xiàn)互操作性是要付出一定代價(jià)的。

  正如您在本系列文章的第四部分中所看到的,將您的應(yīng)用程序公開(kāi)為 Web Services 是一項(xiàng)復(fù)雜的任務(wù)。要正確地完成這項(xiàng)工作,需要通過(guò) Web 服務(wù)描述語(yǔ)言 (WSDL) 文件開(kāi)發(fā)和部署您的代碼;然后,您必須單獨(dú)地為每個(gè)函數(shù)定義不同的接口,同時(shí)還需要確保采用與您希望使用的標(biāo)準(zhǔn)可互操作的格式,對(duì)所提供的值和返回的值進(jìn)行編碼和封裝。

  在您為核心類(lèi)開(kāi)發(fā)和添加新的功能和擴(kuò)展時(shí),所有的這些工作都需要花費(fèi)大量的時(shí)間進(jìn)行開(kāi)發(fā)、以及較長(zhǎng)的時(shí)間進(jìn)行控制。要使得原始類(lèi)能夠通過(guò) Web 服務(wù)接口進(jìn)行訪問(wèn),可能會(huì)使得您的開(kāi)發(fā)時(shí)間增加 20% 到 50%。

  而且,正如稍后將更詳細(xì)地進(jìn)行介紹的,Web 服務(wù)方法還隱含了不容忽視的顯著性能開(kāi)銷(xiāo)(如果您希望在大型操作環(huán)境中部署該應(yīng)用程序的話)。

  PHP Java Bridge

  在本系列文章的第五部分中,您詳細(xì)地了解了 PHP Java Bridge(請(qǐng)參見(jiàn)參考資料),但是 PHP Java Bridge 的關(guān)鍵元素允許您直接從 PHP 內(nèi)部訪問(wèn) Java 類(lèi),就好像您正在訪問(wèn)本地 PHP 類(lèi)一樣。

  盡管 Web 服務(wù)和 PHP Java Bridge 接口在本質(zhì)上存在很大的差別,但事實(shí)上,它們都使用 XML 進(jìn)行通信,以交換有關(guān)原始方法和類(lèi)、以及應(yīng)該如何對(duì)它們進(jìn)行訪問(wèn)的信息。與 Web 服務(wù)解決方案有所不同,這個(gè)過(guò)程是自動(dòng)的。

  正如您在第五部分中所看到的(請(qǐng)參見(jiàn)參考資料)、以及本文清單 1 中所介紹的,在您導(dǎo)入 PHP 元素、并且創(chuàng)建到遠(yuǎn)程 Java 主機(jī)的連接之后,使用和創(chuàng)建 Java 類(lèi)和對(duì)象是非常簡(jiǎn)單的。

清單 1. 簡(jiǎn)單的 PHP Java Bridge 的示例
          
<?
require_once("http://sulaco.mcslp.pri:8080/JavaBridge/java/Java.inc");
$System = new Java("java.lang.System");
print_r($System->getProperties);
?>

  在本教程后面的內(nèi)容中,您將研究所需的確切的方法和解決方案。

  區(qū)別和相似之處

  Web Services 和 PHP Java 解決方案之間存在許多明顯的區(qū)別和相似之處,從而使得采用這兩種方法開(kāi)發(fā)和部署應(yīng)用程序時(shí)具有相應(yīng)的優(yōu)點(diǎn)和缺點(diǎn)。

  例如,Web 服務(wù)和 PHP Java Bridge 解決方案都允許您使用 PHP 作為前端、使用 Java 環(huán)境作為應(yīng)用程序的后端部分。對(duì)于 Web 服務(wù)解決方案,您必須開(kāi)發(fā)原始類(lèi)、Web 服務(wù)類(lèi)和 PHP 接口。對(duì)于 PHP Java Bridge,您只需要開(kāi)發(fā)原始 Java 類(lèi)和 PHP 前端,PHP Java Bridge 可以為您處理所有的互操作性問(wèn)題。

  在 Web 服務(wù)和 PHP Java Bridge 解決方案之間還存在一個(gè)比較顯著的區(qū)別,即完成解決方案所需的步驟有所不同。Web 服務(wù)解決方案需要額外的開(kāi)發(fā)時(shí)間,以使用所需的 Web 服務(wù)接口來(lái)公開(kāi)服務(wù)、并使得它們可供使用。在 PHP 中使用 Web 服務(wù)也是相當(dāng)繁瑣的,因?yàn)槟仨氶_(kāi)發(fā)一個(gè)能夠?yàn)橐验_(kāi)發(fā)的 Web 服務(wù)接口提供接口的解決方案。

  對(duì)于 PHP Java Bridge,您可以直接訪問(wèn)現(xiàn)有的 Java 類(lèi),而不必在 Java 端顯式地開(kāi)發(fā)接口、或者在 PHP 端顯式地開(kāi)發(fā)訪問(wèn)接口。

  性能

  為了將您的原始請(qǐng)求轉(zhuǎn)換為完全與平臺(tái)無(wú)關(guān)的形式,使用 Web 服務(wù)的關(guān)鍵問(wèn)題之一是必須將請(qǐng)求轉(zhuǎn)換為 XML。所得到的 XML 數(shù)據(jù)包中包括請(qǐng)求、源或目標(biāo)信息、以及請(qǐng)求中所包含的任何數(shù)據(jù)或者信息(例如,方法或函數(shù)的參數(shù)),這使得 XML 組件的負(fù)載變得非常大。

  采用這種方式生成有效的 XML 是相當(dāng)花費(fèi)時(shí)間的,但是對(duì)該信息進(jìn)行解碼甚至可能需要花費(fèi)更多的時(shí)間,因?yàn)?XML 解析的過(guò)程并不像您所預(yù)期的那么簡(jiǎn)單和直接。和發(fā)送請(qǐng)求到服務(wù)器的客戶端的負(fù)載相比,這個(gè)處理過(guò)程會(huì)呈現(xiàn)更高的負(fù)載,隨后還會(huì)有接受請(qǐng)求和最后處理請(qǐng)求的過(guò)程。在將響應(yīng)發(fā)送回客戶端的時(shí)候,將按相反的順序執(zhí)行相同的處理過(guò)程(采用 XML 對(duì)響應(yīng)進(jìn)行編碼,發(fā)送到客戶端,客戶端解析 XML 并且提取響應(yīng))。

  您可以在圖 1 中更詳細(xì)地看到這個(gè)過(guò)程。

圖 1. 實(shí)際應(yīng)用中的 Web 服務(wù)接口 ]]>
java編程教程:JDBC技術(shù)介紹http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2480&Page=1wangxinxin2010-12-11 10:04:49數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)人員、數(shù)據(jù)庫(kù)前臺(tái)工具開(kāi)發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的數(shù)據(jù)庫(kù)

JDBC是一種可用于執(zhí)行SQL語(yǔ)句的JavaAPI(ApplicationProgrammingInterface應(yīng)用程序設(shè)計(jì)接口)。它由一些Java語(yǔ)言編寫(xiě)的類(lèi)和界面組成。JDBC為應(yīng)用開(kāi)發(fā)人員、前臺(tái)工具開(kāi)發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的應(yīng)用程序。

一、ODBC到JDBC的發(fā)展歷程

說(shuō)到JDBC,很容易讓人聯(lián)想到另一個(gè)十分熟悉的字眼ODBC。它們之間有沒(méi)有聯(lián)系呢?如果有,那么它們之間又是怎樣的關(guān)系呢?

ODBC是OpenDatabaseConnectivity的英文簡(jiǎn)寫(xiě)。它是一種用來(lái)在相關(guān)或不相關(guān)的管理系統(tǒng)(DBMS)中存取數(shù)據(jù)的,用C語(yǔ)言實(shí)現(xiàn)的,標(biāo)準(zhǔn)應(yīng)用程序數(shù)據(jù)接口。通過(guò)ODBCAPI,應(yīng)用程序可以存取保存在多種不同管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個(gè)DBMS使用了何種數(shù)據(jù)存儲(chǔ)格式和編程接口。

1.ODBC的結(jié)構(gòu)模型

ODBC的結(jié)構(gòu)包括四個(gè)主要部分:應(yīng)用程序接口、驅(qū)動(dòng)器管理器、驅(qū)動(dòng)器和數(shù)據(jù)源。

應(yīng)用程序接口:屏蔽不同的ODBC驅(qū)動(dòng)器之間函數(shù)調(diào)用的差別,為用戶提供統(tǒng)一的SQL編程接口。

驅(qū)動(dòng)器管理器:為應(yīng)用程序裝載驅(qū)動(dòng)器。

驅(qū)動(dòng)器:實(shí)現(xiàn)ODBC的函數(shù)調(diào)用,提供對(duì)特定數(shù)據(jù)源的SQL請(qǐng)求。如果需要,驅(qū)動(dòng)器將修改應(yīng)用程序的請(qǐng)求,使得請(qǐng)求符合相關(guān)的DBMS所支持的文法。

數(shù)據(jù)源:由用戶想要存取的數(shù)據(jù)以及與它相關(guān)的操作系統(tǒng)、DBMS和用于DBMS的網(wǎng)絡(luò)平臺(tái)組成。

雖然ODBC驅(qū)動(dòng)器管理器的主要目的是加載驅(qū)動(dòng)器,以便ODBC函數(shù)調(diào)用,但是驅(qū)動(dòng)器本身也執(zhí)行ODBC函數(shù)調(diào)用,并與相互配合。因此當(dāng)應(yīng)用系統(tǒng)發(fā)出調(diào)用與數(shù)據(jù)源進(jìn)行連接時(shí),驅(qū)動(dòng)器能管理通信協(xié)議。當(dāng)建立起與數(shù)據(jù)源的連接時(shí),驅(qū)動(dòng)器便能處理應(yīng)用系統(tǒng)向DBMS發(fā)出的請(qǐng)求,對(duì)分析或發(fā)自數(shù)據(jù)源的設(shè)計(jì)進(jìn)行必要的翻譯,并將結(jié)果返回給應(yīng)用系統(tǒng)。

2.JDBC的誕生

自從Java語(yǔ)言于1995年5月正式公布以來(lái),Java風(fēng)靡全球。出現(xiàn)大量的用java語(yǔ)言編寫(xiě)的程序,其中也包括應(yīng)用程序。由于沒(méi)有一個(gè)Java語(yǔ)言的API,編程人員不得不在Java程序中加入C語(yǔ)言的ODBC函數(shù)調(diào)用。這就使很多Java的優(yōu)秀特性無(wú)法充分發(fā)揮,比如平臺(tái)無(wú)關(guān)性、面向?qū)ο筇匦缘取kS著越來(lái)越多的編程人員對(duì)Java語(yǔ)言的日益喜愛(ài),越來(lái)越多的公司在Java程序開(kāi)發(fā)上投入的精力日益增加,對(duì)java語(yǔ)言接口的的API的要求越來(lái)越強(qiáng)烈。也由于ODBC的有其不足之處,比如它并不容易使用,沒(méi)有面向?qū)ο蟮奶匦缘鹊龋琒UN公司決定開(kāi)發(fā)一Java語(yǔ)言為接口的應(yīng)用程序開(kāi)發(fā)接口。在JDK1.x版本中,JDBC只是一個(gè)可選部件,到了JDK1.1公布時(shí),SQL類(lèi)包(也就是JDBCAPI)就成為Java語(yǔ)言的標(biāo)準(zhǔn)部件。

二、JDBC技術(shù)概述

JDBC是一種可用于執(zhí)行SQL語(yǔ)句的JavaAPI(ApplicationProgrammingInterface,應(yīng)用程序設(shè)計(jì)接口)。它由一些Java語(yǔ)言寫(xiě)的類(lèi)、界面組成。JDBC給應(yīng)用開(kāi)發(fā)人員、前臺(tái)工具開(kāi)發(fā)人員提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的應(yīng)用程序。

通過(guò)使用JDBC,開(kāi)發(fā)人員可以很方便地將SQL語(yǔ)句傳送給幾乎任何一種。也就是說(shuō),開(kāi)發(fā)人員可以不必寫(xiě)一個(gè)程序Sybase,寫(xiě)另一個(gè)程序Oracle,再寫(xiě)一個(gè)程序Microsoft的SQLServer。用JDBC寫(xiě)的程序能夠自動(dòng)地將SQL語(yǔ)句傳送給相應(yīng)的管理系統(tǒng)(DBMS)。不但如此,使用Java編寫(xiě)的應(yīng)用程序可以在任何支持Java的平臺(tái)上運(yùn)行,不必在不同的平臺(tái)上編寫(xiě)不同的應(yīng)用。Java和JDBC的結(jié)合可以讓開(kāi)發(fā)人員在開(kāi)發(fā)應(yīng)用時(shí)真正實(shí)現(xiàn)WriteOnce,RunEverywhere!

Java具有健壯、安全、易用等特性,而且支持自動(dòng)網(wǎng)上下載,本質(zhì)上是一種很好的應(yīng)用的編程語(yǔ)言。它所需要的是Java應(yīng)用如何同各種各樣的連接,JDBC正是實(shí)現(xiàn)這種連接的關(guān)鍵。

JDBC擴(kuò)展了Java的能力,如使用Java和JDBCAPI就可以公布一個(gè)Web頁(yè),頁(yè)中帶有能遠(yuǎn)端的Ap?plet。或者企業(yè)可以通過(guò)JDBC讓全部的職工(他們可以使用不同的操作系統(tǒng),如Windwos,Machintosh和UNIX)在In?tranet上連接到幾個(gè)全球上,而這幾個(gè)全球可以是不相同的。隨著越來(lái)越多的程序開(kāi)發(fā)人員使用Java語(yǔ)言,對(duì)Java易操作性的需求越來(lái)越強(qiáng)烈。

MIS管理人員喜歡Java和JDBC,因?yàn)檫@樣可以更容易經(jīng)濟(jì)地公布信息。各種已經(jīng)安裝在中的事務(wù)處理都將繼續(xù)正常運(yùn)行,甚至這些事務(wù)處理是存儲(chǔ)在不同的管理系統(tǒng)中;而對(duì)新的應(yīng)用來(lái)說(shuō),開(kāi)發(fā)時(shí)間將縮短,安裝和版本升級(jí)將大大簡(jiǎn)化。程序員可以編寫(xiě)或改寫(xiě)一個(gè)程序,然后將它放在服務(wù)器上,而每個(gè)用戶都可以服務(wù)器得到最新的版本。對(duì)于信息服務(wù)行業(yè),Java和JDBC提供了一種很好的向外界用戶更新信息的方法。

1.JDBC的任務(wù)

簡(jiǎn)單地說(shuō),JDBC能完成下列三件事:

1)同一個(gè)建立連接;

2)向發(fā)送SQL語(yǔ)句;

3)處理返回的結(jié)果。

]]>
從Java到Ruby——我的最近一次技術(shù)轉(zhuǎn)型http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2479&Page=1wangxinxin2010-12-11 10:03:08
1996年7月-1999年10月3年時(shí)間一直使用C語(yǔ)言編寫(xiě)電信協(xié)議軟件,算作我的C語(yǔ)言時(shí)代。其中還使用過(guò)一段時(shí)間SDL語(yǔ)言和基于SDL的代碼自動(dòng)生成工具(瑞典Telelogic公司的SDT)。
2000年3月-2000年10月7個(gè)多月時(shí)間使用Perl語(yǔ)言做網(wǎng)站開(kāi)發(fā),算作我的Perl語(yǔ)言時(shí)代。后來(lái)轉(zhuǎn)向了使用Java和JSP,用了兩個(gè)月。
2001年2月-2001年8月6個(gè)月時(shí)間使用JavaScript做DHTML開(kāi)發(fā),還使用ColdFusion做網(wǎng)站開(kāi)發(fā)。
2001年12月-2001年6月7個(gè)月時(shí)間使用C語(yǔ)言做企業(yè)級(jí)郵件服務(wù)器開(kāi)發(fā)。
2002年8月之后做開(kāi)發(fā)一直使用Java語(yǔ)言至今,算作我的Java語(yǔ)言時(shí)代,算算已經(jīng)快5年了。

在我使用過(guò)的這些語(yǔ)言中,有3種語(yǔ)言對(duì)我的影響最大,那就是C、Perl和Java。當(dāng)然JavaScript對(duì)我的影響也很大,不過(guò)對(duì)于整體的應(yīng)用軟件開(kāi)發(fā)來(lái)說(shuō),JavaScript并不是一個(gè)主角。

現(xiàn)在我正在經(jīng)歷一次新的技術(shù)轉(zhuǎn)型,從Java語(yǔ)言轉(zhuǎn)向Ruby語(yǔ)言和Rails框架。

如果說(shuō)以前的幾次技術(shù)轉(zhuǎn)型都是因?yàn)楣ぷ鞯淖儎?dòng)而導(dǎo)致的,那么這一次技術(shù)轉(zhuǎn)型則是我自己主動(dòng)發(fā)起的,因?yàn)槲腋杏X(jué)Ruby代表著應(yīng)用軟件開(kāi)發(fā)技術(shù)(注意限定詞 “應(yīng)用軟件”)的未來(lái)。Ruby是一種比Java更加先進(jìn)的應(yīng)用軟件開(kāi)發(fā)語(yǔ)言,最重要的是它能夠帶來(lái)極高的開(kāi)發(fā)效率,而且不會(huì)影響代碼的可讀性和可維護(hù)性。

一年多以前我對(duì)Java還抱有一些幻想,認(rèn)為Java社區(qū)如果有更好的框架,開(kāi)發(fā)效率一定會(huì)追上Rails。今年5月我讀了 Bruce A. Tate的《超越Java》這本書(shū),希望從專家那里了解一下Java語(yǔ)言和Java社區(qū)到底出了什么問(wèn)題。這本書(shū)打消了我的幻想,讓我理解了Java最大的問(wèn)題在于靜態(tài)類(lèi)型對(duì)開(kāi)發(fā)效率造成的嚴(yán)重影響。聯(lián)想到我去年下半年做的那個(gè)廣告發(fā)布平臺(tái),我對(duì)此深有感觸。我當(dāng)時(shí)所采用的框架是Spring MVC+Spring IoC+Hibernate+FreeMarker+SiteMesh,按理說(shuō)在Java開(kāi)發(fā)領(lǐng)域,這套組合的開(kāi)發(fā)效率應(yīng)該算是比較高的了。然而實(shí)際的開(kāi)發(fā)進(jìn)度遠(yuǎn)遠(yuǎn)低于我的預(yù)期,我作出第一個(gè)版本的時(shí)間差不多是預(yù)計(jì)時(shí)間的兩倍。當(dāng)然因?yàn)橘Y金的缺乏,大部分時(shí)間都只有我一個(gè)人在做開(kāi)發(fā),什么都要親自動(dòng)手,困難確實(shí)很多。不過(guò)我認(rèn)為主要的問(wèn)題還是在于Java語(yǔ)言做Web開(kāi)發(fā)的笨拙。

因?yàn)橘Y金的缺乏,我今后要做一些自己感興趣的東西,注定仍然只會(huì)有很少的人參與(2、3個(gè)人),Java這樣笨拙的語(yǔ)言可能會(huì)使我付出雙倍的代價(jià)。

當(dāng)然,Java語(yǔ)言仍然在發(fā)展和變化,但是它變的越來(lái)越復(fù)雜,越來(lái)越缺乏一致性,最終很可能會(huì)發(fā)展成為像C++那么復(fù)雜的一種語(yǔ)言。Java越來(lái)越不適合Web應(yīng)用的開(kāi)發(fā)了(我說(shuō)的比較謹(jǐn)慎是因?yàn)檫@個(gè)領(lǐng)域是我最熟悉的),是到需要尋找一種新的開(kāi)發(fā)語(yǔ)言的時(shí)候了。

Rod Johnson確實(shí)很偉大,在參與翻譯了《J2EE without EJB》之后,我至今仍然對(duì)Rod Johnson對(duì)于JavaEE的偉大貢獻(xiàn)深感敬意。但是Spring是從企業(yè)應(yīng)用環(huán)境成長(zhǎng)起來(lái)的,它對(duì)于面向Internet的Web應(yīng)用來(lái)說(shuō),仍然是太重了。而Web 應(yīng)用的很多重要的需求(例如對(duì)Ajax的支持、對(duì)REST的支持等等),Spring并沒(méi)有解決。做企業(yè)應(yīng)用,Spring仍然是很好的選擇,然而做Web應(yīng)用,Spring,甚至是Java語(yǔ)言本身,都不是很好的選擇。為何在Web應(yīng)用開(kāi)發(fā)技術(shù)方面,PHP最終占據(jù)了第一的份額,這是很值得思考的。

我們以前做網(wǎng)站開(kāi)發(fā)從Perl語(yǔ)言轉(zhuǎn)向了Java語(yǔ)言,主要的原因有以下這些:
1. Perl開(kāi)發(fā)的應(yīng)用代碼量大了之后很難維護(hù)。我自己寫(xiě)過(guò)一個(gè)4、500行的復(fù)雜Perl程序,過(guò)了兩個(gè)月后再讀居然都讀不懂了。
2. Perl這個(gè)工具最初是設(shè)計(jì)用來(lái)取代bash、awk、sed等工具的,因?yàn)長(zhǎng)arry Wall覺(jué)得這些工具還不夠強(qiáng)大靈活。Perl最初并不是設(shè)計(jì)用來(lái)作為一種全功能的應(yīng)用軟件編程語(yǔ)言的。
3. Perl對(duì)面向?qū)ο缶幊讨С值牟⒉缓谩?br/>4. 對(duì)于Web開(kāi)發(fā)來(lái)說(shuō),Perl的資源(開(kāi)發(fā)框架、開(kāi)發(fā)庫(kù))沒(méi)有Java豐富,很多功能需要自己來(lái)開(kāi)發(fā)。
5. CGI開(kāi)發(fā)與支持session的Servlet/JSP開(kāi)發(fā)相比太原始,開(kāi)發(fā)難度太大。

所以我們有非常充足的理由轉(zhuǎn)向Java語(yǔ)言。還有一個(gè)不大好開(kāi)口的理由就是,做Java開(kāi)發(fā)當(dāng)時(shí)似乎是成為一個(gè)專業(yè)程序員的標(biāo)志,純粹的面子問(wèn)題,當(dāng)然Java程序員的就業(yè)前景也要好的多。

但是轉(zhuǎn)向Java之初最強(qiáng)烈的感覺(jué)就是Java做一些與文本處理相關(guān)的工作非常麻煩,沒(méi)有Perl快捷,而這些工作對(duì)于開(kāi)發(fā)Web應(yīng)用來(lái)說(shuō)是很常見(jiàn)的。當(dāng)時(shí) Java核心類(lèi)庫(kù)甚至還不支持正則表達(dá)式,需要下載學(xué)習(xí)其他的開(kāi)發(fā)包,直到JDK1.4之后Java核心類(lèi)庫(kù)才開(kāi)始支持正則表達(dá)式。不過(guò)JSP這樣與 ASP、PHP類(lèi)似的服務(wù)器頁(yè)面技術(shù)是比CGI要先進(jìn)一代的技術(shù),所以開(kāi)發(fā)效率還是比寫(xiě)Perl CGI有所提高。

我做了一段時(shí)間JSP 開(kāi)發(fā),發(fā)現(xiàn)全部代碼都混在頁(yè)面中問(wèn)題很多,于是開(kāi)始學(xué)習(xí)Java Web開(kāi)發(fā)的Model1和Model2,并且接觸到了當(dāng)時(shí)剛剛興起的Struts。不過(guò)因?yàn)楣ぷ鬓D(zhuǎn)換,并沒(méi)有深入使用Struts。后來(lái)我用了半年 ColdFusion之后,就不愛(ài)使用JSP了。JSP的開(kāi)發(fā)效率雖然比Perl CGI高一些,但是比起ColdFusion來(lái)說(shuō)還是要低很多。JSP開(kāi)發(fā)后來(lái)逐漸轉(zhuǎn)向基于custom tag的開(kāi)發(fā)方式,并且最終出現(xiàn)了JSTL,在我看來(lái)是一種對(duì)ColdFusion的模仿。Java社區(qū)后來(lái)出現(xiàn)了n多的MVC框架、n多的IoC框架、 n多的ORM框架。《J2EE核心模式》所提倡的標(biāo)準(zhǔn)的三層架構(gòu)至今仍然被當(dāng)作鐵律來(lái)遵循,過(guò)多的層次帶來(lái)了巨大的靈活性,同時(shí)也帶來(lái)了巨大的復(fù)雜性。除了JavaEE之外,我還沒(méi)有看到其他的服務(wù)器端開(kāi)發(fā)技術(shù)如此強(qiáng)調(diào)三層架構(gòu)或者多層架構(gòu)。一般來(lái)說(shuō),分出MVC就足夠了。而JavaEE開(kāi)發(fā)不僅要在 Web表現(xiàn)層中分出MVC,還要在M中再分出業(yè)務(wù)層和持久層。這個(gè)分層的設(shè)計(jì),是做JavaEE開(kāi)發(fā)很難實(shí)現(xiàn)Martin Fowler在《企業(yè)應(yīng)用架構(gòu)模式》中提倡的充血的domain model的一個(gè)主要原因。另外Java語(yǔ)言本身的靜態(tài)類(lèi)型所造成的笨拙和無(wú)法避免的重復(fù)代碼也是一個(gè)主要的原因,如果不強(qiáng)調(diào)分層,并且真的實(shí)現(xiàn)充血的 domain model,那么一個(gè)類(lèi)中包含的代碼量會(huì)顯得太多太復(fù)雜了。

Java社區(qū)中的一些廠商目前在大力追捧JSF和EJB3,但是我并不認(rèn)為JSF和EJB3或者將兩者集成在一起的JBoss Seam能夠拯救JavaEE。復(fù)雜性才是JavaEE最大的問(wèn)題,JBoss Seam成功的關(guān)鍵在于它能否成功地掩蓋JSF和EJB3的復(fù)雜性,使得學(xué)習(xí)成本降低到與Rails相當(dāng)?shù)募?jí)別。不過(guò)即使它能夠做到,將來(lái)開(kāi)發(fā)者還是要面對(duì)Java語(yǔ)言本身的靜態(tài)類(lèi)型所造成的開(kāi)發(fā)效率低下。我并不認(rèn)為JBoss Seam有機(jī)會(huì)在開(kāi)發(fā)效率上超越Rails。另外一個(gè)值得關(guān)注的框架是Grails,它是基于動(dòng)態(tài)語(yǔ)言Groovy的,嚴(yán)格來(lái)說(shuō)不能算是Java社區(qū)的框架。不過(guò)由于它基于Spring、Hibernate、SiteMesh,所以也可以看作是Java框架的進(jìn)一步發(fā)展。在開(kāi)發(fā)效率方面Grails也不大可能超越Rails。除了開(kāi)發(fā)框架本身,還需要考慮眾多外圍工具的支持和社區(qū)的規(guī)模,在這些方面Grails不可能達(dá)到Rails的水平。還有一個(gè)RIFE呢,雖然我完全不了解它,不過(guò)看來(lái)它受到的關(guān)注很少。一個(gè)幾乎完全被忽視的框架,成功的前景估計(jì)很渺茫。Wicket我認(rèn)為是不值得考慮的,現(xiàn)在我們應(yīng)該把目光僅僅投向那些full stack框架上,建造一個(gè)更加精巧的Web MVC框架解決不了根本的問(wèn)題,對(duì)開(kāi)發(fā)效率的提升是有限的。Cetia4和Restlet也是兩個(gè)很有趣的框架,特別是它們能夠支持REST開(kāi)發(fā),代表了 Java Web開(kāi)發(fā)框架的未來(lái)。Google的Guice是一個(gè)很有可能取代Spring的輕量級(jí)IoC框架,前景似乎不錯(cuò)。不過(guò)Cetia4、Restlet、Guice這些框架和Wicket一樣,并不是full stack框架,對(duì)開(kāi)發(fā)效率的提升是有限的。

根據(jù)上述分析,我現(xiàn)在對(duì)Java社區(qū)內(nèi)部的創(chuàng)新能力已經(jīng)感到很失望了(很明顯我后知后覺(jué)了,感到失望的大有人在),這種持續(xù)了10年之久的創(chuàng)新能力似乎已經(jīng)逐漸枯竭。由于動(dòng)態(tài)類(lèi)型的腳本語(yǔ)言(Python、Ruby、JavaScript等等)這些年來(lái)取得了長(zhǎng)足的進(jìn)步,而且在Web開(kāi)發(fā)方面出現(xiàn)了一些killer級(jí)的框架,現(xiàn)在是將目光投向其他開(kāi)發(fā)語(yǔ)言的時(shí)候了。我的決定就是在今年下半年完全轉(zhuǎn)到Ruby和Rails這個(gè)平臺(tái)上面。從Java轉(zhuǎn)到 Ruby有幾個(gè)強(qiáng)有力的理由:
1. Rails可以讓單個(gè)開(kāi)發(fā)者在開(kāi)發(fā)效率方面接近自己能力的極限。我并不是一個(gè)完美架構(gòu)的fans,熱衷于不寫(xiě)一行代碼,巨細(xì)無(wú)靡地分析各種架構(gòu)優(yōu)劣直到腦神經(jīng)癱瘓。我熱衷的是解決用戶真正關(guān)心的問(wèn)題,用技術(shù)改善他們的生活,與用戶建立起良好的人際關(guān)系。
2. Rails框架對(duì)Ajax有更好的支持,通過(guò)使用RJS模板可以極大減輕一般情況下做Ajax開(kāi)發(fā)的復(fù)雜性,提高開(kāi)發(fā)的效率。
3. Rails框架對(duì)REST開(kāi)發(fā)提供了最好的支持。REST在Web開(kāi)發(fā)方面會(huì)越來(lái)越重要,全面支持REST就是未來(lái)所有語(yǔ)言Web開(kāi)發(fā)框架發(fā)展的方向。
4. JRuby 1.0對(duì)Rails的支持已經(jīng)很好,而且支持直接使用Java開(kāi)發(fā)的資源,所以現(xiàn)在是從Java轉(zhuǎn)到Ruby的一個(gè)適當(dāng)?shù)臅r(shí)機(jī)。

我已經(jīng)讀完了《Ruby for Rails中文版》,并且出了一個(gè)個(gè)人的勘誤。《應(yīng)用Rails進(jìn)行敏捷Web開(kāi)發(fā)》第2版我已經(jīng)讀了1/3,在一周之內(nèi)可以全部讀完。這兩本書(shū)讀完之后,基本上已經(jīng)入門(mén)了。在入門(mén)階段我只準(zhǔn)備讀這兩本書(shū),然后我會(huì)通過(guò)開(kāi)發(fā)來(lái)熟悉更多的技術(shù)。因?yàn)槲覍?duì)Perl、JavaScript和Java語(yǔ)言的熟悉,所以學(xué)習(xí)Ruby和Rails并沒(méi)有感覺(jué)有什么難度。事實(shí)上閱讀《應(yīng)用Rails進(jìn)行敏捷Web開(kāi)發(fā)》第2版要比我閱讀《Struts實(shí)戰(zhàn)》之類(lèi)的書(shū)容易理解的多(同時(shí)也更加有趣味,我第一次沒(méi)有感覺(jué)犯困),到目前為止,一切都感覺(jué)很自然。Ruby在我看來(lái)就是Perl+JavaScript+Java,毫無(wú)疑問(wèn)是一門(mén)偉大的語(yǔ)言。很可惜晚學(xué)習(xí)了整整一年多,否則去年見(jiàn)到Martin Fowler的時(shí)候本應(yīng)該問(wèn)他更多關(guān)于Ruby的問(wèn)題的。 ]]>
探討Java與Ruby語(yǔ)言遷移時(shí)的安全性http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2478&Page=1wangxinxin2010-12-11 9:59:47  通常來(lái)說(shuō),“使用Ruby具有風(fēng)險(xiǎn)”是一種普遍的看法,這存在一定的原因。因?yàn)槭褂眯碌恼Z(yǔ)言天生是有風(fēng)險(xiǎn)的。隨著Ruby on Rails逐步進(jìn)入到主流的開(kāi)發(fā)領(lǐng)域中,這樣的風(fēng)險(xiǎn)將會(huì)隨時(shí)間逐漸降低,因?yàn)橛兄鸩皆鲩L(zhǎng)的開(kāi)發(fā)者群、組件(或稱作gems和plug-ins)相關(guān)的書(shū)籍、以及業(yè)務(wù)合作伙伴與你溝通交流。但同時(shí)你也可以聽(tīng)到主流的觀點(diǎn)指出“使用Java是安全的”。對(duì)于這種的觀點(diǎn),我持有強(qiáng)烈的反對(duì)意見(jiàn)。隨著語(yǔ)言的膨脹,這樣的風(fēng)險(xiǎn)通常也會(huì)增長(zhǎng)。為了便于理解在目前在這些觀點(diǎn)上正發(fā)生什么變化,投入點(diǎn)精力去研究Java最初的應(yīng)用情況是值得的。

  新技術(shù)采用概況

  許多分析家擁有技術(shù)應(yīng)用所需的描述模型。其中最為流行的模型是定義在Ruby的Web開(kāi)發(fā)框架Iowa中,用來(lái)描述農(nóng)產(chǎn)品的應(yīng)用,稍后在一本由Geoffrey A. Moore寫(xiě)作的名為《跨越鴻溝》(Crossing the Chasm)的書(shū)中,被用來(lái)描述技術(shù)內(nèi)容。在書(shū)中,Moore分析了技術(shù)應(yīng)用周期中存在著的五個(gè)截然不同的群體:

  技術(shù)專家。這個(gè)群體傾向于采用新的技術(shù)。任何一種有前途的技術(shù)都會(huì)引起這個(gè)群體的注意。

  先行采納者。不管這項(xiàng)技術(shù)是否在主流技術(shù)中取得成功,這個(gè)群體都將會(huì)采用新的技術(shù)來(lái)提升競(jìng)爭(zhēng)優(yōu)勢(shì)。

  實(shí)用主義者。一旦新的技術(shù)進(jìn)入主流應(yīng)用,或是有足夠陡峭的增長(zhǎng)曲線來(lái)保證技術(shù)將得到廣泛采用,那么實(shí)用主義者就會(huì)積極采用新的技術(shù)。

  保守派。只有新技術(shù)成為必須的時(shí)候,他們才會(huì)考慮采用新的技術(shù)。

  懷疑論者。這個(gè)群體可能很晚才會(huì)采用新的技術(shù),或者也可能永遠(yuǎn)只使用某一特定技術(shù)。

  Moore指出,技術(shù)應(yīng)用的關(guān)鍵之處在于團(tuán)隊(duì)中是否存在實(shí)用主義者。因?yàn)閷?shí)用主義者需要新技術(shù)大規(guī)模的應(yīng)用,這個(gè)中間群體希望看到其他務(wù)實(shí)派在團(tuán)隊(duì)做出承諾之前就使用新的技術(shù)。這是一個(gè)類(lèi)似于《第二十二條軍規(guī)》書(shū)中所描述的現(xiàn)象,因?yàn)閯?wù)實(shí)派們都會(huì)相互依賴的存在。出于這樣的原因,在先行采納者排列在技術(shù)專家之后和務(wù)實(shí)派之前,你會(huì)經(jīng)常在市場(chǎng)接受度曲線中看到一種下降的趨勢(shì)。Moore將這種下降稱之為鴻溝傾向,并且這種想法應(yīng)出于圍繞任何新技術(shù)的風(fēng)險(xiǎn)討論的中心。

]]>
Java Web開(kāi)發(fā)——基于JVM的語(yǔ)言正在開(kāi)始流行http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2477&Page=1wangxinxin2010-12-11 9:56:41這是Reuven Lerner在去年寫(xiě)的一篇博文,文章主要介紹了一些新興的基于JVM的腳本語(yǔ)言。結(jié)合本文可以對(duì)Bruce的博文《C++和JAVA傳統(tǒng)中積極的一面》有一個(gè)很好的理解。譯者認(rèn)為,語(yǔ)言始終都是一門(mén)工具,軟件設(shè)計(jì)最重要的東西是來(lái)自于設(shè)計(jì)者的創(chuàng)造性,但是隨著Java語(yǔ)言的出現(xiàn),他的半動(dòng)態(tài)的特性,ClassLoader,反射,動(dòng)態(tài)代理,都是提高開(kāi)發(fā)者創(chuàng)造性的前提,正是因?yàn)檫@些特性,才會(huì)出現(xiàn)新的的編程模式和范式——反轉(zhuǎn)控制和依賴注入,面向方面的編程(AOP)。試想如果Java不提供ClassLoader,反射,動(dòng)態(tài)代理機(jī)制的API,如何能實(shí)現(xiàn)依賴查找和依賴注入和動(dòng)態(tài)AOP? 你能用C++來(lái)反轉(zhuǎn)控制,依賴查找嗎,能對(duì)容器中的組件做進(jìn)行生命周期管理嗎?為了說(shuō)明程序員創(chuàng)造性和語(yǔ)言的這個(gè)關(guān)系,我引用Dion Hinchcliffe博文中的一張圖來(lái)說(shuō)明:

 

圖片點(diǎn)擊可在新窗口打開(kāi)查看

基于JVM的語(yǔ)言正在開(kāi)始流行

當(dāng)Sun Microsystems公司在1995年第一次揭開(kāi)Java的面紗的時(shí)候,就是非常難被定義的。這是因?yàn)镴AVA是由多個(gè)部分構(gòu)成:首先,它當(dāng)然是一個(gè)面向?qū)ο笳Z(yǔ)言。同時(shí)JAVA也是一個(gè)定義標(biāo)準(zhǔn)的語(yǔ)言(或多個(gè)標(biāo)準(zhǔn),包括移動(dòng)設(shè)備,標(biāo)準(zhǔn),和企業(yè)三個(gè)版本)。最后,Java是一個(gè)虛擬機(jī)(”JVM”),一個(gè)Java程序能夠執(zhí)行的軟件環(huán)境。如果你有一個(gè)JVM,雖然這個(gè)JVM只能用來(lái)運(yùn)行Java的程序——但是,JVM能在運(yùn)行在你能想到的每一個(gè)平臺(tái)之上,這使得Java成為一個(gè)具有高移植性的語(yǔ)言。

Java世界的一個(gè)令人著迷的趨勢(shì)就是:在最近的幾年里使用JVM來(lái)運(yùn)行非Java的程序在程增長(zhǎng)的趨勢(shì)。畢竟,如果創(chuàng)造了一門(mén)新的語(yǔ)言,你就必須在特定的平臺(tái)上實(shí)現(xiàn)它。如果你想你的語(yǔ)言能在不同的平臺(tái)上移植,那么你就需要為每一個(gè)平臺(tái)實(shí)現(xiàn)一個(gè)版本。但是,相比而言,如果你將語(yǔ)言實(shí)現(xiàn)在JVM上,那么你就能讓你的語(yǔ)言運(yùn)行在任何系統(tǒng)的JVM上,這就意味著幾乎所有平臺(tái)都可以運(yùn)行。

于是現(xiàn)在就有了許多的基于JVM的新增語(yǔ)言。其中4個(gè)最流行的是發(fā)布在開(kāi)源許可證之下的。考慮到如今Java也是開(kāi)發(fā)源碼了,這意味著你可以使用一個(gè)全開(kāi)源體系,并且這個(gè)體系是可以移植的。因?yàn)檫@些語(yǔ)言都在JVM之上實(shí)現(xiàn)的,所以你就可以同時(shí)訪問(wèn)Java的標(biāo)準(zhǔn)庫(kù)。這意味著如果有一個(gè)第三方的的 Java庫(kù),而且你精于Python,那么你就可以使用Jython在你的源代碼中訪問(wèn)這些Java庫(kù)。

早期的基于JVM的腳本語(yǔ)言,就我所知,是Jython,之前被稱為JPython。Jython,從名字你就可以猜到,是一個(gè)基于JVM的 Python語(yǔ)言實(shí)現(xiàn)。Jython完全兼容Python2.2的標(biāo)準(zhǔn)版本(這個(gè)標(biāo)準(zhǔn)版本的Python也被稱為CPython),這意味著Jython 將會(huì)沒(méi)有Python的一些新特性。最近發(fā)布的Jython版本是2007年月發(fā)布的,但是Sun雇傭了兩位早期Jython非常知名的開(kāi)發(fā)者,并且現(xiàn)在 Jython可以運(yùn)行Django應(yīng)用程序框架,因此驗(yàn)證其兼容Python的能力

Sun公司同時(shí)資助了JRuby的開(kāi)發(fā),一個(gè)基于JVM的Ruby版本。Jython是Python唯一的兩個(gè)實(shí)現(xiàn)的其中之一,對(duì)比而言,JRuby則是眾多Ruby語(yǔ)言實(shí)現(xiàn)的其中之一。然而,JRuby被廣泛的認(rèn)為是一個(gè)非常重要的版本。特別是因?yàn)樗男剩透叨燃嫒輼?biāo)準(zhǔn)C的 Ruby版本實(shí)現(xiàn)。JRuby同樣可以運(yùn)行Ruby on Rails框架(譯者注:構(gòu)建在Ruby之上的WEB應(yīng)用框架),此外還能運(yùn)行其他眾多的功能。

Jython和JRuby都是從其他已存在的語(yǔ)言中移植到JVM中來(lái)的。而全新的基于JVM的腳本語(yǔ)言是Groovy和Scala。這兩門(mén)語(yǔ)言現(xiàn)在都越來(lái)越流行,不同的是,Groovy是動(dòng)態(tài)腳本語(yǔ)言,而是Scala是靜態(tài)語(yǔ)言。使用Groovy最著名的應(yīng)用是Groovy on Grails項(xiàng)目,一個(gè)用Groovy寫(xiě)成,運(yùn)行在JVM之上的WEB應(yīng)用框架(和Ruby on Rails很相似)。Grails找到通向商業(yè)應(yīng)用程序的道路,最著名的就是LinkedIn,使用Linkedin,開(kāi)發(fā)人員發(fā)現(xiàn)他們能比直接使用 Java更快速和容易的開(kāi)發(fā)程序。相比而言,Scala,而是強(qiáng)類(lèi)型是語(yǔ)言,Steve Yegge最近的一次訪談中曾經(jīng)談到、靜態(tài)語(yǔ)言和動(dòng)態(tài)語(yǔ)言的爭(zhēng)論,因?yàn)檫@個(gè)他還受到了很多的批評(píng)(譯者注:關(guān)于Steve Yegge的這篇關(guān)于動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言之爭(zhēng)可以查看這里Steve Yegge是一個(gè)動(dòng)態(tài)語(yǔ)言的支持者

Java已經(jīng)被公認(rèn)為是非常成功而流行的語(yǔ)言。現(xiàn)在,Java也同時(shí)也被認(rèn)為是非常流行的平臺(tái),這四類(lèi)語(yǔ)言僅僅是在不遠(yuǎn)的將來(lái)通過(guò)JVM來(lái)實(shí)現(xiàn)的新興語(yǔ)言的開(kāi)始。

]]>
一個(gè)用JAVA語(yǔ)言開(kāi)發(fā)的含有過(guò)濾器技術(shù)的Web小例子http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2475&Page=1wangxinxin2010-12-11 9:53:22一個(gè)用JAVA語(yǔ)言開(kāi)發(fā)的含有過(guò)濾器技術(shù)的Web小例子//在MySql中創(chuàng)建數(shù)據(jù)庫(kù)
create database logindb;
use logindb;
create table user_info
-> (
-> id int auto_increment primary key,
-> name varchar(10) unique not null,
-> age int not null,
-> password varchar(10) not null,
-> city char(10) not null,
-> type int not null
-> );
insert into user_info values(default,'tom','23','123456','wuxi',0);
insert into user_info values(default,'niit','23','123456','shanghai',1);
insert into user_info values(default,'jerry','25','654321','shanghai',2);
insert into user_info values(default,'admin','25','admin888','shanghai',3);
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//構(gòu)建一個(gè)JavaBean
package com.niit.login;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserInfoBean
{
       private Connection con;
      
       public UserInfoBean()
       {
            con = Connecter.getConnection();
       }
      
       /*
      * 得到用戶的類(lèi)別代號(hào)
      * 0:普通用戶
      * 1:VIP用戶
      * 2:管理員
      * 3:超級(jí)管理員
      * -1:帳號(hào)或者密碼錯(cuò)誤
      */
       public int getUserType(String name,String pass)
       {
            int type = -1;
            try
            {
                     PreparedStatement ps = con
                                    .prepareStatement("select type from user_info where name = ? and password = ?");
                     ps.setString(1, name);
                     ps.setString(2, pass);
                    
                     ResultSet rs = ps.executeQuery();
                     if(rs.next())
                     {
                               type = rs.getInt(1);
                     }
            }
            catch (SQLException e)
            {
                     e.printStackTrace();
            }

            return type;
       }
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//創(chuàng)建基本方法
package com.niit.login;

public class UserInfo
{
       private String name;

       private int age;

       private String password;

       private String city;

       private int type;

       public UserInfo()
       {
            // TODO 自動(dòng)生成構(gòu)造函數(shù)存根
       }

       public UserInfo(String name, int age, String password, String city, int type)
       {
            this.name = name;
            this.age = age;
            this.password = password;
            this.city = city;
            this.type = type;
       }

       public int getAge()
       {
            return age;
       }

       public void setAge(int age)
       {
            this.age = age;
       }

       public String getCity()
       {
            return city;
       }

       public void setCity(String city)
       {
            this.city = city;
       }

       public String getName()
       {
            return name;
       }

       public void setName(String name)
       {
            this.name = name;
       }

       public String getPassword()
       {
            return password;
       }

       public void setPassword(String password)
       {
            this.password = password;
       }

       public int getType()
       {
            return type;
       }

       public void setType(int type)
       {
            this.type = type;
       }
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//創(chuàng)建數(shù)據(jù)庫(kù)連接(該例使用的是MySql數(shù)據(jù)庫(kù))
package com.niit.login;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Connecter
{
       public static Connection getConnection()
       {
            Connection con = null;
            try
            {
                     Class.forName("com.mysql.jdbc.Driver");
                     String url = "jdbc:mysql://127.0.0.1/logindb?useUnicode=true&characterEncoding=GBK";
                     con = DriverManager.getConnection(url, "root", "");
            }
            catch (ClassNotFoundException e)
            {
                     e.printStackTrace();
            }
            catch (SQLException e)
            {
                     e.printStackTrace();
            }

            return con;
       }
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//創(chuàng)建過(guò)濾器
package com.niit.login;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ManagerLoginFilter implements Filter
{
       public void init(FilterConfig config) throws ServletException
       {
           
       }

       /*
      * 執(zhí)行功能的核心方法(過(guò)濾器)
      */
       public void doFilter(ServletRequest req, ServletResponse res,
                     FilterChain chain) throws IOException, ServletException
       {
            //將請(qǐng)求和響應(yīng)轉(zhuǎn)變成 HTTP的請(qǐng)求和響應(yīng)
            HttpServletRequest request = (HttpServletRequest)req;
            HttpServletResponse response = (HttpServletResponse)res;
           
            request.setCharacterEncoding("gb2312");
           
            HttpSession session = request.getSession();
           
            Object obj = session.getAttribute("MANAGERLOGIN");
            if(obj == null)
            {
                     //目前沒(méi)有登錄成功
                     String name = request.getParameter("userName");
                     String pass = request.getParameter("userPass");
                    
                     if(name == null || pass == null)
                     {
                               System.out.println("*********別走后門(mén)**********");
                               response.sendRedirect("login.html");                               
                     }
                    else
                     {
         ]]>
Java技術(shù)的新方向http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2472&Page=1wangxinxin2010-12-11 9:49:59  
  “又一次”指的是什么?“革命”指的又是什么?光看結(jié)論的話肯定是一頭霧水。其實(shí),筆者要講的并不是變化這樣一個(gè)事實(shí),而是“促進(jìn)變化的原動(dòng)力”。是什么讓Java技術(shù)發(fā)生變化?讓我們從這一角度出發(fā),先看一下Java的變化歷程。

  Java正處于轉(zhuǎn)變期

  回顧Java技術(shù)的發(fā)展歷程,人們一定會(huì)感慨:2004年到2005年發(fā)生的變化如此之大,可以說(shuō)“現(xiàn)在”正是Java技術(shù)的轉(zhuǎn)換期。 Java技術(shù)由編程語(yǔ)言(Java語(yǔ)言)、運(yùn)行環(huán)境(JVM:Java虛擬機(jī))、框架(Java API群)組成,目前在每一個(gè)層面上都發(fā)生著巨大的變化。

  (1)編程語(yǔ)言的變化

  Java語(yǔ)言標(biāo)準(zhǔn)出現(xiàn)明顯變化。在2004年9月發(fā)布的正式版本J2SE5.0(J2SE:Java2 Platform, Standard Edition,Java技術(shù)的核心運(yùn)行環(huán)境)中,對(duì)Java語(yǔ)言標(biāo)準(zhǔn)中的Generics與元數(shù)據(jù)進(jìn)行了大幅擴(kuò)展。出現(xiàn)了被認(rèn)為是“自Java問(wèn)世以來(lái)的最大一次語(yǔ)言標(biāo)準(zhǔn)變化”(美國(guó)Sun Microsystems)。這次語(yǔ)言標(biāo)準(zhǔn)的變化給許多Java API帶來(lái)了影響。許多企業(yè)API的新版本都引入了基于元數(shù)據(jù)的注解(程序中記錄的附加信息),以較短的編碼記述更多的信息。

  (2)Java運(yùn)行環(huán)境的變化

  在J2SE5.0中,大幅度強(qiáng)化了JVM的管理功能與實(shí)用性,換句話說(shuō)就是具備了Java執(zhí)行OS(操作系統(tǒng))的特征。例如,原來(lái)在J2EE (Java2 Platform, Enterprise Edition,構(gòu)筑企業(yè)系統(tǒng)的Java技術(shù))領(lǐng)域,標(biāo)準(zhǔn)配備有作為管理功能的應(yīng)用軟件管理框架JMX。不僅如此,還配備有JVM自身監(jiān)控功能((JSR 174: Monitoring and Management Specification for the Java Virtual Machine)。在標(biāo)準(zhǔn)功能架構(gòu)中可以實(shí)時(shí)監(jiān)視JVM運(yùn)行時(shí)的狀態(tài),也就是內(nèi)存使用量、線程狀態(tài)等。

  J2SE5.0中新追加的功能中包括并行處理實(shí)用程序(JSR 166),其基礎(chǔ)是紐約州立大學(xué)Doug Lea提供的程序庫(kù)。也就是說(shuō),標(biāo)準(zhǔn)規(guī)格中采用了來(lái)自民間的程序庫(kù)。

  (3)框架的變化

  服務(wù)器端的Java框架也發(fā)生了巨大變化。企業(yè)級(jí)Java技術(shù)--J2EE的“使用方法”說(shuō)明文件“J2EE Blueprint”中,提出了將應(yīng)用軟件分為Web層、EJB層(Enterprise JavaBeans,將包括事務(wù)處理在內(nèi)的業(yè)務(wù)進(jìn)程模塊化的框架)來(lái)構(gòu)筑的思路。這兩種層次都迎來(lái)了架構(gòu)更替時(shí)期。Web層的新框架為JSF (JavaServer Faces,將模塊組合起來(lái)構(gòu)筑Web應(yīng)用程序的框架),EJB層為標(biāo)準(zhǔn)方案中剛剛公布的下一代EJB規(guī)格“EJB3.0”。
  
  值得注意的是,促成框架發(fā)生變化的正是來(lái)自民間的源碼開(kāi)放軟件。

  對(duì)JSF產(chǎn)生影響的是作為源碼開(kāi)放的Web層框架得到普及的Apache Struts。JSF是對(duì)Struts的思路進(jìn)行改進(jìn)的產(chǎn)物,JSF的Spec Lead(規(guī)格制定領(lǐng)袖)之一Craig R. McClanahan就是Struts的作者。

  對(duì)EJB3.0造成影響的也是民間源碼開(kāi)放軟件。EJB3.0引入了DI(Dependency Injection,依賴注入)容器類(lèi)(Container)與POJO(Plain Old Java Object)持久類(lèi)這些新功能,大大減輕了編程的復(fù)雜性。這些概念因PicoContainer、Spring等源碼開(kāi)放軟件的導(dǎo)入而引人注目。

  其背景在于用戶對(duì)“目前的EJB過(guò)于復(fù)雜”的批評(píng)。原本由EJB反對(duì)派提出的設(shè)計(jì)思想與源碼開(kāi)放軟件,卻變成了EJB3.0的中心概念,顯出了巨大的影響力。

  (4)腳本語(yǔ)言

  在Java技術(shù)標(biāo)準(zhǔn)中新增加了編程語(yǔ)言Groovy(JSR 241)。這是一種可與Java語(yǔ)言無(wú)縫連接的腳本語(yǔ)言,有望以極短的程序完成相關(guān)處理。“在Java技術(shù)中添加Java以外的語(yǔ)言”,這聽(tīng)起來(lái)也許有些別扭,其實(shí)以前就有這樣的呼聲,希望將可以充分利用Java技術(shù)資源的腳本作為語(yǔ)言使用。Groovy本來(lái)是源碼開(kāi)放軟件,最終得到認(rèn)可,被采納為標(biāo)準(zhǔn)規(guī)格。

  由上述可以看出,Java技術(shù)的構(gòu)成要素正在發(fā)生巨大變化。就在不久以前,一提起服務(wù)器Java,“Servlet、JSP、EJB是重要的 API”這樣的說(shuō)明還占主流,但現(xiàn)在基于JSF和EJB3.0的應(yīng)用程序已經(jīng)變成了“面目全非”的程序。而在運(yùn)行短程序或測(cè)試時(shí),甚至還出現(xiàn)了不僅是 Java語(yǔ)言,連腳本語(yǔ)言都開(kāi)始調(diào)用Java框架的情況。]]>
Proguard整理一些資料http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=64&ID=2470&Page=1wangxinxin2010-12-11 9:46:04  我們做java開(kāi)發(fā)的一般都會(huì)遇到如何保護(hù)我們開(kāi)發(fā)的代碼問(wèn)題。java語(yǔ)言由于是基于jvm上面,所以反編譯class文件很很容易。假如我們做了一個(gè)web程序,并把這個(gè)web程序發(fā)布給客戶。實(shí)際上,客戶是很容易反編譯出我們的源代碼出來(lái),包括所有的src文件和jsp文件等等。

  那么,如何保護(hù)我們的源代碼,實(shí)際上,應(yīng)該有幾種方法可以使用:1、使用代碼混淆器 2、重載應(yīng)用服務(wù)器的classloader

   對(duì)于第一種方法來(lái)說(shuō),現(xiàn)在外面有很多開(kāi)源工具可以使用,個(gè)人認(rèn)為最好用的當(dāng)屬proguard莫屬。proguard主要是易用易學(xué)。而且提供的功能也挺多。下面是個(gè)人一點(diǎn)使用心得

   (1)、從網(wǎng)上download proguard工具,proguard工具主要包含是幾個(gè)jar文件和一些example,下載地址http://proguard.sourceforge.net/

   (2)、將里面的幾個(gè)jar文件添加到類(lèi)路徑下面。當(dāng)然,也可以不添加,但是下面在做混淆的時(shí)候,必須指定classpath,使在做混淆的過(guò)程中,能否訪問(wèn)該類(lèi)

   (3)、編寫(xiě)一個(gè)配置文件,主要是混淆器的一些參數(shù)。比如,下面是一個(gè)例子
-injars       platform.jar
-outjars      platform_out.jar
-libraryjars <java.home>/lib/rt.jar
-libraryjars ibatis-common-2.jar
-libraryjars ibatis-dao-2.jar
-libraryjars ibatis-sqlmap-2.jar
-libraryjars junit-3.8.1.jar
-libraryjars d:/j2ee.jar
-libraryjars struts.jar
-libraryjars commons-lang.jar
-libraryjars D:/0working/coreproject/byislib/jasperreports-0.6.1.jar
-libraryjars commons-beanutils.jar

-printmapping proguard.map
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-dontoptimize
-keep public class *
{
public protected *;
}
-keep public class org.**
-keep public class it.**

各個(gè)參數(shù)的含義參考proguard文檔,該文檔非常詳細(xì),上手很容易

OK,到此就完成了代碼混淆,打開(kāi)產(chǎn)生的jar包可以看到,多了好多a、b、c之類(lèi)的類(lèi)文件。說(shuō)明混淆結(jié)果已經(jīng)成功。將原jar刪除、運(yùn)行產(chǎn)生的混淆jar包,一切正常!

常見(jiàn)問(wèn)題:使用過(guò)程中個(gè)人遇到了幾個(gè)問(wèn)題,開(kāi)始也是找了很久才解決
   a. 內(nèi)存溢出異常: 主要是proguard在做混淆的時(shí)候,吃了很多內(nèi)存,因此,在運(yùn)行混淆器的時(shí)候,可以增加內(nèi)存,比如 java -mx512m .....
b.棧溢出異常: 主要是proguard在做混淆的時(shí)候,會(huì)對(duì)一些代碼進(jìn)行優(yōu)化,若遇到一些相對(duì)復(fù)雜的方法時(shí),可能會(huì)拋出此異常。對(duì)付的辦法是增加配置參數(shù)-dontoptimize,如上面的配置例子所示

對(duì)于第二種方法,重載服務(wù)器的classloader的原理是這樣。 首先我們通過(guò)一定算法把class文件加密; 然后寫(xiě)我們自己的classloader,替換服務(wù)器的classloader。 這樣,我們可以讀取class文件,通過(guò)我們自己的算法反加密成正確的class,然后再次進(jìn)行l(wèi)oad。這個(gè)方式還沒(méi)應(yīng)用起來(lái),這幾天個(gè)人正在研究,有什么新成果會(huì)在此做一些總結(jié)。


ProGuard是一個(gè)開(kāi)源的項(xiàng)目,主頁(yè):http://proguard.sourceforge.net/,目前最新的版本是3.3.2.。加載混淆器是非常簡(jiǎn)單的,只需要解壓縮proguard3.3.2.zip,然后在 J2ME->Packing->Obfuscation 標(biāo)簽中選擇 Proguard 的安裝目錄。如下圖所示,在這里可以對(duì)需要在混淆過(guò)程中保留的類(lèi)名進(jìn)行配置,MIDlet 類(lèi)的名稱必須保留,以便設(shè)備的 Java 運(yùn)行時(shí)環(huán)境(JRE)能夠找到執(zhí)行的入口點(diǎn)。
http://images.csdn.net/20050726/image027.jpg,It’s about the above pic.



另一篇文檔
ProGuard是一款免費(fèi)的Java類(lèi)文件壓縮器、優(yōu)化器和混淆器。它能發(fā)現(xiàn)并刪除無(wú)用類(lèi)、字段(field)、方法和屬性值(attribute)。它也能優(yōu)化字節(jié)碼并刪除無(wú)用的指令。最后,它使用簡(jiǎn)單無(wú)意義的名字來(lái)重命名你的類(lèi)名、字段名和方法名。經(jīng)過(guò)以上操作的jar文件會(huì)變得更小,并很難進(jìn)行逆向工程。這里提到了ProGuard的主要功能是壓縮、優(yōu)化和混淆,下面我就先介紹一下這些概念,然后再介紹ProGuard的基本使用方法。

l         什么是壓縮:

Java源代碼(.java文件)通常被編譯為字節(jié)碼(.class文件)。而完整的程序或程序庫(kù)通常被壓縮和發(fā)布成Java文檔(.jar文件)。字節(jié)碼比Java源文件更簡(jiǎn)潔,但是它仍然包含大量的無(wú)用代碼,尤其它是一個(gè)程序庫(kù)的時(shí)候。ProGuard的壓縮程序操作能分析字節(jié)碼,并刪除無(wú)用的類(lèi)、字段和方法。程序只保留功能上的等價(jià),包括異常堆棧描述所需要的信息。

l         什么是混淆:

通常情況下,編譯后的字節(jié)碼仍然包含了大量的調(diào)試信息:源文件名,行號(hào),字段名,方法名,參數(shù)名,變量名等等。這些信息使得它很容易被反編譯和通過(guò)逆向工程獲得完整的程序。有時(shí),這是令人厭惡的。例如像ProGuard這樣的混淆器就能刪除這些調(diào)試信息,并用無(wú)意義的字符序列來(lái)替換所有名字,使得它很難進(jìn)行逆向工程,它進(jìn)一步免費(fèi)的精簡(jiǎn)代碼。除了異常堆棧信息所需要的類(lèi)名,方法名和行號(hào)外,程序只會(huì)保留功能上的等價(jià)。通過(guò)以上的了解,你應(yīng)該明白為什么需要混淆了。

l         ProGuard支持那些種類(lèi)的優(yōu)化:

除了在壓縮操作刪除的無(wú)用類(lèi),字段和方法外,ProGuard也能在字節(jié)碼級(jí)提供性能優(yōu)化,內(nèi)部方法有:

2        常量表達(dá)式求值

2        刪除不必要的字段存取

2        刪除不必要的方法調(diào)用

2        刪除不必要的分支

2        刪除不必要的比較和instanceof驗(yàn)證

2        刪除未使用的代碼

2        刪除只寫(xiě)字段

2        刪除未使用的方法參數(shù)

2        像push/pop簡(jiǎn)化一樣的各種各樣的peephole優(yōu)化

2        在可能的情況下為類(lèi)添加static和final修飾符

2        在可能的情況下為方法添加private, static和final修飾符

2        在可能的情況下使get/set方法成為內(nèi)聯(lián)的

2        當(dāng)接口只有一個(gè)實(shí)現(xiàn)類(lèi)的時(shí)候,就取代它

2        選擇性的刪除日志代碼

實(shí)際的優(yōu)化效果是依賴于你的代碼和執(zhí)行代碼的虛擬機(jī)的。簡(jiǎn)單的虛擬機(jī)比有復(fù)雜JIT編譯器的高級(jí)虛擬機(jī)更有效。無(wú)論如何,你的字節(jié)碼會(huì)變得更小。

仍有一些明顯需要優(yōu)化的技術(shù)不被支持:

2        使非final的常量字段成為內(nèi)聯(lián)

2        像get/set方法一樣使其他方法成為內(nèi)聯(lián)

2        將常量表達(dá)式移到循環(huán)之外

2        Optimizations that require escape analysis



    ProGuard是一個(gè)命令行工具,并提供了圖形化用戶界面,它也可以結(jié)合Ant或J2ME Wireless Toolkit使用。通過(guò)ProGuard得到的更精簡(jiǎn)的jar文件意味著只需要更小的存儲(chǔ)空間;網(wǎng)絡(luò)傳輸更省時(shí);裝載速度更快和占用更小的內(nèi)存空間。另外,ProGuard非常快速和高效,它僅僅只花費(fèi)幾秒鐘和幾兆的內(nèi)存在處理程序。它處理的順序是先壓縮,然后優(yōu)化,最后才進(jìn)行混淆。The results section presents actual figures for a number of applications.與其他Java混淆器相比,ProGuard的主要優(yōu)勢(shì)可能是它的基于模版文件的簡(jiǎn)單配置。一些直觀的命令行選項(xiàng)或一個(gè)簡(jiǎn)單的配置文件已經(jīng)足夠了。例如,下面的配置選項(xiàng)保護(hù)了jar文件里的所有applets:

-keep public class * extends java.applet.Applet

用戶指南里說(shuō)明了所有可用的選項(xiàng),并以大量的例子為你演示這些功能強(qiáng)大的配置選項(xiàng)。



       上面談到了ProGuard的很多好處,現(xiàn)在我們就來(lái)看看如何在程序中使用ProGuard吧,之前也提到了ProGuard可以用命令行、圖形界面、Ant等來(lái)執(zhí)行和處理程序,同時(shí)也提到了配置文件,下面我們一起來(lái)看如何使用:

用命令行執(zhí)行ProGuard的命令如下:

java –jar proguard.jar options……

具體的選項(xiàng)可以參考ProGuard的用戶指南,你也可以把這些屬性寫(xiě)在配置文件里;運(yùn)行時(shí),我們只需要指定這個(gè)配置文件就行了,例如:

java –jar proguard.jar @config.pro

而配置文件的格式也是要按照ProGuard提供的格式來(lái)寫(xiě)的,這個(gè)可以參考ProGuard例子里的配置文件來(lái)配置適合你的應(yīng)用系統(tǒng)的ProGuard配置文件。ProGuard提供了圖形界面的配置和運(yùn)行程序,你可以在界面上配置你想要的參數(shù),然后運(yùn)行即可。前面提到的要手動(dòng)寫(xiě)的配置文件也可以用圖形界面來(lái)配置和生成。

如果你要在Ant里運(yùn)行ProGuard,只需要添加一一個(gè)如下的target即可:

<target name="proguard" depends="init">

       <taskdef resource="proguard/ant/task.properties" classpath="${lib.dir}/proguard/proguard.jar" />

       <proguard c />

</target>

你只需要制定lib.dir和src.dir屬性就行了,同樣的,這里也用了proguard配置文件,跟上面提到的是一樣的。建議大家把ProGuardGUI當(dāng)成一個(gè)生成配置文件的向?qū)?lái)使用,這樣我們只需要修改配置文件而不用重新寫(xiě)一個(gè)配置文件。

如果你覺(jué)得ProGuard還不錯(cuò),那就快把它加入你的項(xiàng)目里吧。





第三文檔
這是一個(gè)不應(yīng)該在開(kāi)源社區(qū)出現(xiàn)的東西,但它的的確確是一個(gè)開(kāi)源的項(xiàng)目,正像它的名字一樣,Proguard,即Program Guard(程序衛(wèi)士),它代表了開(kāi)源的相對(duì)面--代碼保護(hù)。
  作為JAVA這樣的高級(jí)語(yǔ)言,編譯的產(chǎn)物只是相對(duì)源代碼的一個(gè)概念而已,字節(jié)碼雖然不像源代碼那樣易懂,但絕不是不可能進(jìn)行反編譯的,針對(duì)JAVA的反編譯產(chǎn)品很多,如CAVAJ,JAD等等。面對(duì)反編譯產(chǎn)品的不斷出現(xiàn),將代碼視為財(cái)富的那些開(kāi)發(fā)者,又何去何從。
  混淆器正是在這種背景下應(yīng)運(yùn)而生,既然不可能完全地將拒絕反編譯,那就讓他們?nèi)シ淳幾g吧,只要反編譯的結(jié)果別人不能直接使用不就行了嗎?只要將代碼搞混,讓別人拿到了反編譯的結(jié)果也看不懂,甚至不能編譯。
  混淆的方法有很多,主要是以下幾方面。
更名,將私有類(lèi),私有的成員,方法體內(nèi)部的變量名改名,改成a,b,c等等,甚至1,2,3(代碼中不允許不等于成果物中不允許)
改變邏輯的流向,如將if條件取反,if/else對(duì)換
等價(jià)代碼,如將循環(huán)改成GOTO
無(wú)效代碼,插入不可及的無(wú)用代碼
  Proguard是一個(gè)非常優(yōu)秀的開(kāi)源的JAVA混淆器,可以在http://proguard.sourceforge.net/下載到,現(xiàn)在就讓我一起來(lái)看一下Proguard.
  以3.2版為例,釋放壓縮包,我們看到,作為開(kāi)源項(xiàng)目就有docs,lib,src,sample文件夾,在此就不一一介紹了。
  進(jìn)入lib目錄,內(nèi)有proguard.jar,如果要自己有混淆器的外殼,或作ANT插件的話,會(huì)用到它,詳細(xì)情況可以參考Proguard的文檔。
  我們要看的是proguardgui.jar,這是Proguard的圖形界面,我們使用JDK打開(kāi),注意是JDK,不是JRE。

點(diǎn)選Input/Output標(biāo)簽,選擇要混淆的JAR包(注意是JAR包),輸出JAR包,以及用到的所有類(lèi)庫(kù)。
點(diǎn)選Obfuscation標(biāo)簽,選中不需要混淆的類(lèi)(要被反射的類(lèi)絕對(duì)不能被混淆)
點(diǎn)選Process標(biāo)簽,Process按鈕,等著看結(jié)果吧。
Proguard中還包括了代碼優(yōu)化和代碼整理的功能,不是本文討論范圍,有興趣的就自己研究吧)
只混淆方面的選項(xiàng)



使用此種方式,如果a-z使用過(guò),會(huì)轉(zhuǎn)向aa.class,如下圖配置界面
1,4,6,9,10,11,12

源代碼
package org.zwm.pub;

public class Bru {

/**
* @param args
*/
]]>