Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)課件_第1頁(yè)
Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)課件_第2頁(yè)
Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)課件_第3頁(yè)
Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)課件_第4頁(yè)
Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩100頁(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)介

第十二章JSPJAVA語(yǔ)言程序設(shè)計(jì)1Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)目錄12.1JSP簡(jiǎn)介12.2JSP與JavaBean12.3JSP標(biāo)簽庫(kù)12.4JSP與Servlet12.5本章小結(jié)2Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1JSP簡(jiǎn)介servlet和JSP(JavaServerPage)已成為開發(fā)電子商務(wù)等動(dòng)態(tài)網(wǎng)站的首選技術(shù),它們都是運(yùn)行在服務(wù)器上的Java程序servletHTML的編寫和維護(hù)都比較困難,使用print語(yǔ)句生成HTML并不容易,非Java開發(fā)人員很難處理這些HTMLJSP靜態(tài)內(nèi)容的輸出都采用標(biāo)準(zhǔn)的HTML,只用java語(yǔ)言編寫頁(yè)面中生成動(dòng)態(tài)內(nèi)容的代碼提供了對(duì)Java編程語(yǔ)言以及針對(duì)動(dòng)態(tài)部分的servlet技術(shù)的完全訪問(wèn)3Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.1什么是JSP程序JSP簡(jiǎn)單的說(shuō),就是嵌入了Java代碼的HTML,由靜態(tài)HTML、專用的JSP標(biāo)簽和Java代碼組成服務(wù)器端的技術(shù)。在后臺(tái)被自動(dòng)轉(zhuǎn)換成servlet僅在修改后的第一次被訪問(wèn)時(shí),才會(huì)被轉(zhuǎn)換成servlet并進(jìn)行編譯,創(chuàng)建JSP唯一的一個(gè)一實(shí)例,并調(diào)用_jspInit完成初始化,之后每個(gè)用戶請(qǐng)求都會(huì)創(chuàng)建一個(gè)調(diào)用JSP實(shí)例的_jspService方法的線程。因而多個(gè)并發(fā)請(qǐng)求會(huì)導(dǎo)致多個(gè)線程同時(shí)調(diào)用_jspServiceTomcat中,默認(rèn)目錄下的JSP文件被轉(zhuǎn)換生成的servlet文件及編譯后生成的class文件被放在install_dir/work/Catalina/localhost/_/org/apache/jsp目錄下JSP簡(jiǎn)介4Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.1什么是JSP程序

——JSP頁(yè)面被請(qǐng)求后的操作JSP簡(jiǎn)介將JSP頁(yè)面轉(zhuǎn)換為servlet編譯servlet將servlet載入到服務(wù)器內(nèi)存中調(diào)用jspInit調(diào)用_jspService頁(yè)面初次創(chuàng)建請(qǐng)求1有有有有有請(qǐng)求2無(wú)無(wú)無(wú)無(wú)有服務(wù)器重啟后請(qǐng)求3無(wú)無(wú)有有有請(qǐng)求4無(wú)無(wú)無(wú)無(wú)有頁(yè)面修改后請(qǐng)求5有有有有有請(qǐng)求6無(wú)無(wú)無(wú)無(wú)有5Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)JSP文件在服務(wù)器的部署可以和常規(guī)的HTML頁(yè)面放在相同的目錄中,并使用和常規(guī)HTML相同的URL訪問(wèn)它們除了不允許將WEB-INF和META-INF作目錄名之外,可以使用任何喜歡的目錄名Tomcat中JSP的默認(rèn)目錄是install_dir/webapps/ROOT,我們只要把編寫好的JSP文件直接放在此目錄下即可例如install_dir/webapps/ROOT/SomeDirectory/Some則對(duì)應(yīng)的URL為http://host:port/SomeDirectory/Some12.1.1什么是JSP程序

——JSP文件在服務(wù)器的部署JSP簡(jiǎn)介6Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.2JSP語(yǔ)法概述除了標(biāo)準(zhǔn)的HTML以外,JSP主要包括三類組件腳本元素(scriptingelements)使你可以向JSP文件產(chǎn)生的servlet文件中插入代碼指令標(biāo)簽(directives)將影響由JSP頁(yè)產(chǎn)生的servlet的總體結(jié)構(gòu)動(dòng)作標(biāo)簽(actions)影響JSP運(yùn)行時(shí)的功能JSP簡(jiǎn)介7Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)腳本元素——向JSP文件產(chǎn)生的servlet文件中插入代碼,主要有三種形式表達(dá)式<%=expression%><%和=之間不能有空格。expression必須能求值,服務(wù)器計(jì)算出值后以字符串形式發(fā)送到客戶端顯示程序片<%code%>一個(gè)JSP頁(yè)面可以有許多,它們將被插入到生成的servlet文件的_jspService方法中每次客戶端請(qǐng)求都會(huì)新開一個(gè)線程,調(diào)用servlet的service方法,service方法再調(diào)用_jspService方法JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——腳本元素8Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)聲明語(yǔ)句<%!Declaration%>聲明的內(nèi)容包括變量和方法,將被插入到生成servlet的類體中,在_jspService方法之外,成為類變量和類方法,直到服務(wù)器關(guān)閉才被釋放當(dāng)多個(gè)客戶請(qǐng)求一個(gè)JSP頁(yè)面時(shí),多個(gè)線程將共享這些變量和方法,因而任何一個(gè)用戶對(duì)這些變量操作的結(jié)果,都會(huì)影響到其他用戶12.1.2JSP語(yǔ)法概述

——腳本元素JSP簡(jiǎn)介9Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)指令標(biāo)簽將影響由JSP頁(yè)產(chǎn)生的servlet的總體結(jié)構(gòu)其格式為<%@directive

attribute1="value1",attribute2="value2",┄%>directive代表指令名稱attribute代表該指令中可選的屬性名稱value代表屬性值并且總是用單引號(hào)或雙引號(hào)括起來(lái),要想在屬性值value中輸出引號(hào),可在該引號(hào)前用一個(gè)反斜杠“\”在JSP中,有三種類型的指令pageincludetaglibJSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽10Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)page指令可放在文檔內(nèi)的任何位置,該指令對(duì)整個(gè)頁(yè)面有效可以定義一個(gè)或多個(gè)大小寫敏感的屬性,包括import、contentType、isThreadSafe、Session、buffer等import屬性為JSP頁(yè)面引入Java核心包中的類,這樣就可以在腳本部分使用這些類,如:<%@pageimport="java.io.*"%>可以為import屬性指定多個(gè)值,這些值用逗號(hào)分割,這樣就可以引入若干個(gè)包或類,如:

