- JSP網(wǎng)站開發(fā)詳解
- 唐友國 湛洪波編著
- 5183字
- 2019-01-01 07:18:33
1.1 JSP的概念和作用
按照腳本語言是服務(wù)于某一個(gè)子系統(tǒng)的語言這種論述,JSP應(yīng)當(dāng)被看做是一種腳本語言。然而作為一種腳本語言,JSP又顯得過于強(qiáng)大,因?yàn)樵谄渲袔缀蹩梢允褂萌康腏ava類。
本節(jié)我們將介紹JSP的基礎(chǔ)知識及學(xué)習(xí)建議。
1.1.1 什么是JSP
簡要地說,JSP是用來開發(fā)含有動(dòng)態(tài)內(nèi)容網(wǎng)頁的一種技術(shù)。純HTML網(wǎng)頁只會包含靜態(tài)的內(nèi)容,即其內(nèi)容通常保持不變。而JSP頁面則不同,它可以根據(jù)任意數(shù)量的變量來動(dòng)態(tài)調(diào)整自己頁面中的內(nèi)容,這些變量可以是身份驗(yàn)證信息、用戶提供的對象信息、頁面顏色,還可以是用戶所做的一切選擇等。這些功能對于創(chuàng)建像淘寶網(wǎng)這類在線購物及旅店、機(jī)票預(yù)訂,以及對內(nèi)容進(jìn)行多國語言的國際化和個(gè)性化的Web應(yīng)用程序來說是非常關(guān)鍵的。
JSP雖然功能強(qiáng)大,但其頁面和常規(guī)的HTML網(wǎng)頁一樣,也包含標(biāo)準(zhǔn)的標(biāo)記語言元素,如HTML的標(biāo)簽。同時(shí),JSP頁面還包括自身特殊的JSP元素,這些元素將允許服務(wù)器把動(dòng)態(tài)內(nèi)容添加到頁面上。JSP自己的元素用途非常廣泛,它可以讀取數(shù)據(jù)庫的數(shù)據(jù)信息,以及記錄用戶需要保存的信息等。
現(xiàn)在我們來看一個(gè)簡單的JSP頁面執(zhí)行過程。當(dāng)用戶請求一個(gè)JSP頁面時(shí),JSP執(zhí)行過程如圖1-1所示。

