www.99久久热国产日韩欧美.com,成人av免费电影网站,精品一区电影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.martymets.com/bbs/dispbbs.asp?BoardID=64&ID=2493&Page=1wangxinxin2010-12-11 10:37:22有人說,咖啡館是一個叫人學(xué)會放慢步伐、享受生活的地方。這句話不無道理。港人常把飲咖啡稱為嘆咖啡,這個字就有欣賞、品味的含義,舒適的環(huán)境,自然是招徠顧客之道。香港雖然寸金尺土,但無論在鬧市或是在風(fēng)景區(qū),都不難找到精巧雅致的咖啡館,它們或具歐陸情懷,或富英式韻味,大都環(huán)境優(yōu)美、擺設(shè)得體、席位舒適、氣派不凡。

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

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

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

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

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

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

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

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

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

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

      封裝與抽象

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

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

      繼承與擴(kuò)展

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

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

      對象的生命周期

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

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


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

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

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

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

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

      集成開源軟件的基本步驟

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

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

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

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

  看來 ,使用 Java已成大勢所趨 !MicroSoft和 IBM兩大公司都計劃在 Internet上銷售用 Java編寫的軟件。

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

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

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

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

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

  二、 Java語言對軟件開發(fā)技術(shù)的影響

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

  Java語言將對未來軟件的開發(fā)產(chǎn)生影響 ,可從如下幾個方面考慮 :

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

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

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

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

  5 其它:使用 Java語言對開發(fā)效益、開發(fā)價值都有比較明顯的影響。   三、工業(yè)界對 Java語言的評價


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

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

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

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

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

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

  1 所有面向?qū)ο蟮膽?yīng)用開發(fā) ,包括面向?qū)ο蟮氖录枋、處理、綜合等;

  2 計算過程的可視化、可操作化的軟件的開發(fā);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

一、 問題提出

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

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

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

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

二、解決方案

使用AOT編譯器

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

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

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

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

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

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

克服時間的不確定性

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

需保持跨平臺的必要

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

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

Java是良好的嵌入式編程語言嗎?

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

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

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

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

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

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

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

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

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

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

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

  存儲過程和復(fù)雜SQL語句的陷阱

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

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

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

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

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

  Hibernate等ORM問題

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

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

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

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

  關(guān)于本系列

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

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

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

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

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

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

  使用專門的 PHP Java Bridge 重新開發(fā) PHP 接口

  本系列文章共分為六個部分:

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

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

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

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

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

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

  關(guān)于本教程

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

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

  先決條件

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

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

  Apache Tomcat 系統(tǒng)

  Eclipse IDE

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

  Mozilla Web browser for AIX

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

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

  Web 服務(wù)方法

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

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

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

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

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

  PHP Java Bridge

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

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

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

清單 1. 簡單的 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ū)別和相似之處,從而使得采用這兩種方法開發(fā)和部署應(yīng)用程序時具有相應(yīng)的優(yōu)點(diǎn)和缺點(diǎn)。

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

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

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

  性能

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2.JDBC的誕生

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

二、JDBC技術(shù)概述

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

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

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

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

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

1.JDBC的任務(wù)

簡單地說,JDBC能完成下列三件事:

1)同一個建立連接;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  新技術(shù)采用概況

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

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

  先行采納者。不管這項技術(shù)是否在主流技術(shù)中取得成功,這個群體都將會采用新的技術(shù)來提升競爭優(yōu)勢。

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

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

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

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

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

 

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

基于JVM的語言正在開始流行

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

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

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

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