<%@pageimport="java.io.*","java.awt.*","java.util.Date"%>JSP頁(yè)面默認(rèn)import屬性已經(jīng)有如下的值:"java.lang.*","javax.servlet.*","javax.servlet.jsp.*","javax.servlet.http.*“除import屬性外,Page指令的其它屬性只能指定一個(gè)值JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/page指令11Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)contentType屬性定義JSP頁(yè)面相應(yīng)的MIME(MultipurposeInternetMailExtension,多用途Internet郵件擴(kuò)展)類型和JSP頁(yè)面字符編碼其屬性使用以下兩種格式之一<%@pagecontentType="MIME-Type;charset=Character-Set"%>或者<%@pagecontentType="MIME-Type"%>例如<%@pagecontentType="application/vnd.ms-excel;charset=GB2312"%>其屬性默認(rèn)值為<%@pagecontentType="text/html;charset=ISO-8859-1"%>JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/page指令12Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)isThreadSafe屬性用來(lái)設(shè)置JSP頁(yè)面是否可多線程訪問(wèn)設(shè)為true時(shí),JSP頁(yè)面能同時(shí)響應(yīng)多個(gè)客戶的請(qǐng)求設(shè)為false時(shí),同一時(shí)刻只能處理一個(gè)客戶的請(qǐng)求,其它客戶須等待其默認(rèn)值為truesession屬性表示當(dāng)前的JSP頁(yè)面是否參與HTTP會(huì)話設(shè)為true時(shí),可以使用內(nèi)置的javax.Servlet.HttpSession類型的一個(gè)名為session的對(duì)象設(shè)為false時(shí),則該對(duì)象不被創(chuàng)建默認(rèn)值為trueJSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/page指令13Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)buffer屬性指定jsp內(nèi)置輸出流out變量使用的緩沖區(qū)的尺寸,如果設(shè)置為none,則不使用緩沖區(qū)默認(rèn)值是8kbout變量是JspWriter類型的,JspWriter是java.io.Writer類的子類。累計(jì)輸出內(nèi)容超過(guò)了這里設(shè)定的大小、完成了此頁(yè)、或者輸出被明確清除(如使用response.flushBuffer),文檔才被發(fā)送給客戶顯示例如<%@pagebuffer="16kb"%>autoflush屬性控制out的緩沖區(qū)在裝滿時(shí)的處理,默認(rèn)為true設(shè)為true時(shí),裝滿時(shí)則自動(dòng)清除緩沖區(qū)設(shè)為false時(shí),裝滿后則會(huì)出現(xiàn)異常buffer的值是none時(shí)將autoflush設(shè)為false是不合法的JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/page指令14Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)info屬性定義了一個(gè)通過(guò)getServletInfo方法可從servlet中檢索到的串格式為<%@pageinfo="someMessage"%>isErrorPage屬性指明當(dāng)前頁(yè)是否能充當(dāng)其它JSP頁(yè)面的錯(cuò)誤頁(yè)。采用以下兩種格式之一<%@pageisErrorPage="true"%>或者<%@pageisErrorPage="false"%><%--Default--%>。errorPage屬性指定一個(gè)處理當(dāng)前頁(yè)未被捕獲的任何異常的頁(yè)面格式為<%@pageerrorPage="RelativeURL"%>這個(gè)URL指定的錯(cuò)誤頁(yè)的isErrorPage屬性必須被設(shè)為true方可使用JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/page指令15Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)include指令與page指令不同,該指令應(yīng)該放在你想要將外部文件插入的位置,它可以將文件整體插入到該處其格式為<%@includefile=""%>Jsp文件被轉(zhuǎn)換成servlet文件時(shí),外部文件就被插入了,然后統(tǒng)一進(jìn)行編譯當(dāng)外部文件發(fā)生改變時(shí),當(dāng)前頁(yè)面無(wú)法得到通知,要想得知外部文件的任何改變,當(dāng)前頁(yè)面必須重新編譯,由上一節(jié)jsp的操作過(guò)程可知,必須重新保存該jsp文件12.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/include指令JSP簡(jiǎn)介16Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)taglib指令JSP1.1規(guī)范中新增的指定一個(gè)標(biāo)記庫(kù),用于擴(kuò)充標(biāo)準(zhǔn)的JSP標(biāo)記集完成三個(gè)任務(wù)首先,它通知JSP服務(wù)器,頁(yè)面使用一個(gè)標(biāo)記庫(kù)其次,它指定包含標(biāo)記庫(kù)標(biāo)志符的特殊jar文件的位置最后,它指定一個(gè)用于唯一區(qū)分這些新標(biāo)記的標(biāo)記前綴格式為:<%@tagliburi="someuri"prefix="somename"%>uri屬性:一個(gè)引用標(biāo)記庫(kù)描述符文件(后綴名為TLD:TagLibraryDescriptor)的絕對(duì)或相對(duì)URLprefix屬性:指定一個(gè)將要在TLD文件定義的標(biāo)記名前面使用的前綴如果TLD文件定義了一個(gè)名為tag1的標(biāo)記,并且prefix屬性的值設(shè)為test,那么實(shí)際的標(biāo)記名將為test:tag112.1.2JSP語(yǔ)法概述

——指令標(biāo)簽/taglib指令JSP簡(jiǎn)介17Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)動(dòng)作標(biāo)簽一種特殊的標(biāo)簽,影響JSP運(yùn)行時(shí)的功能格式為<jsp:action_name

attribute1="value1",attribute2="value2"┄/>action_name代表動(dòng)作名稱attribute代表屬性名稱value代表屬性值分為兩類Resource動(dòng)作JavaBean動(dòng)作JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——?jiǎng)幼鳂?biāo)簽18Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)

Resource動(dòng)作include動(dòng)作標(biāo)簽告訴JSP頁(yè)面動(dòng)態(tài)包含一個(gè)文件,即JSP頁(yè)面運(yùn)行時(shí)才將文件加入,例如:<jsp:includepage="some"/>如果包含的是普通的文本文件,就將文件的內(nèi)容發(fā)送到客戶端,由客戶端負(fù)責(zé)顯示如果包含的是JSP文件,JSP引擎就執(zhí)行這個(gè)文件,然后將執(zhí)行的結(jié)果發(fā)送到客戶端顯示如果修改了被包含的文件,那么運(yùn)行時(shí)將看到修改后的結(jié)果,這一點(diǎn)和include指令不同可結(jié)合param指令,向要包含的文件傳送信息,被包含的文件通過(guò)JSP的內(nèi)置對(duì)象request調(diào)用getParameter方法獲得參數(shù)值。格式為:<jsp:includepage="some"><jsp:paramname="someName"value="someValue"/></jsp:include>JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——?jiǎng)幼鳂?biāo)簽/Resource動(dòng)作19Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)forward動(dòng)作標(biāo)簽告訴JSP頁(yè)面從該指令處停止當(dāng)前頁(yè)面的繼續(xù)執(zhí)行,而轉(zhuǎn)向其他的一個(gè)頁(yè)面,當(dāng)前頁(yè)面后邊的內(nèi)容將不被執(zhí)行,例如:<jsp:forwardpage="some"/>該標(biāo)簽也可結(jié)合param指令,向要轉(zhuǎn)到的頁(yè)面?zhèn)魉托畔ⅲ袷酵琲nclude標(biāo)簽JSP簡(jiǎn)介12.1.2JSP語(yǔ)法概述