圖1-1 JSP的執(zhí)行過程
(1)客戶端發(fā)出Request(請求)。
(2)JSP容器(服務(wù)器)將JSP轉(zhuǎn)譯成Servlet的源代碼。
(3)將產(chǎn)生的Servlet的源代碼經(jīng)過編譯,并加載到內(nèi)存執(zhí)行。
(4)把結(jié)果Response(響應(yīng))至客戶端。
JSP除定義了自身特殊的元素外,還定義了許多用于Web應(yīng)用程序的標(biāo)準(zhǔn)元素,如引用JavaBeans的元素及共享信息的元素。開發(fā)人員也可以通過使用應(yīng)用程序的專用元素來擴(kuò)展JSP語法,從而完成諸如訪問數(shù)據(jù)庫和EJB、發(fā)送電子郵件,以及生成表示應(yīng)用程序?qū)S脭?shù)據(jù)的HTML這樣的任務(wù)。JSTL規(guī)范(與JSP規(guī)范相關(guān)的一種規(guī)范)也定義了一組這種常用的自定義元素,標(biāo)準(zhǔn)元素和自定義元素的組合可以讓開發(fā)人員開發(fā)出強(qiáng)大的Web應(yīng)用程序。
1.1.2 JSP和Servlet扮演的角色
Sun公司首先發(fā)展出Servlet,其功能強(qiáng)大且體系設(shè)計(jì)很完善。但其輸出HTML語法時(shí)必須使用out.println()逐句輸出,如下面一段簡單的程序所示:
out.println("<html>"); out.println("<head><title>First Servlet</title></head>"); out.println(" Hello World <br>"); out.println("<body>"); out.println("您好"); out.println("</body>"); out.println("</html>")
由于這是一段簡單的Hello World程序,還看不出其復(fù)雜性。但是當(dāng)整個(gè)網(wǎng)頁內(nèi)容非常復(fù)雜時(shí),Servlet程序可能大部分都是用out.println()輸出HTML的標(biāo)簽了!
后來Sun公司推出類似于ASP的嵌入型腳本語言并且命名為“JavaServer Pages”,簡稱為“JSP”,于是上面那段程序改為:
<html> <head><title>www.csdn.cn –中國軟件開發(fā)網(wǎng) </title></head> <body> <% out.println(" Hello World <br>"); out.println("您好"); %> </body> </html>
雖然表面上JSP代替了Servlet完成了請求響應(yīng),但實(shí)際上JSP仍然需要結(jié)合Servlet技術(shù)才能完成自己的任務(wù)。因?yàn)镴SP頁面在Web服務(wù)器端執(zhí)行時(shí)首先轉(zhuǎn)譯成Servlet類,然后通過執(zhí)行轉(zhuǎn)譯后的Servlet把響應(yīng)結(jié)果送到客戶端,讀者可參考圖1-1。
可以說JSP注重于Web應(yīng)用程序的前端視圖,而Servlet則注重于Web應(yīng)用程序的邏輯控制。現(xiàn)在大多數(shù)Web應(yīng)用程序把這兩種強(qiáng)大的技術(shù)結(jié)合起來,因?yàn)槎叩慕Y(jié)合是一個(gè)強(qiáng)大的工具,使用這種工具可以開發(fā)出易于維護(hù)且能夠隨著新的需求進(jìn)行擴(kuò)展的伸縮性強(qiáng)的應(yīng)用程序。由于Servlet是一個(gè)普通的Java類,因此可以借用Java語言的全部能力,通過標(biāo)準(zhǔn)的Java開發(fā)和調(diào)試環(huán)境來實(shí)現(xiàn)請求處理。然后可以把JSP頁面用在最適合它的地方,如前端視圖中,使用Servlet收集或生成的信息把應(yīng)答通過JSP顯示。
自從JSP技術(shù)產(chǎn)生以來,將其與Servlet結(jié)合起來的Web開發(fā)框架有很多,如JSP+Servlet+JavaBeans模式、基于JSP和Servlet的MVC(Model View Control,模型視圖控制器)模式等。這些典型的框架技術(shù)目前都很受開發(fā)人員的青睞,在后面的章節(jié)中我們將會詳細(xì)介紹。
1.1.3 JSP和其他框架的集成
JSP作為J2EE的一部分,既可以用于開發(fā)小型的Web站點(diǎn),也可以用于開發(fā)大型企業(yè)級的應(yīng)用程序。
對于最小型的Web站點(diǎn),可以直接使用JSP來構(gòu)建動(dòng)態(tài)網(wǎng)頁。這種站點(diǎn)最為簡單,所需要的僅僅是簡單的留言板及動(dòng)態(tài)日期等基本的功能。對于這種開發(fā)模式,一般可以將所有的動(dòng)態(tài)處理部分都放置在JSP的Scriptlet中,就像使用PHP或ASP開發(fā)動(dòng)態(tài)網(wǎng)頁一樣。
中型站點(diǎn)面對的是數(shù)據(jù)庫查詢、用戶管理和小量的商業(yè)業(yè)務(wù)邏輯,在這種站點(diǎn)中,不能將所有的內(nèi)容全部交給JSP頁面來處理。在單純的JSP中加入Java Beans技術(shù)將有助于這種中型網(wǎng)站的開發(fā)。利用Java Beans將很容易完成如數(shù)據(jù)庫連接、用戶登錄與注銷及商業(yè)業(yè)務(wù)邏輯封裝的任務(wù)。例如,將常用的數(shù)據(jù)庫連接寫為一個(gè)Java Beans,既方便了使用,又可以使JSP文件簡單而清晰,通過封裝還可以防止一般的開發(fā)人員直接獲得數(shù)據(jù)庫的控制權(quán)。
然而對于大中型網(wǎng)站來說,最復(fù)雜的就是如何把業(yè)務(wù)、邏輯控制和視圖這幾個(gè)方面完全清晰地區(qū)分開來,而不是由傳統(tǒng)的JSP+Java Beans方式來實(shí)現(xiàn)。因?yàn)槟菢訒屔虡I(yè)邏輯、數(shù)據(jù)庫及視圖控制方面很混亂,不易維護(hù)及擴(kuò)展,并且可伸縮性差。這樣就產(chǎn)生了用于區(qū)別商業(yè)邏輯、業(yè)務(wù)及視圖控制的技術(shù)及其開發(fā)框架,典型的有EJB、Struts、Hibernate及Spring等框架技術(shù)。下面我們簡單來看幾個(gè)典型JSP和其他技術(shù)及框架相集成的技術(shù)。
(1)JSP+Java Beans+DataBase。
這個(gè)模型主要的特點(diǎn)就是JSP全權(quán)接收請求并發(fā)送響應(yīng),而Java Beans的作用是和數(shù)據(jù)庫服務(wù)器進(jìn)行通信,讀取數(shù)據(jù)。然后將數(shù)據(jù)信息發(fā)送至JSP頁面,如圖1-2所示。

