JavaWeb程序設(shè)計(jì)與案例教程第4章JSP編程課件_第1頁
JavaWeb程序設(shè)計(jì)與案例教程第4章JSP編程課件_第2頁
JavaWeb程序設(shè)計(jì)與案例教程第4章JSP編程課件_第3頁
JavaWeb程序設(shè)計(jì)與案例教程第4章JSP編程課件_第4頁
JavaWeb程序設(shè)計(jì)與案例教程第4章JSP編程課件_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第4章 JSP編程第1頁,共100頁。本章內(nèi)容 JSP概述 JSP頁面代碼解析 JSP的工作原理 JSP的隱含對(duì)象 JSP標(biāo)簽與JavaBean JSP動(dòng)作標(biāo)簽 簡易購物商城系統(tǒng)第2頁,共100頁。4.1 JSP概述Java服務(wù)器頁面(Java Server Pages,JSP)是一種動(dòng)態(tài)頁面開發(fā)技術(shù)。JSP是在傳統(tǒng)的HTML代碼中插入Java程序段和JSP標(biāo)記而形成的擴(kuò)展名為“.jsp”的文件。JSP與Servlet一樣,是在服務(wù)器端執(zhí)行的。第3頁,共100頁。4.1 JSP概述JSP頁面的創(chuàng)建:首先在MyEclipse下,選擇FileNewWeb Project選項(xiàng)(見圖4.1),新建一個(gè)

2、Web Project項(xiàng)目,并輸入項(xiàng)目名稱“jsp_first”。圖4.1 新建Web Project項(xiàng)目“jsp_first”第4頁,共100頁。4.1 JSP概述在“WebRoot”文件夾上單擊鼠標(biāo)右鍵,會(huì)出現(xiàn)如圖4.2所示的功能菜單,選擇NewJSP(Advanced Templates)選項(xiàng),將彈出如圖4.3所示的JSP創(chuàng)建向?qū)?duì)話框。圖4.2 新建JSP第5頁,共100頁。4.1 JSP概述在“Create a new JSP page”對(duì)話框中的“File Name”文本框中輸入JSP頁面文件的名稱:first.jsp,然后單擊“Finish”按鈕完成設(shè)置。圖4.3 設(shè)置JSP信息

3、第6頁,共100頁。4.1 JSP概述此時(shí),在項(xiàng)目的工程文件夾“WebRoot”下,會(huì)出現(xiàn)一個(gè)first.jsp文件,雙擊該文件打開如圖4.4所示的頁面。圖4.4 自動(dòng)生成的first.jsp頁面代碼第7頁,共100頁。4.1 JSP概述將該Web項(xiàng)目部署到Tomcat,查看JSP頁面first.jsp的顯示效果,打開瀏覽器,輸入訪問路徑http:/localhost:8080/jsp_first/first.jsp,可看到該頁面的顯示效果與HTML文件的效果一致,如圖4.5所示。圖4.5 first.jsp的顯示效果第8頁,共100頁。4.2 JSP頁面代碼解析寫JSP就像在寫HTML,但H

4、TML只能為用戶提供靜態(tài)內(nèi)容,而JSP技術(shù)允許在頁面中嵌套Java代碼,為用戶提供動(dòng)態(tài)數(shù)據(jù)。第9頁,共100頁。4.2 JSP頁面代碼解析4.2.1 JSP指令元素4.2.2 JSP模板元素4.2.3 JSP腳本元素第10頁,共100頁。4.2.1 JSP指令元素通過分析MyEclipse通過模板新建的JSP頁面結(jié)構(gòu),可以看到每個(gè)JSP頁面的最上方都有代碼片段,該代碼片段是JSP語法中的指令語法結(jié)構(gòu)。JSP指令用來設(shè)置與整個(gè)JSP頁面相關(guān)的屬性,它并不直接產(chǎn)生任何可見的輸出,只是告訴JSP引擎如何處理JSP頁面,如網(wǎng)頁的編碼方式和腳本語言。JSP指令使用的語法格式如下: 第11頁,共100頁。

5、4.2.1 JSP指令元素指 令用 途范 例page設(shè)定JSP整體信息include在JSP內(nèi)包含其他JSP內(nèi)容taglib在JSP內(nèi)使用“自定義標(biāo)簽”JSP中常用的指令如表4.1所示第12頁,共100頁。4.2.1 JSP指令元素page指令的常用屬性及其功能描述如表4.2所示屬 性功 能 描 述buffer指定out對(duì)象使用緩沖區(qū)的大小autoFlush控制out對(duì)象的緩存區(qū)contentType指定當(dāng)前JSP頁面的MIME類型和字符編碼errorPage指定當(dāng)JSP頁面發(fā)生異常時(shí)需要轉(zhuǎn)向的錯(cuò)誤處理頁面isErrorPage指定當(dāng)前頁面是否可以作為另一個(gè)JSP頁面的錯(cuò)誤處理頁面pageEn

6、coding說明當(dāng)前頁面中的文字所使用的文字編碼import導(dǎo)入要使用的Java類info定義JSP頁面的描述信息isThreadSafe指定對(duì)JSP頁面的訪問是否為線程安全language定義JSP頁面所用的腳本語言,默認(rèn)是Javasession指定JSP頁面是否使用sessionisELIgnored指定是否執(zhí)行EL表達(dá)式isScriptingEnabled確定腳本元素能否被使用第13頁,共100頁。4.2.1 JSP指令元素打開first.jsp文件,可以看到在該頁面的第一行使用了page指令,如下所示。(1)language=java指定了JSP引擎要用什么語言來編譯JSP網(wǎng)頁。目前只

7、可以使用Java語言。(2)import=java.util.*表示在當(dāng)前JSP中按需導(dǎo)入java.util包下的所需的類,此處所指import屬性,與Java中的package、import使用方法相同。如果需要同時(shí)導(dǎo)入多個(gè)不同的包,可使用“,”對(duì)多個(gè)包進(jìn)行分隔。(3)pageEncoding說明當(dāng)前first.jsp中的文字所使用的文字編碼默認(rèn)為“ISO-8859-1”,但該編碼不支持中文,修改pageEncoding的值為“utf-8”來解決JSP文件中文件的保存第14頁,共100頁。4.2.2 JSP模板元素JSP頁面中的HTML內(nèi)容稱之為JSP模板元素。JSP模板元素定義了網(wǎng)頁的基本