——?jiǎng)幼鳂?biāo)簽/Resource動(dòng)作20Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)plugin動(dòng)作標(biāo)簽用于插入Applet或JavaBean到JSP頁(yè)面,組件必須被下載到瀏覽器并且在客戶端執(zhí)行param元素可以用于發(fā)送參數(shù)到Applet或JavaBean(一個(gè)可重復(fù)使用的軟件組件,實(shí)際上就是一個(gè)Java類)如:

<jsp:plugin

type="applet"code="A.class"width="120"height="120"><jsp:paramname="someName"value="someValue"/>

<jsp:fallback>promptmessage

</jsp:fallback>

</jsp:plugin>當(dāng)客戶訪問(wèn)含該段代碼的JSP文件時(shí),如果客戶端不支持applet,將導(dǎo)致下載Javaplug插件,出現(xiàn)客戶選擇是否下載插件的界面。用戶下載安裝后,就可以使用Java虛擬機(jī)加載執(zhí)行Javaapplet小應(yīng)用程序A.class了fallback元素可用于指定組件失敗時(shí)發(fā)送到客戶端的錯(cuò)誤信息字符串12.1.2JSP語(yǔ)法概述

——?jiǎng)幼鳂?biāo)簽/Resource動(dòng)作JSP簡(jiǎn)介21Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)JavaBean動(dòng)作useBean動(dòng)作標(biāo)簽格式為<jsp:useBeanid="bean的名字"class="創(chuàng)建bean的類"scope="有效范圍"/>或者<jsp:useBeanid="bean的名字"class="創(chuàng)建bean的類"scope="有效范圍"/></jsp:useBean>服務(wù)器將加載該bean類的一個(gè)對(duì)象setProperty動(dòng)作標(biāo)簽設(shè)置bean的屬性getProperty動(dòng)作標(biāo)簽獲取bean屬性的值并輸出12.1.2JSP語(yǔ)法概述

——?jiǎng)幼鳂?biāo)簽/JavaBean動(dòng)作JSP簡(jiǎn)介22Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.3JSP內(nèi)置對(duì)象JSP的內(nèi)置對(duì)象在JSP頁(yè)面的腳本元素中,有些不用聲明就可以使用的對(duì)象包括out、request、response、session、application等out對(duì)象是javax.servlet.jsp.JspWriter類的實(shí)例,JspWriter包含的方法大多數(shù)與java.io.PrintWriter類一樣這個(gè)輸出流對(duì)象用來(lái)向客戶端輸出數(shù)據(jù),其可調(diào)用的方法如下表JSP簡(jiǎn)介23Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.3JSP內(nèi)置對(duì)象(續(xù))

——out對(duì)象可使用的方法名稱解釋print(Booleanb)輸出一個(gè)布爾值print(charc)輸出一個(gè)字符print(doubled)輸出一個(gè)雙精度的浮點(diǎn)數(shù)print(floatf)輸出一個(gè)單精度的浮點(diǎn)數(shù)print(longl)輸出一個(gè)長(zhǎng)整型數(shù)據(jù)print(Strings)輸出一個(gè)字符串newLine()輸出一個(gè)換行符flush()輸出緩沖區(qū)里的內(nèi)容close()關(guān)閉流JSP簡(jiǎn)介24Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)request對(duì)象是javax.servlet.http.HttpServletRequest的實(shí)例客戶每次請(qǐng)求頁(yè)面時(shí),JSP引擎創(chuàng)建一個(gè)request對(duì)象代表該請(qǐng)求封裝了用戶提交的信息,這些信息包括HTTP請(qǐng)求的請(qǐng)求行HTTP頭信息體調(diào)用相應(yīng)的方法可以獲取封裝的信息,最常用的方法是request.getParameter(param_name)12.1.3JSP內(nèi)置對(duì)象(續(xù))

——request對(duì)象JSP簡(jiǎn)介25Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.3JSP內(nèi)置對(duì)象(續(xù))

——request對(duì)象的常用方法名稱解釋getProtocal()獲取客戶向服務(wù)器提交信息使用的通訊協(xié)議getServletPath()獲取JSP文件的目錄getContentLength()獲取提交信息的長(zhǎng)度getMethod()獲取客戶提交信息的方式,例如post或getgetHeaderNames()獲取頭名字的一個(gè)枚舉getHeader(Strings)獲取HTTP頭文件中由s指定的屬性的值,例如“content-type”,“cookie”等getRemoteHost()獲取客戶機(jī)的名稱getRemoteAddr()獲取客戶機(jī)的IP地址getServerName()獲取服務(wù)器的名稱getServerPort()獲取服務(wù)器的端口號(hào)getParameterNames()獲取客戶提交的信息體部分中所有參數(shù)的名字getParameter(String_name)獲取指定參數(shù)名字的參數(shù)值JSP簡(jiǎn)介26Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)

response對(duì)象javax.servlet.http.httpServletResponse的實(shí)例與request對(duì)象相對(duì)應(yīng),我們可以用response對(duì)象對(duì)客戶的請(qǐng)求做出動(dòng)態(tài)響應(yīng),向客戶端發(fā)送數(shù)據(jù)。類似于HTTP請(qǐng)求,HTTP響應(yīng)也由三個(gè)基本部分組成狀態(tài)行:包括使用的協(xié)議以及狀態(tài)代碼,表示請(qǐng)求是否成功頭:包含關(guān)于服務(wù)器和返回的文檔的消息,例如服務(wù)器名稱和文檔類型等信息體使用這個(gè)對(duì)象的一些方法可以完成如下任務(wù)動(dòng)態(tài)設(shè)置contentType屬性頁(yè)面重定向設(shè)置返回狀態(tài)碼等JSP簡(jiǎn)介12.1.3JSP內(nèi)置對(duì)象(續(xù))

——response對(duì)象27Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)JSP簡(jiǎn)介12.1.3JSP內(nèi)置對(duì)象(續(xù))