圖1-2 JSP+JavaBean的框架實(shí)現(xiàn)
(2)JSP+JavaBeans+Servlet+DAO。
該模型集成使用了Servlets和JSP頁面,如圖1-3所示。其中JSP頁面用于表示層,并且Servlets負(fù)責(zé)處理各類任務(wù)。Servlet作為一個(gè)控制器,負(fù)責(zé)處理請求并創(chuàng)建JSP頁面所需的任何Bean,并確定將該請求傳遞到哪個(gè)JSP頁面。JSP頁面檢索Servlet創(chuàng)建的對象,并提取動(dòng)態(tài)內(nèi)容插入在一個(gè)模板中。

圖1-3 JSP+Servlet+JavaBean的MVC框架實(shí)現(xiàn)
該模型促進(jìn)了MVC體系結(jié)構(gòu)風(fēng)格設(shè)計(jì)模式的使用,早就存在多個(gè)框架能夠?qū)崿F(xiàn)MVC這個(gè)有用的設(shè)計(jì)模式,并將內(nèi)容和表示真正地分離開來。Apache Struts是MVC的形式化框架,非常適用于復(fù)雜的應(yīng)用程序。在這些復(fù)雜的應(yīng)用程序中,單個(gè)請求或表單提交會產(chǎn)生看起來截然不同的結(jié)果。
(3)JSP+Serlvet+EJB。
EJB(Enterprise JavaBeans)帶給我們的是一種基本的事務(wù)管理和一種與客戶端類型無關(guān)的組件模型,它加強(qiáng)了對模型(Model)、視圖(View)和控制器(Controller)的劃分,從而使整個(gè)應(yīng)用程序更易于擴(kuò)展和維護(hù)。
EJB組件有兩種基本類型,即實(shí)體Bean和會話Bean。實(shí)體Bean表示的是特定的一部分商業(yè)數(shù)據(jù),例如,一個(gè)員工或一個(gè)客戶的數(shù)據(jù)。每個(gè)實(shí)體Bean都有一個(gè)唯一的標(biāo)識符,要訪問這個(gè)實(shí)體的所有客戶都將使用同一個(gè)Bean實(shí)例;而會話Bean主要用來處理商業(yè)邏輯,而且只能由創(chuàng)建它的那個(gè)客戶使用。通常,會話Bean代表其客戶操作實(shí)體Bean。
在一個(gè)EJB應(yīng)用程序的Web界面中,請求被發(fā)送給一個(gè)Servlet,這與JSP+Servlet方案一樣。該Servlet將不再處理這個(gè)請求,而是請求一個(gè)EJB會話Bean(或者一個(gè)用到EJB會話Bean接口的Web層組件)來完成對請求的處理。因此控制器角色跨越了Servlet和EJB會話Bean,模型也可以跨越多個(gè)組件。通常我們使用Web層之間的通信,當(dāng)完成對請求的處理后會話Bean可能更新了許多EJB實(shí)體Bean。這時(shí),Web層中的Java Beans組件將會接到通知,從而自動(dòng)地更新其狀態(tài)。隨后一個(gè)JSP頁面將使用這些組件來生成一個(gè)應(yīng)答,這樣模型角色由EJB實(shí)體Bean和Web層中的Java Beans組件共同承擔(dān)。
基于EJB的應(yīng)用程序通常被看做是無所不能的,然而它是最復(fù)雜的模型,因此需要在開發(fā)、配置、操作和管理領(lǐng)域多做許多事情。盡管EJB可能是一種開發(fā)某種類型應(yīng)用程序的比較好的方式,但它對許多人來說過于復(fù)雜了。因此在決定使用EJB之前,應(yīng)仔細(xì)考慮到底是否真的需要EJB。
(4)JSP+Struts+JavaBeans+DAO。
JSP和Struts框架的集成實(shí)際上就是MVC框架(如圖1-3所示)技術(shù)的延展,可用于快速開發(fā)Java Web應(yīng)用。Struts實(shí)現(xiàn)的重點(diǎn)在控制器,包括ActionServlet/RequestProcessor,我們定制的Action也為視圖提供了一系列定制標(biāo)簽(Custom Tag)。但Struts幾乎沒有涉及模型,所以它可以采用JAVA實(shí)現(xiàn)的任何形式的商業(yè)邏輯。
Struts本身負(fù)責(zé)將MVC中的用戶數(shù)據(jù)傳入業(yè)務(wù)層,并且將業(yè)務(wù)層處理的結(jié)果返回給用戶。
(5)JSP+Struts+Hibernate。
Hibernate是一個(gè)面向Java環(huán)境的對象/關(guān)系數(shù)據(jù)庫映射工具,這種映射工具用來把對象模型表示的對象映射到基本SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)中。
Hibernate使用數(shù)據(jù)庫和配置文件來為應(yīng)用程序提供持久化服務(wù),如圖1-4所示為其概覽。

