整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          放棄JSP吧-否則你無路可走

          說一下我自己學(xué)習(xí)和使用JSP的經(jīng)歷吧

          我1998年開始學(xué)習(xí)Java,那時候?qū)W校里老師可能聽說過Java,但是同學(xué)基本上都不知道Java。校圖書館進(jìn)第一批Java的書,后面的借閱記錄上都是我的名字。當(dāng)時幾乎所有男同學(xué)都在學(xué)C++、PB、VB、Delphi,女生很多在學(xué)ASP。所以很多同學(xué)問我學(xué)的是什么,Java是干什么的。

          大學(xué)畢業(yè)以后,開始用Java做的第一個實際項目是對日外包,是2001年。日方有一套很老的系統(tǒng),想用Java重構(gòu)一下,要求用JSP。我下班就跑去西單圖書大廈,發(fā)現(xiàn)那里的書都還是Servlet的, 沒有JSP的!

          還好,當(dāng)時的公司同時進(jìn)行的一項業(yè)務(wù)就是代理BEA的Weblogic(BEA是三個從SUN出來的人創(chuàng)建的,后來被Oracle收購)。Weblogic的產(chǎn)品文檔里包含非常全面的JSP介紹,所以起初對JSP的學(xué)習(xí)都是從Weblogic開始的。

          那時候還沒聽說過什么Struts。自己在SUN的官網(wǎng)發(fā)現(xiàn)了WAF的文檔,全稱是Web Application Framework,算是最早MVC模式的介紹。這個WAF不算是框架,只是介紹了MVC模式應(yīng)該是個什么樣子,如何用Servlet+JSP實現(xiàn)MVC模式。SUN的官網(wǎng)提供了少量的樣例代碼,剩下的都是我們根據(jù)文檔自己搭建和實踐。

          在項目的中后期(02年下半年吧),有一次坐班車,聽到后面座位上兩個人在說話。一個人問:你知道Struts嗎?另外一個人說:不知道。問的那個人說:就是S T R U T S這幾個字母,開發(fā)Java的。我偷偷記在心里,然后第二天上網(wǎng)查了一下(當(dāng)時沒有智能機,家里也沒有WIFI),才算開啟了Apache這扇大門。后來在ASF上又學(xué)習(xí)了Cocoon、pluto、turbine等等很多框架。

          大概02年底,對日外包項目順利完成了,我公司開始接國內(nèi)的項目。第一個國內(nèi)項目是東北一所大學(xué)的科研經(jīng)費審批項目。記得去給人家部署和演示的時候特別有意思。我們用了半天時間在服務(wù)器上部署好,然后去給客戶演示。打開瀏覽器,輸入ip+端口,開始操作。操作了十幾分鐘,所有的客戶沒有說一個字。越演示心里越?jīng)]底,不知道客戶啥反應(yīng)。大概又過了幾分鐘,客戶的主任發(fā)話了:你們的軟件呢?

          我們的軟件呢?我給你演示了半天,這不就是我們的軟件嗎?最后才明白,用戶認(rèn)為只有下載一個類似叫setup.exe或install.exe的程序,雙擊,然后下一步下一步,最后桌面上出現(xiàn)一個快捷方式,那才算是軟件!在經(jīng)過片刻的不可思議之后,我認(rèn)為實際用戶的理念總是落后于研發(fā)人員的理念,這個我很容易想明白。但后來發(fā)現(xiàn),我那些學(xué)PB、Delphi的師兄弟也不是一時半會能接受B/S結(jié)構(gòu)的應(yīng)用算是軟件的...他們認(rèn)為:你不就是寫個網(wǎng)頁嗎???

          再后來,從03-08年,長期從事企業(yè)應(yīng)用開發(fā),主要是基于Weblogic Platform,包括Server、Integration、Portal,其中在Portal上工作的時間最多。

          其中04-05年用Weblogic Portal做深圳市最大的電子政務(wù)項目,06-07年用Weblogic平臺做廣東省電信的3G業(yè)務(wù)平臺,08-09年用Aqualogic做南方電網(wǎng)的SOA。

          Weblogic Server中集成了Struts,沒記錯的話當(dāng)時是1.1版本。BEA把Struts做了升級和改造,可以在Weblogic Workshop中可視化開發(fā),就是下面這樣:

          其中圓形代表Action,有Begin Action,End Action,還有普通的中間節(jié)點Action。BEA把Struts的這個升級稱作Java Page Flow(Java 頁面流)。一組這樣的圖形當(dāng)中包含的Action和JSP,會定義在一個擴(kuò)展名是.jpf的文件中。

          后來,BEA把JPF捐獻(xiàn)給了Apache,成為ASF下的一個開源項目Apache Beehive。

          Welcome to Apache Beehivebeehive.apache.org

          這個項目現(xiàn)在已經(jīng)停止更新了。

          大概從06年開始,接觸到了YUI,也就是Yahoo User Interface,Yahoo開源的一套前端JS組件庫。從此算是開啟了我的前端之路。

          07-08年開始用Extjs,作者說Ext就是Extension(擴(kuò)展)的意思,擴(kuò)展了YUI,提供了更豐富的適合企業(yè)開發(fā)的前端組件。但這時候,Extjs還僅僅是豐富的UI組件庫,算不上框架。就是在JSP生成的HTML里面嵌入Extjs的組件。

          09-11年用GWT,就是Google Web Toolkits。Google當(dāng)時的想法很先進(jìn),用Java開發(fā)前端UI,最終編譯成JS。有點類似于現(xiàn)在TS編譯成JS的過程,就是打算利用上Java的強類型、面向?qū)ο蟮忍攸c。這時候就已經(jīng)完全前后端分離了。可以說從08年之后我就再也沒寫過JSP,一個頁面也沒寫過。

          10年開始用Bootstrap。這時候GWT的缺點就暴露出來了,CSS非常難改。直到13年初,開始用上了Angularjs。記得當(dāng)時在智聯(lián)招聘上發(fā)布職位的時候搜了一下,北京市只有用友和我們公司招聘Angularjs開發(fā)。后來就從Angularjs用到React,又用回Angular4,一直到現(xiàn)在都以最新版本的Angular為主,企業(yè)應(yīng)用和互聯(lián)網(wǎng)應(yīng)用都有開發(fā)。移動開發(fā)主要用Ionic,React Native也用過。

          為什么要詳細(xì)介紹我過去和JSP以及前端框架相關(guān)的開發(fā)經(jīng)歷呢?是因為我想表達(dá)一個觀點:如果要客觀公正評價JSP是否還有必要用,特別是還有必要學(xué),需要一個真正長期用過JSP(前后端不分離)開發(fā),也真正長期用前端框架(前后端分離)開發(fā)的人才可以。

          就像我在有些知乎答案下評論的那樣:

          遇到這種情況,我總想起福特的名言:“如果我當(dāng)年去問顧客他們想要什么,他們肯定會告訴我:‘一匹更快的馬。’”

          滿大街跑馬車的時代,福特問顧客需要什么,顧客就說需要一匹更快的馬。他們不知道汽車時代會給生活帶來怎樣革命性的變化。

          在BP機時代,大家認(rèn)為有人戴BP機已經(jīng)很牛了。滿大街諾基亞摩托羅拉功能機的時代,大家也都覺得夠用了。問他們需要什么,他們估計會回答:充一次電能不能待機一個月?能不能把自己喜歡的MP3當(dāng)彩鈴?

          我覺得要對比評價兩代產(chǎn)品,應(yīng)該給兩代產(chǎn)品都熟練體驗過的人去判斷。從功能機時代過來的人,現(xiàn)在iphone都已經(jīng)用到第三部了,你再問他功能機夠不夠用。就拿一個兩代產(chǎn)品都具有的功能(比如都可以QQ聊天)對比,你愿意回到功能機時代還是繼續(xù)用智能機。

          一直抱定JSP不撒手,沒動力、沒能力學(xué)習(xí)前端技術(shù),沒有真正理解前后端分離開發(fā)模式的人,不可能得出公正全面的評價。

          在校期間或參加培訓(xùn)班就學(xué)習(xí)了前端框架,參加工作后就開始前后端分離的人,也無法理解老人只用JSP或用JSP+JS前端UI組件的開發(fā)模式是個怎么回事。

          上面兩種人,據(jù)我實際接觸中了解,大部分都認(rèn)為自己的開發(fā)模式是理所當(dāng)然的。就像我之前描述自己剛畢業(yè)時候的經(jīng)歷一樣。大部分客戶和我的一些同學(xué),理所當(dāng)然認(rèn)為雙擊setup.exe,然后下一步下一步才是軟件。而我理所當(dāng)然認(rèn)為B/S架構(gòu)的也是軟件,只是更便于開發(fā)和操作。

          JSP為什么不適合現(xiàn)在的主流開發(fā),為什么正在被拋棄

          過去一年多,陸陸續(xù)續(xù)在知乎上回答了一些關(guān)于JSP的問題。當(dāng)然,我的回答都是建議淘汰JSP,新人小白一定不要再學(xué)JSP了。我現(xiàn)在集中把這些技術(shù)因素歸納一下。

          一個現(xiàn)代主流Java Web應(yīng)用,不管前端、后端、還是微服務(wù)架構(gòu),都在淘汰JSP。

          其中,我認(rèn)為Java服務(wù)器端主流技術(shù)還是Spring(Spring Boot + Spring MVC + Spring Cloud)。

          下面三點,第一點幾乎盡人皆知,第二點有一部分人清楚,第三點卻很少有人意識到。

          前端框架已經(jīng)非常成熟和穩(wěn)定,不需要JSP
          前后端分離已經(jīng)不是什么趨勢了,而是當(dāng)前B/S架構(gòu)開發(fā)的主流模式。前后端分離之后,前端只負(fù)責(zé)展現(xiàn)和交互,后端負(fù)責(zé)核心業(yè)務(wù)邏輯。前后端通過API進(jìn)行交互,并且最好符合RESTful風(fēng)格。服務(wù)器端把數(shù)據(jù)返回給前端就不再關(guān)心這些數(shù)據(jù)用在哪里、如何布局、什么樣式。

          這個層面的原因非常容易理解,也是絕大多數(shù)討論JSP是否還有必要學(xué)的時候里都會提到的。


          服務(wù)器端的Spring MVC/WebFlux 和 Spring Boot已經(jīng)開始拋棄JSP
          從Spring 5開始,在原有的基于Servlet技術(shù)的Spring MVC之外增加了一個新的編程模型,就是Spring WebFlux。
          Spring WebFlux是響應(yīng)式非阻塞的,而且不支持Servlet API,所以也就不支持JSP!

          上圖左側(cè)是Spring 5新引入的Spring WebFlux,右側(cè)是大家熟悉的Spring MVC,兩者并列,Spring同時支持。

          關(guān)于這一點,可以看Stack Overflow上面來自Spring Framework和Spring Boot團(tuán)隊成員Brian Clozel的回答:

          Spring WebFlux - no JSP support??stackoverflow.com

          新的Spring WebFlux不支持JSP,那咱們不用就好了,至少Spring MVC還是支持JSP的啊。那我們繼續(xù)看。

          如果我們繼續(xù)使用Spring Boot+Spring MVC開發(fā),那么Spring Boot對JSP是有限制的,看官方文檔怎么說的:

          鏈接在這里:

          Spring Boot Reference Guide?docs.spring.io

          其中那行備注:

          If possible, JSPs should be avoided. There are several known limitations when using them with embedded servlet containers.
          盡可能避免用JSP。當(dāng)使用嵌入式Servlet容器時,有一些已知的限制。

          關(guān)于這些限制和如何繼續(xù)在Spring Boot中使用JSP,可以自己查一下,知乎里就有好多文章

          Spring Boot對JSP有限制,那咱們就湊合用唄,反正我是寫Java的,我的發(fā)展方向是架構(gòu)師,我正打算學(xué)習(xí)微服務(wù),正在看Spring Cloud。那咱們就繼續(xù)看看Spring Cloud吧。


          微服務(wù)架構(gòu)下更沒有JSP的用武之地
          首先要明白Spring Boot和Spring Cloud的關(guān)系。可以先看我的這個回答:

          Spring boot與Spring cloud 是什么關(guān)系??www.zhihu.com

          還是看這張圖吧:

          右側(cè)綠色的部分都是Spring Cloud的組成部分,不管是API Gateway、Config Dashboard,Service Registry,還是多個MicroServices,他們都是Spring Boot應(yīng)用!或者說Spring Boot是整個Spring Cloud的基石(其實也是Spring Cloud Data Flow的基石)。

          哦,你明白了,因為有Spring Boot對JSP的限制,而Spring Cloud的組成部分都是Spring Boot應(yīng)用,所以Spring Cloud也對JSP有限制。其實不僅僅是表面上這個原因,咱們繼續(xù)分析。

          如果強行繼續(xù)在Spring Cloud環(huán)境中繼續(xù)使用JSP,那么JSP放在哪里?有兩種方案。

          1. API Gateway和每個MicroService里面都有@Controller以及對應(yīng)的JSP。那么這種方案下,不同微服務(wù)中的JSP如何通信?用戶訪問的時候,同一個應(yīng)用下的所有JSP頁面會在不同IP和端口下來回變換。一會是http://ip0:8081/xxx/xxx.jsp,一會是http://ip1:8082/xxx/xxx.jsp,點個連接又跳轉(zhuǎn)到http://ip2:8080/xxx/xxx.jsp....
          2. 把整個微服務(wù)應(yīng)用下的所有@Controller和JSP都放在API Gateway里面,其他Microservice中只有提供REST API的@Controller和@Service。這種方案并不算理想的微服務(wù)架構(gòu),因為Gateway沒有解耦,里面的所有@Controller不能拆分部署。這樣就相當(dāng)于在MicroService架構(gòu)下有了一個局部的Monolithic(單體應(yīng)用)。

          那怎么才算是使用Spring Cloud的正確姿勢?還是看上面那幅圖,這次關(guān)注左側(cè)三個灰色的部分。IoT(物聯(lián)網(wǎng) Internet of Things)、Mobile(移動應(yīng)用)、Browser(瀏覽器端),這三個也是應(yīng)用啊。

          我們再看一幅圖:

          整個Spring體系的圖出來了。還是看左側(cè),Your App,也就是IoT(物聯(lián)網(wǎng) Internet of Things)、Mobile(移動應(yīng)用)、Browser(瀏覽器端)這三類!

          Browser就是前后端分離之后的前端應(yīng)用,獨立開發(fā)、獨立部署、只和服務(wù)器端有HTTP RESTful通信。

          我們看看Spring官方給出的Spring Cloud例子,鏈接在這里:

          Spring Projects?spring.io

          customers-stores-ui是前端應(yīng)用,用Angularjs實現(xiàn)的。例子是便于學(xué)習(xí)的,不應(yīng)該引入額外的太多其他技術(shù)!為什么Spring官方的例子非要用上前端技術(shù)?不能只用服務(wù)器端開發(fā)人員熟悉的模板引擎解(包括JSP)來演示Spring Cloud嗎?

          我們再看另外一個例子,Spring的Petclinic大家都熟悉吧?Spring 官方例子:

          spring-projects/spring-petclinic?github.com

          官方的是Monolithic(單體)應(yīng)用,模板用的是Thymeleaf,自己去看代碼。

          用Spring Cloud實現(xiàn)的版本:

          Spring Petclinic community?github.com

          前端有Angular和React兩種實現(xiàn),服務(wù)器端有Java和Kotlin兩種實現(xiàn),都沒有用服務(wù)器端模板。

          同樣的問題。為什么演示Spring Cloud的開發(fā),要引入額外的前端技術(shù)?

          答案都是同樣的,Spring Cloud就必須前后端分離開發(fā)!用JSP就無法完美拆分微服務(wù),無法利用微服務(wù)本應(yīng)帶來的各種優(yōu)勢。


          總結(jié):

          我曾經(jīng)在知乎某一個問題下總結(jié)過:現(xiàn)在JSP處于被前后端夾擊的狀態(tài),生存空間越來越小了。就算你不打算管前端,只想在服務(wù)器端有所建樹。微服務(wù)的前提也必須前后端分離。

          放棄JSP吧,讓自己的路走的寬一些。如果死守JSP不放,服務(wù)器端只能停留在SSH/SSM階段,用Spring Boot+Spring MVC已經(jīng)是你的天花板了。

          yEclipse官方最新版免費下載|Myeclipse漢化下載.MyEclipse-功能最全面的Java IDE. - MyEclipse官方中文網(wǎng)

          如果您有HTML或JSP文件要編輯,這里將介紹如何編輯。查找以下信息:

          • 編輯源代碼
          • 大綱和屬性視圖
          • 參數(shù)頁面

          該功能在MyEclipse中是可用的。

          一、HTML / JSP編輯器

          要編輯HTML或JSP文件,請執(zhí)行以下操作當(dāng)中的一個:

          • 雙擊HTML或JSP文件。
          • 右鍵單擊HTML或JSP文件,并選擇Open。

          HTML編輯器有以下模式:

          • 源模式 — 源模式是HTML和JSP代碼的源代碼編輯器,它包括智能內(nèi)容輔助、行編號、彩色語法高亮顯示、格式操作、實時驗證、在輸入時標(biāo)記有問題的源代碼以及代碼格式化。
          • 設(shè)計模式 — 設(shè)計模式具有雙面板視圖,頂部面板為設(shè)計模式,底部面板為源模式。設(shè)計模式為所見即所得的可視化編輯模式,設(shè)計畫布允許選擇、復(fù)制、剪切、粘貼和使用拖放重新定位Web UI控件。此模式包括一個設(shè)計調(diào)色板,其中包含可以添加到設(shè)計畫布的UI Web控件。
          • 預(yù)覽模式 — 預(yù)覽模式允許用戶快速查看頁面在瀏覽器中的外觀,預(yù)覽模式從設(shè)計模式加載當(dāng)前源代碼,即使編輯器內(nèi)容尚未保存。HTML源代碼以預(yù)覽模式呈現(xiàn),并且“扎根”于資源所在的位置。如果HTML文檔中的圖像相對于HTML頁面的當(dāng)前位置,則圖像將在預(yù)覽中正確呈現(xiàn)。

          打開文件時,默認(rèn)模式是Design(設(shè)計),通過單擊編輯器底部的適當(dāng)選項卡來更改模式。

          本文概述了使用源代碼編輯器編輯HTML時最重要的概念和特性。

          二、編輯源代碼

          用戶可以從源代碼模式或設(shè)計模式訪問源代碼,設(shè)計模式具有雙面板視圖,設(shè)計模式位于頂部面板,源模式位于底部面板。

          直接編輯源代碼時,可以使用以下功能:

          • 語法、顏色和高亮
          • 智能代碼完成和內(nèi)容輔助
          • HTML驗證
          • 源格式和清理
          • HTML模板
          • HTML片段

          2.1 智能代碼完成和內(nèi)容輔助

          在整個源代碼中,編輯器提供特定于內(nèi)容的代碼幫助。

          Tag names(標(biāo)記名稱):Code assist根據(jù)當(dāng)前上下文提供可用HTML標(biāo)記的列表。

          Tag attributes(標(biāo)記屬性):代碼輔助提供了特定于正在編輯的標(biāo)記屬性列表。

          Attribute values(屬性值):在適當(dāng)?shù)臅r候,代碼幫助會為您提供一個已知可能值的列表。

          2.2 HTML驗證

          有兩種類型的HTML驗證:“輸入時”和“資源更改”。

          “輸入時”:當(dāng)對HTML文檔進(jìn)行更改時,編輯器總是檢查HTML語法的有效性,就像Java編輯器一樣。

          注意:這種類型的驗證錯誤和警告不會出現(xiàn)在Problems視圖中。

          資源更改:當(dāng)資源被修改(保存、移動、復(fù)制或?qū)?時,資源構(gòu)建器將對資源執(zhí)行HTML驗證。

          注意:您可以通過從菜單中選擇Window>Preferences,展開MyEclipse并選擇Validation來設(shè)置驗證參數(shù)。

          2.3 源格式化和清理

          要快速格式化源代碼,請右鍵單擊編輯器,并選擇Source>Format。格式化器不會在內(nèi)部修改HTML標(biāo)記元素,它只調(diào)整HTML元素的縮進(jìn)和間距。

          使用Cleanup Document選項進(jìn)行高級格式化和樣式調(diào)整,允許您更改標(biāo)記名稱和屬性的大小寫,還有其他選項可以插入所需的標(biāo)記和屬性。要使用此選項,請在編輯器中右鍵單擊并選擇Source>Cleanup Document,選擇Format source復(fù)選框,來將Format Document操作作為文檔清理的一部分。

          JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是用XML語法寫成的。

          利用JSP動作可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。

          動作元素只有一種語法,它符合XML標(biāo)準(zhǔn):

          <jsp:action_name attribute="value" />

          動作元素基本上都是預(yù)定義的函數(shù),JSP規(guī)范定義了一系列的標(biāo)準(zhǔn)動作,它用JSP作為前綴,可用的標(biāo)準(zhǔn)動作元素如下:

          語法描述
          jsp:include在頁面被請求的時候引入一個文件。
          jsp:useBean尋找或者實例化一個JavaBean。
          jsp:setProperty設(shè)置JavaBean的屬性。
          jsp:getProperty輸出某個JavaBean的屬性。
          jsp:forward把請求轉(zhuǎn)到一個新的頁面。
          jsp:plugin根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標(biāo)記。
          jsp:element定義動態(tài)XML元素
          jsp:attribute設(shè)置動態(tài)定義的XML元素屬性。
          jsp:body設(shè)置動態(tài)定義的XML元素內(nèi)容。
          jsp:text在JSP頁面和文檔中使用寫入文本的模板

          常見的屬性

          所有的動作要素都有兩個屬性:id屬性和scope屬性。

          • id屬性:

            id屬性是動作元素的唯一標(biāo)識,可以在JSP頁面中引用。動作元素創(chuàng)建的id值可以通過PageContext來調(diào)用。

          • scope屬性:

            該屬性用于識別動作元素的生命周期。 id屬性和scope屬性有直接關(guān)系,scope屬性定義了相關(guān)聯(lián)id對象的壽命。 scope屬性有四個可能的值: (a) page, (b)request, (c)session, 和 (d) application。


          <jsp:include>動作元素

          <jsp:include>動作元素用來包含靜態(tài)和動態(tài)的文件。該動作把指定文件插入正在生成的頁面。語法格式如下:

          <jsp:include page="相對 URL 地址" flush="true" />

          前面已經(jīng)介紹過include指令,它是在JSP文件被轉(zhuǎn)換成Servlet的時候引入文件,而這里的jsp:include動作不同,插入文件的時間是在頁面被請求的時候。

          以下是include動作相關(guān)的屬性列表。

          屬性描述
          page包含在頁面中的相對URL地址。
          flush布爾屬性,定義在包含資源前是否刷新緩存區(qū)。

          實例

          以下我們定義了兩個文件 date.jspmain.jsp,代碼如下所示:

          date.jsp文件代碼:

          <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%><p>
           今天的日期是: <%= (new java.util.Date()).toLocaleString()%></p>

          main.jsp文件代碼:

          <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><h2>include 動作實例</h2><jsp:include page="date.jsp" flush="true" /></body></html>

          現(xiàn)在將以上兩個文件放在服務(wù)器的根目錄下,訪問main.jsp文件。顯示結(jié)果如下:

          include 動作實例今天的日期是: 2016-6-25 14:08:17

          <jsp:useBean>動作元素

          jsp:useBean 動作用來加載一個將在JSP頁面中使用的JavaBean。

          這個功能非常有用,因為它使得我們可以發(fā)揮 Java 組件復(fù)用的優(yōu)勢。

          jsp:useBean動作最簡單的語法為:

          <jsp:useBean id="name" class="package.class" />

          在類載入后,我們既可以通過 jsp:setProperty 和 jsp:getProperty 動作來修改和檢索bean的屬性。

          以下是useBean動作相關(guān)的屬性列表。

          屬性描述
          class指定Bean的完整包名。
          type指定將引用該對象變量的類型。
          beanName通過 java.beans.Beans 的 instantiate() 方法指定Bean的名字。

          在給出具體實例前,讓我們先來看下 jsp:setProperty 和 jsp:getProperty 動作元素:


          <jsp:setProperty>動作元素

          jsp:setProperty用來設(shè)置已經(jīng)實例化的Bean對象的屬性,有兩種用法。首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,如下所示:

          <jsp:useBean id="myName" ... />...<jsp:setProperty name="myName" property="someProperty" .../>

          此時,不管jsp:useBean是找到了一個現(xiàn)有的Bean,還是新創(chuàng)建了一個Bean實例,jsp:setProperty都會執(zhí)行。第二種用法是把jsp:setProperty放入jsp:useBean元素的內(nèi)部,如下所示:

          <jsp:useBean id="myName" ... >... <jsp:setProperty name="myName" property="someProperty" .../></jsp:useBean>

          此時,jsp:setProperty只有在新建Bean實例時才會執(zhí)行,如果是使用現(xiàn)有實例則不執(zhí)行jsp:setProperty。

          jsp:setProperty動作有下面四個屬性,如下表:

          屬性描述
          namename屬性是必需的。它表示要設(shè)置屬性的是哪個Bean。
          propertyproperty屬性是必需的。它表示要設(shè)置哪個屬性。有一個特殊用法:如果property的值是"*",表示所有名字和Bean屬性名字匹配的請求參數(shù)都將被傳遞給相應(yīng)的屬性set方法。
          valuevalue 屬性是可選的。該屬性用來指定Bean屬性的值。字符串?dāng)?shù)據(jù)會在目標(biāo)類中通過標(biāo)準(zhǔn)的valueOf方法自動轉(zhuǎn)換成數(shù)字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean類型的屬性值(比如"true")通過 Boolean.valueOf轉(zhuǎn)換,int和Integer類型的屬性值(比如"42")通過Integer.valueOf轉(zhuǎn)換。   value和param不能同時使用,但可以使用其中任意一個。
          paramparam 是可選的。它指定用哪個請求參數(shù)作為Bean屬性的值。如果當(dāng)前請求沒有參數(shù),則什么事情也不做,系統(tǒng)不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供默認(rèn)屬性值,只有當(dāng)請求參數(shù)明確指定了新值時才修改默認(rèn)屬性值。

          <jsp:getProperty>動作元素

          jsp:getProperty動作提取指定Bean屬性的值,轉(zhuǎn)換成字符串,然后輸出。語法格式如下:

          <jsp:useBean id="myName" ... />...<jsp:getProperty name="myName" property="someProperty" .../>

          下表是與getProperty相關(guān)聯(lián)的屬性:

          屬性描述
          name要檢索的Bean屬性名稱。Bean必須已定義。
          property表示要提取Bean屬性的值

          實例

          以下實例我們使用了Bean:

          package com.runoob.main;public class TestBean {
           private String message = "菜鳥教程";
           public String getMessage() {
           return(message);
           }
           public void setMessage(String message) {
           this.message = message;
           }}

          編譯以上實例文件 TestBean.java :

          $ javac TestBean.java

          編譯完成后會在當(dāng)前目錄下生成一個 TestBean.class 文件, 將該文件拷貝至當(dāng)前 JSP 項目的 WebContent/WEB-INF/classes/com/runoob/main 下( com/runoob/main 包路徑,沒有需要手動創(chuàng)建)。

          下面是一個 Eclipse 中目錄結(jié)構(gòu)圖:

          下面是一個很簡單的例子,它的功能是裝載一個Bean,然后設(shè)置/讀取它的message屬性。

          現(xiàn)在讓我們在main.jsp文件中調(diào)用該Bean:

          <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><h2>Jsp 使用 JavaBean 實例</h2><jsp:useBean id="test" class="com.runoob.main.TestBean" />
          <jsp:setProperty name="test"
           property="message"
           value="我愛學(xué)習(xí)..." />
          <p>輸出信息....</p>
          <jsp:getProperty name="test" property="message" /></body></html>

          <jsp:forward> 動作元素

          jsp:forward動作把請求轉(zhuǎn)到另外的頁面。jsp:forward標(biāo)記只有一個屬性page。語法格式如下所示:

          <jsp:forward page="相對 URL 地址" />

          以下是forward相關(guān)聯(lián)的屬性:

          屬性描述
          pagepage屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態(tài)計算,可以是一個JSP頁面或者一個 Java Servlet.

          實例

          以下實例我們使用了兩個文件,分別是: date.jsp 和 main.jsp。

          date.jsp 文件代碼如下:

          <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%><p>
           今天的日期是: <%= (new java.util.Date()).toLocaleString()%></p>

          main.jsp文件代碼:

          <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><h2>forward 動作實例</h2><jsp:forward page="date.jsp" /></body></html>

          現(xiàn)在將以上兩個文件放在服務(wù)器的根目錄下,訪問main.jsp文件。顯示結(jié)果如下:

          今天的日期是: 2016-6-25 14:37:25

          <jsp:plugin>動作元素

          jsp:plugin動作用來根據(jù)瀏覽器的類型,插入通過Java插件 運行Java Applet所必需的OBJECT或EMBED元素。

          如果需要的插件不存在,它會下載插件,然后執(zhí)行Java組件。 Java組件可以是一個applet或一個JavaBean。

          plugin動作有多個對應(yīng)HTML元素的屬性用于格式化Java 組件。param元素可用于向Applet 或 Bean 傳遞參數(shù)。

          以下是使用plugin 動作元素的典型實例:

          <jsp:plugin type="applet" codebase="dirname" code="MyApplet.class"
           width="60" height="80">
           <jsp:param name="fontcolor" value="red" />
           <jsp:param name="background" value="black" />
           <jsp:fallback>
           Unable to initialize Java Plugin </jsp:fallback>
          </jsp:plugin>

          如果你有興趣可以嘗試使用applet來測試jsp:plugin動作元素,<fallback>元素是一個新元素,在組件出現(xiàn)故障的錯誤時發(fā)送給用戶錯誤信息。


          <jsp:element> 、 <jsp:attribute>、 <jsp:body>動作元素

          <jsp:element> 、 <jsp:attribute>、 <jsp:body>動作元素動態(tài)定義XML元素。動態(tài)是非常重要的,這就意味著XML元素在編譯時是動態(tài)生成的而非靜態(tài)。

          以下實例動態(tài)定義了XML元素:

          <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><jsp:element name="xmlElement"><jsp:attribute name="xmlElementAttr">
           屬性值</jsp:attribute><jsp:body>
           XML 元素的主體</jsp:body></jsp:element></body></html>

          <jsp:text>動作元素

          <jsp:text>動作元素允許在JSP頁面和文檔中使用寫入文本的模板,語法格式如下:

          <jsp:text>模板數(shù)據(jù)</jsp:text>

          以上文本模板不能包含其他元素,只能只能包含文本和EL表達(dá)式(注:EL表達(dá)式將在后續(xù)章節(jié)中介紹)。請注意,在XML文件中,您不能使用表達(dá)式如 ${whatever > 0},因為>符號是非法的。 你可以使用 ${whatever gt 0}表達(dá)式或者嵌入在一個CDATA部分的值。

          <jsp:text><![CDATA[<br>]]></jsp:text>

          如果你需要在 XHTML 中聲明 DOCTYPE,必須使用到<jsp:text>動作元素,實例如下:

          <jsp:text><![CDATA[<!DOCTYPE html
          PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "DTD/xhtml1-strict.dtd">]]></jsp:text><head><title>jsp:text action</title></head><body><books><book><jsp:text> 
           Welcome to JSP Programming</jsp:text></book></books></body></html>

          你可以對以上實例嘗試使用<jsp:text>及不使用該動作元素執(zhí)行結(jié)果的區(qū)別。


          主站蜘蛛池模板: 杨幂AV污网站在线一区二区| 国产乱码一区二区三区四| 精品亚洲一区二区| 国产日本亚洲一区二区三区| 久久精品无码一区二区三区日韩 | 日韩精品一区二区三区在线观看| 人妻无码视频一区二区三区| 亚洲一区二区三区自拍公司| 国产MD视频一区二区三区| 国产福利无码一区在线| 国产成人久久精品区一区二区 | 亚洲性无码一区二区三区| 亚洲AV无码一区二区三区DV| 久久无码人妻精品一区二区三区| 国产一区韩国女主播| 国产伦精品一区二区三区四区| 国产精品亚洲一区二区麻豆 | 无码中文字幕一区二区三区 | 国产日韩高清一区二区三区 | 国产一区二区三区在线免费观看| 亚洲av色香蕉一区二区三区蜜桃| 国产精品亚洲午夜一区二区三区| 久久国产精品一区免费下载| 国产乱码精品一区二区三区中文| 国产a∨精品一区二区三区不卡| 成人精品一区二区三区中文字幕| 久久无码一区二区三区少妇| 夜夜嗨AV一区二区三区| 亚洲爆乳精品无码一区二区三区| 亚洲综合一区二区国产精品| 亚洲综合一区二区| 亚洲av无码一区二区三区人妖| 精品国产一区二区三区免费看| 内射少妇一区27P| 波多野结衣一区二区三区aV高清 | 无码中文字幕一区二区三区| 成人无号精品一区二区三区| 日韩精品一区二区三区视频| 久久se精品一区精品二区| 亚洲高清日韩精品第一区| 国精产品一区一区三区MBA下载|