《電子商務的應用開發(fā)技術(shù)》-第6章_第1頁
《電子商務的應用開發(fā)技術(shù)》-第6章_第2頁
《電子商務的應用開發(fā)技術(shù)》-第6章_第3頁
《電子商務的應用開發(fā)技術(shù)》-第6章_第4頁
《電子商務的應用開發(fā)技術(shù)》-第6章_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第六章.服務器端開發(fā)技術(shù)JSP及JavaBean對外經(jīng)濟貿(mào)易大學信息學院第六章.服務器端開發(fā)技術(shù)JSP及JavaBean第一節(jié).JSP第二節(jié).JavaBean第三節(jié).JSP、JavaBean及Servlet組合開發(fā)第四節(jié).開發(fā)框架、模式介紹第一節(jié) JSP1. JSP概述 JSP是SUN公司推出的一種新型的Web開發(fā)語言,和其他開發(fā)語言相 比,JSP有以下顯著的優(yōu)點:運行效率較高且功能強 JSP頁面在第一次被訪問時,JSP容器會將其轉(zhuǎn)換成一個等價的Servlet類,并且放置在工作目錄中,以后所有對該JSP頁面的訪問都會由該Servlet類來處理,不再需要對JSP的解析。因此,在某種意義上可以說,

2、在“運行時”JSP在效率上和功能上都等同于一個Servlet,這也使得JSP具有Servlet所提供的效率和功能等所有好處。動態(tài)內(nèi)容和靜態(tài)內(nèi)容的分離 典型的JSP文件的內(nèi)容看上去就像一個HTML頁面,事實上甚至可以把一個HTML格式的文件簡單的改名為后綴為JSP的文件(JSP文件的擴展名為JSP),就可以直接在JSP容器中運行了。所不同的是,JSP頁面通常還會包括其他的一些由JSP規(guī)范定義的稱為元素的部分,用于表達邏輯和顯示動態(tài)內(nèi)容。這些元素和純HTML代碼自由的融合在一起,但是又能在外觀上截然分開。這種做法使得JSP頁面的結(jié)構(gòu)相對較為清晰,能同時為開發(fā)人員和網(wǎng)頁設計人員理解。 組件重用 軟件

3、設計時的重用性是非常重要的,JSP特別考慮到已有組件的重用,在JSP中的組件重用主要是通過JavaBean組件、Enterprise JavaBean組件和定制化標簽來實現(xiàn)的。這些組件可以由第三方開發(fā),并且可以和開發(fā)工具結(jié)合起來實現(xiàn)快速開發(fā)。2. JSP元素開發(fā)基礎 (1) JSP元素的基本概念 元素就是由JSP規(guī)范定義的,JSP容器能夠理解并處理的部分,除了元素之外所有其他的內(nèi)容,即JSP容器不能理解的則統(tǒng)稱為模板。元素有不同的類型,類型的定義描述了元素語法和語義。例如,如果元素擁有屬性,類型定義就需要描述屬性的名字、屬性值的類型和屬性的意義等等。(2) JSP元素的類型 JSP規(guī)范定義了三

4、大類元素:腳本元素、指令和動作。使用腳本元素完成網(wǎng)頁的各種功能,腳本元素最終會轉(zhuǎn)換為Servlet的代碼,指令可以控制Servlet的整體結(jié)構(gòu),而動作支持重用已有組件。為了簡化書寫和快速開發(fā),JSP也定義了一些預定義的變量以方便使用,如request變量使得開發(fā)者可以得到客戶端(一般是瀏覽器)請求傳遞過來的參數(shù)等。 JSP腳本 JSP腳本提供了JSP動作和模板內(nèi)容之間的粘合劑。JSP腳本實際上幾乎可以使用Java語言提供的全部功能和開發(fā)包。因此能夠給開發(fā)者提供非常靈活的功能來控制頁面的顯示和邏輯。JSP腳本也分為三類:聲明,代碼片斷和表達式。聲明的語法是,代碼片斷的語法是,表達式的語法式。后面

5、可以看到,這些不同類型的JSP腳本在JSP頁面中起不同的作用。JSP指令 JSP指令為JSP容器解釋并執(zhí)行JSP頁面提供需要的信息。指令的作用是和每個單獨的HTTP請求無關(guān)的。比如我們可以使用指令來引入一些JAVA包,進而使用其中定義的類等。每個HTTP請求都可能會用到這些類。指令的語法是。JSP動作 JSP動作支持在JSP腳本中動態(tài)地插入一個文件、重用JavaBeans組件、前進到另一個頁面,或為Java 插件生成一個HTML。JSP動作通常遵循XML中元素的語法,一般來說都有一個包含有元素名稱的起始標志,可能還包含有屬性設置、一些可選項和一個結(jié)束標志。有的元素也僅僅有一個包含屬性設置的標志