圖1-4 Hibernate概覽
Hibernate不僅僅管理Java類到數(shù)據(jù)庫表的映射(包括Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時(shí)人工使用SQL和JDBC處理數(shù)據(jù)的時(shí)間。
Hibernate的目標(biāo)是對于開發(fā)人員通常持久化相關(guān)的編程任務(wù)減輕其中任務(wù)量的95%,對于那些在基于Java的中間層應(yīng)用中實(shí)現(xiàn)面向?qū)ο蟮臉I(yè)務(wù)模型和商業(yè)邏輯的應(yīng)用,它很有用。
在沒有Hibernate之前,我們通過Java Beans或DAO來實(shí)現(xiàn)數(shù)據(jù)庫底層的數(shù)據(jù)通信,其開發(fā)任務(wù)大,且責(zé)任重大。也可能是修改最頻繁的模塊,并且不利于擴(kuò)展和修改,兼容性差。通過JSP+Struts+Hibernate的集成,數(shù)據(jù)處理模塊大大減輕了負(fù)擔(dān)。這樣視圖層專門由JSP來完成,Struts實(shí)現(xiàn)的重點(diǎn)是控制器的角色,它負(fù)責(zé)從Hibernate中讀取數(shù)據(jù)信息并傳送給JSP來顯示。而Hibernate專門負(fù)責(zé)模型與數(shù)據(jù)庫的通信,定制數(shù)據(jù)庫映射對象及HSQL語句來完成數(shù)據(jù)庫表的映射、查詢及獲取數(shù)據(jù)等關(guān)鍵任務(wù)。
(6)JSP+Struts+Hibernate+Spring。
Spring是一個(gè)服務(wù)于所有層面的應(yīng)用程序框架,提供了Java Bean的配置基礎(chǔ)、AOP的支持、JDBC的提取框架,以及抽象事務(wù)支持等。
相對于EJB來說,Spring是一個(gè)輕量級的J2EE應(yīng)用開發(fā)框架。這里提到的輕量級指的是Spring框架本身,而不是說Spring只能適用于輕量級的應(yīng)用開發(fā)。其輕量級體現(xiàn)在框架本身的基礎(chǔ)結(jié)構(gòu),以及對其他應(yīng)用工具的支持和裝配能力。與EJB這種龐然大物相比,Spring使我們降低了各個(gè)技術(shù)層次之間的風(fēng)險(xiǎn)。EJB的內(nèi)聚性較強(qiáng),比如數(shù)據(jù)持久層管理、事務(wù)管理及生命周期管理都全部交給容器管理,內(nèi)聚性的白盒特征使我們必須放棄一部分可控性而信任容器能力。而Spring則是考慮如何“不造輪子”,即更好地組裝這些輪子,讓它們更好地轉(zhuǎn)動(dòng)。例如,數(shù)據(jù)持久層管理可以使用Hibernate,日志管理可以使用jakarta.common.logging。
Spring的主要部分為Bean+ApplicationContext,它以一種統(tǒng)一的Ioc方式查找、管理、組裝并使用系統(tǒng)的組件取代一切工廠,包括持久化框架,及Web框架等。
JSP+Struts+Hibernate+Spring目前被J2EE開發(fā)行業(yè)內(nèi)視為J2EE框架的最佳組合,其結(jié)構(gòu)如圖1-5所示。在這個(gè)組合中,表示層由Struts來實(shí)現(xiàn),業(yè)務(wù)邏輯類可以用Spring的beans進(jìn)行配置,并由Spring管理與表現(xiàn)層的控制器及更下層的DAO對象的關(guān)系。另外,還可以進(jìn)行配置性的事務(wù)處理。而DAO層是Spring封裝后的Hibernate API,讓Hibernate繼續(xù)瘦身,并且通過Spring建立與上層的關(guān)系。