——resnponse對(duì)象的常用方法名稱解釋setStatus(intsc)設(shè)置返回狀態(tài)碼setContentType(Stringtype)設(shè)置被發(fā)送文檔的MIME類型setHeader(Stringname,Stringvalue)設(shè)置頭中指定屬性name為指定值valuesetRedirect(Stringlocation)重定向到指定URL28Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)會(huì)話的概念從一個(gè)客戶打開瀏覽器連接到服務(wù)器的某個(gè)服務(wù)目錄,到客戶關(guān)閉瀏覽器離開該服務(wù)目錄稱為一個(gè)會(huì)話每個(gè)會(huì)話只對(duì)應(yīng)于一個(gè)客戶,并且可以跨多個(gè)頁(yè)面session對(duì)象javax.servlet.http.HttpSession的實(shí)例,對(duì)應(yīng)于會(huì)話的概念用于在使用無(wú)狀態(tài)連接協(xié)議(如HTTP)的情況下跟蹤關(guān)于某個(gè)客戶的信息,對(duì)識(shí)別客戶是非常重要的在客戶首次訪問(wèn)某服務(wù)目錄中的任何一個(gè)JSP頁(yè)面時(shí)創(chuàng)立,并且具有一個(gè)獨(dú)一無(wú)二的Id號(hào),直到客戶關(guān)閉瀏覽器或這個(gè)session對(duì)象達(dá)到了最大生存時(shí)間,服務(wù)器端該客戶的session對(duì)象才被取消調(diào)用相應(yīng)的方法可以存儲(chǔ)客戶在訪問(wèn)各個(gè)頁(yè)面期間提交的各種信息,比如姓名、編號(hào)等JSP簡(jiǎn)介12.1.3JSP內(nèi)置對(duì)象(續(xù))

——session對(duì)象29Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)JSP簡(jiǎn)介12.1.3JSP內(nèi)置對(duì)象(續(xù))

——session對(duì)象的常用方法名稱解釋intgetMaxInactiveInterval()返回會(huì)話過(guò)期前需要經(jīng)過(guò)的秒數(shù)voidsetMaxInactiveInterval(intinterval)設(shè)置某個(gè)會(huì)話的生命期longgetCreationTime()返回創(chuàng)建會(huì)話的時(shí)間longgetLastAccessedTime()返回上次使用此會(huì)話的時(shí)間voidinvalidate()使得session對(duì)象無(wú)效booleanisNew()判斷是否是個(gè)新會(huì)話StringgetId()返回識(shí)別客戶的獨(dú)一無(wú)二的字符串EnumerationgetIds()返回一個(gè)包含當(dāng)前所有會(huì)話Id的枚舉值voidsetAttribute(Stringkey,Objectvalue)在session對(duì)象中添加obj,并指定索引關(guān)鍵字為keyObjectgetAttribute(Stringname)從session對(duì)象獲取關(guān)鍵字為key的對(duì)象voidremoveAttribute(Stringname)從session中刪除指定索引關(guān)鍵字的對(duì)象EnumerationgetAttributeName()獲取session對(duì)象存儲(chǔ)的所有鍵名30Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)application對(duì)象javax.servlet.ServletContext的實(shí)例。比session對(duì)象的生存時(shí)期更長(zhǎng)。服務(wù)器啟動(dòng)后,就產(chǎn)生了這個(gè)application對(duì)象,直到服務(wù)器關(guān)閉,該對(duì)象才被取消所有客戶共享這個(gè)內(nèi)置的application對(duì)象,所以任何客戶對(duì)該對(duì)象中存儲(chǔ)的數(shù)據(jù)的改變都會(huì)影響到其他客戶,因此,在某些情況下,對(duì)該對(duì)象的操作需要同步處理12.1.3JSP內(nèi)置對(duì)象(續(xù))

——application對(duì)象JSP簡(jiǎn)介31Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.3JSP內(nèi)置對(duì)象(續(xù))

——application對(duì)象的常用方法名稱解釋voidsetAttribute(Stringkey,Objectobj)將obj對(duì)象添加到application對(duì)象中,并為obj指定一個(gè)索引關(guān)鍵字key。ObjectgetAttribute(Stringkey)獲取application對(duì)象中指定關(guān)鍵字的對(duì)象EnumerationgetAttributeNames()返回application對(duì)象的所有索引關(guān)鍵字voidremoveAttribute(Stringkey)刪除指定索引的對(duì)象JSP簡(jiǎn)介32Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.4一個(gè)簡(jiǎn)單的JSP程序在表單中輸入一個(gè)自然數(shù),計(jì)算從1到該數(shù)的累加和<%--page指令標(biāo)簽,指定MIME類型和頁(yè)面的字符編碼--%><%@pagecontentType="text/html;charset=gb2312"%><%--聲明一個(gè)類方法,該方法在整個(gè)JSP頁(yè)面有效--%><%!intcontinuousSum(intn){ intsum=0; for(inti=1;i<=n;i++){sum=sum+i;} returnsum;}%><%--JSP中的Java程序片,將被JSP引擎按順序執(zhí)行--%><%Stringstr=request.getParameter("number");if(str==null)str="10";intr=Integer.parseInt(str);%>JSP簡(jiǎn)介33Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.4一個(gè)簡(jiǎn)單的JSP程序(續(xù))<html><head><title>計(jì)算連續(xù)和</title></head><body><h1>請(qǐng)輸入一個(gè)自然數(shù)</h1><!--HTML表單--><formname="form1"method="post"action=""><inputtype="text"name="number"value=<%=str%>><inputtype="submit"name="Submit"value="計(jì)算"></form> <%--JSP表達(dá)式,其值由服務(wù)器負(fù)責(zé)計(jì)算,并將結(jié)果發(fā)回客戶端顯示--%><%=r%>的連續(xù)和是<%=continuousSum(r)%></body></html>JSP簡(jiǎn)介34Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.1.4一個(gè)簡(jiǎn)單的JSP程序(續(xù))

——例12_1運(yùn)行結(jié)果JSP簡(jiǎn)介35Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.2JSP與JavaBean指令標(biāo)簽<%@includefile=“”%>和動(dòng)作標(biāo)簽<jsp:includepage=“some”/>都可以嵌入代碼。前者實(shí)際上是將代碼插入行內(nèi),后者是將另一個(gè)頁(yè)面的輸出插入原來(lái)的頁(yè)面這些方法無(wú)助于分離表示邏輯和業(yè)務(wù)邏輯,它們都造成了顯著的可伸縮性問(wèn)題,不利于開發(fā)人員分工合作JavaBean解決了這個(gè)問(wèn)題,它將一系列相關(guān)的屬性和方法組合在一個(gè)Java類中,構(gòu)成了一個(gè)組件在JSP程序中,只要使用JavaBean動(dòng)作標(biāo)簽調(diào)用該組件就可以了36Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.2.1JavaBean簡(jiǎn)介JavaBean其實(shí)就是Java類必須使用一組相當(dāng)簡(jiǎn)單而又標(biāo)準(zhǔn)的設(shè)計(jì)和命名約定,因而調(diào)用它們的應(yīng)用程序無(wú)須理解其內(nèi)部工作原理,就可以很容易的使用JavaBean的方法JavaBean類的一個(gè)實(shí)例叫做一個(gè)bean通常我們將JavaBean文件取名為XxxBeanJSP與JavaBean37Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.2.1JavaBean簡(jiǎn)介(續(xù))

