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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

12、int(DataType)是兩個(gè)主要的輸出方法,它們的區(qū)別在于println輸出后換行,print輸出后不換行。下例簡(jiǎn)單地使用out對(duì)象把系統(tǒng)時(shí)間輸入到瀏覽器上。 out對(duì)象使用實(shí)例 % 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ù)名字設(shè)置/獲得屬性getParameter根據(jù)名字得到參數(shù)的值getParameterName 獲取所有參數(shù)的名字列表getRemoteAddr 得到客戶端(瀏覽器)的IP地址getAttributeName 獲取所有屬性的名字列表 setAttribute與getAttribute方法實(shí)例 下面的mainreq.jsp包含了import.jsp文件,先執(zhí)行import.jsp,在 import.jsp中設(shè)置了屬性friend的值為Tom,在這之后mainreq.jsp的被執(zhí)行,瀏覽器上

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

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

16、字(多個(gè)參數(shù)名字都放到Enumeration類型的對(duì)象中),通過遍歷Enumeration類型的對(duì)象拿到每個(gè)名字,并利用名字作為參數(shù)調(diào)用getParameter方法取得該參數(shù)的值,進(jìn)而在瀏覽器屏幕上顯示該參數(shù)。顯示所有參數(shù)后,同時(shí)調(diào)用getRemoteAddr方法顯示客戶端的IP地址。 getParameterNameMain1.jsp getParameterName()方法使用實(shí)例 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對(duì)象可以用于在JSP給瀏覽器響應(yīng)的時(shí)候設(shè)置與響應(yīng)相關(guān)的參數(shù),比如使用response對(duì)象的setHeader方法可以設(shè)置各種響應(yīng)頭屬性,其中refresh屬性可以設(shè)施頁(yè)面自動(dòng)刷新。下例(respon

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

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

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

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

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

23、removeAttribute()方法可以將相關(guān)的屬性和值保存到該對(duì)象和從該對(duì)象中取出。 下例(appAtt.jsp)展示了如何使用這些方法。該例把用戶名和口令這兩個(gè)變量作為屬性,先使用setAttribute方法將它們保存到Applicationd對(duì)象中,然后又使用getAttribute方法從中取出并顯示將其到頁(yè)面上。在這之后,使用removeAttribute方法刪除屬性password,然后再去獲得password屬性的值,由于已經(jīng)刪除,所有結(jié)果都只返回null。 appAtt.jsp: Application對(duì)象方法實(shí)例 % 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、 另一個(gè)方法getAttributeNames()將當(dāng)前Application對(duì)象中保存的所有的屬性的名字都取出來(lái)。這個(gè)方法也很有用,下面給出一個(gè)例子(getAttName.jsp) Application對(duì)象方法實(shí)例 % 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指令描述了和頁(yè)面相關(guān)的指示信息,定義了JSP文件中的全局屬性。在一個(gè)JSP頁(yè)面中, page指令可以出現(xiàn)多次,但是每一種屬性卻只能出現(xiàn)一次,發(fā)生重復(fù)的屬性設(shè)置時(shí),后面的設(shè)置將覆蓋掉先前的設(shè)置。 page指令的基本

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

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

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

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

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

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

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

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

35、char(20) 語(yǔ)句建立表,然后向這個(gè)表寫入一條測(cè)試紀(jì)錄。注意先將MySQL數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序(比如mysql-connector-java-3.0.9 -stable-bin.jar)放到resin安裝目錄下的lib目錄下,然后就可以編寫JSP訪問數(shù)據(jù)庫(kù)了。 訪問數(shù)據(jù)庫(kù)里面的數(shù)據(jù)表的程序代碼如下:(文件名為mysql.jsp)。% /驅(qū)動(dòng)程序名 String driverName=com.mysql.jdbc.Driver; /數(shù)據(jù)庫(kù)用戶名 String userName=root; /密碼 String userPasswd=; /數(shù)據(jù)庫(kù)名 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(); / 輸出每一個(gè)數(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(); % 第六章.服務(wù)器端開發(fā)技術(shù)JSP及JavaBean第一節(jié).JSP第二節(jié).JavaBean第三節(jié).JSP、JavaBean及Servlet組合開發(fā)第四節(jié).開發(fā)框架、模式介紹第二節(jié) JavaBean 1. JavaBean概述 (1) JavaBean的作用 在Java模型中,通過JavaBean可以無(wú)限擴(kuò)充Java程序的功能,通過JavaBea

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

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

41、 get 方法則用于提取這兩個(gè)屬性。在實(shí)際應(yīng)用中,這種 Bean 一般應(yīng)當(dāng)從數(shù)據(jù)庫(kù)提取稅率值,此處我們簡(jiǎn)化了這個(gè)過程,允許任意設(shè)定稅率。下面是這個(gè) 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 示例頁(yè)面 在 JSP 頁(yè)面中應(yīng)用上述 Bean 要用到 標(biāo)記。依賴于具體使用的 JSP 引擎的不同,在何處配置以及如何配置 Bean 的方法也可能略有不同。下面是一個(gè)應(yīng)用上述 Bean 的示例頁(yè)面: 提取 Bean 屬性值使用方法 1 : 產(chǎn)品 : 稅率 : 提取 Bean 屬性值使用方法 2 : 產(chǎn)品 : 稅率 :

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

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

45、個(gè)文件:register.html負(fù)責(zé)顯示個(gè)人信息編輯頁(yè)面register.jsp 注冊(cè)提交的處理頁(yè)面UserRegister.java 負(fù)責(zé)儲(chǔ)存?zhèn)€人信息到數(shù)據(jù)庫(kù)Person.java做為JavaBean接收register.html輸入的個(gè)人 信息,并傳遞給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ù)庫(kù)名 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();第六章.服務(wù)器端開發(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ù)庫(kù),取得數(shù)據(jù)后可以進(jìn)行處理進(jìn)而完成業(yè)務(wù)邏輯。在這種情況下,瀏覽器直接訪問一個(gè)JSP頁(yè)面,這個(gè)JSP頁(yè)面處理請(qǐng)求(可能通過JDBC訪問數(shù)據(jù)庫(kù))并生成動(dòng)態(tài)內(nèi)容,然后和模板數(shù)據(jù)一起生成一個(gè)標(biāo)準(zhǔn)HTML文本并發(fā)回給瀏覽器顯示。 2. Servlet+JSP+Jav

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

52、ter.html負(fù)責(zé)顯示個(gè)人信息編輯頁(yè)面registerConfirm.jsp 負(fù)責(zé)顯示個(gè)人信息確認(rèn)頁(yè)面Person.Java做為JavaBean在Servlet和JSP之間傳遞信息RegisterServlet.Java負(fù)責(zé)儲(chǔ)存?zhèn)€人信息并轉(zhuǎn)發(fā)請(qǐng)求 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); / 組建一個(gè)Person JavaBean Person person = new Person(); person.setName(name); person.setSex(

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論