8、骨架,即定義了頁面的結(jié)構(gòu)和外觀。例如,創(chuàng)建登錄界面login.jsp,其中頁面中包含username和password,以及“登錄”按鈕。login.jsp頁面的源代碼如下。第15頁,共100頁。4.2.2 JSP模板元素1 2 3 4 5 登錄界面6 7 8 9 username:10 password:11 12 13 14 第16頁,共100頁。4.2.3 JSP腳本元素在JSP頁面中有3種腳本元素(Scripting Elements),Java Scriptlet、JSP表達(dá)式和JSP聲明。(1)Java Scriptlet,Java Scriptlet是嵌入在JSP頁面中的Java

9、代碼段。Java Scriptlet是以結(jié)尾的標(biāo)簽。1 2 3 4 5 Java Scriptlet實(shí)例6 7 8 % 9 for(int i=0;i13 14 第17頁,共100頁。4.2.3 JSP腳本元素在JSP頁面中有3種腳本元素(Scripting Elements),Java Scriptlet、JSP表達(dá)式和JSP聲明。(2)JSP表達(dá)式,在Java的語法中,如果希望將數(shù)據(jù)通過標(biāo)準(zhǔn)輸出流打印到控制臺(tái)中,可使用“System.out”將數(shù)據(jù)打印到控制臺(tái),如圖4.8所示。如果希望將數(shù)據(jù)輸出到瀏覽器中進(jìn)行展示,可使用JSP表達(dá)式。JSP表達(dá)式是以“”結(jié)尾的標(biāo)簽,它作為Java語言表達(dá)式

10、的占位符。例如以下語句。第18頁,共100頁。4.2.3 JSP腳本元素在JSP頁面中有3種腳本元素(Scripting Elements): Java Scriptlet、JSP表達(dá)式和JSP聲明。(3)JSP聲明,JSP聲明可用于在JSP頁面中聲明變量和定義方法。聲明被放到以“”結(jié)尾的標(biāo)簽內(nèi),可以包含任意數(shù)量的、合法的Java聲明語句。下面是JSP聲明的一個(gè)例子。第19頁,共100頁。4.3 JSP的工作原理執(zhí)行JSP代碼需要在服務(wù)器上安裝JSP引擎,比較常見的引擎有WebLogic和Tomcat,下面將以Tomcat為例進(jìn)行講解。Tomcat接收到以“.jsp”為擴(kuò)展名的URL的訪問請(qǐng)求

11、時(shí),將該訪問請(qǐng)求交給JSP引擎去處理。Tomcat中的JSP引擎負(fù)責(zé)解釋和執(zhí)行JSP頁面。第20頁,共100頁。4.3 JSP的工作原理下面的JSP頁面jspDeclaration2.jsp,源代碼如下。1 2 3 4 5 6 JSP運(yùn)行原理7 8 9 11 15 16 17 18 第21頁,共100頁。4.3 JSP的工作原理保存好文件后,打開文件夾“%CATALINA_HOME%workCatalinalocalhostjsp_firstorgapachejsp”,可以看到該文件夾下存放了多個(gè)Java源碼文件,如圖4.12所示。圖4.12 轉(zhuǎn)換后的servlet源碼第22頁,共100頁。4

12、.3 JSP的工作原理其中包括jspDeclaration2_jsp.java和jspDeclaration2_jsp.class,分別對(duì)應(yīng)jspDeclaration2.jsp文件經(jīng)過JSP解析引擎轉(zhuǎn)換后的Servlet類,以及這個(gè)Servlet類編譯后的字節(jié)碼文件。打開其中的jspDeclaration2_jsp.java文件,分析一下這個(gè)解析后的Servlet與JSP源文件之間的關(guān)系,如圖4.13所示。圖4.13 定義jspDeclaration2_.jsp類第23頁,共100頁。4.3 JSP的工作原理4.3.1 JSP與servlet的關(guān)系4.3.2 JSP的執(zhí)行流程第24頁,共10

13、0頁。4.3.1 JSP與servlet的關(guān)系jspDeclaration2_jsp類繼承自org.apache.jasper.runtime.HttpJspBase而HttpJspBase實(shí)現(xiàn)了javax.servlet.Servlet接口從而jspDeclaration2_jsp類間接實(shí)現(xiàn)了javax.servlet.Servlet接口,所以稱jspDeclaration2_jsp類是一個(gè)Servlet類第25頁,共100頁。4.3.2 JSP的執(zhí)行流程JSP頁面在第一次被訪問時(shí),JSP引擎將它翻譯成一個(gè)Servlet源程序,接著再把這個(gè)Servlet源程序編譯成Servlet的class

14、類文件,然后再由Web容器(Servlet引擎)以調(diào)用普通Servlet程序一樣的方式來裝載和解釋執(zhí)行這個(gè)由JSP頁面翻譯成的Servlet程序,如圖4.16所示W(wǎng)eb容器查找JSP文件存在首次訪問請(qǐng)求*.jsp響應(yīng)結(jié)果返回響應(yīng)結(jié)果Jasper轉(zhuǎn)換JSP為Servlet代碼編譯Servlet生成.class文件調(diào)用service方法圖4.16 JSP的執(zhí)行流程第26頁,共100頁。4.4 JSP的隱含對(duì)象每個(gè)JSP頁面在第一次被訪問時(shí),Web容器都會(huì)把請(qǐng)求交給JSP引擎(即一個(gè)Java程序)去處理。JSP引擎先將JSP翻譯成一個(gè)_jspServlet,然后按照Servlet的調(diào)用方式進(jìn)行調(diào)用。

15、JSP引擎在調(diào)用JSP對(duì)應(yīng)的_jspServlet時(shí),會(huì)傳遞或創(chuàng)建一些與Web開發(fā)相關(guān)的對(duì)象供_jspServlet使用。第27頁,共100頁。4.4 JSP的隱含對(duì)象JSP中預(yù)先傳遞和定義了9個(gè)這樣的對(duì)象,分別為request、response、session、application、out、pagecontext、config、page、exception。表4.3介紹了每個(gè)對(duì)象的具體類型。序 號(hào)內(nèi) 置 對(duì) 象類 型1pageContextjavax.servlet.jsp.PageContext2Requestjavax.servlet.http.HttpServletRequest3R

16、esponsejavax.servlet.http.HttpServletResponse4Sessionjavax.servlet.http.HttpSession5Applicationjavax.servlet.ServletContext6Configjavax.servlet.ServletConfig7Outjavax.servlet.jsp.JspWriter8Pagejava.lang.Object9Exceptionjava.lang.Throwable表4.3 JSP的9個(gè)隱含對(duì)象第28頁,共100頁。4.4 JSP的隱含對(duì)象打開jspDeclaration2.jsp轉(zhuǎn)換后

17、的Servlet類文件jspDeclaration2.jsp_jsp.java,可以看到這9個(gè)內(nèi)置對(duì)象的定義格式,如圖4.17所示。圖4.17 內(nèi)置對(duì)象的傳遞和定義第29頁,共100頁。4.4 JSP的隱含對(duì)象4.4.1 response與out對(duì)象4.4.2 4個(gè)作用域?qū)ο?.4.3 pageContext對(duì)象4.4.4 config對(duì)象4.4.5 exception對(duì)象第30頁,共100頁。4.4.1 response與out對(duì)象response對(duì)象代表對(duì)客戶端的響應(yīng),主要是將JSP容器處理過的對(duì)象傳回到客戶端。response對(duì)象也具有作用域,但只在JSP頁面內(nèi)有效。out對(duì)象用于向客戶