圖1-5 使用Struts及Hibernate的Spring中間層
1.1.4 學(xué)習(xí)JSP網(wǎng)站編程
如何學(xué)習(xí)JSP編程,以成為一個(gè)成功的JSP開發(fā)人員?一個(gè)常見的誤解是把JSP當(dāng)做簡化的Java,開發(fā)人員通常試著沒有學(xué)習(xí)要求的支持技巧而直接學(xué)習(xí)JSP。JSP是一個(gè)銜接技術(shù),并且要成功地銜接開發(fā)人員需要理解的另外的技術(shù)。如Java、HTML和JavaScript,這是學(xué)習(xí)JSP之前最好能掌握的。
筆者的建議如下。
(1)架設(shè)Web Server,并理解它。
因?yàn)锳pache是免費(fèi)的且在大多數(shù)平臺上工作,所以為訓(xùn)練目的,推薦Apache。
(2)學(xué)習(xí)和理解HTML。
務(wù)必要了解HTML基礎(chǔ),特別是HTML布局中如table及body等這些重要標(biāo)記的使用方法。許多開發(fā)人員通過HTML IDE學(xué)習(xí)HTML。因?yàn)榇蠖鄶?shù)HTML IDE產(chǎn)生混亂的TMl語法,所以花時(shí)間學(xué)習(xí)手工編寫HTML是很有必要的,使用JSP和HTML混合編程精通HTML語法是重要的。
(3)學(xué)習(xí)Java語言編程基礎(chǔ)。
必須認(rèn)真學(xué)習(xí)Java,因?yàn)樗且婚T全新的面向?qū)ο缶幊陶Z言,和C、C++并列為3大開發(fā)語言。并且JSP和Servlet都是以Java語言為基礎(chǔ)的,因此Java基礎(chǔ)很重要。如果有面向?qū)ο缶幊陶Z言(如C++)經(jīng)驗(yàn),那么學(xué)習(xí)Java將會很快。不用擔(dān)心學(xué)習(xí)Swing或Java的圖形方面,因?yàn)樵贘SP中不會使用這些特征。集中精力 在Java工作的細(xì)節(jié),學(xué)習(xí)Java的邏輯及面向?qū)ο蟮木幊趟枷耄惨贘ava Bean上花時(shí)間。學(xué)習(xí)Applet是好的,但是如Swing及JSP之類的大多數(shù)應(yīng)用將不使用小程序。
在這方面的書籍很多,典型的有《Thinkin in Java》(第三版)及《Java2核心技術(shù)》等。
(4)學(xué)習(xí)JavaScript。
JavaScript是網(wǎng)頁編程中一種高效的腳本語言,用其可以減輕編寫JSP頁面中一些重要功能的負(fù)擔(dān)。應(yīng)該學(xué)習(xí)如何用JavaScript在HTML中驗(yàn)證輸入的Form元素,也要學(xué)習(xí)JavaScript如何能在一頁HTML以內(nèi)修改Form的元素。還要學(xué)習(xí)如何編寫JavaScript函數(shù),最后要求能從一頁HTML內(nèi)的事件中觸發(fā)JavaScript函數(shù)。
(5)建立JSP Server并理解其結(jié)構(gòu)及內(nèi)部運(yùn)行機(jī)制。
典型的JSP Server包括Tomcat、Jboss、WebLogic及Websphere等,推薦從Tomcat 5.5開始。它相比其他服務(wù)器小型且靈活,可以很好地運(yùn)行JSP程序。另外,許多JSP開發(fā)人員使用Tomcat,因此當(dāng)遇到一個(gè)問題時(shí)將容易得到幫助。
(6)開始學(xué)習(xí)JSP。
掌握了Java、JavaScript及HTML的知識后,可以開始完全以本書作為教程來學(xué)習(xí)JSP。
除了本書以外,如果要在某一方面了解更詳細(xì)的內(nèi)容,可以參考專項(xiàng)的書籍。如在Servlet方面有Dustin R.Callaway著的《精通Servlets》、Struts方面有Ted Husted著的《Struts In Action》、Hibernate方面有《Hibernate——符合Java習(xí)慣的關(guān)系數(shù)據(jù)庫持久化》,以及Spring方面的《Spring 2.0 FrameWork中文參考手冊》等。
(7)學(xué)習(xí)更多的JSP Server。
其他更多的JSP Server當(dāng)然也可以運(yùn)行JSP程序,然而許多JSP Server都由自己特殊的特征,可以讓你更好地理解JSP工程。例如,Jboss是開源且免費(fèi)的,如果想了解J2EE服務(wù)器內(nèi)部機(jī)制,就可以學(xué)習(xí)并理解其源代碼。也可以在它的基礎(chǔ)上進(jìn)行二次開發(fā)及封裝,讓其變成自己開發(fā)的Web服務(wù)器。而Weblogic和WebSphere這種大型服務(wù)器軟件的特點(diǎn)是穩(wěn)定且吞吐量巨大,對于架設(shè)數(shù)據(jù)海量且需要穩(wěn)定的Web應(yīng)用程序來說是很不錯(cuò)的,但它們也是昂貴的。
(8)學(xué)習(xí)敏捷開發(fā)、設(shè)計(jì)模式及J2EE體系架構(gòu)等方面的知識。
良好的軟件不僅在于其功能完備、易用性強(qiáng),更在于其擴(kuò)展性好且可伸縮性強(qiáng),達(dá)到這種要求的軟件就需要有好的架構(gòu)及設(shè)計(jì)思想,而敏捷開發(fā)及設(shè)計(jì)模式等就是教導(dǎo)開發(fā)人員如何實(shí)現(xiàn)伸縮性強(qiáng)的代碼和設(shè)計(jì)。而J2EE體系架構(gòu)方面的學(xué)習(xí)將會讓你對整個(gè)Web應(yīng)用程序的框架設(shè)計(jì)有一種像建筑師一樣的設(shè)計(jì)及規(guī)劃理念。
- 大型網(wǎng)站架構(gòu)實(shí)戰(zhàn)
- jQuery網(wǎng)頁特效設(shè)計(jì)基礎(chǔ)教程(慕課版·第2版)
- Vue.js Web開發(fā)案例教程(在線實(shí)訓(xùn)版)
- 全能網(wǎng)頁設(shè)計(jì)師精煉手冊
- 《練就職場功夫熊貓》
- 動(dòng)態(tài)網(wǎng)頁設(shè)計(jì)與制作(HTML5+CSS3+JavaScript)(第3版)
- 中文版Dreamweaver CC+Flash CC+Photoshop CC網(wǎng)頁設(shè)計(jì)基礎(chǔ)培訓(xùn)教程
- ASP快速建站全程實(shí)錄
- 精通網(wǎng)站建設(shè):100%全能建站密碼
- 外貿(mào)獨(dú)立站建站實(shí)操從入門到精通
- 精通HTML 5+CSS 3:100%網(wǎng)頁設(shè)計(jì)與布局密碼
- 中文版Dreamweaver CS6高手之道
- 從缺陷中學(xué)習(xí)C-C++
- 眾妙之門:電子商務(wù)網(wǎng)站設(shè)計(jì)指南
- 水晶石技法Photoshop商業(yè)網(wǎng)頁設(shè)計(jì)