——JavaBean的設(shè)計(jì)要求對(duì)于JSP中使用的JavaBean,有三個(gè)設(shè)計(jì)要求必須擁有一個(gè)默認(rèn)(無(wú)參數(shù))的構(gòu)造函數(shù)如果未聲明任何構(gòu)造函數(shù),默認(rèn)的構(gòu)造函數(shù)會(huì)被自動(dòng)創(chuàng)建JSP元素創(chuàng)建bean時(shí),會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)類中不應(yīng)該有公開的屬性對(duì)于類內(nèi)的屬性,通常應(yīng)該提供設(shè)置和獲取其值的方法publicvoidsetXxx(Objec_typevalue)方法進(jìn)行設(shè)置publicObject_typegetXxx()方法進(jìn)行獲取,如果該屬性是布爾類型的,允許使用publicbooleanisXxx()獲取屬性值如果某個(gè)屬性只有g(shù)etXxx或isXxx方法,叫做只讀屬性JSP與JavaBean38Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)可以使用JSP腳本元素訪問(wèn)類的任意方法訪問(wèn)bean的標(biāo)準(zhǔn)JSP動(dòng)作只能使用那些遵循getXxx/setXxx或isXxx/setXxx命名約定的方法12.2.1JavaBean簡(jiǎn)介(續(xù))

——JSP對(duì)JavaBean的訪問(wèn)JSP與JavaBean39Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)設(shè)計(jì)一個(gè)描述員工信息的JavaBean類。包括編號(hào)、姓名、性別、工資、職務(wù)屬性packagemyBeans;publicclassEmployeeBean{ privateintid=0,salary=0; privateStringname="none",occupation="none"; privatebooleanmale=true;

publicintgetId(){returnid;} publicvoidsetId(intid){this.id=id;} publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;}

publicbooleanisMale(){returnmale; } publicvoidsetMale(booleanmale){this.male=male;}

publicintgetSalary(){returnsalary;} publicvoidsetSalary(intsalary){this.salary=salary;}

publicStringgetOccupation(){returnoccupation;} publicvoidsetOccupation(Stringoccupation){this.occupation=occupation;}}JSP與JavaBean12.2.1JavaBean簡(jiǎn)介(續(xù))

——例12_240Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)EmployeeBean類滿足成為JavaBean的條件沒(méi)有公開的實(shí)例變量沒(méi)有聲明任何顯式的構(gòu)造函數(shù),從而也就擁有了一個(gè)默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù)它的屬性的設(shè)置和獲得都使用了標(biāo)準(zhǔn)的形式JSP與JavaBean12.2.1JavaBean簡(jiǎn)介(續(xù))

——例12_2說(shuō)明41Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.2.2在JSP程序中使用JavaBeanJavaBean類在Web應(yīng)用中的部署不能放在含有JSP文件的目錄中,而應(yīng)該放在安裝servlet的目錄中,且一定要使用包單個(gè)JavaBean類的字節(jié)碼文件的正確位置是webAppDir/WEB-INF/classes/PackageName/含有bean類的JAR文件應(yīng)該放在webAppDir/WEB-INF/lib/目錄中在JSP頁(yè)面中,可以使用三種JavaBean動(dòng)作標(biāo)簽構(gòu)建和操作JavaBean組件useBean動(dòng)作標(biāo)簽setProperty動(dòng)作標(biāo)簽getProperty動(dòng)作標(biāo)簽JSP與JavaBean42Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)

<jsp:useBeanid="beanName"

class="package.class"

scope="someScope"/>表示建立一個(gè)bean類的對(duì)象class指定的bean類的類名id指定該實(shí)例的名字scope屬性表示bean的有效范圍,有4個(gè)可選值PageRequestSessionApplication如果已經(jīng)存在scope和id相同的實(shí)例,則訪問(wèn)現(xiàn)存的實(shí)例JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))

——建立JavaBean43Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)Page默認(rèn)值,有效范圍是當(dāng)前請(qǐng)求訪問(wèn)的JSP頁(yè)面表示每次請(qǐng)求訪問(wèn)JSP頁(yè)面時(shí)都會(huì)創(chuàng)建新的bean,并將其放在PageContext對(duì)象中servlet可以通過(guò)預(yù)定義變量pageContext的getAttribute方法訪問(wèn)它Request有效范圍是當(dāng)前的請(qǐng)求將bean放在HttpServletRequest對(duì)象中,如果已經(jīng)存在,則調(diào)用之,可通過(guò)getAttribute方法訪問(wèn)在使用jsp:include,jsp:forward,或者RequestDispatcher的include或forward方法時(shí),兩個(gè)JSP頁(yè)面,或JSP頁(yè)面和servlet將會(huì)共享該bean12.2.2在JSP程序中使用JavaBean(續(xù))

——建立JavaBeanJSP與JavaBean44Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)Session有效范圍是客戶的會(huì)話期間表示要將bean實(shí)例存儲(chǔ)到與當(dāng)前請(qǐng)求相關(guān)的HttpSession對(duì)象中如果這個(gè)客戶在多個(gè)頁(yè)面中相互鏈接,每個(gè)頁(yè)面都包含有一個(gè)useBean標(biāo)簽,這些useBean標(biāo)簽中id的值相同,并且scope的值都是session,那么該客戶在這些頁(yè)面得到的bean是相同的一個(gè)Application表示要將bean實(shí)例存儲(chǔ)在ServletContext中,ServletContext由Web應(yīng)用中多個(gè)servlet和JSP頁(yè)面共享所有客戶共享這個(gè)bean,如果一個(gè)客戶改變這個(gè)bean的某個(gè)屬性的值,那么所有客戶的這個(gè)bean的屬性值都發(fā)生了變化這個(gè)bean直到服務(wù)器關(guān)閉才被取消JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))

——建立JavaBean45Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)<jsp:getPropertyname="beanName"