6、,例如: body JSP注釋 如果想在一個JSP文件中加入注釋說明一些邏輯等信息,可以使用如下格式: JSP的注釋部分和HTML的注釋相似,當在執(zhí)行的時候JSP引擎將去掉對注釋的解釋。這就意味著JSP注釋并不返回到用戶的瀏覽器中。不象HTML注釋被定義在標簽之間,JSP注釋被定義在之間。 (3)實例分析 下面給出一個JSP(Welcome.jsp)網(wǎng)頁的簡單例子,該例使用了前面介紹的一些元素。在這個JSP網(wǎng)頁中包含了靜態(tài)HTML內(nèi)容和從JavaBean生成的動態(tài)數(shù)據(jù)。當用戶訪問這個網(wǎng)頁的時候,它可以顯示當前的日期,并根據(jù)當前的時間增加相應的問候語(例如“早上好”和“下午好”)。這里只關(guān)注和示

7、意了JSP的結(jié)構(gòu)和包含的各種元素,具體含義和語法暫時不用關(guān)注。該例子不能正常運轉(zhuǎn),因為里面用到了一個JavaBean,但是沒有提供JavaBean的類。 Welcome Today is Day: Year: 早上好 下午好 在上面的例子中,HTML中嵌入了JSP腳本。其中jsp:useBean 動作初始化了一個JavaBean,JavaBean將在網(wǎng)頁的后面部分被用到: 當網(wǎng)頁被編譯成一個servlet的時候,指令將被JSP引擎處理。在上面的例子中,有如下兩個指令:分別為; 定義了頁面所使用的語言(Java)和所引入的Java包 指定一個將要插入頁面底部的HTML文件內(nèi)容“int”聲明并給出

8、了一個當前時間的相應值 (AM 或 PM): 另外,在上面的例子中,表達式將調(diào)用JavaBean組件并在頁面中插入結(jié)果數(shù)據(jù): Scriptlet將作為一個Java代碼塊植入JSP頁面中。Scriptlet代碼被一一插入由頁面所產(chǎn)生的servlet中,它被定義在之間。上面例子中的scriptlet可以根據(jù)當前用戶產(chǎn)生相應的時間和問候語: 早上好 下午好 最后: 是注釋。后面的章節(jié)將詳細介紹JSP 指令、JSP 動作、JSP 腳本和一些預定義變量的語法和用法。 3.JSP 腳本 在J S P中,主要的程序部分就是腳本元素,其中包括三個部分:聲明(Declaration)、表達式(Expressio

9、n)和代碼(Scriptlet)。從功能上講,聲明用于聲明一個或多個變量,表達式將是一個完整的語言表達式,而代碼部分將是一些程序片斷。三個腳本元素的基本語法都是以一個“ ”結(jié)尾的。下面分別給出三種腳本的簡單示例。 聲明 J S P中的聲明用于聲明一個或多個變量和方法,并不輸出任何的文本到o u t輸出流去。在聲明元素中聲明的變量和方法將在J S P頁面初始化時加以初始化。聲明的語法為:舉例如下: %! public String f(int i) if (i實際上,聲明變量和方法的語句完全可以放在后面的腳本代碼中,兩者有什么不一樣呢?放在中的聲明語句在JSP編譯為Servlet的時候?qū)⒆鳛轭惖?/p>

10、屬性而存在,而放在腳本代碼中的聲明將在類的方法內(nèi)部被聲明。 表達式 表達式元素表示的是一個在腳本語言中被定義的表達式,J S P中的表達式可以被看作一種簡單的輸出形式,在運行后被自動轉(zhuǎn)化為字符串,然后插入到這個表達式在JSP文件的位置處而被顯示。表達式語法為:舉例如下: 腳本代碼 JSP腳本代碼包含一個有效的程序段, 腳本代碼也被稱做scriptlet。它能夠包含多個JSP語句、方法、變量和表達式??梢允褂媚_本完成下列工作: 聲明將要用到的變量或方法 編寫JSP表達式 使用任何隱含的對象和任何用jsp:useBean聲明過的對象 編寫JSP語句,一般語句要遵從Java 語法規(guī)定任何文本、HTM

11、L標記、JSP元素都必須在腳本之外。 當JSP收到客戶的請求時,腳本就會被執(zhí)行,如果腳本有顯示的內(nèi)容,這些顯示的內(nèi)容就被存在out對象(參見JSP預定義變量章節(jié))中,進而輸出給用戶。腳本的語法為: 4. JSP預定義變量 JSP提供了8種預定義的變量.它們是request,response,out,session,application, config,pageContext和page.這里主要介紹前5個,因為相對來說它們更重要些。 (1) out out對象主要用來向瀏覽器(客戶端)輸出各種格式的數(shù)據(jù),并且管理應用服務器上的輸出緩沖區(qū),out.println(DataType)和out.pr