18、端發(fā)送文本數(shù)據(jù)。JSP頁面中的out對(duì)象的類型為JspWriter,其作用和用法與ServletResponse對(duì)象的getWriter方法返回的PrintWriter對(duì)象非常相似。JspWriter相當(dāng)于一種帶緩存功能的PrintWriter,設(shè)置JSP頁面的page指令的buffer屬性可以設(shè)置其緩存大小,或者關(guān)閉緩存。第31頁,共100頁。4.4.1 response與out對(duì)象例如,在jsp_first項(xiàng)目中新建currentTime.jsp,實(shí)現(xiàn)一個(gè)實(shí)時(shí)顯示當(dāng)前時(shí)間的頁面,該頁面每隔1秒刷新一次,顯示新的時(shí)間。具體的實(shí)現(xiàn)代碼如下。1 3 4 5 6 實(shí)時(shí)刷新時(shí)間效果7 8 9 16

19、17 第32頁,共100頁。4.4.2 4個(gè)作用域?qū)ο笤赪eb開發(fā)中存在4種范圍的作用域,分別為當(dāng)前頁面、一次請(qǐng)求、一次會(huì)話以及整個(gè)Web生命周期。開發(fā)者可以借助于對(duì)應(yīng)的作用域?qū)ο髞碓L問不同作用域中的數(shù)據(jù),在JSP中將使用page、request、session以及application這4個(gè)隱含對(duì)象來訪問當(dāng)前頁面、一次請(qǐng)求、一次會(huì)話以及整個(gè)Web生命周期4個(gè)作用域中的數(shù)據(jù)。第33頁,共100頁。4.4.2 4個(gè)作用域?qū)ο骔eb中的page、request、session以及application 4個(gè)隱含對(duì)象,擁有各自獨(dú)立的“Key/value”容器,用來存放“Key/value”對(duì)格式的數(shù)

20、據(jù)。4個(gè)作用域范圍實(shí)際上指的是這4個(gè)代表作用域的對(duì)象的生命周期。(1)page里的“Key/value”,只要頁面跳轉(zhuǎn)了,它們就不見了。如果把“Key/value”放到pageContext里,就說明它的作用域是page,它的有效范圍只在當(dāng)前jsp頁面里。從“Key/value”放到pageContext開始,到j(luò)sp頁面結(jié)束,可以使用這個(gè)“Key/value”。第34頁,共100頁。4.4.2 4個(gè)作用域?qū)ο螅?)request里的“Key/value”可以跨越forward前后的兩頁。但是只要刷新頁面,它們就重新計(jì)算。如果把“Key/value”放到request里,就說明它的作用域是re

21、quest,它的有效范圍是一次請(qǐng)求。(3)session里“Key/value”的有效范圍是一次會(huì)話,只要關(guān)閉瀏覽器,再次重啟瀏覽器訪問該頁,session里的“Key/value”就失效了。(4) application里“Key/value”的有效范圍是整個(gè)Web應(yīng)用,除非重啟Tomcat,否則“Key/value”會(huì)一直存在。整個(gè)應(yīng)用是指從應(yīng)用啟動(dòng),到應(yīng)用結(jié)束。第35頁,共100頁。4.4.3 pageContext對(duì)象pageContext對(duì)象是JSP技術(shù)中最重要的一個(gè)對(duì)象,它代表JSP頁面的運(yùn)行環(huán)境,這個(gè)對(duì)象不僅封裝了對(duì)其他八大隱式對(duì)象的引用,它自身還是一個(gè)域?qū)ο螅ㄈ萜鳎梢杂脕肀?/p>

22、存數(shù)據(jù)。此外,該對(duì)象還封裝了Web開發(fā)中經(jīng)常涉及的一些操作,例如,引入其他資源、檢索其他域?qū)ο笾械膶傩缘?。?6頁,共100頁。4.4.3 pageContext對(duì)象pageContext封裝其他隱含對(duì)象的意義如果在編程過程中,把pageContext對(duì)象傳遞給一個(gè)普通的Java對(duì)象,那么這個(gè)Java對(duì)象將可以獲取八大隱式對(duì)象,此時(shí)這個(gè)Java對(duì)象就可以和瀏覽器交互了,這個(gè)Java對(duì)象就成為了一個(gè)動(dòng)態(tài)Web資源。這就是pageContext封裝其他八大內(nèi)置對(duì)象的意義,把pageContext傳遞給誰,誰就能成為一個(gè)動(dòng)態(tài)Web資源。第37頁,共100頁。4.4.3 pageContext對(duì)象pa