property="propertyName"/>表示讀取bean屬性的值bean的名稱由name項(xiàng)指定,與useBean標(biāo)簽的id項(xiàng)對(duì)應(yīng)property項(xiàng)指定屬性名稱該語(yǔ)法只能讀取在JavaBean類文件中有g(shù)etXxx方法的屬性也可用JSP腳本元素<%=beaName.getXxx()%>得到相同的結(jié)果JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))

——取得Bean的屬性值46Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)<jsp:setPropertyname="beanName"

property="propertyName"

value="propertyValue"/>表示設(shè)置bean的屬性值name項(xiàng)指定bean的名稱,與useBean標(biāo)簽的id相對(duì)應(yīng)property項(xiàng)指定屬性名稱value項(xiàng)指定屬性的值該語(yǔ)法只能設(shè)置JavaBean類文件中有setXxx方法的屬性也可以用JSP腳本元素<%=beanName.setXxx("propertyValue")%>得到相同的結(jié)果JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))

——設(shè)置Bean的屬性值47Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)建立JSP文件Ex12_3.jsp使用上節(jié)建立的EmployeeBean<%@pagecontentType="text/html;charset=gb2312"%><html><head><title>使用JavaBean</title></head><body><jsp:useBeanid="employee"class="myBeans.EmployeeBean"/>

<H2>初始值:</h2><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>編號(hào)是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工資是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>職務(wù)是:<jsp:getPropertyname="employee"property="occupation"/></p>

<H2>修改后:</h2><jsp:setPropertyname="employee"property="name"value="超杰"/><jsp:setPropertyname="employee"property="id"value="1"/><jsp:setPropertyname="employee"property="male"value="true"/><jsp:setPropertyname="employee"property="salary"value="6000"/><jsp:setPropertyname="employee"property="occupation"value="Manager"/><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>編號(hào)是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工資是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>職務(wù)是:<jsp:getPropertyname="employee"property="occupation"/></p></body></html>12.2.2在JSP程序中使用JavaBean(續(xù))

——例12_3JSP與JavaBean48Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)

首先顯示初始值,修改后,顯示新值JSP與JavaBean12.2.2在JSP程序中使用JavaBean(續(xù))

——例12_3運(yùn)行結(jié)果49Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)通過(guò)表單使用上節(jié)建立的EmployeeBean。<%@pagecontentType="text/html;charset=gb2312"%><%@pagecontentType="text/html;charset=gb2312"%><html><head><title>使用JavaBean</title></head><body><formname="form1"method="post"action=""><br>姓名:<inputtype="text"name="name"> <br>性別:<inputtype="radio"name="male"value="true">男

<inputtype=“radio”name=“male”value=“false”>女

<br>編號(hào):<inputtype="text"name="id"><br>職務(wù):<inputtype="text"name="occupation"><br>工資:<inputtype="text"name="salary"><br><inputtype="submit"name="Submit"value="提交"></form>

<jsp:useBeanid="employee"class="myBeans.EmployeeBean"/><jsp:setPropertyname="employee"property="name"param="name"/><jsp:setPropertyname="employee"property="id"param="id"/><jsp:setPropertyname="employee"property="male"param="male"/><jsp:setPropertyname="employee"property="salary"param="salary"/><jsp:setPropertyname="employee"property="occupation"param="occupation"/><P>名字是:<jsp:getPropertyname="employee"property="name"/></P><p>編號(hào)是:<jsp:getPropertyname="employee"property="id"/></p><p>是否男性?<jsp:getPropertyname="employee"property="male"/></p><p>工資是:<jsp:getPropertyname="employee"property="salary"/>元</p><p>職務(wù)是:<jsp:getPropertyname="employee"property="occupation"/></p></body></html>12.2.2在JSP程序中使用JavaBean(續(xù))

——例12_4JSP與JavaBean50Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.2.2在JSP程序中使用JavaBean(續(xù))

——例12_4運(yùn)行結(jié)果在表單中填入信息后,將顯示填入的信息JSP與JavaBean51Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3JSP標(biāo)簽庫(kù)JSP標(biāo)簽庫(kù)除了使用JavaBean,JSP還可以使用定制的標(biāo)記,便于Web開發(fā)人員實(shí)現(xiàn)內(nèi)容和功能的分離相對(duì)于使用JavaBean,用戶自定義的標(biāo)簽庫(kù)有如下優(yōu)點(diǎn)beans不可以操縱JSP的內(nèi)容,但標(biāo)簽庫(kù)可以使用標(biāo)簽比bean可以用更加簡(jiǎn)單的形式完成復(fù)雜的功能,JSP通過(guò)指令標(biāo)簽中的taglib指令使用標(biāo)簽庫(kù)52Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3JSP標(biāo)簽庫(kù)(續(xù))使用自定義標(biāo)簽比使用bean要復(fù)雜一些,它需要3個(gè)部分實(shí)現(xiàn)標(biāo)簽行為的標(biāo)簽處理類將XML元素名稱映射到標(biāo)簽實(shí)現(xiàn)上的標(biāo)簽庫(kù)描述文件(后綴名為tld)使用標(biāo)簽的JSP程序JSP標(biāo)簽庫(kù)53Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.1標(biāo)簽處理類標(biāo)簽處理類是一個(gè)Java類,用來(lái)告訴系統(tǒng)在JSP程序中遇到標(biāo)簽后應(yīng)該做些什么必須實(shí)現(xiàn)javax.servlet.jsp.tagext.Tag接口通常通過(guò)擴(kuò)展如下兩類來(lái)實(shí)現(xiàn)javax.servlet.jsp.tagext.TagSupportjavax.servlet.jsp.tagext.BodyTagSupportJSP標(biāo)簽庫(kù)54Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.1標(biāo)簽處理類(續(xù))TagSupport類及其doStartTag方法如果在taglib指令標(biāo)簽中沒(méi)有屬性或標(biāo)簽體,即標(biāo)簽的引用形式為<prefix:tagname/>,這樣的標(biāo)簽類應(yīng)該擴(kuò)展TagSupport類該類實(shí)現(xiàn)Tag接口并包含基本標(biāo)簽所需的大量標(biāo)準(zhǔn)功能。只須重載改該類的doStartTag方法,這個(gè)方法中的代碼將在頁(yè)面請(qǐng)求時(shí)期遇到標(biāo)簽頭時(shí)執(zhí)行為了產(chǎn)生輸出,doStartTag方法應(yīng)該調(diào)用pageContext類變量的getOut方法獲得JspWriter對(duì)象除此之外,調(diào)用pageContext的別的一些方法,還可以獲得和請(qǐng)求相關(guān)的別的數(shù)據(jù)結(jié)構(gòu):例如getRequest、getResponse、getServletContext、getSession如果標(biāo)簽沒(méi)有體,doStartTag方法應(yīng)該返回SKIP_BODY常量,這將告訴系統(tǒng)忽略標(biāo)簽起始和結(jié)束之間的內(nèi)容JSP標(biāo)簽庫(kù)55Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)實(shí)現(xiàn)一個(gè)標(biāo)簽處理類,當(dāng)JSP程序遇到相應(yīng)標(biāo)簽,可插入一個(gè)100以內(nèi)的隨機(jī)整數(shù)和一行文本packagetags;importjavax.servlet.jsp.*;importjavax.servlet.jsp.tagext.*;importjava.io.*;publicclassExampleTagextendsTagSupport{ publicintdoStartTag(){ try{ JspWriterout=pageContext.getOut(); out.print((int)(Math.random()*100)); out.print("Myfirsttagtest!"); } catch(IOExceptionioe){ System.out.println("ErrorinExampleTag:"+ioe); } return(SKIP_BODY); }}12.3.1標(biāo)簽處理類(續(xù))