12、int(DataType)是兩個主要的輸出方法,它們的區(qū)別在于println輸出后換行,print輸出后不換行。下例簡單地使用out對象把系統(tǒng)時間輸入到瀏覽器上。 out對象使用實例 % out.println(new Date().toLocaleString(); out.print(); out.print(out輸出成功); % (2) request request類似于Servlet中的HttpServletRequest類,通過它得到request的參數(shù)(通過getParameter方法)、request 的類型(GET,POST,HEAD,等等),以及引入的HTTP頭(cook

13、ies,Referer,等等)。 它們的主要方法如下:setAttribute/getAttribute根據(jù)名字設置/獲得屬性getParameter根據(jù)名字得到參數(shù)的值getParameterName 獲取所有參數(shù)的名字列表getRemoteAddr 得到客戶端(瀏覽器)的IP地址getAttributeName 獲取所有屬性的名字列表 setAttribute與getAttribute方法實例 下面的mainreq.jsp包含了import.jsp文件,先執(zhí)行import.jsp,在 import.jsp中設置了屬性friend的值為Tom,在這之后mainreq.jsp的被執(zhí)行,瀏覽器上

14、顯示出friend的值為設置的Tom。mainreq.jsp 你剛才輸入的內(nèi)容是: import.jsp request對象使用實例 getParameter方法實例 如下兩個JSP文件演示了如何使用getParameter方法。getParameterMain1.jsp的主要功能是顯示Form,通過Form提交參數(shù)student、city和enjoy,點擊提交后調(diào)用submit.jsp。而submit.jsp文件使用getParameter方法。通過它指定參數(shù)名字,讀取特定的參數(shù),并在瀏覽器屏幕上顯示。 getParameterMain1.jsp getParameter()方法使用實例 s

15、ubmit.jsp 你剛才輸入的內(nèi)容是: 當點擊按鈕提交后,顯示下邊內(nèi)容 getParameterName和getRemoteAddr方法實例 有時候為了獲取不知道參數(shù)的名字,需要使用getParameterName獲得所有參數(shù)的名字,然后再使用獲得的名字去取得參數(shù)的值。下面的兩個JSP文件演示了如何使用getParameterName方法。 getParameterNameMain1.jsp主要功能是顯示Form,通過Form提交參數(shù)student、city和enjoy,點擊提交后調(diào)用submit1.jsp。而submit1.jsp文件使用getParameterName方法獲取所有參數(shù)的名

16、字(多個參數(shù)名字都放到Enumeration類型的對象中),通過遍歷Enumeration類型的對象拿到每個名字,并利用名字作為參數(shù)調(diào)用getParameter方法取得該參數(shù)的值,進而在瀏覽器屏幕上顯示該參數(shù)。顯示所有參數(shù)后,同時調(diào)用getRemoteAddr方法顯示客戶端的IP地址。 getParameterNameMain1.jsp getParameterName()方法使用實例 submit1.jsp 剛才輸入的參數(shù)名及值如下:%Enumeration e=request.getParameterNames(); while(e.hasMoreElements() String par

17、ameterName=(String)e.nextElement(); String parameterValue=(String)request.getParameter(parameterName); out.print(參數(shù)名稱:+parameterName+ ); out.print(參數(shù)內(nèi)容:+parameterValue+);%你的IP地址是: (3) response response對象可以用于在JSP給瀏覽器響應的時候設置與響應相關(guān)的參數(shù),比如使用response對象的setHeader方法可以設置各種響應頭屬性,其中refresh屬性可以設施頁面自動刷新。下例(respon

18、sesetHeader.jsp)每隔2秒自動刷新瀏覽器,并顯示當前系統(tǒng)時間。 responsesetHeader.jsp的代碼如下: setHeader刷新頁面實例 (4) session 在Servlet一章中我們知道當用戶訪問網(wǎng)站,系統(tǒng)將為他生成一個獨一無二的Session對象,用以記錄該用戶的個人信息 ,一旦該用戶退出網(wǎng)站,那么該Session對象將會注銷。Session對象可以綁定若干個人信息或者Java對象,不同Session對象的同名變量是不會相互干擾的。在JSP中我們可以直接使用該對象。 該對象常用的方法包含getValue(String name)、putValue(Strin

19、g name)、removeValue(String name)、getValueNames() 、getCreationTime()、getId()、getLastAccessedTime()、getMaxInactiveInterval()、 setMaxInactiveInterval()等。相關(guān)的方法和含義基本與Servlet中講述過的HttpSession類似,這里略去細節(jié)。 我們只通過例子來看如何使用該對象保存屬性和值對,使得同一個用戶的一次會話的不同頁面之間可以共享這些屬性和值。該例涉及3個頁面,分別是主頁面: SessionMain.jsp轉(zhuǎn)向頁面1:SessionSub1.j

20、sp轉(zhuǎn)向頁面2:SessionSub2.jsp具體執(zhí)行過程及解釋如下: 執(zhí)行SessionMain.jspSessionMain.jsp會把兩個屬性和值(username和password)保存到session中。 執(zhí)行SessionSub1.jsp點擊鏈接后從SessionMain.jsp轉(zhuǎn)向SessionSub1.jsp頁面,該頁面執(zhí)行時會讀出SessionMain.jsp保存的屬性的值(username和password),并顯示在屏幕上。該頁面讀取并在瀏覽器上顯示了一些會話相關(guān)的數(shù)據(jù),最后刪除屬性username。 執(zhí)行SessionSub2.jsp點擊SessionSub1.jsp頁

21、面包含的鏈接(指向第三頁)后轉(zhuǎn)向SessionSub2.jsp頁面,SessionSub2.jsp頁面會嘗試從session中讀取屬性username和password,結(jié)果是由于SessionSub1.jsp頁面刪除了屬性username,所以username讀出null,而只能讀出password屬性,在瀏覽器會顯示null及口令1234。 SessionMain.jsp Session主頁面 指向第二頁SessionSub1.jsp SessionSub1.jsp Session轉(zhuǎn)向頁面1 BR % String name=session.getValueNames(); out.pri

22、ntln(+); for(int i=0;iname.length;i+) out.println(session.getValue(namei)+); % 指向第三頁SessionSub2.jsp SessionSub2.jsp Session轉(zhuǎn)向頁面2 (5) application Application對象由服務器來創(chuàng)建和加以清除,在JSP服務器運行時刻,僅有一個Application為眾多用戶請求共享。用戶不能創(chuàng)建和清除Application對象,而只能獲得這個Appliation對象去使用它。 Application對象的setAttribute(),getAttribute()和

23、removeAttribute()方法可以將相關(guān)的屬性和值保存到該對象和從該對象中取出。 下例(appAtt.jsp)展示了如何使用這些方法。該例把用戶名和口令這兩個變量作為屬性,先使用setAttribute方法將它們保存到Applicationd對象中,然后又使用getAttribute方法從中取出并顯示將其到頁面上。在這之后,使用removeAttribute方法刪除屬性password,然后再去獲得password屬性的值,由于已經(jīng)刪除,所有結(jié)果都只返回null。 appAtt.jsp: Application對象方法實例 % String username=rossini; Stri

24、ng password=126263; application.setAttribute(username,username); application.setAttribute(password,password); out.println(application.getAttribute(username)+); out.println(application.getAttribute(password)+); application.removeAttribute(password); out.println(application.getAttribute(password)+); %

25、 另一個方法getAttributeNames()將當前Application對象中保存的所有的屬性的名字都取出來。這個方法也很有用,下面給出一個例子(getAttName.jsp) Application對象方法實例 % String username=rossini; String password=126263; application.setAttribute(username,username); application.setAttribute(password,password); Enumeration enum=application.getAttributeNames();

26、 while(enum.hasMoreElements() String attrName=(String)enum.nextElement(); out.println(attrName+application.getAttribute(attrName)+); % 5. JSP 指令 指令分為三種page, include和taglib,其樣式如下: (1) page指令 page指令描述了和頁面相關(guān)的指示信息,定義了JSP文件中的全局屬性。在一個JSP頁面中, page指令可以出現(xiàn)多次,但是每一種屬性卻只能出現(xiàn)一次,發(fā)生重復的屬性設置時,后面的設置將覆蓋掉先前的設置。 page指令的基本

27、語法格式如下: 下面是常用的page指令例子: (引用Java語言的類庫) 注意:page 指令作用于整個JSP頁面,同樣包括靜態(tài)的包含文件。但是page 指令不能作用于動態(tài)的包含文件,比如jsp:include。page指令作用范圍是整個JSP頁面,無論放在JSP的文件的哪個地方,一般都是放在JSP文件的頂部。 (2) Taglib指令 Taglib指令描述了擴展的標簽庫信息。JSP容器能夠理解并處理的元素除了JSP規(guī)范定義的標準元素之外,還可以通過標簽擴展接口來進行擴展。對于每個擴展的元素(通常稱其為定制標簽),需要通過Taglib指令來把其定義信息告知JSP容器。Taglib指令的語法是

28、: 其中: URI描述這個標簽庫位置的U R L,可以是相對路徑或絕對路徑。t a g P r e f i x 定義了一個指示使用此標簽庫的前綴,例如將t a g P r e f i x設為m y P r e f i x時,可以使用下面的語句來使用此標簽庫中的m y Ta g標簽: (3) Include指令 Include指令的作用是包含另一個文件, 其語法相當簡單: 其中relativeURLspec是要包含的文件的相對路徑。 6. JSP 動作 JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。利用JSP動作可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外

29、的頁面和為Java插件生成HTML代碼。 (1) JSP標準動作及其屬性 JSP標準動作包括: jsp:include:在頁面被請求的時候引入一個文件。 jsp:useBean:尋找或者實例化一個JavaBean。 jsp:setProperty:設置JavaBean的屬性。 jsp:getProperty:輸出某個JavaBean的屬性。 jsp:forward:把請求轉(zhuǎn)到一個新的頁面。 jsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記。 一般這些動作都具有一些描述自己的屬性,其中i d屬性和scope屬性是每一個JSP動作都具有的屬性。i d表示一個動作的

30、名稱,而scope則表示一個動作的作用域。scope作用域的取值見 下表。 (2) 動作 可能是JSP中最重要的一個動作,通過使用這個動作,JSP可以動態(tài)地使用JavaBean組件來擴充JSP的功能,由于JavaBean在開發(fā)上及在使用上的簡單明了,使得JSP的開發(fā)過程和以往其他動態(tài)網(wǎng)頁開發(fā)工具有了本質(zhì)上的區(qū)別。盡管ASP等動態(tài)網(wǎng)頁技術(shù)也可以使用組件技術(shù),但是由于ActiveX控件編寫上的復雜和使用上的不方便,實際的開發(fā)工作中組件技術(shù)使用得并不多。 的語法如下:typeSpec := class= className |class= className type= typeName |type

31、= typeName class= className |beanName= beanName type= typeName |type= typeName beanName= beanName |type= typeName如果在中需要加入其他的元素,那么使用下面的語法:body下面給出幾個例子:/JSP:useBean (3) 動作 動作用于向一個JavaBean的屬性賦值,需要注意的是,在這個動作中將會使用到的name屬性的值將是一個前面已經(jīng)使用動作引入的JavaBean的名字。的語法如下:prop_expr := property=* |property= propertyName|p

32、roperty= propertyName param= parameterName|property= propertyName value= propertyValuepropertyValue := string下面就動作舉幾個例子:將ServletRequest對象request中的參數(shù)全部輸入到名為request的JavaBean中:將ServletRequest對象user中的參數(shù)username輸入到名為user的JavaBean中: (4) 動作 動作用于從一個JavaBean中得到某個屬性的值,無論原先這個屬性是什么類型的,都將被轉(zhuǎn)換為一個String類型的值。jsp:get

33、Property有兩個必需的屬性:name(表示Bean的名字)和property(表示要提取哪個屬性的值)。其語法如下:例如: (6) 動作 用于引入一個靜態(tài)或動態(tài)的頁面到一個JSP文件中。動作可以包含一個或幾個子動作用于向要引入的頁面?zhèn)鬟f參數(shù)。 其語法如下:或 (6) 動作 用于引導客戶端的請求到另一個頁面或者是另一個Servlet去。動作可以包含一個或幾個子動作,用于向要引導進入的頁面?zhèn)鬟f參數(shù)。下面是的語法:或 * 舉例如下:JSP:forward page= /(7) 動作 實際上提供了名稱與值的一種一一對應關(guān)系,在、和中常常作為子動作使用。其語法為: (8) 動作 jsp:plugi

34、n動作用來根據(jù)瀏覽器的類型,插入通過Java插件 運行Java Applet所必需的OBJECT或EMBED元素。 7. JSP連接數(shù)據(jù)庫 在實際開發(fā)應用的時候,經(jīng)常需要訪問數(shù)據(jù)庫。通過JSP可以直接訪問數(shù)據(jù)庫,對于大型應用,這不是特別好的方法。但是對于有些應用,直接在JSP中訪問數(shù)據(jù)庫將使開發(fā)非常簡單。 訪問數(shù)據(jù)庫的時候,一定將JDBC的驅(qū)動程序放到服務器的類路徑里。下面給出使用JSP訪問MySQL數(shù)據(jù)庫的例子,這個例子要求在數(shù)據(jù)庫里建一個表student,有兩個字段比如為name,city,可以用create table student(name varchar(20), city var

35、char(20) 語句建立表,然后向這個表寫入一條測試紀錄。注意先將MySQL數(shù)據(jù)庫的JDBC驅(qū)動程序(比如mysql-connector-java-3.0.9 -stable-bin.jar)放到resin安裝目錄下的lib目錄下,然后就可以編寫JSP訪問數(shù)據(jù)庫了。 訪問數(shù)據(jù)庫里面的數(shù)據(jù)表的程序代碼如下:(文件名為mysql.jsp)。% /驅(qū)動程序名 String driverName=com.mysql.jdbc.Driver; /數(shù)據(jù)庫用戶名 String userName=root; /密碼 String userPasswd=; /數(shù)據(jù)庫名 String dbName=test;

36、/表名 String tableName=student; /連接字符串String url=jdbc:mysql:/localhost:3306/+dbName+?user= +userName+&password=+userPasswd; Class.forName(driverName).newInstance(); Connection connection=DriverManager.getConnection(url); Statement statement = connection.createStatement(); String sql=SELECT name,city F

37、ROM +tableName; ResultSet rs = statement.executeQuery(sql); /獲得數(shù)據(jù)結(jié)果集合 ResultSetMetaData rmeta = rs.getMetaData(); /確定數(shù)據(jù)集的列數(shù),亦字段數(shù) int numColumns=rmeta.getColumnCount(); / 輸出每一個數(shù)據(jù)值 out.print(名字); out.print(|); out.print(城市); out.print(); while(rs.next() out.print(rs.getString(1)+ ); out.print(|);out.p

38、rint(rs.getString(2);out.print(); out.print(); out.print(共+numColumns+條記錄); rs.close(); statement.close(); connection.close(); % 第六章.服務器端開發(fā)技術(shù)JSP及JavaBean第一節(jié).JSP第二節(jié).JavaBean第三節(jié).JSP、JavaBean及Servlet組合開發(fā)第四節(jié).開發(fā)框架、模式介紹第二節(jié) JavaBean 1. JavaBean概述 (1) JavaBean的作用 在Java模型中,通過JavaBean可以無限擴充Java程序的功能,通過JavaBea

39、n的組合可以快速的生成新的應用程序。對于程序員來說,最好的一點就是JavaBean可以實現(xiàn)代碼的重復利用,另外對于程序的易維護性等等也有很重大的意義。 JavaBean傳統(tǒng)的應用在于可視化的領(lǐng)域,如AWT下的應用。自從JSP誕生后,JavaBean更多的應用在了非可視化領(lǐng)域,在服務器端應用方面表現(xiàn)出來了越來越強的生命力。下面主要討論的是非可視化的JavaBean。非可視化的JavaBean,顧名思義就是沒有GUI界面的JavaBean。在JSP程序中常用來封裝事務邏輯、數(shù)據(jù)庫操作等等,可以很好地實現(xiàn)業(yè)務邏輯和前臺程序(如JSP文件)的分離,使得系統(tǒng)具有更好的健壯性和靈活性。 (2) JavaB

40、ean應遵守的規(guī)定 本質(zhì)上JavaBean是一個Java類,只不過JavaBean在書寫的時候要遵守一些約定(JavaBean規(guī)范)。下面是JavaBean必須遵守的:一個javaBean類必須是一個公共類 一個javaBean類必須有一個空的構(gòu)造函數(shù) 一個javaBean類不應有公共實例變量 持有值應該通過一組存取方法(getXxx和setXxx)來訪問 2.稅率設置和讀取的JavaBean示例 (1) TaxRate.java 該示例創(chuàng)建了一個名為 TaxRate 的 Bean 。它有兩個屬性,即 Product(產(chǎn)品)和 Rate (稅率)。兩個 set 方法分別用來設置這兩個屬性,兩個

41、 get 方法則用于提取這兩個屬性。在實際應用中,這種 Bean 一般應當從數(shù)據(jù)庫提取稅率值,此處我們簡化了這個過程,允許任意設定稅率。下面是這個 Bean 的代碼(TaxRate.java)清單: public class TaxRate String Product; double Rate; public TaxRate() this.Product = car; this.Rate = 15; public void setProduct (String ProductName) this.Product = ProductName; public String getProduct(

42、) return (this.Product); public void setRate (double rateValue) this.Rate = rateValue; public double getRate () return (this.Rate); (2) JSP 示例頁面 在 JSP 頁面中應用上述 Bean 要用到 標記。依賴于具體使用的 JSP 引擎的不同,在何處配置以及如何配置 Bean 的方法也可能略有不同。下面是一個應用上述 Bean 的示例頁面: 提取 Bean 屬性值使用方法 1 : 產(chǎn)品 : 稅率 : 提取 Bean 屬性值使用方法 2 : 產(chǎn)品 : 稅率 :

43、上例使用 標記內(nèi)的屬性id 定義了整個 JSP 頁面內(nèi)該 Bean 的標識taxbean, scope 屬性定義了該 Bean 的生存時間, class 屬性說明了實現(xiàn)該Bean的類文件全名)。這個 JSP 頁面用兩種方法提取taxbean的屬性值,使用set 和 get 方法設置和提取屬性值;使用 標記。 中的 name 屬性的值即為 中定義的 Bean 的 id屬性值taxbean,它的 property 屬性指定的是目標屬性的名字(比如Product或者Rate)。 3.注冊個人信息的JavaBean示例 這個例子中包含1個HTML頁面(register.html),1個JSP頁面,2個

44、JavaBean,通過HTML頁面輸入用戶注冊信息,提交到JSP頁面,JSP頁面里面使用了2個JavaBean,1個用于獲取HTML頁面提交的信息,另外一個JavaBean將注冊信息提交到數(shù)據(jù)庫。該例子使用Mysql數(shù)據(jù)庫,要求在數(shù)據(jù)庫里建一個表Person, 可以用create table person(name varchar(20), sex varchar(8),birthday varchar(10),email varchar(30) 語句建立表。訪問數(shù)據(jù)庫的時候,一定將JDBC的驅(qū)動程序放到服務器的類路徑里。每執(zhí)行一次新用戶注冊,數(shù)據(jù)表表Person就會多一條新記錄。該例子包括四

45、個文件:register.html負責顯示個人信息編輯頁面register.jsp 注冊提交的處理頁面UserRegister.java 負責儲存?zhèn)€人信息到數(shù)據(jù)庫Person.java做為JavaBean接收register.html輸入的個人 信息,并傳遞給UserRegister JavaBean處理. register.htm :名字性別男 女出生日期電子郵箱register.jsp :Person.java :public class Person private String name; private String sex; private String birthday; pri

46、vate String email; public Person() public void setName(String name) =name; public void setSex(String sex) this.sex=sex; public void setBirthday(String birthday) this.birthday=birthday; public void setEmail(String email) this.email=email; public String getName( ) return name; public String getSex( )

47、return sex; public String getBirthday( ) return birthday; public String getEmail( ) return this.email; UserRegister.java :import java.sql.*;public class UserRegister private Person person;private Connection con;public UserRegister() throws Exception String driverName=com.mysql.jdbc.Driver; String us

48、erName=root; String userPasswd=; /密碼 String dbName=test; /數(shù)據(jù)庫名 String tableName=student; /表名 /連接字符串如下 String url=jdbc:mysql:/localhost:3306/+dbName+?user= +userName+&password=+userPasswd; Class.forName(driverName).newInstance(); con =DriverManager.getConnection(url);public void setPerson(Person pers

49、on)this.person=person;public void regist() throws ExceptionString reg=insert into person values(?,?,?,?);PreparedStatement stmt=con.prepareStatement( reg);stmt.setString(1,person.getName() );stmt.setString(2,person.getSex() );stmt.setString(3,person.getBirthday() );stmt.setString(4,person.getEmail()

50、 );stmt.executeUpdate();第六章.服務器端開發(fā)技術(shù)JSP及JavaBean第一節(jié).JSP第二節(jié).JavaBean第三節(jié).JSP、JavaBean及Servlet組合開發(fā)第四節(jié).開發(fā)框架、模式介紹第三節(jié) JSP、JavaBean及Servlet組合開發(fā) 1. JSP +JDBC模式 在JSP中可以直接使用JDBC去訪問數(shù)據(jù)庫,取得數(shù)據(jù)后可以進行處理進而完成業(yè)務邏輯。在這種情況下,瀏覽器直接訪問一個JSP頁面,這個JSP頁面處理請求(可能通過JDBC訪問數(shù)據(jù)庫)并生成動態(tài)內(nèi)容,然后和模板數(shù)據(jù)一起生成一個標準HTML文本并發(fā)回給瀏覽器顯示。 2. Servlet+JSP+Jav

51、aBean模式 Servlet、JSP結(jié)合JavaBean的開發(fā)模式也是常用的開發(fā)模式,使用這種模式,我們就能夠?qū)崿F(xiàn)業(yè)務邏輯和頁面顯示的分離,并創(chuàng)建復用程度更高的組件。這樣模式的工作原理如下圖所示: 3.綜合開發(fā)示例 (1)注冊個人信息實例概述 這個例子先訪問一個注冊HTML頁面,點擊提交按鈕后調(diào)用一個Servlet,Servlet可以進行注冊用戶邏輯處理(比如保存到數(shù)據(jù)庫,數(shù)據(jù)庫操作代碼省略),將處理結(jié)果放置在一個JavaBean中,然后請求轉(zhuǎn)發(fā)給JSP,JSP根據(jù)JavaBean的內(nèi)容生成HTML文本,發(fā)送給瀏覽器顯示。 這個例子實現(xiàn)一個常見的注冊個人信息的功能。它包括四個文件:regis

52、ter.html負責顯示個人信息編輯頁面registerConfirm.jsp 負責顯示個人信息確認頁面Person.Java做為JavaBean在Servlet和JSP之間傳遞信息RegisterServlet.Java負責儲存?zhèn)€人信息并轉(zhuǎn)發(fā)請求 register.html :名字性別男 女出生日期電子郵箱RegisterServlet.Java :import Javax.Servlet.http.*;public class RegisterServlet extends HttpServlet public void doPost (HttpServletRequest request

53、, HttpServletResponse response) try String name = request.getParameter(name); String sex = request.getParameter(sex); String birthday = request.getParameter(birthday); String email = request.getParameter(email); / 組建一個Person JavaBean Person person = new Person(); person.setName(name); person.setSex(

54、sex); person.setBirthday(birthday); person.setEmail(email); / 調(diào)用savePerson()方法將Person存儲到數(shù)據(jù)庫中 savePerson(person); / 回顯注冊信息到頁面上 request.setAttribute (person, person); / 轉(zhuǎn)發(fā)請求到確認頁面 getServletConfig().getServletContext().getRequestDispatcher (/registerConfirm.jsp).forward(request, response); catch (Excep

55、tion ex) ex.printStackTrace ();public void savePerson(Person person) / 未實現(xiàn),參考以前JDBC實現(xiàn)registerConfirm.jsp :注冊成功! 您的注冊信息是名字性別出生日期電子郵箱第六章.服務器端開發(fā)技術(shù)JSP及JavaBean第一節(jié).JSP第二節(jié).JavaBean第三節(jié).JSP、JavaBean及Servlet組合開發(fā)第四節(jié).開發(fā)框架、模式介紹第四節(jié) 開發(fā)框架、模式介紹1. EJB概述 (1) EJB的特點 EJB是用于開發(fā)和部署多層結(jié)構(gòu)的、分布式的、面向?qū)ο蟮腏ava應用系統(tǒng)的跨平臺的構(gòu)件體系結(jié)構(gòu)。采用EJB

