J2EE和JAVA有關(guān)系
一、準(zhǔn)備篇
1 什么是J2EE?它和普通的Java有什么不同?
答:J2EE全稱為Java2 Platform, Enterprise Edition。
“J2EE平臺本質(zhì)上是一個分布式的服務(wù)器應(yīng)用程序設(shè)計環(huán)境——一個Java環(huán)境,它提供了:
·宿主應(yīng)用的一個運行基礎(chǔ)框架環(huán)境。
·一套用來創(chuàng)建應(yīng)用的Java擴(kuò)展API?!保ㄒ浴禞2EE服務(wù)器端高級編程》)
2 J2EE好學(xué)嗎?
答:J2EE是很多技術(shù)的集合體,并且還在成長中。
你會遇到很多專有名詞:比如(X)HTML,Servlet/JSP,JDBC,JMS,JNDI,EJB,XML,Web Service……。
尤其是XML和Web Service正在快速成長。幸運的是,你不需要等到學(xué)會所有技術(shù)后再開始編程。
大體上J2EE可以分成3個主要應(yīng)用:Servlet/JSP,EJB,XML/Web Service 和一些支撐技術(shù)例如JDBC和JNDI。
你可以一個一個的學(xué)。
3 J2EE有什么用?
答:用來建設(shè)大型的分布式企業(yè)級應(yīng)用程序。或者用更時髦的名詞說就是“電子商務(wù)”應(yīng)用程序。
這些企業(yè)可能大到擁有中心數(shù)據(jù)庫服務(wù)器,Web服務(wù)器集群和遍布全國的辦公終端,也可能小到只不過想做一個網(wǎng)站。
4 學(xué)J2EE有前途嗎?
答:在這一市場目前只有一種技術(shù)可以和J2EE競爭,那就是Microsoft的.NET。
相對來說.NET要“新”一些而J2EE要“老”一些。
但是.NET只能用于Windows平臺(Microsoft聲稱要開發(fā)C#在Linux上的虛擬機(jī)但是尚未兌現(xiàn)該諾言),
考慮到Linux的發(fā)展勢頭,你可以相信.NET不會一統(tǒng)天下。
5 據(jù)說J2EE的性能不如.NET好,是真的嗎?
答:在Sun公司提供的樣例程序Pet Store上,Microsoft聲稱不如相同的.NET程序好。
而Sun公司反駁說這一程序不能真正體現(xiàn)J2EE的性能,并且指責(zé)Microsoft在數(shù)據(jù)庫上做了優(yōu)化。
作者沒有學(xué)習(xí)過.NET因而不能妄下斷言。
無論如何,大型分布式程序中的性能瓶頸通常首先來自于錯誤的設(shè)計。
6 聽你說了這么多,我想學(xué)著玩玩。
答:除非你想靠它當(dāng)飯吃或者作為技術(shù)儲備,否則請不要浪費你的時間。
Flash要好玩得多。計算機(jī)游戲就更加好玩了。
7 學(xué)習(xí)J2EE該怎么開始?
答:首先,下載一個J2EE服務(wù)器。其次,去java.sun.com下載J2EE的API。第三,找一本好的參考書。最后,找一個順手的IDE。
J2EE服務(wù)器。你可以用Sun的J2EE SDK(免費),或者Weblogic(性能最好,但是太大,而且作者不推薦盜版行為),或者JBoss(免費,就是文檔太少),或者JRun(開發(fā)版免費,作者用這個)。參考書作者感覺Wrox的《J2EE服務(wù)器端高級編程》不錯,但是太老(作者手頭的是2001年中文版)。你還需要去下載一些最新的技術(shù)資料(當(dāng)然肯定是英文的)。
IDE如果你的機(jī)器配置夠好(內(nèi)存至少512M以上,256M或以下請勿考慮),可以用IBM的WSAD,不然就繼續(xù)用Eclipse或者其他。
你也可以經(jīng)常去水木清華的Java版逛逛,但是在發(fā)貼前先看看精華區(qū)里有沒有你要的答案。
8 我下了一個J2EE服務(wù)器但是不會配置。
答:請認(rèn)真閱讀隨機(jī)指導(dǎo)文檔,不同的服務(wù)器的配置都不一樣,作者愛莫能助。
9 我發(fā)現(xiàn)你沒有提到Tomcat。
答:Tomcat只是一個Web服務(wù)器,更準(zhǔn)確地說主要只是一個Web Container。
如果你想要學(xué)習(xí)EJB的話,Tomcat無法滿足你的需要。
二、 Servlet/JSP篇
10 什么是Servlet?
答:一個Servlet是一個Java類。它處理Http(s)請求并作出響應(yīng),包括返回一個HTML頁面或轉(zhuǎn)交給其他URL處理。
Servlet必須運行在一個Web Container例如Tomcat中。
Servlet必須是javax.servlet.http.HttpServlet的子類,
你可以繼承doGet()或者doPost()方法,兩者分別對應(yīng)于Http(s)中的Get請求和Post請求。
11 我怎么獲得Http請求里的參數(shù)?
答:HttpRequest的getParameter()方法。例如:String paramValue = request.getParameter("paramName");
12 我怎么返回結(jié)果?
答:你可以利用相關(guān)API打開一個輸出流,并向流中直接寫入一個HTML頁面。
但是作者完全不贊成這樣做。一方面這樣做會很羅嗦。
另一方面從Model-View-Controller模式(在《J2EE核心模式》中被歸為Front Controller模式)的觀點來看,
你應(yīng)當(dāng)提供一些HTML或者JSP作為視圖(view),而Servlet則根據(jù)請求參數(shù)決定轉(zhuǎn)到哪一個視圖。
你可以利用response.sendRedirect(...)方法或request.getDispatcher(...).forward()方法來實現(xiàn)。
13 sendRedirect()和forward()有什么不同?
答:sendRedirect()是向瀏覽器發(fā)送一個redirect通知,瀏覽器重定向到新的URL。
而forward是在服務(wù)器端直接轉(zhuǎn)到新的URL,對于瀏覽器是透明的。
前者瀏覽器的地址欄顯示的是新的URL,后者瀏覽器的地址欄顯示的是Servlet的URL。
因而當(dāng)目標(biāo)URL會自動刷新時,兩者會造成一些差別。
14 我寫了一個Servlet程序,怎么運行它?
答:開發(fā)J2EE程序有一個部署(deploy)的概念,實際上是開發(fā)——部署——運行的三部曲。
大多數(shù)服務(wù)器支持Hot deploy。你只需要在相應(yīng)的Application目錄(具體路徑依賴于服務(wù)器)下面
建立一個符合WAR或EAR格式(參見16,17)的目錄,啟動服務(wù)器,就可以通過瀏覽器訪問了。
特別的,你的Servlet的class文件應(yīng)當(dāng)放在/WEB-INF/classes目錄中。
注意J2EE SDK不支持Hot deploy,你需要通過它的deploy tool來部署。
Tomcat只支持WAR格式。
15 EAR和WAR有什么不同?
答:EAR是一個完整的J2EE應(yīng)用程序,包括Web部分和EJB部分。
WAR只是其中的Web部分。
16 EAR格式是怎樣的?
答:一個EAR可以包含任意多個WAR或EJB JAR,并且包含一個META-INF的目錄。
在/META-INF中包含了一個application.xml,其中描述了這個EAR包含哪些模塊,以及安全性配置。
細(xì)節(jié)請看參考書。
17 WAR格式是怎樣的?
答:一個WAR包含一個WEB-INF的目錄,這個目錄下包含classes目錄,lib目錄和web.xml。
/WEB-INF/classes存放按package組織的class文件,/WEB-INF/lib目錄存放jar文件,
web.xml描述了很多東西,請讀參考書。
18 我的普通HTML文件應(yīng)當(dāng)放在哪里?
答:放在除了/WEB-INF以外的其他地方。
19 我訪問不到servlet,甚至連HTML文件都訪問不到!
答:第一你沒啟動服務(wù)器。第二你敲錯了端口。第三你沒有正確配置context-path。
第四你的服務(wù)器不支持auto reload或者你關(guān)閉了這一選項,你得重啟服務(wù)器。
第五確認(rèn)你沒有把HTML放在/WEB-INF目錄下,那是訪問不到的。
20 我能訪問HTML但是訪問不到servlet。
答:請檢查你的web.xml文件。確保你正確定義了<servlet>和<servlet-mapping>元素。
前者標(biāo)識了一個servlet,后者將一個相對于context-path的URL映射到一個servlet。
在Tomcat中你可以通過/context-path/servlet/package/servletname的形式訪問servlet,
但是這只是Tomcat的便捷訪問方式,并不是正式規(guī)范。
細(xì)節(jié)請看參考書。
21 什么是JSP?它和Servlet有什么區(qū)別?
答:你可以將JSP當(dāng)做一個可擴(kuò)充的HTML來對待。
雖然在本質(zhì)上JSP文件會被服務(wù)器自動翻譯為相應(yīng)的Servlet來執(zhí)行。
可以說Servlet是面向Java程序員而JSP是面向HTML程序員的,除此之外兩者功能完全等價。
22 我的JSP顯示的漢字是亂碼。
答:在你的JSP開頭加上一行 <%@ page contentType="text/html; charset=gb2312"%>
如果你已經(jīng)聲明了page我想你知道該怎么修改。
23 JSP文件存放在哪里?
答:除了/WEB-INF下的任何地方。
24 在JSP里面怎么引用Java Bean。
答:首先,確認(rèn)你要引用的類在/WEB-INF/classes下或在/WEB-INF/lib的某個jar內(nèi)。
其次,在JSP里加一行 <jsp:useBean id="..." scope="..." class="..."/>
具體解釋請看參考書。
25 我想在servlet間傳遞數(shù)據(jù)。
答:利用session。在Servlet/JSP中,你可以在4個地方保存數(shù)據(jù)。
1) page,本頁面。
2) session,用來存放客戶相關(guān)的信息,比如購物車,對應(yīng)接口為javax.servlet.http.HttpSession。
session機(jī)制實際上是cookie和URL Rewrite的抽象,服務(wù)器會自動使用cookie或URL Rewrite來實現(xiàn)。
3) request,可以在forward()時傳遞信息,對應(yīng)接口為javax.servlet.http.HttpRequest。
4) application,或稱context,存放全局信息,對應(yīng)接口為javax.servlet.ServletContext。
26 怎么調(diào)用cookie?
答:作者建議使用session,你總是會遇到某些禁用cookie的用戶。這時session會自動使用URL重寫來實現(xiàn)。
27 怎么在JSP里面實現(xiàn)文件下載?
答:實際上這是一個HTML的問題。答案是一個超鏈接<a>。
28 怎么實現(xiàn)文件上傳?
答:客戶端是HTML問題,在form中設(shè)置method為post,enctype為multi-part/form-data,加一個<input type="file">。
而在接收的servlet中只是一個I/O問題。
29 我想讓頁面自動刷新,比如聊天室。
答:這是一個HTML問題,在<head>部分中加一條<meta http-equiv="refresh" content="5" url="...">。
這是所謂的Clinet-push,客戶端刷新技術(shù)。
30 我想讓用戶登錄以后才能訪問頁面。
答:使用聲明式安全措施。
你只需要在web.xml中定義安全角色(Role),并定義受保護(hù)的URL集合只能由特定Role訪問。
大多數(shù)服務(wù)器支持基于數(shù)據(jù)庫的用戶映射,你只要在相應(yīng)數(shù)據(jù)庫中建立兩張表并配置服務(wù)器就可以了。
注意J2EE SDK不支持基于數(shù)據(jù)庫的用戶映射。
細(xì)節(jié)請看參考書和服務(wù)器文檔。
31 我想要能注冊用戶。
答:參看30。在接受注冊請求的Servlet中執(zhí)行寫入數(shù)據(jù)庫操作即可。
32 怎么在JSP中訪問數(shù)據(jù)庫?
答:標(biāo)準(zhǔn)做法是使用DAO模式,定義一個Java bean來訪問數(shù)據(jù)庫并在JSP中使用。
然而,當(dāng)你的數(shù)據(jù)庫模式很簡單時,你可以使用JSTL中的<sql:query>標(biāo)簽來快速訪問。
33 什么是JSTL?
答:JSTL是Jsp Standard Tag Library的縮寫。這是一組通用標(biāo)簽并將成為JSP 2.0的一部分。
其中包含賦值<c:set>,分支<c:if>,循環(huán)<c:forEach>,查詢數(shù)據(jù)庫<sql:query>,更新數(shù)據(jù)庫<sql:update>
等。目前你需要像添加自定義標(biāo)簽庫一樣來添加JSTL,但是可以預(yù)計JSP 2.0會將JSTL作為組成部分。
標(biāo)簽庫可以在
http://jakarta.apache.org/下載。注意JSTL需要在支持JSP1.2或更高版本的容器下運行。
幫助文件可以閱讀sun的JSTL正式規(guī)范。
=======================================================
j2me入門--什么是J2ME及J2ME基礎(chǔ)知識
Java發(fā)展歷史
相信熟悉Java 演進(jìn)歷史的人或多或少都聽說過,Java 技術(shù)一開始并非就叫做 Java ,而是叫做OAK ,而且最早的時候就是為了嵌入式系統(tǒng)而設(shè)計的一項產(chǎn)品。后來因為網(wǎng)際網(wǎng)路的發(fā)達(dá),而OAK 的諸多特性剛好又適合用在網(wǎng)路上(例如可移植性、編譯后程序碼很小),因為商標(biāo)已被注冊的關(guān)系,因此 OAK 被改名成Java ,從此因緣際會地成了網(wǎng)路上的閃亮巨星,并隨著時間越來越成熟,也慢慢地產(chǎn)生了許多非原本預(yù)期中的相關(guān)運用。雖然 Java 已經(jīng)被用到許多企業(yè)級軟體上,可是其實骨子里面還是非常適合用在嵌入式系統(tǒng)之中。
雖然從Java 1.0 發(fā)表之后,Java 就被廣泛地使用在桌上型應(yīng)用程序以及Applet 的開發(fā)上,但是,從Java 1.1 開始,Java又回到了它一開始的老路--也就是嵌入式系統(tǒng)方面的應(yīng)用,在當(dāng)時Sun Microsystems 發(fā)表了Embedded Java 與Personal Java(也有人簡稱為PJava)這兩項規(guī)格。其中Embedded Java 是為了資源十分有限,而且沒有顯示設(shè)備的嵌入式裝置而設(shè)計; Personal Java 則是為了在能夠與網(wǎng)際網(wǎng)路連線、并擁有顯示系統(tǒng)(例如彩色LCD)的消費性電子裝置而設(shè)計。接著Java 的版本演進(jìn)到Java 2 ,這時為了再明顯區(qū)分各種Java 的應(yīng)用,所以分割出了J2EE 、J2SE、以及 J2ME 三種版本。這三種版本的各種特性我們已經(jīng)在前面已經(jīng)詳細(xì)地描述,在此不再贅述。不過請大家記住,由於 Java 2將Java 的應(yīng)用區(qū)分成三大塊,使得 Java 程序語言的發(fā)展不會再像Java 1.1時如樹枝狀般擴(kuò)散出去,這么一來有助於大家對 Java 各種應(yīng)用的澄清,而不會造成今后越發(fā)展下去越不可收拾的混亂局面。額外向大家一提的是,后來Personal Java 發(fā)展到1.2 版的時候,也采用了一些Java 2 平臺上與安全性有關(guān)的設(shè)計。
J2ME
J2ME 在設(shè)計其規(guī)格的時候,遵循著「對於各種不同的裝置而造出一個單一的開發(fā)系統(tǒng)是沒有意義的事」這個基本原則。於是 J2ME 先將所有的嵌入式裝置大體上區(qū)分為兩種 :一種是運算功能有限、電力供應(yīng)也有限的嵌入式裝置(比方說PDA 、手機(jī));另外一種則是運算能力相對較佳、并請在電力供應(yīng)上相對比較充足的嵌入式裝置 (比方說冷氣機(jī)、電冰箱、電視機(jī)上盒 (set-top box))。因為這兩種型態(tài)的嵌入式裝置,所以Java 引入了一個叫做Configuration 的概念,然后把上述運算功能有限、電力有限的嵌入式裝置定義在Connected Limited Device Configuration(CLDC)規(guī)格之中;而另外一種裝置則規(guī)范為 Connected Device Configuration(CDC)規(guī)格。也就是說, J2ME 先把所有的嵌入式裝置利用Configuration 的概念區(qū)隔成兩種抽象的型態(tài)。
其實在這里大家可以把Configuration 當(dāng)作是J2ME 對於兩種類型嵌入式裝置的規(guī)格,而這些規(guī)格之中定義了這些裝置至少要符合的運算能力、供電能力、記憶體大小等規(guī)范,同時也定了一組在這些裝置上執(zhí)行的 Java程序所能使用的類別函式庫、這些規(guī)范之中所定義的類別函式庫為 Java標(biāo)準(zhǔn)核心類別函式庫的子集合以及與該型態(tài)裝置特性相符的擴(kuò)充類別函式庫。比方就CLDC 的規(guī)范來說,可以支援的核心類別函式庫為java.lang.*、java.io.*、java.util.*,而支援的擴(kuò)充類別函式庫為java.microedition.io.*。區(qū)分出兩種主要的Configuration 之后,J2ME 接著在定義出Profile的概念。Profile 是架構(gòu)在Configuration 之上的規(guī)格。之所以有Profile的概念,是為了要更明確地區(qū)分出各種嵌入式裝置上Java 程序該如何開發(fā)以及它們應(yīng)該具有哪些功能。因此Profile 之中定義了與特定嵌入式裝置非常相關(guān)的擴(kuò)充類別函式庫,而 Java 程序在各種嵌入式裝置上的使用者介面該如何呈現(xiàn)就是定義在Profile 里頭。Profile 之中所定義的擴(kuò)充類別函式庫是根據(jù)底層Configuration 內(nèi)所定義的核心類別函式庫所建立。
雖然J2ME標(biāo)準(zhǔn)繁多,但只要把握住標(biāo)準(zhǔn)劃分的原因就很容易掌握。在這個技術(shù)飛速發(fā)展的領(lǐng)域,我們不能把眼光局限于標(biāo)準(zhǔn)的字面含義,而要靈活掌握,把握其精神。比如,CLDC和CDC的定義中具體的最小內(nèi)存需求僅僅是"最小的",隨著硬件能力的飛速發(fā)展,很有可能一些界限會變得模糊。PDA本來應(yīng)該屬于CLDC的范圍,但是Compaq的iPaq上卻實現(xiàn)了CDC。以后的下一代PDA有64M內(nèi)存并不意外,在其上實現(xiàn)CDC也是完全可能的。但是,從功能的角度,應(yīng)該還是CLDC以及PDA Profile更適合于PDA的條件。到那時,具體的實現(xiàn)就要看廠商和開發(fā)者的選擇了。還需要注意的是,由于Profile是建于Configuration之上,作為對Configuration的擴(kuò)展,因此Profile必須Configuration的支持。有的文章在講到MIDP的內(nèi)存需求時,說MIDP需要最少256K,這是指MIDP本身。而有的文章說MIDP需要最少768K,那時因為把作為基礎(chǔ)的CLDC所需要的512K算進(jìn)去了。
CLDC
CLDC是針對少于512KB內(nèi)存footprint的設(shè)備的配置。CLDC采用的是KVM,它是高度優(yōu)化的JVM方式,他針對的是16比特或32比特的微處理器,160到512 KB內(nèi)存為基礎(chǔ)的低端,網(wǎng)絡(luò)連接,電池驅(qū)動的設(shè)備。典型的內(nèi)存要求是128KB做有來存儲KVM和相關(guān)的庫。更多關(guān)于KVM的信息可以從Sun公司的KVM白頁中得到。
就網(wǎng)絡(luò)化而言,CLDC針對的是有限的和間歇性的無線連接設(shè)備,所有在J2ME CLDC之上運行的應(yīng)用軟件都應(yīng)能在其他任何高端的Java VM上運行。當(dāng)然,這需要CLDC庫的支持。CLDC配置關(guān)注于I/O,網(wǎng)絡(luò)化,安全問題,國際化問題和核心Java庫等相關(guān)的領(lǐng)域。
與事件處理,用戶和應(yīng)用程序的互動,應(yīng)用程序生存期管理等內(nèi)容相關(guān)的領(lǐng)域是由Profile來處理的。使用界面定義(對于特定的設(shè)備,如傳呼機(jī),移動電話和PDA)也在Profile層的范圍之內(nèi),它建立在頂端之上,并使用J2ME配置。Mobile Information Device Profile (MIDP)是一個J2ME profile,它定義了使用CLDC配置設(shè)備的用戶界面相關(guān)的規(guī)范。
CLDC從J2SE獲得絕大多數(shù)的類,但一些針對小內(nèi)存footprint設(shè)備的新類并不是從J2SE APIs獲得的。關(guān)于類從J2SE 做繼承和新CLDC類的具體信息,可參考CLDC規(guī)范1.0a版本的6.2和6.3中的內(nèi)容。Java語言規(guī)范中的一些例外是沒有浮點支持,沒有類實例的完成化支持和有限的錯誤處理能力。
在這里提到CLDC HotSpot應(yīng)用也是具有相關(guān)性的,它相當(dāng)于使用CLDC配置的設(shè)備的KVM中Java VM的替換。根據(jù)Sun公司,CLDC HotSpot執(zhí)行VM是一個高性能的JVM(32位,采用CLDC v1.0規(guī)范)。他在相同的內(nèi)存footprint上運行時提供比KVM高出一個數(shù)量級的更佳的性能。
CDC:完全的Java平臺
CDC是應(yīng)用在具有較大內(nèi)存,特別是2MB以上的設(shè)備上的,CDC針對有限和間歇的無線連接設(shè)備,CDC與CVM和Foundation profile共同定義了完全的J2ME環(huán)境。
CVM是為用戶和嵌入設(shè)備設(shè)計的完全功能性JVM,它支持所有的Java 2 v1.3 VM安全防護(hù),JNI, JVMDI, RMI,弱引用功能和庫。本質(zhì)上說,CVM具有所有一個駐留桌面系統(tǒng)的JVM所具有的功能。
CDC由J2SE中最小的Java數(shù)據(jù)包組成。Foundation profile由用戶設(shè)備所需要的保持類庫和APIs所組成。因此,如果你工作在一個以CDC為基礎(chǔ)的J2ME環(huán)境下,你就需要更新你代碼以使APIs更新?lián)Q代。
CDC是CLDC的一個擴(kuò)展集,所以在兩種配置之間存在著向上的兼容性。CDC和Foundation profile也提供了對使用PersonalJava實時規(guī)范開發(fā)的應(yīng)用程序的完全兼容。
J2ME的平臺無關(guān)性主要指的是設(shè)備的宿主操作系統(tǒng)平臺。由于Java平臺建筑于虛擬機(jī)之上,只要不同的操作系統(tǒng)上的虛擬機(jī)滿足同樣的規(guī)范和標(biāo)準(zhǔn),對于虛擬機(jī)以上的層次是平臺無關(guān)的。這使得針對某一Configuration或者Profile的應(yīng)用可以運行于所有實現(xiàn)了這一Configuration或者Profile的操作系統(tǒng)平臺。舉例來說,目前已經(jīng)有網(wǎng)站開始收集基于MIDP的程序--MIDlet,提供下載和收費,各種支持MIDP的設(shè)備都可以使用,這包括數(shù)量巨大的智能手機(jī)和幾乎所有的PDA(Palm OS和Pocket PC)。
相關(guān)站點
Java 2 Micro Edition
http://www.javasoft.com/j2me/JDC J2ME Tech Tips
http://developer.java.sun.com/developer/J2METechTips/CLDC & KVM
http://www.javasoft.com/products/cldc/