——例12_5JSP標(biāo)簽庫(kù)56Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.2標(biāo)簽庫(kù)描述文件標(biāo)簽庫(kù)描述文件定義了標(biāo)簽處理類后,接下來(lái)就是在服務(wù)器上為這個(gè)類命名,并將其和一個(gè)專門的XML標(biāo)簽名關(guān)聯(lián)起來(lái)。通過(guò)標(biāo)簽庫(kù)描述文件可以完成這個(gè)任務(wù)該文件包括一個(gè)XML版本聲明、一個(gè)DOCTYPE聲明、以及一個(gè)taglib容器元素重點(diǎn)是taglib容器元素中的tag元素,對(duì)于沒(méi)有屬性的標(biāo)簽,tag元素又應(yīng)該包括以下四個(gè)子元素name:該元素定義了將在JSP文件中使用的tagname;tag-class:該元素給出了標(biāo)簽處理類的完整類名,包括包名;body-content:對(duì)于沒(méi)有體的標(biāo)簽應(yīng)該取值為EMPTY;description:一個(gè)簡(jiǎn)短的說(shuō)明JSP標(biāo)簽庫(kù)57Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)

建立一個(gè)標(biāo)簽庫(kù)描述文件,將上例建立的標(biāo)簽處理類和example名關(guān)聯(lián)。將其存儲(chǔ)在Chapter12\web\WEB-INF\tlds\example.tld<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns=""xmlns:xsi=""xsi:schemaLocation="web-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><short-name>example</short-name><uri>/WEB-INF/tlds/example</uri><tag><name>example</name><tag-class>tags.ExampleTag</tag-class><body-content>empty</body-content><description>Insert

arandominteger</description></tag></taglib>12.3.2標(biāo)簽庫(kù)描述文件(續(xù))

——例12_6JSP標(biāo)簽庫(kù)58Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.3在JSP文件中使用標(biāo)簽已經(jīng)有了標(biāo)簽處理類和標(biāo)簽庫(kù)描述文件,接下來(lái)就可以在JSP文件中使用自定義的標(biāo)簽了在首次使用標(biāo)簽之前,需要使用taglib指令標(biāo)簽<%@tagliburi=“someuri”prefix=“somename”%>uri屬性是一個(gè)引用標(biāo)簽庫(kù)描述符文件的絕對(duì)或相對(duì)URLprefix屬性指定一個(gè)將要在標(biāo)簽庫(kù)描述符文件定義的標(biāo)簽名前面使用的前綴接下來(lái)就可以使用<prefix:tagname/>引用標(biāo)簽了JSP標(biāo)簽庫(kù)59Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)建立一個(gè)JSP文件,使用剛剛建立的標(biāo)簽處理類和標(biāo)簽庫(kù)描述文件<%@pagecontentType="text/html;charset=gb2312"%><html><head><%@tagliburi="/WEB-INF/tlds/example"prefix="testTag"%><title>使用標(biāo)簽<testTag:example/></title></head><body><H1><testTag:example/></H1></body></html>12.3.3在JSP文件中使用標(biāo)簽(續(xù))

——例12_7JSP標(biāo)簽庫(kù)60Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)每次按刷新后結(jié)果都是隨機(jī)的12.3.3在JSP文件中使用標(biāo)簽(續(xù))

——例12_7運(yùn)行結(jié)果JSP標(biāo)簽庫(kù)61Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.4自定義標(biāo)簽庫(kù)有時(shí)我們需要在JSP文件中指定標(biāo)簽的一些屬性例如我們希望能輸出1000以內(nèi),而不是100以內(nèi)的隨機(jī)整數(shù)這時(shí)的引用形式應(yīng)該是<prefix:tagnameattribute1="value1"attribute2="value2"┅/>相應(yīng)的需要修改標(biāo)簽處理類和標(biāo)簽庫(kù)描述文件JSP標(biāo)簽庫(kù)62Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.4自定義標(biāo)簽庫(kù)(續(xù))

——修改標(biāo)簽處理類NewExampleTag.java使用attribute1將導(dǎo)致調(diào)用標(biāo)簽處理類的setAttribute1方法。所以為了在Ex12_7中能夠指定隨機(jī)整數(shù)的范圍,我們?yōu)閷傩匀∶麨閞ange,并修改標(biāo)簽處理類ExampleTag.java為NewExampleTag.java如下publicclassNewExampleTagextendsTagSupport{protectedintrange=100;publicintdoStartTag(){try{JspWriterout=pageContext.getOut();out.print((int)(Math.random()*range));out.print("Tagtestwithattribute!");}catch(IOExceptionioe){System.out.println("ErrorinExampleTag:"+ioe);}return(SKIP_BODY);}publicvoidsetRange(Stringrange){try{this.range=Integer.parseInt(range);}catch(NumberFormatExceptionnfe){this.range=100;}}}JSP標(biāo)簽庫(kù)63Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)此外還需要修改標(biāo)簽庫(kù)描述文件,在12.3.2節(jié)中介紹的tag元素中再增加attribute子元素,這個(gè)子元素又包括三個(gè)孫元素name::定義了屬性名稱,這個(gè)例子中,屬性名為rangerequired:指出是否必須提供該屬性,true是必須提供,false是可以不提供,這個(gè)例子中,range屬性是可選的,如果不選,則默認(rèn)為100,所以我們將其設(shè)定為falsertexprvalue:是一個(gè)可選孫元素,表示屬性值是否可以是JSP表達(dá)式,以便在請(qǐng)求時(shí)期動(dòng)態(tài)確定,默認(rèn)狀態(tài)下是false,表示只能是一個(gè)靜態(tài)字符串12.3.4自定義標(biāo)簽庫(kù)(續(xù))