23、geContext作用域?qū)ο髉ageContext對(duì)象可以作為容器來使用,因此可以將一些數(shù)據(jù)存儲(chǔ)在pageContext對(duì)象中。pageContext對(duì)象的常用方法如下:public void setAttribute(java.lang.String name,java.lang.Object value);public java.lang.Object getAttribute(java.lang.String name,int scope);public void removeAttribute(java.lang.String name);public java.lang.Object

24、 findAttribute(java.lang.String name)。第38頁,共100頁。4.4.3 pageContext對(duì)象pageContext進(jìn)行跳轉(zhuǎn)pageContext類中定義了一個(gè)forward方法來簡化和替代RequestDispatcher. forward方法。使用pageContext的forward方法跳轉(zhuǎn)到其他頁面的代碼如下。1 2 3 4 5 使用pageContext的forward方法跳轉(zhuǎn)頁面6 7 第39頁,共100頁。4.4.4 config對(duì)象config 對(duì)象的主要作用是取得服務(wù)器的配置信息。通過pageConext對(duì)象的 getServletC

25、onfig() 方法可以獲取一個(gè)config對(duì)象。當(dāng)一個(gè)Servlet 初始化時(shí),容器把某些信息通過 config對(duì)象傳遞給這個(gè)Servlet。開發(fā)者可以在web.xml 文件中為應(yīng)用程序環(huán)境中的Servlet程序和JSP頁面提供初始化參數(shù)。第40頁,共100頁。4.4.4 config對(duì)象config對(duì)象的幾個(gè)方法分別是:(1)public String getParameter(String name),返回指定名稱name的初始化參數(shù)值,如果參數(shù)不存在則返回null;(2)public java.util.Enumeration getinitParameterNames(),得到所有初

26、始化參數(shù)名稱的枚舉;(3)public ServletContext getServletContext(),返回Servlet或JSP頁面所屬的ServletContext的一個(gè)引用;(4)public String getServletName(),返回Servlet實(shí)例或JSP頁面的名稱,此名稱可以在Web應(yīng)用部署描述文件中指定。對(duì)于一個(gè)未注冊(cè)(即未命名)的Servlet實(shí)例或JSP頁面,將返回該Servlet類的類名。在以下JSP頁面代碼中,使用了config的一個(gè)方法getServletName()第41頁,共100頁。4.4.5 exception對(duì)象exception 對(duì)象用于顯

27、示異常信息,只有在包含 isErrorPage=true 的頁面中才可使用,在一般的JSP頁面中使用該對(duì)象將無法編譯JSP文件。exception對(duì)象和Java的所有對(duì)象一樣,都具有系統(tǒng)提供的繼承結(jié)構(gòu)。在Java程序中,可以使用try/catch關(guān)鍵字來處理異常情況,如果在JSP頁面中出現(xiàn)沒有捕獲到的異常,就會(huì)生成exception對(duì)象,并把 exception 對(duì)象傳送到在page指令中設(shè)定的錯(cuò)誤頁面中,然后在錯(cuò)誤頁面中進(jìn)行處理。第42頁,共100頁。4.5 JSP標(biāo)簽與JavaBean為了簡化Web編程,JSP頁面內(nèi)置了支持一些以“jsp”為前綴的標(biāo)簽,被稱為JSP標(biāo)簽。其中用于數(shù)據(jù)處理的

28、JSP標(biāo)簽需要與后端JavaBean實(shí)體對(duì)象一起使用,能夠有效減少JSP頁面中的Java代碼量。第43頁,共100頁。4.5 JSP標(biāo)簽與JavaBean4.5.1 JavaBean概述4.5.2 標(biāo)簽4.5.3 標(biāo)簽4.5.4 標(biāo)簽第44頁,共100頁。4.5.1 JavaBean概述JavaBean在Web開發(fā)中通常用于封裝數(shù)據(jù),其他程序可以通過反射技術(shù)實(shí)例化JavaBean對(duì)象,并且通過反射遵守命名規(guī)范的方法,獲知JavaBean的屬性,進(jìn)而調(diào)用其屬性保存數(shù)據(jù)。JavaBean的屬性可以是任意類型,且一個(gè)JavaBean可以有多個(gè)屬性,每個(gè)屬性通常都需要具有相應(yīng)的setter、gette

29、r方法,setter方法稱為屬性修改器,getter方法稱為屬性訪問器。第45頁,共100頁。4.5.1 JavaBean概述屬性修改器必須以小寫的set前綴開始,后跟屬性名,且屬性名的第一個(gè)字母必須為大寫。例如,name屬性的修改器名稱為setName,password屬性的修改器名稱為setPassword。屬性訪問器通常以小寫的get前綴開始,后跟屬性名,且屬性名的第一個(gè)字母也必須為大寫。例如,name屬性的訪問器名稱為getName,password屬性的訪問器名稱為getPassword。第46頁,共100頁。4.5.1 JavaBean概述JavaBean是一個(gè)遵循特定寫法的Jav

30、a類,它通常具有如下特點(diǎn):提供一個(gè)默認(rèn)的無參構(gòu)造函數(shù);需要被序列化并且實(shí)現(xiàn)了Serializable接口;可能有一系列可讀/寫屬性;可能有一系列的“getter”或“setter”方法。JavaBean示例代碼如下。第47頁,共100頁。4.5.1 JavaBean概述1 public class Person 2 private String name;3 private int age;4 public String getName() 5 return name;6 7 public void setName(String name) 8 = name;9 10 public int g

