版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第2章Web動態(tài)編程技術(shù)JSP 2.1 JSP的概念及特性 2.2 JSP頁面的組成 2.3 Session元素 2.4 Cookie元素 2.5 JSP通過JavaBean訪問數(shù)據(jù)庫的綜合實例 2.6 Student_info實例在JBuilder中的實現(xiàn) 思考題 2.1 JSP的概念及特性 2.1.1 JSP與ASP腳本語言的比較1JSP與ASP處理機制的比較JSP與Microsoft的ASP技術(shù)非常相似。 兩者都提供在HTML代碼中混合某種程序代碼、由語言引擎解釋執(zhí)行程序代碼。在ASP或JSP環(huán)境下, HTML代碼主要負責描述信息的顯示樣式,而程序代碼則用來描述處理邏輯。普通的HTML頁
2、面只依賴于Web服務器,而ASP和JSP頁面需要附加的語言引擎分析和執(zhí)行程序代碼。程序代碼的執(zhí)行結(jié)果被重新嵌入到HTML代碼中,然后一起發(fā)送給瀏覽器。ASP和JSP都是面向Web服務器的技術(shù),客戶端瀏覽器不需要任何附加的軟件支持。 ASP的編程語言是基于VB的腳本語言,JSP使用的是Java,這是兩者最明顯的區(qū)別。ASP與JSP還有一個更為本質(zhì)的區(qū)別:兩種語言引擎用完全不同的方式處理頁面中嵌入的程序代碼。在ASP下, 基于VB的腳本代碼被ASP引擎解釋執(zhí)行;在JSP下,代碼被編譯成Servlet并由Java虛擬機執(zhí)行,這種編譯操作僅在對JSP頁面的第一次請求時發(fā)生。 2JSP與ASP的性能比較
3、 表2-1 JSP與ASP的性能比較 2.1.2 JSP運行環(huán)境Sun公司的JSP主頁在http:/products/jsp/index.html,從這里可以下載 JSP 規(guī)范。這些規(guī)范定義了供應商在創(chuàng)建 JSP 引擎時所必須遵從的一些規(guī)則。 執(zhí)行JSP代碼前, 需要在服務器上安裝JSP引擎Tomcat。 以安裝到E盤為例,安裝Tomcat之后,將源文件放在E:tomcatwebappsROOT目錄下,執(zhí)行E:tomcatbinstartup.bat命令即可啟動服務器。默認配置下服務器在端口 8080 監(jiān)聽,使用http:/localhost:8080即可打開缺省頁面。 2.1.3 JDK的安
4、裝與配置Java開發(fā)工具JDK(Java Development Kit)是許多Java專家最初使用的開發(fā)環(huán)境。盡管許多編程人員已經(jīng)使用第三方的開發(fā)工具,但JDK仍被作為Java開發(fā)的重要工具。JDK的安裝與安裝其他軟件一樣,直接雙擊setup,按照安裝要求就可以順利安裝成功?,F(xiàn)在以1.4.0版本為例,假設(shè)安裝到E盤。 JDK的安裝及配置步驟如下:(1) 設(shè)置JAVA_HOME環(huán)境變量:右鍵單擊【我的電腦】屬性【高級】【環(huán)境變量】,新建一個系統(tǒng)變量,命名為JAVA_HOME,值為E:j2sdk1.4.0,單擊【確定】完成配置。如圖2.1所示。 圖2.1 JAVA_HOME的配置 (2) 設(shè)置C
5、LASSPATH環(huán)境變量:環(huán)境變量的配置位置同上。新建一個系統(tǒng)變量,命名為CLASSPATH,值為E:j2sdk1.4.0libdt.jar;E:j2sdk1.4.0libtools.jar,單擊【確定】完成當前配置。如圖2.2所示。 圖2.2 CLASSPATH的配置 至此,JDK環(huán)境變量配置完畢,單擊【環(huán)境變量】屬性框里的【確定】,可完成應用配置。這樣,就完成了運行Tomcat的前提。 2.1.4 Tomcat的安裝和配置一般來說,Tomcat可從網(wǎng)站直接下載,解壓后即可使用。如果有安裝程序,則直接點setup安裝即可。以解壓或安裝到D盤為例:解壓或安裝完后,進入到d:tomcatbin,
6、然后雙擊目錄里名為startup. bat的批處理文件就可以開啟Tomcat服務器。如圖2.3所示。 圖2.3 Tomcat服務器啟動后的示意圖 注意:有些時候8080端口可能會被某個應用程序占用(如Oracle等),這時就需要修改Tomcat服務器的端口,可在D:tomcatconfserver.xml中修改,如圖2.4所示。 圖2.4 Tomcat配置文件server.xml 2.1.5 JBoss的安裝和配置現(xiàn)今,越來越多的Web應用建立在JBoss Web服務器上,在此對JBoss的安裝及配置進行簡要介紹。在JBoss的安裝目錄下(如D:jboss-3.2.6)進入bin目錄,運行ru
7、n.bat文件,運行后的界面如圖2.5所示。 圖2.5 JBoss服務器完全啟動后的示意圖 JBoss的配置文件在D:jboss-3.2.6serverdefaultdeployjbossweb-tomcat50.sarserver.xml,如圖2.6所示。注:這里以JBoss裝在D盤下為例。 圖2.6 JBoss配置文件server.xml 設(shè)置端口為80882.1.6 JSP的基本語法功能:寫在JSP程序中,但不發(fā)給客戶。 JSP語法: 例程2.1 JSP注釋(comment.html) A Comment Test A Test of Comments 描述: 用隱藏注釋標記的字符會在J
8、SP編譯時被忽略掉。JSP編譯器不會對之間的語句進行編譯,它不會顯示在客戶的瀏覽器中,也不會在源代碼中看到。上面的例程如圖2.7所示。從運行效果來看,代碼里面的注釋部分This comment will not be visible in the page source并沒有出現(xiàn)在瀏覽器里。 圖2.7 comment.html的運行效果 2.1.7 JSP生命周期JSP的生命周期主要包括初始化、請求處理和中止。初始化:在客戶端第一次請求該JSP頁時,調(diào)用jspInit()方法。請求處理:當客戶請求到達時,容器調(diào)用jspService方法。該方法是JSP頁面轉(zhuǎn)換成Servlet時自動轉(zhuǎn)換成的。中
9、止:當Web服務器和容器關(guān)閉時,容器調(diào)用JSP的jspDestroy()方法。 2.1.8 JSP執(zhí)行流程JSP是通過JSP Container轉(zhuǎn)換成Servlet并運用于網(wǎng)頁的語言。JSP執(zhí)行流程如圖2.8所示。 圖2.8 JSP執(zhí)行流程示意圖 當用戶在客戶端發(fā)出請求時,通過Web服務傳到JSP容器,JSP容器將判斷JSP頁面在當前JSP容器中是否是第一次請求。如果是第一次請求,則將JSP文件編譯成Servlet文件以應答客戶請求,否則需判斷JSP頁面是否作過修改;如果作過修改,則需編譯JSP文件,否則無需編譯,直接調(diào)用上次編譯后的應答類進行客戶端的響應。 2.2 JSP頁面的組成 JSP頁
10、面包括JSP元素、注釋及HTML元素,如圖2.9所示。JSP指令:用于將消息傳送到JSP引擎。JSP動作:使用XML語法格式的標記來控制JSP引擎的各種行為。JSP腳本:插入Java語言程序代碼。 圖2.9 JSP頁面的組成 2.2.1 JSP指令JSP指令是為JSP引擎而設(shè)計的。該指令并不直接產(chǎn)生任何可見輸出,而只是告訴引擎如何處理其余JSP頁面。這些指令始終被括在“”標記中。兩個最重要的指令是page和include。另外,taglib指令很少使用,在用JSP1.1創(chuàng)建自定義標記時可以使用它。 幾乎在所有的JSP頁面頂部都會看到page指令。盡管不是必需的,但page指令可以讓你指定:(1
11、) 到何處查找起支持作用的Java類別:(2) 出現(xiàn)Java運行問題時,通過errorPage將用戶引向何處:1include指令include指令用于把其它的文本文件或JSP文件加入到當前的JSP文件中,同時解析這個文件中的JSP語句。 include指令可以把你的內(nèi)容分成更多可管理的元素,比如包括一個普通頁面頁眉或頁腳的元素。包含的網(wǎng)頁可以是一個固定的HTML 頁面或更多的JSP內(nèi)容,形式如: 指令將會在JSP編譯時插入一個包含文本或代碼的文件,當你使用指令時,這個包含的過程相當于靜態(tài)的。靜態(tài)的包含就是指這個被包含的文件將會被插入到JSP文件中去。這個包含的文件可以是JSP文件、HTML文
12、件或文本文件。如果包含的是JSP文件,則這個包含的JSP文件中的代碼將會被執(zhí)行。這個被包含文件可以是HTML文件、JSP文件、文本文件,或者只是一段Java代碼。但是得注意,在這個包含文件中不能使用、標記,因為這將會影響在原JSP文件中同樣的標記,有時還會導致錯誤。如果這個包含文件被改變,則包含此文件的JSP文件將被重新編譯。 屬性: file=relativeURL:這個包含文件的路徑名一般來說是指相對路徑,不需要什么端口、協(xié)議和域名,如error.jsp、templates/onlinestore.html、/beans/calendar.jsp 如果這個路徑以“/”開頭,那么這個路徑主要
13、是參照JSP應用的上下關(guān)系路徑;如果路徑是以文件名或目錄名開頭的,那么這個路徑就是正在使用的JSP文件的當前路徑。 例程2.2 include指令(include.jsp)An Include Test The current date and time are 被包含文件date.jsp: 圖2.10 include.jsp的運行效果 2page指令功能:定義JSP文件中的全局屬性。JSP 語法:% page language=java extends=package.class import=package.class | package.*, . session=true | false
14、 buffer=none | 8KB | sizekb autoFlush=true | false info=text errorPage=relativeURL contentType=mimeType ;charset=characterSet | text/html; charset=ISO-8859-1 isErrorPage=true | false 例: 相關(guān)描述:指令作用于整個JSP頁面,同樣包括靜態(tài)的包含文件。但是,指令不能作用于動態(tài)的包含文件,比如 ??梢栽谝粋€頁面中用多個指令,但是其中的屬性只能用一次。不過也有個例外,那就是import屬性。因為import屬性和Java
15、中的import語句差不多(參照Java Language),所以就可以多用此屬性幾次。無論把指令放在JSP文件的哪個地方,它的作用范圍都是整個JSP頁面。不過,為了JSP程序的可讀性以及好的編程習慣,最好還是把它放在JSP文件的頂部。 屬性: language=java:聲明腳本語言的種類,暫時只能用“java”。 extends=package.class:標明JSP編譯時需要加入Java Class的全名,但是得慎重地使用它,它會限制JSP的編譯能力。 import=package.class | package.* , .:指明需要導入的Java包的列表,這些包就作用于程序段、表達式以
16、及聲明。 下面的包在JSP編譯時已經(jīng)導入了,所以不需要再指明:java.lang.* javax.servlet.*javax.servlet.jsp.* javax.servlet.http session=true | false:設(shè)定客戶是否需要HTTP session。如果設(shè)定為true,那么session是有用的。 如果設(shè)定為false,那么就不能使用session對象,以及定義了scope=session的元素,這樣使用會導致錯誤。缺省值是true。 buffer=none | 8KB | sizekb:buffer的大小被out對象用于處理執(zhí)行后的JSP對客戶瀏覽器的輸出。缺省值
17、是8 KB。 autoFlush=true | false:設(shè)置如果buffer溢出,是否需要強制輸出。如果其值被定義為true(缺省值),輸出正常,如果它被設(shè)置為false,并且這個buffer溢出,就會導致一個意外錯誤的發(fā)生。如果把buffer設(shè)置為none,那么就不能把autoFlush設(shè)置為false。 isThreadSafe=true | false:設(shè)置JSP文件是否能多線程使用。缺省值是true,也就是說,JSP能夠同時處理多個用戶的請求。如果設(shè)置為false,則一個JSP文件一次只能處理一個請求。 info=text:一個文本在執(zhí)行JSP時將會被逐字加入JSP中,能夠使用Se
18、rvlet.GetServletInfo方法取回。 errorPage=relativeURL:設(shè)置處理異常事件的JSP文件。當頁面出現(xiàn)一個設(shè)有捕獲的異常時,指向另一個JSP頁面的URL。 contentType=mimeType ;charset=characterSet | text/html;charset=ISO-8859-1:設(shè)置MIME類型。缺省MIME類型是text/html, 缺省字符集為ISO-8859-1。 isErrorPage=true | false:設(shè)置此頁是否為出錯頁。如果被設(shè)置為true,則能使用exception對象。 3taglib指令功能:定義一個標簽庫及
19、其自定義標簽的前綴。JSP 語法: uri:英文全稱為Uniform Resource Identifier,其功能是根據(jù)標簽的前綴對自定義的標簽進行惟一的命名。 例: . 相關(guān)描述: 指令聲明此JSP文件使用了自定義的標簽,同時引用標簽庫,還指定了它們的標簽的前綴。 自定義的標簽含有標簽和元素之分。因為JSP文件能夠轉(zhuǎn)化為XML,所以了解標簽和元素之間的聯(lián)系很重要。 標簽只不過是一個在意義上被抬高了的標記,是JSP元素的一部分。 JSP元素是JSP語法的一部分,和XML一樣有開始標記和結(jié)束標記。元素也可以包含其它的文本、標記、元素。 4隱藏對象隱藏對象也叫內(nèi)置對象,是JSP自帶的,不需在頁面
20、聲明就可直接使用。在腳本中使用隱藏對象,使用戶更容易收集通過瀏覽器請求發(fā)送的信息、響應瀏覽器以及存儲用戶信息,從而使對象開發(fā)者擺脫了很多繁瑣的工作。隱藏對象包括: Request:請求對象。 Response:響應對象。 PageContext:頁面上下文對象。 Session::會話對象。 Application:應用程序?qū)ο蟆?Out:輸出對象。 Config:配置對象。 Page:頁面對象。 Exception:例外對象。JSP內(nèi)置對象映射表如表2-2所示。表2-2 JSP內(nèi)置對象映射表 各對象的描述如下:(1) Request對象:代表的是來自客戶端的請求,此請求包含來自GET/POS
21、T請求的參數(shù),在服務器端接受并得到從客戶端瀏覽器提交或上傳的信息。Request 對象可以訪問任何基于 HTTP 請求傳遞的所有信息,包括從Form表單用 POST 方法或 GET 方法傳遞的參數(shù)、cookie等。關(guān)于它的方法使用得較多的是getParameter、getParameterNames和getParameterValues。通過調(diào)用這幾個方法,可獲取請求對象中所包含的參數(shù)的值。 (2) Response對象:代表的是對客戶端的響應,也就是說,可以通過Response對象組織發(fā)送到客戶端的數(shù)據(jù)。但由于處于組織方式的底層,因此建議普通讀者不使用。需要向客戶端發(fā)送文字時,直接使用Out
22、對象即可。(3) PageContext對象:直譯時可以稱作“頁面上下文”對象,代表的是當前頁面運行的一些屬性,常用的方法包括findAttribute、getAttribute、getAttributesScope和getAttributeNamesInScope。一般情況下PageContext對象用到的也不是很多。只有在項目所面臨的情況比較復雜時,才會利用頁面屬性來輔助處理。 (4) Session對象:代表服務器與客戶端所建立的會話,當需要在不同的JSP頁面中保留客戶信息的情況下使用,例如,在線購物、客戶軌跡跟蹤等。Session對象建立在Cookie的基礎(chǔ)上,所以使用時應注意判斷客戶
23、端是否打開了Cookie。常用的方法包括getId、getValue、getValueNames和putValue等。(5) Application對象:負責提供應用程序在服務器中運行時的一些全局信息,常用的方法有g(shù)etMimeType和getRealPath等。 (6) Out對象:代表了向客戶端發(fā)送數(shù)據(jù)的對象,與Response對象不同。通過Out對象發(fā)送的內(nèi)容將是瀏覽器需要顯示的內(nèi)容,是文本一級的??梢酝ㄟ^Out對象直接向客戶端輸出一個由程序動態(tài)生成的HTML文件。 常用的方法除了Print和PrintIn之外, 還包括clear、clearBuffer、flush、getBufferS
24、ize和gerRemaining。因為Out對象內(nèi)部包括了一個緩沖區(qū),所以需要對緩沖區(qū)進行操作的方法。(7) Config對象:提供一些配置信息, 以獲得Servlet初始化時的參數(shù)。 常用的方法有g(shù)etInitParameter和getInitParameterNames。 (9) Exception對象:代表了JSP文件運行時所產(chǎn)生的例外對象。此對象不能在一般JSP文件中直接使用,只能在使用了“”的JSP文件中使用。這是因為JSP文件運行時產(chǎn)生的錯誤對象被向外拋出,只有被使用了“”標記,從而被具有攔截錯誤對象功能的JSP文件所攔截。最常用的方法就是getMessage,用以獲得錯誤信息,此
25、外還會用到getLocalizedMessage和printStackTrace。 2.2.2 JSP動作JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。 利用JSP動作可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼等。常見標準JSP動作(JSP 1.1規(guī)范Web包容器所支持的7個標準動作)有:用于在當前頁面加入其它頁面的內(nèi)容,運行時加入;include指令在編譯時就加入。:用于轉(zhuǎn)發(fā)請求,page屬性指定轉(zhuǎn)發(fā)的目的頁面,如:。:用于在使用include和forward操作時添加傳遞的參數(shù)。在被包括的頁面或轉(zhuǎn)發(fā)的頁面進行r
26、equest訪問時可以獲得添加的參數(shù),如:。:用于下載Java插件,且該動作在客戶端執(zhí)行。 1動作功能:包含一個靜態(tài)或動態(tài)文件。 JSP 語法:jsp:include page=relativeURL | flush=true / 或者jsp:include page=relativeURL | flush=true jsp:param name=parameterName value=parameterValue | / 例: 相關(guān)描述: 元素允許包含動態(tài)文件和靜態(tài)文件,這兩種包含文件的結(jié)果是不同的。如果文件僅是靜態(tài)文件,那么這種包含僅僅是把包含文件的內(nèi)容加到JSP文件中去;如果這個文件是動
27、態(tài)的,那么這個被包含文件也會被JSP編譯器執(zhí)行(與ASP相似)。 不能從文件名上判斷一個文件是動態(tài)的還是靜態(tài)的,比如aspcn.jsp 就有可能只是包含一些信息而已,并不需要執(zhí)行。能夠同時處理這兩種文件,因此就不需要包含時還要判斷此文件是動態(tài)的還是靜態(tài)的。如果這個包含文件是動態(tài)的,那么還可以用來傳遞參數(shù)名和參數(shù)值。 相關(guān)屬性: page=relativeURL | :參數(shù)為一相對路徑,或者是代表相對路徑的表達式。 flush=true:表示是否要立即打印出來。如果要立即打印出來,則必須使用flush=true,不能使用false值。缺省值為false。 jsp:param name=param
28、eterName value=parameterValue |/:子句能傳遞一個或多個參數(shù)給動態(tài)文件。在一個頁面中可使用多個來傳遞多個參數(shù)。 2動作功能:重定向一個HTML文件、JSP文件或者是一個程序段。JSP 語法:jsp:forward page=relativeURL | / 或者jsp:forward page=relativeURL | jsp:param name=parameterName value=parameterValue | / 例:或者 相關(guān)描述: 標簽從一個JSP文件向另一個文件傳遞一個包含用戶請求的request對象。標簽以下的代碼,將不能執(zhí)行。 能夠向目標文件
29、傳送參數(shù)和值。在上面的例子中傳遞的參數(shù)名為username,值為jsmith。如果使用了標簽的話,則目標文件必須是一個動態(tài)的文件,且能夠處理參數(shù)。 如果使用了非緩沖輸出的話,那么使用時就要小心。如果在使用之前JSP文件已經(jīng)有了數(shù)據(jù),那么文件執(zhí)行就會出錯。 相關(guān)屬性: page=relativeURL | :這里是一個表達式或一個字符串,用于說明將要定向的文件或URL。這個文件可以是JSP程序段,或者是其它能夠處理request對象的文件(如asp、cgi、php)。 jsp:param name=parameterName value=parameterValue | /:向一個動態(tài)文件發(fā)送一
30、個或多個參數(shù),這個文件一定是動態(tài)文件。 如果想傳遞多個參數(shù),則可以在一個JSP文件中使用多個。name指定參數(shù)名,value指定參數(shù)值。 3動作功能:執(zhí)行一個applet或bean,有可能的話還要下載一個Java插件執(zhí)行它。JSP 語法: jsp:param name=parameterName value=parameterValue | / text message for user 例:Unable to load applet 相關(guān)描述: 元素用于在瀏覽器中播放或顯示一個對象(典型的就是applet和bean),而這種顯示需要瀏覽器的Java插件。 當JSP文件被編譯并送往瀏覽器時,元
31、素將會根據(jù)瀏覽器的版本替換成或者元素。注意,用于HTML 4.0,用于HTML 3.2。 一般來說,元素會指定對象是applet還是bean,同樣也會指定class的名字及位置。另外,還會指定將從哪里下載這個Java插件。相關(guān)屬性: type=bean | applet: 將被執(zhí)行的插件對象的類型。必須得指定是bean還是applet,因為這個屬性沒有缺省值。 code=classFileName:將會被Java插件執(zhí)行的Java Class的名字,必須以 .class結(jié)尾。這個文件必須存在于codebase屬性指定的目錄中。 codebase=classFileDirectoryName:將
32、會被執(zhí)行的Java Class文件的目錄(或者是路徑)。如果沒有提供此屬性,那么使用的JSP文件的目錄將會被使用。 name=instanceName:是bean或applet實例的名字,它將會在JSP其它的地方調(diào)用。 archive=URIToArchive, .:一些由逗號分開的路徑名。這些路徑名用于預裝一些將要使用的class,這會提高applet的性能。 4動作功能:創(chuàng)建一個Bean實例并指定它的名字和作用范圍。 JSP語法:jsp:useBean id=beanInstanceName scope=page | request | session | application clas
33、s=package.class | type=package.class | class=package.class type=package.class | beanName=package.class| type=package.class / | other elements 例: 相關(guān)描述: JavaBean類似于ActiveX控件,它們都能提供常用功能并且可以重復使用。 JavaBean的值是通過一些屬性獲得的,可通過這些屬性訪問JavaBean設(shè)置。相關(guān)屬性: id=beanInstanceName:在所定義的范圍中確認Bean的變量,能在后面的程序中使用此變量名來分辨不同的Bea
34、n,這個變量名對大小寫敏感。 scope=page | request | session | application:Bean存在的范圍以及id變量名的有效范圍。缺省值是page,以下是詳細說明: page :能在包含元素的JSP文件以及此文件中的所有靜態(tài)包含文件中使用Bean,直到頁面執(zhí)行完畢向客戶端發(fā)回響應或轉(zhuǎn)到另一個文件為止。 request :在任何執(zhí)行相同請求的JSP文件中使用Bean,直到頁面執(zhí)行完畢向客戶端發(fā)回響應或轉(zhuǎn)到另一個文件為止。能夠使用request對象訪問Bean,比如request.getAttribute(beanInstanceName)。 session :從
35、創(chuàng)建Bean開始,就能在任何使用相同session的JSP文件中使用Bean。這個Bean存在于整個session生存周期內(nèi),任何在分享此session的JSP文件都能使用同一個Bean。注意,在創(chuàng)建Bean的JSP文件的指令中必須指定session=true。 application :從創(chuàng)建Bean開始,就能在任何使用相同application的JSP文件中使用Bean。這個Bean存在于整個application生存周期內(nèi),任何在分享此application的JSP文件都能使用同一Bean。 class=package.class:使用new關(guān)鍵字以及class構(gòu)造器從一個class中示
36、例一個Bean。這個class不能是抽象的,必須有一個公用的、沒有參數(shù)的構(gòu)造器。這個package的名字區(qū)別大小寫。 5 動作功能:設(shè)置Bean中的屬性值。JSP語法:jsp:setPropertyname=beanInstanceNameproperty= * | property=propertyName param=parameterName | property=propertyName value=string | / 例: 相關(guān)描述: 元素使用Bean給定的setter方法,在Bean中設(shè)置一個或多個屬性值。在使用這個元素之前必須使用聲明此Bean。這是因為和是聯(lián)系在一起的,同時它
37、們使用的Bean實例的名字也應當相匹配(就是說,在中的name的值應當和中id的值相同)。 能使用多種方法利用來設(shè)定屬性值: 可以通過用戶輸入的所有值(被作為參數(shù)儲存在request對象中)來匹配Bean中的屬性; 通過用戶輸入的指定的值來匹配Bean中指定的屬性;還可以在運行時使用一個表達式來匹配Bean的屬性。 相關(guān)屬性: name=beanInstanceName:表示已經(jīng)在中創(chuàng)建的Bean實例的名字。 property=*:儲存用戶在JSP輸入的所有值,用于匹配Bean中的屬性。在Bean中的屬性的名字必須和request對象中的參數(shù)名一致。從客戶傳到服務器上的參數(shù)值一般都是字符類型,
38、這些字符串為了能夠在Bean中匹配,就必須轉(zhuǎn)換成其它的類型。下面列出了Bean屬性的類型以及它們的轉(zhuǎn)換方法。 java.lang.Boolean.valueOf(String)java.lang.Byte.valueOf(String)java.lang.Character.valueOf(String) java.lang.Double.valueOf(String)java.lang.Integer.valueOf(String)java.lang.Float.valueOf(String)java.lang.Long.valueOf(String)如果request對象的參數(shù)值中有空值,
39、那么對應的Bean屬性將不會設(shè)定任何值。同樣地,如果Bean中有一個屬性沒有與之對應的request參數(shù)值,那么這個屬性同樣也不會設(shè)定。 property=propertyName param=parameterName :使用request中的一個參數(shù)值來指定Bean中的一個屬性值。在這個語法中,property指定Bean的屬性名,param指定request中的參數(shù)名。 如果Bean屬性和request參數(shù)的名字不同,那么就必須得指定property和param;如果它們同名,那么只需要指明property就行了;如查參數(shù)值為空(或未初始化),則對應的Bean屬性不被設(shè)定。 proper
40、ty=propertyName value=string | :使用指定的值來設(shè)定Bean屬性。這個值可以是字符串,也可以是表達式。如果是字符串,那么它就會被轉(zhuǎn)換成Bean屬性的類型(查看上面字符串轉(zhuǎn)化為其它類型的方法);如果是一個表達式,那么它的類型就必須和它將要設(shè)定的屬性值的類型一致;如果參數(shù)值為空,那么對應的屬性值也不會被設(shè)定。另外,不能在一個中同時使用param和value。如果使用了property=*,那么Bean的屬性沒有必要按html表單中的順序排序。 6動作功能:獲取Bean的屬性值,用于顯示在頁面中。JSP語法:例:Calendar of 相關(guān)描述: 元素將獲得Bean的屬
41、性值,并可以將其使用或顯示在JSP頁面中。在使用之前,必須用創(chuàng)建它。 元素有一些限制: 不能使用來檢索一個已經(jīng)被索引了的屬性; 能夠和JavaBeans組件一起使用,但是不能與Enterprise Bean一起使用。相關(guān)屬性: name=beanInstanceName:Bean的名字,由指定。 property=propertyName:指定Bean的屬性名。 在Sun的JSP參考中提到:如果使用來檢索的值是空值,那么NullPointerException將會出現(xiàn);同時,如果使用程序段或表達式來檢索其值,那么在瀏覽器上出現(xiàn)的是null(空)。 例程2.3 numguess.jspNumbe
42、rGuessCongratulations! You got it.And after just tries.Care to try again? Welcome to the Number Guess game.Im thinking of a number between 1 and 100. Whats your guess? Good guess, but nope. Try .You have made guesses.Im thinking of a number between 1 and 100.Whats your guess? 例程2.4 NumberGuessBean.j
43、ava(例程2.3所用javabean文件)package num;import java.util.*;public class NumberGuessBean int answer;boolean success;String hint;int numGuesses;/構(gòu)造函數(shù)執(zhí)行初始化public NumberGuessBean() reset(); /設(shè)置guess屬性值public void setGuess(String guess) numGuesses+;int g;try g = Integer.parseInt(guess); catch (NumberFormatExce
44、ption e) g = -1; if (g = answer) success = true; else if (g = -1) hint = a number next time; else if (g answer) hint = lower; /獲得是否猜數(shù)成功屬性public boolean getSuccess() return success; /獲得提示屬性public String getHint() return + hint; /獲得猜數(shù)次數(shù)屬性public int getNumGuesses() return numGuesses;/復位:重新設(shè)置猜數(shù)答案,并初始化屬性
45、值public void reset() answer = Math.abs(new Random().nextInt() % 100) + 1; success = false; numGuesses = 0; 把JSP文件放到Tomcat的webapps/root/下面,把Java文件編譯生成的class文件放到webapps/root/web-inf/classes/num下面。如果沒有classes文件夾,則要自己新建一個,然后在classes下面再建一個包,對本例來說,就是num文件夾。numguess.jsp編譯運行效果如圖2.11所示。 圖2.11 numguess.jsp的運行
46、效果 2.2.3 JSP腳本1JSP聲明JSP聲明用來定義頁面級變量,以保存信息或定義JSP頁面的其余部分可能需要的支持方法。如果發(fā)現(xiàn)代碼太多,則通常把它們寫成一個獨立的Java類別。聲明一般都在“”標記中。一定要以分號( ;)結(jié)束變量聲明。例:。 可以一次性聲明多個變量和方法,只要以;結(jié)尾就行。當然,這些聲明在Java中應是合法的。 可以直接使用在中被包含進來的已經(jīng)聲明的變量和方法,不需要對它們重新進行聲明。一個聲明僅在一個頁面中有效。如果你想讓每個頁面都用到一些聲明,則最好把它們寫成一個單獨的文件,然后用或元素包含進來。2JSP表達式 JSP表達式的結(jié)果會被轉(zhuǎn)換成一個字符串,并且被直接包括
47、在輸出頁面之內(nèi)。JSP 表達式包含在“” 標記中,沒有分號。 例: 表達式元素表示的是一個在腳本語言中被定義的表達式,在運行后被自動轉(zhuǎn)化為字符串,然后插入到這個表達式在JSP文件的位置顯示。因為這個表達式的值已經(jīng)被轉(zhuǎn)化為字符串,所以你能在一行文本中插入這個表達式。 3ScriptletScriptlet是一段可以在處理請求時間執(zhí)行的Java代碼。Scriptlet包括在之間,它可以產(chǎn)生輸出,并將輸入發(fā)到客戶的輸出流里;也可以是一些流程控制語句。當然,在它中間還可以包含一些合法的Java注釋。在被編譯的類里, 多個Scriptlet可以按在JSP中出現(xiàn)的順序合并成一個Scriptlet。Scri
48、ptlet像其它的Java代碼或者方法一樣,可以修改在它內(nèi)部的對象,作為方法引用的結(jié)果。在一段Scriptlet中創(chuàng)建的對象,可以在另一個Scriptlet中使用。在編譯后的Servlet中,Srciptlet被包含在Servlet的Service方法中。Scriptlet的語法是:。 2.3 Session元素 2.3.1 Session 對象Session翻譯為中文是“會話”的意思。Session其實是指訪問者從到達某個特定主頁到離開的時間段內(nèi),服務器給他分配的一個用來存儲信息的全局變量的集合。這些變量可以是自動生成的,也可以是程序員在服務器端腳本程序中定義的。因此,Session實際上是
49、服務器與客戶端之間的“會話”。Session可以用來存儲訪問者的一些特定信息,如訪問者姓名、性別、所使用瀏覽器類型、顯示器分辨率以及停留時間。主機服務器就是根據(jù)Session來跟蹤這些信息的。 用戶在Web應用程序中訪問同一頁面時,Session變量始終存在。當用戶在應用程序的頁面間跳轉(zhuǎn)時,存儲在Session對象中的變量也不會清除。當然,也可以使用Session方法來結(jié)束一個會話或設(shè)置空閑會話的超時期限。Session在JSP程序中是一個內(nèi)置對象。Session存放數(shù)據(jù)的格式與Cookie一樣,是以“索引鍵(名字)/值”的格式來存放的。不同的是,在Session對象存儲的值可以是復雜的對象類
50、型,而不限于簡單的字符串;另外,Session存放數(shù)據(jù)的對象存放在Web服務器端,而Cookie存放數(shù)據(jù)的對象存放在Web客戶端,因此Session比Cookie更安全。在JSP程序中,通常不需要特別的聲明就可以直接使用Session對象。 不過,為了確認,可以加入以下代碼,以表示需要啟動Session功能:如果設(shè)置Session的值為false,則說明禁用Session功能。Session對象類為HttpSession,它提供了很多使用方法,在下一節(jié)中將詳細介紹。 2.3.2 Session對象方法Session對象類是HttpSession。HttpSession由服務器的程序?qū)崿F(xiàn),提供H
51、TTP服務器和HTTP客戶端之間的會話。會話被用來在多頁面請求中保持狀態(tài)和用戶認證。會話實際是通過使用Cookie或Query字段來保持的。為了測試客戶端是否支持Cookie,HttpSession定義了一個isCookieSupportDetermined方法和一個isUsingCookies方法。Session對象常用方法如表2-3所示。表2-3 Session對象常用方法 2.3.3 Session示例在應用中使用最多的是getAttribute和setAttribute。現(xiàn)以一個簡單的例子來說明Session的應用,程序示例為例程2.5(信息寫入Session并顯示Session相關(guān)信
52、息)和例程2.6(從Session讀出信息)。 例程2.5 Page1.jsp顯示Session相關(guān)信息并設(shè)置session顯示Session相關(guān)信息并設(shè)置session %/取得session的編號String Id = session.getId();out.println(session的編號:+Id);/取得session的建立時間Date startTime = new Date(session.getCreationTime();out.println(session建立時間:+startTime);/取得session的最后一次使用時間Date lastTime = new Da
53、te(session.getLastAccessedTime();out.println(最后使用session時間:+lastTime);/取得session的有效時間 int tmpTime = session.getMaxInactiveInterval();out.println(默認的session有效時間為:+tmpTime);/將session的有效時間設(shè)定為50分鐘session.setMaxInactiveInterval(60*50);int changeTime = session.getMaxInactiveInterval();out.println(修改后sessi
54、on有效時間為:+changeTime);/將字符串保存到sessionsession.setAttribute(str,this is a session example);% 轉(zhuǎn)向page2 例程2.6 page2.jsp獲取session 2.4 Cookie元素 2.4.1 Cookie對象1什么是Cookie瀏覽器用一個或多個限定的文件支持Cookie,這些文件在Windows機器上叫做Cookie文件,被網(wǎng)站用來存儲Cookie數(shù)據(jù),網(wǎng)站可以在這些Cookie文件中插入信息。Cookie也為一些網(wǎng)絡黑客提供了可乘之機,例如,有的程序可以通過某些途徑讀取Cookie文件,所以有的用戶
55、認為Cookie增加了安全隱患,甚至是對自身隱私的侵犯。盡管如此,由于Cookie的高效靈活等特性,它在應用程序中還是得到了廣泛的應用。 2. Cookie的工作原理Cookie將通過HTTP Headers從服務器返回到瀏覽器上,服務器首先在響應中利用 Set-Cookie Header來創(chuàng)建一個Cookie,服務器端在響應請求的Cookie Header中就會返回這個Cookie來完成瀏覽器的認證。服務器可以根據(jù)Cookie來跟蹤用戶,這對于需要區(qū)別用戶的場合(如電子商務)特別有用。服務器也可以據(jù)此收集用戶的信息,因此,為了保證安全,多數(shù)瀏覽器可以設(shè)置是否使用Cookie。選擇IE瀏覽器的
56、【工具】【Internet選項】【隱私】即可設(shè)定Cookie,如圖2.12所示。 圖2.12 Internet選項的隱私設(shè)置 2.4.2 Cookie對象方法常用的Cookie方法如表2-4所示。 表2-4 Cookie對象常用方法 2.4.3 Cookie示例一個Cookie包含一對鍵/值。下面的代碼生成一個Cookie并將它寫到用戶的硬盤上:Cookie the Cookie=new Cookie(cookieName, cookieValue);Response.addCookie(theCookie);在Cookie的構(gòu)造方法中,第一個參數(shù)是鍵,第二個參數(shù)是值。如果服務器想從用戶硬盤上
57、獲取Cookie,則可以使用下面的方法從客戶請求中取得所有的Cookie:Cookie cookies=request.getCookies(); 然后調(diào)用Cookie的getName方法獲得Cookie的鍵,調(diào)用Cookie的getValue方法獲得Cookie的值。此外,還可以通過Cookie的setMaxAge(int expire)方法來設(shè)置Cookie的有效期。超過參數(shù)expire指定的時間(以秒為單位),Cookie就會失效。先寫Cookie信息,然后從Cookie中讀出剛寫入的信息,相關(guān)文件為writecookie.jsp(寫Cookie)和readcookie.jsp(讀Coo
58、kie)。例程2.7 writecookie.jsp寫入cookie寫入cookie示例讀取cookie 例程2.8 readcookie.jsp讀取cookie% Cookie cookies=request.getCookies();/將適用目錄下所有Cookie讀入并存入cookies數(shù)組中Cookie sCookie=null;String svalue=null;String sname=null;if(cookies=null)/如果沒有任何cookieout.println(沒有cookie記錄);elseout.println(cookie個數(shù):+cookies.length)
59、; for(int i=0;icookies.length;i+)/循環(huán)列出所有可用的CookiesCookie=cookiesi;sname=sCookie.getName();svalue=sCookie.getValue();out.println(cookie名字:+sname+,cookie值:+svalue);% 下面再舉一例,先從客戶端中讀出Cookie鍵的值,然后將指定的一對Cookie的鍵/值寫回客戶端。例程2.9 JspCookie.jspJspCookie % /從客戶請求中取得所有的Cookie Cookie cookies=request.getCookies();
60、if(cookies!=null) for(int i=0;i Cookie name: Cookie value: Old max age in seconds: New max age in seconds: JspCookie.jsp首先讀取客戶端所有的Cookie并把它們輸出到網(wǎng)頁上,然后修改Cookie的有效期,將修改前后Cookie的有效期輸出到網(wǎng)頁上,最后創(chuàng)建新的Cookie并把它寫到客戶端。JspCookie.jsp生成的網(wǎng)頁如圖2.13所示。 圖2.13 JspCookie程序運行結(jié)果 在瀏覽JspCookie.jsp時,第一次訪問時是將Cookie寫到瀏覽器,所以看不到打印
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 硬式內(nèi)鏡的清洗標準及質(zhì)量要求
- 農(nóng)村兄弟二人分家協(xié)議書范文
- 本田4s維修協(xié)議書范文電子版
- 推土機挖掘機合作協(xié)議書范文
- 網(wǎng)約車規(guī)范協(xié)議書范文模板
- 檔案行政執(zhí)法培訓課件
- 電力設(shè)施隱患排查治理方案
- 我運動我健康我快樂作文4篇
- 2016年戶外服裝發(fā)展現(xiàn)狀及市場前景分析
- 旅游接待業(yè)課件
- 量子計算的生物醫(yī)學應用-用于藥物研發(fā)與疾病診斷
- Unit+8大單元整體教學設(shè)計 人教版英語九年級全冊
- 江蘇省鹽城市建湖縣2023-2024學年八年級上學期期中生物模擬試題
- 點火源的種類及安全控制對策
- 工程未驗收證明書范本
- 污水處理工程設(shè)備安裝驗收記錄
- 校園足球特色學校足球校本課程教材
- 變電站施工站班會記錄表
- 儲能項目用戶側(cè)投資測算表
- 古錢幣優(yōu)秀課件
- 辦公室工作流程圖課件
評論
0/150
提交評論