56、可以使開發(fā)商業(yè)應用系統(tǒng)變得容易,應用系統(tǒng)可以在一個支持EJB的環(huán)境中開發(fā),開發(fā)完之后部署在其他的環(huán)境中,隨著需求的改變,應用系統(tǒng)可以不加修改地遷移到其他功能更強、更復雜的服務器上。 EJB簡化了多層體系結(jié)構(gòu)應用系統(tǒng)的開發(fā)過程。在分布式應用系統(tǒng)的開發(fā)中,采用多層體系結(jié)構(gòu)的方法有很多優(yōu)點,如增加了應用系統(tǒng)的可伸縮性的、可靠性、靈活性等。因為服務器端構(gòu)件可以根據(jù)應用需求迅速地加以修改,且構(gòu)件在網(wǎng)絡中的位置和應用無關(guān),因此系統(tǒng)管理員可以很容易地重新配置系統(tǒng)的負載。多層體系結(jié)構(gòu)非常適合于大數(shù)據(jù)量的商業(yè)事務系統(tǒng),特別是在基于Web的應用中,需要多層體系結(jié)構(gòu)支持瘦客戶機及瀏覽器的快速Applet下載。目前,

57、越來越多的系統(tǒng)開始采用多層體系結(jié)構(gòu)的方法。 (2)常用開發(fā)模式 在一個較為復雜的多層體系結(jié)構(gòu)中,EJB可以和JSP、Servlet一起使用。常用開發(fā)模式可以用下圖來表示: 在這個開發(fā)模式中,Servlet調(diào)用EJB的接口,EJB來執(zhí)行和數(shù)據(jù)庫的交互及其他操作,并把操作結(jié)果返回給Servlet,Servlet再將請求轉(zhuǎn)發(fā)給JSP。這樣做的結(jié)果就是進一步分離了系統(tǒng)各個部分的職責,Servlet負責控制流程,EJB負責數(shù)據(jù)訪問和業(yè)務邏輯處理,JSP負責顯示。實際上,這也是目前流行的MVC(Model、View、Controller)模式的一種體現(xiàn)。對MVC有興趣的讀者可以查閱其他資料進一步對其研究。