31、etAge() 11 return age;12 13 public void setAge(int age) 14 this.age = age;15 16 public Person(String name, int age) 17 super();18 = name;19 this.age = age;20 21 public Person()22 23 Override24 public String toString() 25 return name;26 27 第48頁,共100頁。4.5.1 JavaBean概述用戶在進(jìn)行JSP開發(fā)的時(shí)候,一般不允許在JSP頁面中使用Java S

32、criptlet腳本,因此需盡量替換掉JSP頁面中的相關(guān)Java代碼。JSP技術(shù)提供了3個(gè)關(guān)于JavaBean組件的JSP標(biāo)簽,來實(shí)現(xiàn)對(duì)有關(guān)JavaBean操作代碼的替換,它們分別為:標(biāo)簽,用于在JSP頁面中查找或?qū)嵗粋€(gè)JavaBean組件;標(biāo)簽,用于在JSP頁面中設(shè)置一個(gè)JavaBean組件的屬性;標(biāo)簽,用于在JSP頁面中獲取一個(gè)JavaBean組件的屬性。第49頁,共100頁。4.5.2 標(biāo)簽通過使用標(biāo)簽可以在JSP中聲明一個(gè)JavaBean,聲明后,JavaBean對(duì)象就成了腳本變量,可以通過腳本元素或其他自定義標(biāo)簽來訪問。標(biāo)簽的語法格式如下:第50頁,共100頁。4.5.2 標(biāo)簽接

33、下來看看標(biāo)簽的一個(gè)簡單用法,編寫useBean.jsp頁面的代碼如下。1 2 3 4 5 useBean定義6 7 8 9 10 11 12 13 14 15 21 22 第51頁,共100頁。4.5.2 標(biāo)簽上面這段代碼分別定義了存放于4個(gè)作用域中的4個(gè)entry.Person類型的對(duì)象p_page、p_request、p_session、p_application。標(biāo)簽的id屬性代表了這個(gè)對(duì)象的引用變量名稱,并且在每個(gè)作用域進(jìn)行存放時(shí)所使用的key的名稱也是該id,為4個(gè)對(duì)象的name屬性進(jìn)行賦值。用戶可以直接在JSP腳本片段中通過id的值來訪問對(duì)應(yīng)的JavaBean對(duì),上述代碼中的p_p

34、age對(duì)象的定義方式為“”,其功能與下列代碼的含義一致,一般用來替換下列JSP腳本中的Java源碼: 第52頁,共100頁。4.5.3 標(biāo)簽標(biāo)簽的主要功能是為對(duì)象設(shè)置屬性值,被設(shè)置值的對(duì)象可以是通過標(biāo)簽定義的對(duì)象,也可以是通過其他任何方式放置到4大作用域范圍內(nèi)的對(duì)象。標(biāo)簽在使用時(shí),有4種語法格式,分別是:jsp:setProperty name=beanName property=屬性名 value= /第53頁,共100頁。4.5.3 標(biāo)簽其中,標(biāo)簽有4個(gè)屬性,其用法和作用描述如下。name屬性用于指定JavaBean對(duì)象的名稱。property屬性用于指定JavaBean對(duì)象的屬性名。va

35、lue屬性用于指定JavaBean對(duì)象的某個(gè)屬性的值,value的值可以是字符串,也可以是表達(dá)式。為字符串時(shí),該值會(huì)自動(dòng)轉(zhuǎn)化為JavaBean屬性相應(yīng)的類型;如果是一個(gè)表達(dá)式,那么該表達(dá)式的計(jì)算結(jié)果必須與所要設(shè)置的JavaBean屬性的類型一致。param屬性用于將JavaBean實(shí)例對(duì)象的某個(gè)屬性值設(shè)置為一個(gè)請(qǐng)求參數(shù)值,該屬性值同樣會(huì)自動(dòng)轉(zhuǎn)換成要設(shè)置的JavaBean屬性的類型。第54頁,共100頁。4.5.4 標(biāo)簽標(biāo)簽用于讀取JavaBean對(duì)象的屬性,也就是調(diào)用JavaBean對(duì)象的getter方法,然后將讀取的屬性值轉(zhuǎn)換成字符串后插入輸出的響應(yīng)正文中,該標(biāo)簽的使用格式為:name屬性用

36、于指定JavaBean實(shí)例對(duì)象的名稱,其值應(yīng)與標(biāo)簽的id屬性值相同;property屬性用于指定JavaBean實(shí)例對(duì)象的屬性名。第55頁,共100頁。4.6 JSP動(dòng)作標(biāo)簽在JSP編程的過程中,需要盡量替換掉Java代碼部分,下面講解Web程序設(shè)計(jì)中有關(guān)頁面跳轉(zhuǎn)等動(dòng)作方面的替換方法。第56頁,共100頁。4.6 JSP動(dòng)作標(biāo)簽4.6.1 標(biāo)簽4.6.2 標(biāo)簽4.6.3 標(biāo)簽第57頁,共100頁。4.6.1 標(biāo)簽標(biāo)簽可用于把一個(gè)請(qǐng)求轉(zhuǎn)發(fā)給另一個(gè)資源。該標(biāo)簽的語法格式如下:jsp:forward page=relativeURL | /page屬性用于指定請(qǐng)求轉(zhuǎn)發(fā)到的資源的相對(duì)路徑,它可以通過執(zhí)

37、行一個(gè)JSP表達(dá)式來獲得,下面來看一個(gè)簡單的使用示例。首先定義兩個(gè)JSP頁面:forward.jsp和target.jsp,希望在訪問forward.jsp后,能夠讓頁面跳轉(zhuǎn)到target.jsp,具體實(shí)現(xiàn)代碼如下。第58頁,共100頁。4.6.1 標(biāo)簽(1)forward.jsp(2)target.jsp1 2 3 4 5 forward標(biāo)簽使用示例6 7 8 9 10 1 2 3 4 5 forward標(biāo)簽使用示例6 7 8 這是跳轉(zhuǎn)后的目標(biāo)文件9 10 第59頁,共100頁。4.6.1 標(biāo)簽當(dāng)在瀏覽器中輸入U(xiǎn)RL“http:/localhost:8080/jsp_first/forwar