——修改標(biāo)簽庫(kù)描述文件NewExample.tldJSP標(biāo)簽庫(kù)64Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)將剛剛建立的標(biāo)簽處理類和newexample名關(guān)聯(lián)。將其存儲(chǔ)在Chapter12\web\WEB-INF\tlds\NewExample.tld<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns=""xmlns:xsi=""xsi:schemaLocation="web-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><short-name>newexample</short-name><uri>/WEB-INF/tlds/NewExample</uri>

<tag>

<name>newexample</name>

<tag-class>tags.NewExampleTag</tag-class>

<body-content>empty</body-content>

<description>Insertarandomintegerwithinsomerange</description>

<attribute>

<name>range</name><required>false</required>

</attribute></tag></taglib>12.3.4自定義標(biāo)簽庫(kù)(續(xù))

——修改標(biāo)簽庫(kù)描述文件newexample.tldJSP標(biāo)簽庫(kù)65Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)最后,我們修改例12_7的Jsp文件如下:<%@pagecontentType="text/html;charset=gb2312"%><html><head><%@tagliburi="/WEB-INF/tlds/NewExample"prefix="testTag"%><title>使用標(biāo)簽<testTag:newexample/></title></head><body><UL><Br>使用默認(rèn)范圍:<testTag:newexample/><Br>1000以內(nèi):<testTag:newexamplerange="1000"/><Br>10000以內(nèi):<testTag:newexamplerange="10000"/></UL></body></html>12.3.4自定義標(biāo)簽庫(kù)(續(xù))

——修改JSP文件Ex12_7_new.jspJSP標(biāo)簽庫(kù)66Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)將會(huì)出現(xiàn)三個(gè)不同范圍內(nèi)的隨機(jī)數(shù),每次刷新后結(jié)果都將不同12.3.4自定義標(biāo)簽庫(kù)(續(xù))

——Ex12_7_new.jsp運(yùn)行結(jié)果JSP標(biāo)簽庫(kù)67Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.3.4自定義標(biāo)簽庫(kù)(續(xù))此外我們還可以在標(biāo)簽中使用標(biāo)簽體其形式為<prefix:tagname>body</prefix:tagname>,body里的內(nèi)容可以是JSP腳本元素、指令標(biāo)簽、動(dòng)作標(biāo)簽這時(shí)需要修改標(biāo)簽處理類doStartTag方法不能再返回SKIP_BODY,而應(yīng)該返回EVAL_BODY_INCLUDE如果需要在讀取body內(nèi)容后進(jìn)行一些處理,還需要重載doEndTag方法如果在標(biāo)簽內(nèi)容顯示完之后還想繼續(xù)處理后面的頁(yè)面內(nèi)容,doEndTag方法應(yīng)該返回EVAL_PAGES,否則應(yīng)該返回SKIP_PAGEJSP標(biāo)簽庫(kù)還可以實(shí)現(xiàn)嵌套標(biāo)簽。有興趣的讀者可以查找介紹JSP高級(jí)應(yīng)用的教材JSP標(biāo)簽庫(kù)68Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)12.4JSP與ServletJSP與ServletJSP不過(guò)是編寫Servlet的另一種不同的方式而已,JSP歸根到底也要轉(zhuǎn)化為Servlet二者各有所長(zhǎng)Servlet擅長(zhǎng)數(shù)據(jù)處理,如讀取并檢查數(shù)據(jù)、與數(shù)據(jù)庫(kù)通信JSP擅長(zhǎng)表示,即構(gòu)建HTML來(lái)表示請(qǐng)求的結(jié)果通常一個(gè)大型的項(xiàng)目需要綜合使用JSP與Servlet69Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)通常,我們可以將一個(gè)Web應(yīng)用程序的結(jié)構(gòu)分為三個(gè)部分顯示層(Presentationlayer):包括前端的HTML、XML和Applet,主要用作用戶的操作接口,負(fù)責(zé)讓用戶輸入數(shù)據(jù)以及顯示數(shù)據(jù)處理后的結(jié)果商業(yè)邏輯層(Businesslogiclayer):負(fù)責(zé)數(shù)據(jù)處理、連接數(shù)據(jù)庫(kù)、產(chǎn)生數(shù)據(jù)等控制層(Controllayer):控制整個(gè)網(wǎng)站的流程這三個(gè)部分分別對(duì)應(yīng)模型-視圖-控制器(ModelViewController,MVC)構(gòu)架的視圖、模型、控制器12.4.1Web應(yīng)用程序的一般結(jié)構(gòu)JSP與Servlet70Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)SUN在JSP出現(xiàn)早期制定了兩種規(guī)范,稱為Model1和Model212.4.1Web應(yīng)用程序的一般結(jié)構(gòu)(續(xù))

——兩種規(guī)范71Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)Model1設(shè)計(jì)模塊:開發(fā)快速,適合于小型系統(tǒng),其處理方式還可分為兩種完全使用JSP來(lái)開發(fā)用戶發(fā)出一個(gè)請(qǐng)求到服務(wù)器端,就是由JSP頁(yè)面來(lái)接收處理,接著將執(zhí)行結(jié)果響應(yīng)到客戶端由于JSP頁(yè)面包括了大量的Java語(yǔ)法,程序可讀性降低,不易維護(hù),而且不利于重復(fù)利用使用JSP+JavaBean將可重用的組件抽出來(lái)寫成JavaBean,通過(guò)JSP調(diào)用JavaBean來(lái)存取數(shù)據(jù)和進(jìn)行邏輯運(yùn)算依然缺乏流程控制,每個(gè)JSP文件都要完成驗(yàn)證參數(shù)正確性、確認(rèn)用戶的身份權(quán)限、異常處理等任務(wù),因此對(duì)將來(lái)的維護(hù)造成了困難12.4.1Web應(yīng)用程序的一般結(jié)構(gòu)(續(xù))

——Model1設(shè)計(jì)模塊JSP與Servlet72Java語(yǔ)言程序設(shè)計(jì)-JSP程序設(shè)計(jì)Model2MVC架構(gòu)對(duì)于大型系統(tǒng)的開發(fā),大多采取Model2MVC架構(gòu)的開發(fā)模式MVC最主要的精神就是Model和View的分離,因而可以使網(wǎng)頁(yè)設(shè)計(jì)師和程序員獨(dú)立工作,互不影響Model代表的是應(yīng)用程序的商業(yè)邏輯(通過(guò)JavaBean、EJB等組件來(lái)實(shí)現(xiàn))View是系統(tǒng)的顯示接口(使用JSP來(lái)輸出HTML)Controller提供應(yīng)用程序的處理過(guò)程控制(通常是servlet)12

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論