Sun公司同時資助了JRuby的開發(fā),一個基于JVM的Ruby版本。Jython是Python唯一的兩個實(shí)現(xiàn)的其中之一,對比而言,JRuby則是眾多Ruby語言實(shí)現(xiàn)的其中之一。然而,JRuby被廣泛的認(rèn)為是一個非常重要的版本。特別是因?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都是從其他已存在的語言中移植到JVM中來的。而全新的基于JVM的腳本語言是Groovy和Scala。這兩門語言現(xiàn)在都越來越流行,不同的是,Groovy是動態(tài)腳本語言,而是Scala是靜態(tài)語言。使用Groovy最著名的應(yīng)用是Groovy on Grails項目,一個用Groovy寫成,運(yùn)行在JVM之上的WEB應(yīng)用框架(和Ruby on Rails很相似)。Grails找到通向商業(yè)應(yīng)用程序的道路,最著名的就是LinkedIn,使用Linkedin,開發(fā)人員發(fā)現(xiàn)他們能比直接使用 Java更快速和容易的開發(fā)程序。相比而言,Scala,而是強(qiáng)類型是語言,Steve Yegge最近的一次訪談中曾經(jīng)談到、靜態(tài)語言和動態(tài)語言的爭論,因?yàn)檫@個他還受到了很多的批評(譯者注:關(guān)于Steve Yegge的這篇關(guān)于動態(tài)語言和靜態(tài)語言之爭可以查看這里Steve Yegge是一個動態(tài)語言的支持者

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

]]>
一個用JAVA語言開發(fā)的含有過濾器技術(shù)的Web小例子http://www.martymets.com/bbs/dispbbs.asp?BoardID=64&ID=2475&Page=1wangxinxin2010-12-11 9:53:22一個用JAVA語言開發(fā)的含有過濾器技術(shù)的Web小例子//在MySql中創(chuàng)建數(shù)據(jù)庫
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)建一個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();
       }
      
       /*
      * 得到用戶的類別代號
      * 0:普通用戶
      * 1:VIP用戶
      * 2:管理員
      * 3:超級管理員
      * -1:帳號或者密碼錯誤
      */
       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 自動生成構(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ù)庫連接(該例使用的是MySql數(shù)據(jù)庫)
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)建過濾器
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í)行功能的核心方法(過濾器)
      */
       public void doFilter(ServletRequest req, ServletResponse res,
                     FilterChain chain) throws IOException, ServletException
       {
            //將請求和響應(yīng)轉(zhuǎn)變成 HTTP的請求和響應(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)
            {
                     //目前沒有登錄成功
                     String name = request.getParameter("userName");
                     String pass = request.getParameter("userPass");
                    
                     if(name == null || pass == null)
                     {
                               System.out.println("*********別走后門**********");
                               response.sendRedirect("login.html");                               
                     }
                    else
                     {
         ]]>
Java技術(shù)的新方向http://www.martymets.com/bbs/dispbbs.asp?BoardID=64&ID=2472&Page=1wangxinxin2010-12-11 9:49:59  
  “又一次”指的是什么?“革命”指的又是什么?光看結(jié)論的話肯定是一頭霧水。其實(shí),筆者要講的并不是變化這樣一個事實(shí),而是“促進(jìn)變化的原動力”。是什么讓Java技術(shù)發(fā)生變化?讓我們從這一角度出發(fā),先看一下Java的變化歷程。

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

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

  (1)編程語言的變化

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

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

  在J2SE5.0中,大幅度強(qiáng)化了JVM的管理功能與實(shí)用性,換句話說就是具備了Java執(zhí)行OS(操作系統(tǒng))的特征。例如,原來在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í)時監(jiān)視JVM運(yùn)行時的狀態(tài),也就是內(nèi)存使用量、線程狀態(tài)等。

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

  (3)框架的變化

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

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

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

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

 。4)腳本語言

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

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

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

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

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

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

   (3)、編寫一個配置文件,主要是混淆器的一些參數(shù)。比如,下面是一個例子
-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.**

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

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

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

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


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



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

l         什么是壓縮:

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

l         什么是混淆:

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

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

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

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

2        刪除不必要的字段存取

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

2        刪除不必要的分支

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

2        刪除未使用的代碼

2        刪除只寫字段

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

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

2        在可能的情況下為類添加static和final修飾符

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

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

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

2        選擇性的刪除日志代碼

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

仍有一些明顯需要優(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是一個命令行工具,并提供了圖形化用戶界面,它也可以結(jié)合Ant或J2ME Wireless Toolkit使用。通過ProGuard得到的更精簡的jar文件意味著只需要更小的存儲空間;網(wǎng)絡(luò)傳輸更省時;裝載速度更快和占用更小的內(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)勢可能是它的基于模版文件的簡單配置。一些直觀的命令行選項或一個簡單的配置文件已經(jīng)足夠了。例如,下面的配置選項保護(hù)了jar文件里的所有applets:

-keep public class * extends java.applet.Applet

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



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

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

java –jar proguard.jar options……

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

java –jar proguard.jar @config.pro

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

如果你要在Ant里運(yùn)行ProGuard,只需要添加一一個如下的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)成一個生成配置文件的向?qū)硎褂茫@樣我們只需要修改配置文件而不用重新寫一個配置文件。

如果你覺得ProGuard還不錯,那就快把它加入你的項目里吧。





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

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



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

源代碼
package org.zwm.pub;

public class Bru {

/**
* @param args
*/
]]>
主站蜘蛛池模板: 东乌珠穆沁旗| 盱眙县| 西吉县| 安西县| 军事| 漳浦县| 陆川县| 四川省| 胶南市| 庆元县| 辽中县| 来凤县| 滨海县| 平邑县| 彩票| 定陶县| 云林县| 搜索| 河津市| 阿城市| 洪洞县| 宁津县| 十堰市| 淮阳县| 湖南省| 芦溪县| 紫云| 申扎县| 麻江县| 平阳县| 杭锦旗| 奉节县| 通许县| 米易县| 将乐县| 喀喇| 饶平县| 兴安县| 同心县| 池州市| 洛扎县|