38、d.jsp”,來訪問forward.jsp頁面,可以看到瀏覽器中顯示的是target.jsp頁面內(nèi)容,證明跳轉(zhuǎn)成功,如圖4.27所示。圖4.27 跳轉(zhuǎn)效果第60頁,共100頁。4.6.2 標(biāo)簽在頁面進(jìn)行跳轉(zhuǎn)的過程中,會(huì)不可避免地在兩個(gè)資源之間進(jìn)行一些數(shù)據(jù)傳遞的操作。JSP提供了標(biāo)簽,來實(shí)現(xiàn)通過請(qǐng)求參數(shù)進(jìn)行數(shù)據(jù)傳遞。使用該標(biāo)簽的語法格式如下:jsp:forward page=relativeURL |jsp:param name=參數(shù)名 value=參數(shù)| /第61頁,共100頁。4.6.2 標(biāo)簽標(biāo)簽的name屬性用于指定參數(shù)名,value屬性用于指定參數(shù)值。在標(biāo)簽中可以使用多個(gè)標(biāo)簽來傳遞多個(gè)參

39、數(shù)。下面來修改一下第4.6.1節(jié)中的forward.jsp和target.jsp,實(shí)現(xiàn)使用標(biāo)簽向跳轉(zhuǎn)的目標(biāo)頁面?zhèn)鬟f參數(shù)。第62頁,共100頁。4.6.2 標(biāo)簽(1)forward.jsp(2)target.jsp1 2 3 4 5 forward標(biāo)簽使用示例6 7 8 9 10 11 12 1 2 3 4 5 forward標(biāo)簽使用示例6 7 8 這是跳轉(zhuǎn)后的目標(biāo)文件,username= 9 10 第63頁,共100頁。4.6.2 標(biāo)簽當(dāng)在瀏覽器中輸入U(xiǎn)RL“http:/localhost:8080/jsp_first/forward.jsp”,來訪問forward.jsp頁面,并向targe

40、t.jsp頁面?zhèn)鬟f參數(shù)username,值為admin,在target.jsp頁面中使用JSP表達(dá)式將這個(gè)參數(shù)獲取出來并顯示在瀏覽器中,效果如圖4.29所示。圖4.29 傳遞參數(shù)第64頁,共100頁。4.6.3 標(biāo)簽在JSP的動(dòng)作標(biāo)簽中,是原理較為復(fù)雜的一個(gè)標(biāo)簽,用于把另一個(gè)資源的輸出內(nèi)容插入當(dāng)前JSP頁面的輸出內(nèi)容中,這種在JSP頁面執(zhí)行時(shí)的引入方式稱為動(dòng)態(tài)引入。具體使用的語法格式如下:jsp:include page=relativeURL | flush=true|false /page屬性用于指定被引入資源的相對(duì)路徑,它也可以通過執(zhí)行一個(gè)表達(dá)式來獲得;flush屬性指定在插入其他資源的

41、輸出內(nèi)容時(shí),是否先將當(dāng)前JSP頁面已輸出的內(nèi)容刷新到客戶端。第65頁,共100頁。4.6.3 標(biāo)簽下面一起來看一個(gè)簡單的使用示例,首先實(shí)現(xiàn)兩個(gè)JSP頁面:include1.jsp和include2.jsp,其中,用include1.jsp包含include2.jsp的內(nèi)容,這兩個(gè)頁面的運(yùn)行效果如圖4.30所示,代碼如下。第66頁,共100頁。4.6.3 標(biāo)簽(1)include1.jsp(2)include2.jsp1 2 3 4 5 主頁面6 7 8 這是主頁面include1.jsp的內(nèi)容,接下來是要引入的include2.jsp的內(nèi)容:9 10 11 12 1 2 3 4 5 被包含的頁

42、面6 7 8 這里是include2.jsp的內(nèi)容9 10 第67頁,共100頁。4.6.3 標(biāo)簽當(dāng)在瀏覽器中輸入U(xiǎn)RL“http:/localhost:8080/jsp_/include1.jsp”時(shí),在瀏覽器顯示的結(jié)果是在使用標(biāo)簽的地方將include2.jsp的內(nèi)容顯示出來,運(yùn)行效果如圖4.30所示。圖4.30 標(biāo)簽的包含效果第68頁,共100頁。4.7 綜合servlet與JSP的登錄程序綜合上述所學(xué)知識(shí),下面一起來實(shí)現(xiàn)一個(gè)較為完整的登錄程序。該程序包含如下功能。(1)用戶能在登錄頁面輸入用戶名和密碼,如圖4.38所示。(2)單擊“登錄”按鈕時(shí),系統(tǒng)能對(duì)輸入的用戶名和密碼進(jìn)行校驗(yàn)。(3

43、)若用戶名和密碼正確(假定用戶名為admin,密碼為123456),則跳轉(zhuǎn)至登錄成功頁面,如圖4.39所示。否則,會(huì)在登錄頁面提示“用戶名或者密碼錯(cuò)誤”,如圖4.40所示。第69頁,共100頁。4.7 綜合servlet與JSP的登錄程序圖4.38 登錄界面圖4.39 登錄成功界面圖4.40 登錄失敗界面第70頁,共100頁。4.8 簡易購物商城系統(tǒng)4.8.1 系統(tǒng)功能4.8.2 系統(tǒng)設(shè)計(jì)4.8.3 實(shí)體類定義4.8.4 DAO接口定義4.8.5 DAO接口實(shí)現(xiàn)類4.8.6 工具類的設(shè)計(jì)4.8.7 簡易購物商城系統(tǒng)前臺(tái)實(shí)現(xiàn)第71頁,共100頁。4.8.1 系統(tǒng)功能購物商城系統(tǒng)分為前后臺(tái)子系統(tǒng)。