58、 在EJB出現(xiàn)之后,J2EE領(lǐng)域各種技術(shù)快速涌現(xiàn)。尤其是建立在J2EE基礎技術(shù)之上的高層開發(fā)模式和開發(fā)框架進展較快。在開發(fā)模式方面,MVC模式已經(jīng)屬于公認的J2EE應用的標準模式。各種開發(fā)框架都無一例外的可以歸納為MVC的全部或部分實現(xiàn),其中影響較大的是著重于控制層的Struts,著重于整合各層不同技術(shù)的Spring,和各種持久層框架如Hibernate等。 2. Struts簡介 Struts是最早應用MVC的開發(fā)框架之一。 要理解Struts,先要對MVC有一定的了解。下面先介紹它,再講解Struts。 (1) MVC簡介 MVC是ModelViewController的簡寫。Model

59、代表的是應用的業(yè)務邏輯(通過JavaBean,EJB組件實現(xiàn)), View 是應用的表示面(由JSP頁面產(chǎn)生),Controller 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重用。 下圖是一個簡單的MVC結(jié)構(gòu)示意圖。圖中可以看到前面所講的Servlet、JSP、JavaBean都可以分別對應于MVC中的控制器,視圖和模型部分。 (2) Struts Struts本質(zhì)上是一種開發(fā)框架。Struts遵循MVC的基本思想,并主要在控制層從優(yōu)化程序結(jié)構(gòu)和方便應用開發(fā)的角度做了很多擴展工作。除此之外St

60、rtus還提供了很多附屬的工具和定制標簽。 Struts的框架結(jié)構(gòu) 和其他架構(gòu)比較而言,Struts致力于成為一個功能最精簡的開發(fā)框架,將一般開發(fā)項目中最具有共性的控制部分抽取出來,而不是試圖實現(xiàn)一個完整系統(tǒng)中所有部分。這樣做的好處是,使用Struts對每個系統(tǒng)實現(xiàn)特定的業(yè)務邏輯帶來的限制較少。Struts也可以很容易的和其他框架和技術(shù)整合。其結(jié)構(gòu)可以示意如下圖: Struts的操作流程 首先,控制器(ActionServlet)進行初始化工作,讀取配置文件(struts-config.xml),為不同的Struts模塊初始化相應的ModuleConfig對象。比如配置文件中的Action映射

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論