JSP實(shí)戰(zhàn)重點(diǎn)
發(fā)表時(shí)間:2024-01-18 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在 Internet眾多網(wǎng)站中,基于Web數(shù)據(jù)庫(kù)的動(dòng)態(tài)網(wǎng)站應(yīng)用相當(dāng)廣泛;赪eb網(wǎng)絡(luò)數(shù)據(jù)庫(kù)的動(dòng)態(tài)網(wǎng)站由一個(gè)Web瀏覽器作為客戶端界面,一個(gè)數(shù)據(jù)庫(kù)服務(wù)器用做信息存儲(chǔ)和一個(gè)連接兩者的 Web應(yīng)用服務(wù)器組成。原有開(kāi)發(fā)動(dòng)態(tài)網(wǎng)站的CGI技術(shù),隨著Web應(yīng)用程序的客戶端技術(shù)不斷地發(fā)展,逐漸被Java App...
在 Internet眾多網(wǎng)站中,基于Web數(shù)據(jù)庫(kù)的動(dòng)態(tài)網(wǎng)站應(yīng)用相當(dāng)廣泛。基于Web網(wǎng)絡(luò)數(shù)據(jù)庫(kù)的動(dòng)態(tài)網(wǎng)站由一個(gè)Web瀏覽器作為客戶端界面,一個(gè)數(shù)據(jù)庫(kù)服務(wù)器用做信息存儲(chǔ)和一個(gè)連接兩者的 Web應(yīng)用服務(wù)器組成。原有開(kāi)發(fā)動(dòng)態(tài)網(wǎng)站的CGI技術(shù),隨著Web應(yīng)用程序的客戶端技術(shù)不斷地發(fā)展,逐漸被Java Applet、ActiveX控件、DHTML和JavaScript所取代。這些技術(shù)極大地改善了用戶界面,但當(dāng)它們嘗試做一些深入的工作時(shí),開(kāi)始遇到客戶端瀏覽器不兼容、服務(wù)器負(fù)擔(dān)過(guò)重、訪問(wèn)速度下降以及安全性等問(wèn)題。JSP技術(shù)就是解決這些問(wèn)題的一把金鑰匙,本文主要討論在使用JSP技術(shù)構(gòu)建動(dòng)態(tài)網(wǎng)站的過(guò)程中的一些技術(shù)問(wèn)題。
JSP技術(shù)
JSP是基于Java Servlet以及整個(gè)Java體系的Web開(kāi)發(fā)技術(shù),利用這一技術(shù)可以建立先進(jìn)、安全、快速和跨平臺(tái)的動(dòng)態(tài)網(wǎng)站。在傳統(tǒng)的網(wǎng)頁(yè)HTML文件中加入Java程序片段和JSP標(biāo)記,就構(gòu)成了JSP網(wǎng)頁(yè)。Web服務(wù)器接收到訪問(wèn)JSP網(wǎng)頁(yè)的請(qǐng)求時(shí),首先執(zhí)行其中的程序片段,然后將執(zhí)行結(jié)果以HTML格式返回給客戶。程序片段可以操作數(shù)據(jù)庫(kù)、重新定向網(wǎng)頁(yè)以及發(fā)送 E-mail 等等,這就是建立動(dòng)態(tài)網(wǎng)站所需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅是得到的結(jié)果,對(duì)客戶瀏覽器的要求很低。如圖1所示,在用戶連接JSP網(wǎng)站時(shí),用戶請(qǐng)求網(wǎng)頁(yè),JSP頁(yè)面獨(dú)自響應(yīng)請(qǐng)求,將用戶對(duì)網(wǎng)頁(yè)的請(qǐng)求轉(zhuǎn)化為對(duì)數(shù)據(jù)的請(qǐng)求,通過(guò)JavaBean處理請(qǐng)求并將返回的數(shù)據(jù)封裝成HTML頁(yè)面返回給用戶。
JSP有許多優(yōu)勢(shì):
1. 程序?qū)懸淮危教幙梢赃\(yùn)行。JSP在設(shè)計(jì)時(shí),充分考慮到應(yīng)用平臺(tái)的無(wú)關(guān)性。依賴于Java的可移植性,JSP得到目前許多流行操作平臺(tái)的支持,可在Apache、NetScape、IIS等服務(wù)器上執(zhí)行。
2. 執(zhí)行速度快。JSP頁(yè)面只需編譯一次轉(zhuǎn)化為Java字節(jié)代碼,其后一直駐留于服務(wù)器內(nèi)存中,加快了對(duì)JSP頁(yè)面的響應(yīng)速度。若不考慮JSP頁(yè)面第一次編譯所花的時(shí)間,則JSP的響應(yīng)速度要比ASP快得多。
3. Java的優(yōu)勢(shì)。JSP技術(shù)是用Java語(yǔ)言作為腳本語(yǔ)言的?缙脚_(tái)、成熟、健壯、易擴(kuò)充的Java技術(shù)使得開(kāi)發(fā)人員的工作在其他方面也變得容易和簡(jiǎn)單。在Windows系統(tǒng)被懷疑可能會(huì)崩潰時(shí),Java能有效地防止系統(tǒng)崩潰。Java語(yǔ)言通過(guò)提供防止內(nèi)存泄漏的方法,在內(nèi)存管理方面大顯身手。加之,JSP為應(yīng)用程序提供了更為健壯的意外事件處理機(jī)制,充分發(fā)揮了Java的優(yōu)勢(shì)。
JSP技術(shù)難點(diǎn)
1. 連接數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)連接對(duì)動(dòng)態(tài)網(wǎng)站來(lái)說(shuō)是最為重要的部分,在與后端數(shù)據(jù)庫(kù)連接時(shí)可以采用ODBC或JDBC技術(shù)。雖然ODBC作為傳統(tǒng)的連接數(shù)據(jù)庫(kù)的手段是一種選擇,但是ODBC有以下致命缺陷,從而使它無(wú)法勝任JSP的請(qǐng)求:
(1) ODBC是C語(yǔ)言實(shí)現(xiàn)的API,從Java程序調(diào)用本地的C程序會(huì)帶來(lái)一系列類似安全性、完整性、健壯性方面的問(wèn)題。
(2) 其次,完全精確地實(shí)現(xiàn)從C代碼ODBC到Java API 翻譯的ODBC不會(huì)令人滿意,因?yàn)樵贘ava中沒(méi)有指針,而ODBC中大量地使用了指針,包括極易出錯(cuò)的空指針“void *”。
(3) 考慮到平臺(tái)移植性,在開(kāi)發(fā)JSP程序中使用ODBC會(huì)帶來(lái)負(fù)面影響,使得代碼不適合于移植。
為了使程序在具有安全性、完整性、健壯性的同時(shí), 可以方便地移植,采用JDBC連接數(shù)據(jù)庫(kù)更合適一些。JDBC是一種可用于執(zhí)行SQL語(yǔ)句的Java API,它由一些Java語(yǔ)言寫(xiě)的類、界面組成,使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的數(shù)據(jù)庫(kù)應(yīng)用程序。通過(guò)使用JDBC,可以很方便地將SQL語(yǔ)句傳送到幾乎任何一種數(shù)據(jù)庫(kù)。也就是說(shuō),可以不必寫(xiě)一個(gè)程序訪問(wèn)Sybase,寫(xiě)另一個(gè)程序訪問(wèn)Oracle,再寫(xiě)一個(gè)程序訪問(wèn)Microsoft的SQL Server。用JDBC寫(xiě)的程序能夠自動(dòng)地將SQL語(yǔ)句傳送給相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)。
在本地?cái)?shù)據(jù)庫(kù)程序使用Microsoft的Access等數(shù)據(jù)庫(kù)時(shí),可以使用Sun公司開(kāi)發(fā)的JDBC-ODBC橋,借用此技術(shù)JSP程序就可以訪問(wèn)帶有ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)。這樣既保留JDBC的優(yōu)點(diǎn),又可以使用Microsoft提供的ODBC數(shù)據(jù)源與Access連接。不管對(duì)方是何種數(shù)據(jù)庫(kù),只要有ODBC接口就可以直接使用JDBC-ODBC橋與數(shù)據(jù)庫(kù)連接,而無(wú)需因?yàn)楹蠖藬?shù)據(jù)庫(kù)的改變而改動(dòng)相應(yīng)的程序代碼,實(shí)現(xiàn)了應(yīng)用層與數(shù)據(jù)庫(kù)層的完美分離。如果需要變后端數(shù)據(jù)庫(kù)為MySQL,只需在ODBC數(shù)據(jù)源中安裝MySQL的驅(qū)動(dòng)程序之后,就可以直接使用MySQL數(shù)據(jù)庫(kù)了。
2. 內(nèi)建的組件
在實(shí)現(xiàn)網(wǎng)站的時(shí)候,由于客觀需要,為了方便區(qū)分本地局域網(wǎng)用戶與遠(yuǎn)端連上來(lái)的用戶,并提供相應(yīng)的權(quán)限,可以采用內(nèi)建的組件Request來(lái)捕獲每一個(gè)連到服務(wù)器上的用戶的IP地址,通過(guò)比較之后給出相應(yīng)的權(quán)限。這樣做到本局域網(wǎng)內(nèi)用戶可以使用網(wǎng)站內(nèi)所有公開(kāi)的和不對(duì)外公開(kāi)的資源。還可以將現(xiàn)有的方法加以改進(jìn),將各種IP地址輸入到數(shù)據(jù)庫(kù)中并且賦予不同的IP地址不同的權(quán)限,以完整地控制用戶使用網(wǎng)站資源。
會(huì)話狀態(tài)維持是Web應(yīng)用開(kāi)發(fā)者必須面對(duì)的問(wèn)題。為了了解用戶是否還在線,使用內(nèi)建的Session組件,通過(guò)給每個(gè)登錄用戶一個(gè)Session變量,可以在用戶非正常離開(kāi)網(wǎng)站之后,關(guān)閉該用戶使用的資源,達(dá)到節(jié)省內(nèi)存,提高服務(wù)器性能的目的。
在JSP中還提供了Cookie類,其構(gòu)造器有兩個(gè)參數(shù),分別代表Cookie的名稱和值。Cookie類中提供了各種方法設(shè)置Cookie的屬性,如通過(guò)setMaxAge方法可以設(shè)置Cookie的生存時(shí)間。若生存時(shí)間為負(fù)值,代表瀏覽器關(guān)閉Cookie,即消失; 生存時(shí)間為0,代表刪除Cookie; 生存時(shí)間為正數(shù),代表Cookie存在多少秒?梢杂肅ookie臨時(shí)保存用戶的賬號(hào)和口令,JSP可隨時(shí)讀取,驗(yàn)證用戶的合法性。可以將用戶的瀏覽狀態(tài)保存在Cookie中,下次用戶再訪問(wèn)網(wǎng)頁(yè)時(shí),由JSP向?yàn)g覽器顯示個(gè)性化頁(yè)面。
3. 轉(zhuǎn)換Unicode編碼
在許多JSP頁(yè)面的調(diào)試過(guò)程中都碰到過(guò)由于漢字編碼與Unicode編碼轉(zhuǎn)換引起的問(wèn)題,如在瀏覽器中看到的JSP頁(yè)面中的漢字都是亂碼、JSP頁(yè)面無(wú)法正常顯示漢字、JSP不能接收表單提交的漢字、JSP數(shù)據(jù)庫(kù)讀寫(xiě)無(wú)法獲得正確的內(nèi)容等等,這是因?yàn)楝F(xiàn)在大部分具有國(guó)際化特征的軟件核心字符處理都是以Unicode為基礎(chǔ)的,在軟件運(yùn)行時(shí)根據(jù)當(dāng)時(shí)“Locale/Lang/Codepage”設(shè)置確定相應(yīng)的本地字符編碼設(shè)置,并依此處理本地字符,所以應(yīng)該在處理過(guò)程中實(shí)現(xiàn)Unicode和本地字符集的相互轉(zhuǎn)換,甚至以Unicode為中介的兩個(gè)不同本地字符集的相互轉(zhuǎn)換。這種方式在網(wǎng)絡(luò)環(huán)境下被進(jìn)一步延伸,任何網(wǎng)絡(luò)兩端的字符信息也需要根據(jù)字符集的設(shè)置轉(zhuǎn)換成可接受的內(nèi)容。
由于IE默認(rèn)字符集為GB2312,然而Windows默認(rèn)為GBK,Java則默認(rèn)為Unicode,所以如果不通過(guò)一定的轉(zhuǎn)換,直接在GB2312字符集上顯示從GBK或Unicode得到的頁(yè)面將是一片亂碼。Java 語(yǔ)言采用Unicode處理字符,但從另一個(gè)角度來(lái)說(shuō),在Java程序中也可以采用非Unicode,重要的是保證程序入口和出口的漢字信息不失真。如完全采用ISO-8859-1來(lái)處理漢字也能達(dá)到正確的結(jié)果,經(jīng)過(guò)轉(zhuǎn)換之后并將網(wǎng)頁(yè)字符集強(qiáng)制設(shè)為GB2312字符集顯示,就能夠正常顯示漢字了。