44、其中,前臺(tái)主要完成商品信息的展示及購物車的相關(guān)功能,主要包含以下模塊。(1)登錄:用戶在登錄頁面輸入用戶名和密碼,如圖4.43所示。單擊“登錄”按鈕時(shí),系統(tǒng)能對(duì)輸入的用戶名和密碼進(jìn)行校驗(yàn)。若用戶名和密碼正確(初始化用戶名為admin0,admin4,密碼與用戶名相同),則跳轉(zhuǎn)至購物商城首頁,如圖4.44所示。第72頁,共100頁。4.8.1 系統(tǒng)功能圖4.43 登錄頁面圖4.44 購物商城頁面第73頁,共100頁。4.8.1 系統(tǒng)功能(2)個(gè)人中心:單擊圖4.44左側(cè)的“個(gè)人中心”,會(huì)出現(xiàn)圖4.45所示的個(gè)人信息展示頁面。圖4.45 個(gè)人信息展示頁面第74頁,共100頁。4.8.1 系統(tǒng)功能(

45、3)查看商品列表:單擊圖4.45左側(cè)的“全部商品”,用戶可以查看全部商品列表,如圖4.46所示。從頁面可以看出,圖4.44和圖4.46一樣,這說明用戶登錄后的首頁即是全部商品列表頁面。圖4.46 查看全部商品列表頁面第75頁,共100頁。4.8.1 系統(tǒng)功能(4)添加商品至購物車:單擊商品列表中每個(gè)商品后的“加入購物車”,系統(tǒng)即可將該商品加入購物車,如圖4.47所示。單擊“繼續(xù)購物”,則頁面跳轉(zhuǎn)至商品列表頁面,用戶可以繼續(xù)將需要購買的商品加入購物車。圖4.47 購物車頁面第76頁,共100頁。4.8.1 系統(tǒng)功能(5)購物車管理:包括查看購物車,刪除購物車內(nèi)指定商品,如圖4.47所示。系統(tǒng)后臺(tái)

46、的主要功能是進(jìn)行商品的管理,包括對(duì)商品進(jìn)行增加、修改、刪除等。(6)管理員登錄:與用戶登錄一樣,系統(tǒng)對(duì)管理員的用戶名和密碼進(jìn)行校驗(yàn),如圖4.48所示。當(dāng)?shù)卿洺晒?,出現(xiàn)系統(tǒng)后臺(tái)首頁,如圖4.49所示。第77頁,共100頁。4.8.1 系統(tǒng)功能(7)添加商品:單擊圖4.49左側(cè)的“添加商品”,會(huì)出現(xiàn)商品添加頁面,如圖4.50所示。圖4.48 系統(tǒng)后臺(tái)登錄頁面圖4.49 系統(tǒng)后臺(tái)頁面圖4.50 商品添加頁面第78頁,共100頁。4.8.1 系統(tǒng)功能(8)商品修改和刪除:單擊圖4.50中的“查看商品列表”,頁面會(huì)跳轉(zhuǎn)至商品信息修改和刪除頁面,如圖4.51所示。圖4.51 商品信息修改和刪除頁面第79

47、頁,共100頁。4.8.2 系統(tǒng)設(shè)計(jì)本系統(tǒng)按照MVC的設(shè)計(jì)理念,將程序分為3個(gè)核心模塊:模型、視圖和控制器,同時(shí)采用DAO設(shè)計(jì)模式實(shí)現(xiàn)對(duì)數(shù)據(jù)的相關(guān)存取操作。在進(jìn)行程序設(shè)計(jì)和開發(fā)之前,首先需要設(shè)計(jì)目錄和包的結(jié)構(gòu)。良好的結(jié)構(gòu)會(huì)使代碼邏輯清楚且容易維護(hù)。本應(yīng)用的項(xiàng)目名稱為chexam,整體目錄結(jié)構(gòu)如圖4.52所示。其中,src目錄的結(jié)構(gòu)如圖4.53所示,由圖中可知src目錄下共有5個(gè)包,分別說明如下。第80頁,共100頁。4.8.2 系統(tǒng)設(shè)計(jì)圖4.52 項(xiàng)目目錄結(jié)構(gòu)圖4.53 src目錄結(jié)構(gòu)第81頁,共100頁。4.8.2 系統(tǒng)設(shè)計(jì)(1).zzti.dao包:存放AutionDAO、BaseDAO、

48、PersonalDAO、TempoparyCartDAO、UserDAO接口的源代碼文件,分別對(duì)應(yīng)于商品存取、反射機(jī)制、人員信息存取、臨時(shí)購物車存取、用戶信息存取。(2).zzti.dao.impl.constance包:存放DAO包中接口的內(nèi)存實(shí)現(xiàn)的源代碼文件。(3).zzti.entity包:存放AutionDO、CartDO、PersonalInfoDO、ResultDO、UserDO等實(shí)體類的源代碼文件,分別對(duì)應(yīng)于商品實(shí)體、購物車實(shí)體、個(gè)人信息實(shí)體、執(zhí)行結(jié)果實(shí)體和用戶實(shí)體。第82頁,共100頁。4.8.2 系統(tǒng)設(shè)計(jì)(4).zzti.servlet.web包:存放項(xiàng)目相關(guān)的Servlet

49、文件。(5).zzti.util包:存放DAOFactory類、PathConstence和StringUtil等輔助類的源代碼文件。其中,DAOFactory類是工廠類,用于生成DAO對(duì)象,PathConstence類用于配置JSP和Servlet的根路徑,StringUtil類用于判斷字符串是否為空。第83頁,共100頁。4.8.3 實(shí)體類定義對(duì)系統(tǒng)中的數(shù)據(jù)模型(Model)進(jìn)行分析。從目錄結(jié)構(gòu)來看,系統(tǒng)可以識(shí)別出AutionDO、CartDO、PersonalInfoDO、ResultDO、UserDO等實(shí)體類。具體代碼參考P126第84頁,共100頁。4.8.4 DAO接口定義數(shù)據(jù)訪問

