Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 在线免费观看你懂的,91国内精品视频,日本不卡在线

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

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

          說一下我自己學習和使用JSP的經歷吧

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

          大學畢業以后,開始用Java做的第一個實際項目是對日外包,是2001年。日方有一套很老的系統,想用Java重構一下,要求用JSP。我下班就跑去西單圖書大廈,發現那里的書都還是Servlet的, 沒有JSP的!

          還好,當時的公司同時進行的一項業務就是代理BEA的Weblogic(BEA是三個從SUN出來的人創建的,后來被Oracle收購)。Weblogic的產品文檔里包含非常全面的JSP介紹,所以起初對JSP的學習都是從Weblogic開始的。

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

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

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

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

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

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

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

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

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

          Welcome to Apache Beehivebeehive.apache.org

          這個項目現在已經停止更新了。

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

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

          09-11年用GWT,就是Google Web Toolkits。Google當時的想法很先進,用Java開發前端UI,最終編譯成JS。有點類似于現在TS編譯成JS的過程,就是打算利用上Java的強類型、面向對象等特點。這時候就已經完全前后端分離了。可以說從08年之后我就再也沒寫過JSP,一個頁面也沒寫過。

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

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

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

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

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

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

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

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

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

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

          JSP為什么不適合現在的主流開發,為什么正在被拋棄

          過去一年多,陸陸續續在知乎上回答了一些關于JSP的問題。當然,我的回答都是建議淘汰JSP,新人小白一定不要再學JSP了。我現在集中把這些技術因素歸納一下。

          一個現代主流Java Web應用,不管前端、后端、還是微服務架構,都在淘汰JSP。

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

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

          前端框架已經非常成熟和穩定,不需要JSP
          前后端分離已經不是什么趨勢了,而是當前B/S架構開發的主流模式。前后端分離之后,前端只負責展現和交互,后端負責核心業務邏輯。前后端通過API進行交互,并且最好符合RESTful風格。服務器端把數據返回給前端就不再關心這些數據用在哪里、如何布局、什么樣式。

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


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

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

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

          Spring WebFlux - no JSP support??stackoverflow.com

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

          如果我們繼續使用Spring Boot+Spring MVC開發,那么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。當使用嵌入式Servlet容器時,有一些已知的限制。

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

          Spring Boot對JSP有限制,那咱們就湊合用唄,反正我是寫Java的,我的發展方向是架構師,我正打算學習微服務,正在看Spring Cloud。那咱們就繼續看看Spring Cloud吧。


          微服務架構下更沒有JSP的用武之地
          首先要明白Spring Boot和Spring Cloud的關系。可以先看我的這個回答:

          Spring boot與Spring cloud 是什么關系??www.zhihu.com

          還是看這張圖吧:

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

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

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

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

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

          我們再看一幅圖:

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

          Browser就是前后端分離之后的前端應用,獨立開發、獨立部署、只和服務器端有HTTP RESTful通信。

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

          Spring Projects?spring.io

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

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

          spring-projects/spring-petclinic?github.com

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

          用Spring Cloud實現的版本:

          Spring Petclinic community?github.com

          前端有Angular和React兩種實現,服務器端有Java和Kotlin兩種實現,都沒有用服務器端模板。

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

          答案都是同樣的,Spring Cloud就必須前后端分離開發!用JSP就無法完美拆分微服務,無法利用微服務本應帶來的各種優勢。


          總結:

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

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

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

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

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

          該功能在MyEclipse中是可用的。

          一、HTML / JSP編輯器

          要編輯HTML或JSP文件,請執行以下操作當中的一個:

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

          HTML編輯器有以下模式:

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

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

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

          二、編輯源代碼

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

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

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

          2.1 智能代碼完成和內容輔助

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

          Tag names(標記名稱):Code assist根據當前上下文提供可用HTML標記的列表。

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

          Attribute values(屬性值):在適當的時候,代碼幫助會為您提供一個已知可能值的列表。

          2.2 HTML驗證

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

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

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

          資源更改:當資源被修改(保存、移動、復制或導入)時,資源構建器將對資源執行HTML驗證。

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

          2.3 源格式化和清理

          要快速格式化源代碼,請右鍵單擊編輯器,并選擇Source>Format。格式化器不會在內部修改HTML標記元素,它只調整HTML元素的縮進和間距。

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

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

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

          動作元素只有一種語法,它符合XML標準:

          <jsp:action_name attribute="value" />

          動作元素基本上都是預定義的函數,JSP規范定義了一系列的標準動作,它用JSP作為前綴,可用的標準動作元素如下:

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

          常見的屬性

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

          • id屬性:

            id屬性是動作元素的唯一標識,可以在JSP頁面中引用。動作元素創建的id值可以通過PageContext來調用。

          • scope屬性:

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


          <jsp:include>動作元素

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

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

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

          以下是include動作相關的屬性列表。

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

          實例

          以下我們定義了兩個文件 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>

          現在將以上兩個文件放在服務器的根目錄下,訪問main.jsp文件。顯示結果如下:

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

          <jsp:useBean>動作元素

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

          這個功能非常有用,因為它使得我們可以發揮 Java 組件復用的優勢。

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

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

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

          以下是useBean動作相關的屬性列表。

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

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


          <jsp:setProperty>動作元素

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

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

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

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

          此時,jsp:setProperty只有在新建Bean實例時才會執行,如果是使用現有實例則不執行jsp:setProperty。

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

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

          <jsp:getProperty>動作元素

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

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

          下表是與getProperty相關聯的屬性:

          屬性描述
          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

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

          下面是一個 Eclipse 中目錄結構圖:

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

          現在讓我們在main.jsp文件中調用該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="我愛學習..." />
          <p>輸出信息....</p>
          <jsp:getProperty name="test" property="message" /></body></html>

          <jsp:forward> 動作元素

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

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

          以下是forward相關聯的屬性:

          屬性描述
          pagepage屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,可以是一個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>

          現在將以上兩個文件放在服務器的根目錄下,訪問main.jsp文件。顯示結果如下:

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

          <jsp:plugin>動作元素

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

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

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

          以下是使用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>元素是一個新元素,在組件出現故障的錯誤時發送給用戶錯誤信息。


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

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

          以下實例動態定義了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>模板數據</jsp:text>

          以上文本模板不能包含其他元素,只能只能包含文本和EL表達式(注:EL表達式將在后續章節中介紹)。請注意,在XML文件中,您不能使用表達式如 ${whatever > 0},因為>符號是非法的。 你可以使用 ${whatever gt 0}表達式或者嵌入在一個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>及不使用該動作元素執行結果的區別。


          主站蜘蛛池模板: 日韩视频一区二区在线观看| 亚洲一区二区高清| 久久亚洲色一区二区三区 | 日韩一区二区三区视频久久| 亚洲AV成人一区二区三区在线看| 精品人无码一区二区三区| 国产精品揄拍一区二区| 精品一区二区三区高清免费观看 | 国产亚洲福利精品一区二区| 国产一区内射最近更新| 亚洲一区二区三区深夜天堂| 中文字幕日韩精品一区二区三区| 麻豆国产在线不卡一区二区| 精品视频一区二区三区四区| 久久青草精品一区二区三区| 亚洲欧美国产国产综合一区| 99精品一区二区三区无码吞精| 久久久久成人精品一区二区| 亚洲无线码在线一区观看| 天美传媒一区二区三区| 久久久人妻精品无码一区| 精品成人一区二区三区免费视频 | 精品国产日韩亚洲一区在线| 精品国产一区二区三区麻豆| 亚洲国产情侣一区二区三区| 亚洲一区二区三区高清不卡| 亚洲欧美日韩中文字幕一区二区三区| 无码人妻一区二区三区免费| 熟妇人妻系列av无码一区二区| 国产精品亚洲一区二区麻豆| 伊人久久精品无码麻豆一区| 国产一区二区好的精华液| 波霸影院一区二区| 肥臀熟女一区二区三区| 久久久久久人妻一区精品| 韩国美女vip福利一区| 日本精品视频一区二区| 91久久精品国产免费一区| 亚洲综合在线成人一区| 久久人妻无码一区二区| 午夜精品一区二区三区在线视|