50、對(duì)象(Data Access Object,DAO)是一個(gè)數(shù)據(jù)訪問接口,其目的是為了讓業(yè)務(wù)層不依賴具體的數(shù)據(jù)存儲(chǔ)方法。一個(gè)典型的DAO實(shí)現(xiàn)有下列幾個(gè)組件。DAO接口:DAO接口中定義了所有數(shù)據(jù)的基本操作,如添加記錄、刪除記錄及查詢記錄等。實(shí)現(xiàn)DAO接口的具體類:DAO實(shí)現(xiàn)類實(shí)現(xiàn)DAO接口,并實(shí)現(xiàn)了接口中定義的所有方法。DAO工廠類:在沒有DAO工廠類的情況下,必須通過創(chuàng)建DAO實(shí)現(xiàn)類的實(shí)例才能完成對(duì)數(shù)據(jù)記錄的相關(guān)操作。如果需要選用其他數(shù)據(jù)源的DAO實(shí)現(xiàn)類,就必須對(duì)該段代碼重新編輯和編譯,降低了系統(tǒng)的可維護(hù)性。所以,在本章中加入了工廠設(shè)計(jì)模式的DAOFactory類解決該問題。第85頁,共100

51、頁。4.8.4 DAO接口定義(1)BaseDAO,BaseDAO是用于設(shè)置反射機(jī)制的,作為其他接口的父類接口而存在。詳細(xì)解釋請(qǐng)參看第4.8.6節(jié)DAOFactory的相關(guān)內(nèi)容。具體代碼如下。(2)AuctionDAO,該接口定義了商品基本操作的相關(guān)方法,包括獲取全部商品信息、獲取指定商品信息、添加商品信息及刪除指定商品信息等。1 package .zzti.dao;2 public interface BaseDAO 3 第86頁,共100頁。4.8.4 DAO接口定義1 package .zzti.dao;2 import .zzti.entity.AuctionDO;3 import j

52、ava.sql.SQLException;4 import java.util.List;5 6 /*商品操作 */7 public interface AuctionDAO extends BaseDAO8 /*9 * 從數(shù)據(jù)源中獲取指定id對(duì)應(yīng)的商品信息10 * param id11 * return12 */13 public AuctionDO getAuction(String id) throws SQLException ;14 /*15 * 添加一條商品信息到數(shù)據(jù)源中16 * param auc:要添加的商品對(duì)象17 */18 public void addAuction(Au

53、ctionDO auc)throws SQLException;19 /*20 * 獲取數(shù)據(jù)源中的全部的商品列表21 * return22 */23 public List getAll() throws SQLException;24 /*25 * 通過商品id刪除一條商品記錄26 * param id:要?jiǎng)h除的商品的id27 */28 public void deleteAuction(String id) throws SQLException;29 /*30 * 修改數(shù)據(jù)源中的指定商品信息31 * param auc:要修改的商品和其修改后的信息32 */33 public void

54、updateAuction(AuctionDO auc) throws SQLException;34 第87頁,共100頁。4.8.4 DAO接口定義(3)UserDAO,UserDAO接口繼承自BaseDAO接口,定義了獲取所有用戶信息、查找用戶、增加及刪除用戶的方法,具體代碼如下。1 package .zzti.dao;2 import java.sql.SQLException;3 import java.util.List;4 import .zzti.entity.UserDO;5 public interface UserDAO extends BaseDAO6 /*7 * 獲得

55、系統(tǒng)中的所有用戶8 * return9 */10 public List getAll() throws SQLException;11 /*12 * 用于登錄校驗(yàn)13 * param username14 * param password15 * return16 */17 public UserDO findUser(String username, String password) throws 18 SQLException;19 /*20 * 在系統(tǒng)中創(chuàng)建一個(gè)用戶的信息21 * param u22 * return23 */24 public int insertUser(UserD

56、O u) throws SQLException;25 /*26 * 根據(jù)用戶的id刪除一個(gè)用戶27 * param id28 * return29 */30 public int deleteUser(String id) throws SQLException;31 32 第88頁,共100頁。4.8.4 DAO接口定義(4)PersonalInfoDAO,PersonalInfoDAO接口繼承自BaseDAO接口,定義了獲取個(gè)人基本信息和設(shè)置個(gè)人基本信息的基本方法,具體代碼如下。1 package .zzti.dao;2 import java.sql.SQLException;3 im

57、port .zzti.entity.PersonalInfoDO;4 public interface PersonalDAO extends BaseDAO5 /*6 * 通過用戶名查詢當(dāng)前用戶的個(gè)人信息7 * param username8 * return9 * throws SQLException10 */11 public PersonalInfoDO getPersonalInfo(String username) throws 12 SQLException;13 /*14 * 保存用戶的個(gè)人信息15 * param username16 * param p17 * throw

58、s SQLException18 */19 public void setPersonalInfo(String username,PersonalInfoDO p) throws 20 SQLException;21 第89頁,共100頁。4.8.4 DAO接口定義(5)TemporaryCartDAO接口TemporaryCartDAO接口繼承自BaseDAO接口,定義了向臨時(shí)購物車中增加一條商品記錄、刪除一條商品記錄及獲取商品所有信息的基本方法,代碼如下。1 package .zzti.dao;2 import .zzti.entity.AuctionDO;3 import .zzti.

59、entity.CartDO;4 import java.util.List;5 public interface TemporaryCartDAO extends BaseDAO6 /*7 * 添加商品到臨時(shí)購物車中8 * param auctionDO9 */10 public void addToCart(String username,AuctionDO auctionDO);11 12 /*13 * 從臨時(shí)購物車中刪除一條商品記錄14 * param aucId15 */16 public void removeFromCart(String username,String aucId

60、);17 18 /*從臨時(shí)購物車中將所有的商品信息獲取出來19 * return20 */21 public List getAllFromCart(String username);22 第90頁,共100頁。4.8.5 DAO接口實(shí)現(xiàn)類(1)AuctionDAO的實(shí)現(xiàn),利用HasMap存儲(chǔ)所有商品,商品id作為鍵,商品AuctionDO作為值,增加、刪除、更新商品就是針對(duì)該HasMap進(jìn)行相應(yīng)的增刪改操作,代碼如下。1 public class AuctionDAOImpl implements AuctionDAO2 private static Map auctionList = ne

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論