JavaWeb開發

  • XML基礎
  • 用tomcat構建web站點
    • WEB開發的相關知識
      • lInternet上供外界訪問的Web資源分爲
        • 靜態web資源(如html 頁面):指web頁面中供人們瀏覽的數據始終是不變。
        • 動態web資源:指web頁面中供人們瀏覽的數據是由程序產生的,不同時間點訪問web頁面看到的內容各不相同。
          • 常用動態web資源開發技術:JSP/Servlet、ASP、PHP等
      • JAVAEE規範
        • SUN公司制定的規範。
        • 包含13種技術,JSP/Servlet是其中的一種。
      • 常見WEB服務器
        • WebLogic是BEA公司的產品,是目前應用最廣泛的Web服務器,支持JavaEE規範,而且不斷的完善以適應新的開發要求。收費。
        • IBM公司的WebSphereAS,支持JavaEE規範。
        • 大名鼎鼎的紅帽的產品,原來屬於開源組織JbossAS,後被紅帽收購。支持JavaEE規範,免費。
        • 在小型的應用系統或者有特殊需要的系統中,可以使用一個 免費的Web服務器:Tomcat,該服務器支持全部JSP以及 Servlet規範。
        • Tomcat屬於輕量級的服務器。其它服務器屬於重量級的服務器。
      • 服務器規範和應用的三角關係

        • 應用程序按照JavaEE規範開發,與具體運行在哪個服務器上無關。
    • Tomcat服務器簡介
      • Tomcat是在SUN公司推出的小型Servlet/JSP調試工具的基礎上發展起來的一個優秀的Servlet容器,Tomcat本身完全用Java語言編寫。
      • 目前是Apache開源軟件組織的一個軟件項目,它的官方網址爲http://tomcat.apache.org。
      • 得到了廣大開源代碼志願者的大力支持,且可以和目前大部分的主流Web服務器(IIS、Apache服務器)一起工作,它運行穩定、可靠且高效。
      • 已成爲目前開發企業JavaWeb應用的最佳Servlet容器選擇之一。
      • 獲取Tomcat安裝程序包:
        • tar.gz文件是Linux操作系統下的安裝版本
        • exe文件是Windows系統下的安裝版本x86 x64
        • zip文件是Windows系統下的壓縮版本 (建議)
      • Tomcat的版本:
        • Tomcat的版本隨着SUN公司推出的Servlet/JSP規範不同而不同,基本上是SUN公司每推出一個版本,Tomcat也會發行新的版本以適應新的規範。

    • 安裝Tomcat
      • 在安裝和使用Tomcat之前必須先行安裝相應版本的JDK(JRE)。
      • 解壓對應的包(請不要解壓到中文目錄或有空格的目錄中)。
      • Tomcat的安裝目錄稱之爲CATALINA_HOME。
      • 啓動:進入<CATALINA_HOME>\bin,執行startup.bat啓動Tomcat。
      • 驗證是否啓動成功:http://localhost:8080,如果看到頁面,表示成功了。
      • 安裝中可能遇到的問題:
        • Java_home環境變量:
          • 必須配置JAVA_HOME環境變量,指向JDK的安裝目錄。
        • 端口占用問題(更改默認端口):
          • Tomcat使用的默認端口是8080.Web中HTTP默認使用的端口是80(HTTP協議規定的80端口)。
          • 更改Tomcat使用的默認端口8080---->8888:
            • 找到<CATALINA_HOME>\conf\server.xml文件
            • <Connector port="8888" protocol="HTTP/1.1" 
                             connectionTimeout="20000" 
                             redirectPort="8443" />
        • Catalina_home環境變量的設置問題
          • 不建議配置CATALINA_HOME環境變量。
    • Tomcat的目錄結構(服務器廠商自己安排的)
      • bin:存放啓動和關閉Tomcat的一些批處理命令。如startup.bat和shutdown.bat等。
      • conf:存放Tomcat的配置文件(全局)。
      • lib:Tomcat運行用到的jar包(全局)。
      • logs:Tomcat的啓動和運行日誌。
      • temp:存放臨時文件。
      • webapps:存放JavaWeb應用的目錄。(該目錄中有幾個目錄--不含子目錄,就說明當前Tomcat管理者幾個應用)。
      • work:Tomcat的工作目錄。
    • JavaWeb的目錄結構(SUN公司的Servlet規範要求的)
      • 一個web應用由多個靜態web資源和動態web資源組成。
      • 開發web應用時,不同類型的文件有嚴格的存放規則,否則不僅可能會使web應用無法訪問,還會導致web服務器啓動報錯。

      • WEB-INF:必須有。此目錄中的資源文件用戶無法直接訪問到。
        • classes:存放編譯後的class文件。
        • lib:存放應用需要的jar包。
        • web.xml:當前應用的配置文件。
    • 如何部署JavaWeb應用
      • 開放式目錄:把應用直接拷貝到Tomcat\webapps目錄下即可。
      • 把應用打成war:進入應用的根目錄,執行jar -cvf MyApp.war,將應用打成war包,把war包拷貝到Tomcat\webapps目錄下即可。
    • Tomcat的核心組成部分
      • Tomcat本身由一系列可配置的組件構成,其中核心組件是Servelt容器組件,它是所有其他Tomcat組件的頂層容器。
      • 每個組件都可以在Tomcat安裝目錄/conf/server.xml文件中進行配置,每個Tomcat組件在server.xml文件中對應一種配置元素。
      • 以下用XML的形式展示了各種Tomcat組件之間的關係:

      • server.xml是Tomcat的核心配置文件。
      • Context:用於配置某個應用。
      • Host:用於配置某個主機。
      • Tomcat體系架構:
    • 配置Web站點的虛擬目錄:Context
      • 方式一:在server.xml文件的host元素中配置,例如:
        • Context元素必須出現在Host元素的內部。
        • path:指定虛擬目錄。以"/"開頭。
        • docBase:指定實際的應用的目錄地址。
        • 不建議使用,需要重新啓動Tomcat。
      • 方式二:在Tomcat\conf\[enginename]\[hostname]目錄下建立一個擴展名爲xml的配置文件,內容如下:
        <?xml version="1.0" encoding="gbk"?>
        <Context docBase="C:\MyApp"/>
        • 此處:文件名就是虛擬目錄的名字(等同於path的功能),其他不變。
        • 此種方式不需要重新啓動Tomcat就可以生效。
      • 小練習:配置默認端口、默認應用、默認主頁。
        1. 修改默認端口:修改server.xml中的那個8080爲80。
        2. 更改默認應用:在Tomcat\conf\[enginename]\[hostname]目錄下建立一個擴展名爲ROOT.xml的配置文件(不重啓無效),內容如下:
          <?xml version="1.0" encoding="gbk"?>
          <Context docBase="C:\MyApp"/>
        3. 在應用的WEB-INF目錄下,建立一個web.xml的配置文件,內容如下:
          <?xml version="1.0" encoding="ISO-8859-1"?>


          <web-app xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
              version="2.5">
              <welcome-file-list>
                  <welcome-file>b.html</welcome-file>
              </welcome-file-list>


          </web-app>
      • Tomcat6.x提供了多種配置<Context>元素的途徑。當其加載一個web應用時,會依次按照以下五種方式嘗試查找Web應用的<Context>元素,直到找到爲止:
        1. 到Tomcat安裝目錄/conf/context.xml文件中查找元素。
        2. 到Tomcat安裝目錄/conf/[enginename]/[hostname]/context.xml.default文件中查找元素。
        3. 到Tomcat安裝目錄/conf/[enginename]/[hostname]/[contextpath].xml文件中查找元素。
          • [contextpath]:表示單個Web應用的URL入口。
        4. 到Web應用的META-INF/context.xml文件中查找元素。
        5. 到Tomcat安裝目錄/conf/server.xml文件中查找元素。只適用於單個Web應用。
        • 如果僅僅爲單個Web應用配置元素,可以優先採用第三種配置方式。
      • Context元素的屬性

        • 在一般情況下,元素都會使用默認的標準Context組件,即className屬性採用默認值org.apache.catalina.core.StandardContext,它除了擁有上面介紹到的屬性外,還有自身專有的屬性:
          • cachingAllowed是否允許啓用靜態資源(HTML、圖片、聲音等)的緩存。默認值爲true。
          • cacheMaxSize設置靜態資源緩存的最大值,單位爲K。
          • workDir指定Web應用的工作目錄。
          • uppackWAR如果爲true,會把war文件展開爲開放目錄後再運行。爲false,直接運行war文件。默認值爲true。
      • web.xml文件
        • 通過web.xml文件,可以將web應用中的:
          • 某個web資源配置爲網站首頁
          • 將servlet程序映射到某個url地址上
          • ……
        • 但凡涉及到對web資源進行配置,都需要通過web.xml文件。
        • 舉例:通過web.xml文件配置網站首頁。
        • 注意:web.xml文件必須放在web應用\WEB-INF目錄下。
    • 配置Web站點的虛擬主機:Host
      • 假如兩家公司Web應用都發布在同一個Tomcat服務器上,可以爲每家公司分別創建一個虛擬主機。
      • 儘管以上兩個虛擬主機位於同一個主機,但是當客戶通過以上兩個不同虛擬主機名訪問Web應用時,會感覺到這兩個應用分別擁有獨立的主機。
      • 如需在WEB服務器中配置一個網站,需在server.xml中使用Host元素進行配置,例:
        • <Host name=”site1” appBase=”c:\app></Host>
        • name:主機的名稱。
        • appBase:本主機下的所有應用的存放目錄。
      • 配置的主機(網站)要想被外部訪問,必須在DNS服務器或windows系統中註冊。
    • 鏈接器:Connector
      • Tomcat與其他服務器整合原理圖:

    • 在Tomcat中配置SSL
      • 在網絡上,信息在由源主機到目標主機的傳輸過程會經過其他計算機,網絡上的信息有可能被非法分子監聽,從而導致個人隱私泄露。
      • 隨着電子商務的發展,對信息安全的要求越來越高,於是Netscape公司提出了SSL(Server Socket Layer)協議,旨在達到在開放網絡(Internet)上安全、保密地傳輸信息的目的。
      • HTTPS=HTTP+SSL。HTTPS使用的默認端口是443。SSL是一種保證網絡上的兩個節點進行安全通信的協議,建立在SSL協議上的HTTP被稱爲HTTPS協議。
      • SSL採用加密技術來實現安全通信,保證通信數據的保密性和完整性,並且保證通信雙方可以驗證對方的身份。
      • 加密技術的基本原理是:
        • 數據從一端發送到另一端,發送者先對數據加密,然後再把它發送給接受者。
        • 這樣,在網絡上傳輸的是經過加密的數據,如果有人非法截獲了這批數據,由於沒有解密的密鑰,就無法獲得真正的原始數據。
        • 接收者收到加密的數據後,先對數據解密,然後再處理。
      • SSL通過安全證書來證明客戶或服務器的身份。當客戶通過安全的連接和服務器通信時,服務器會先向客戶出示它的安全證書,而每一個證書在世界範圍內都是唯一的。爲了擴大用戶羣,一些服務器向客戶出示證書後,並不要求客戶出示安全證書,但在某些情況下,服務器也會要求客戶出示安全證書,以便覈實該客戶的身份。
      • 安全證書的獲得有兩種方式:
        • 從權威機構獲得證書
          • Certificate Authority,CA和VeriSign和Thawte,它們保證了證書的可信性。申請證書時,需要付費,且一個證書只針對一個IP有效。
        • 創建自我簽名的證書
          • 如果只關心數據在網絡上的安全傳輸,而不需要對方身份驗證,可以創建自我簽名的證書。與權威機構頒發的證書採用的加密技術是一樣的。
      • 可以根據安全需要,爲Tomcat配置SSL,它包含以下兩個步驟:
        1. 準備安全證書
          • 創建自我簽名的證書。
          • SUN公司提供了製作證書的工具keytool。在JDK1.4以上版本中都包含了這一工具。通過這個工具生成證書的命令爲:
            keytool -genkey -alias tomcat -keyalg RSA
            以上命令將生成包含一對非對稱密鑰和自我簽名的證書,這個命令中參數的意思
            -genkey:生成一對非對稱密鑰。
            -alias:指定密鑰對的別名,該別名是公開的。
            -keyalg:指定加密算法,此處採用通用的RSA算法。
          • 以上命令將在操作系統的用戶目錄下生成名爲”.keystore”的文件。
          • 如果希望生成的keystore文件放在其他目錄中,可以使用-keystore參數
            keytool -genkey -alias tomcat -keyalg RSA -keystore d:\.keystore
        2. 配置Tomcat的SSL連接器(Connector)
          • 在Tomcat的servlet.xml文件中,已經提供了現成的配置SSL連接器的代碼,只要把註釋去掉即可
            <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                           maxThreads="150" scheme="https" secure="true"
                           clientAuth="false" sslProtocol="TLS" />
          • 其他屬性:
            keystoreFile:指定keystore文件的存放位置,可以指定絕對路經。如果此項沒有設定,在默認情況下,Tomcat將從當前操作系統用戶的用戶名目錄下讀取名爲”.keystore”的文件。
            keystorePass:指定keystore的密碼,如果此項沒有設定,在默認情況下,Tomcat將使用”changeit”密碼。
          • 錯誤:
            • 在配置tomcat的SSL雙向握手中,由於6.0.33版本中默認啓用了APR(APR是通過JNI訪問的可移植庫,可以提高Tomcat的性能和伸縮性),所以採用傳統的配置方式(如下)會報異常:

      • 訪問支持SSL的Web站點:https://localhost:8443
      • 當Tomcat接收到這一HTTPS請求後,會向客戶的瀏覽器發送服務器的安全證書,IE瀏覽器接收到證書後,將向客戶顯示安全警報。
  • HTTP協議詳解
    • HTTP協議概述
      • WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循一定的規則,這個規則就是HTTP協議。
      • HTTP是HyperText Transfer Protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程及數據本身的格式。
      • HTTP協議的版本:
        • HTTP/1.0:無狀態協議。
          • 基於HTTP協議的客戶/服務器模式的信息交換過程,如圖所示,它分四個過程,建立連接、發送請求信息、發送響應信息、關閉連接。

          • 瀏覽器與WEB服務器的連接過程是短暫的,每次連接只處理一個請求和響應。對每一個頁面的訪問,瀏覽器與WEB服務器都要建立一次單獨的連接。
          • 瀏覽器到WEB服務器之間的所有通訊都是完全獨立分開的請求和響應。
        • HTTP/1.1:有狀態協議。一次連接基礎上可以發出多次請求和響應。
          • 在一個TCP連接上可以傳送多個HTTP請求和響應。
          • 多個請求和響應過程可以重疊
          • 增加了更多的請求頭和響應頭,比如Host、If-Unmodified-Since請求頭等。

      • 瀏覽器訪問多圖網頁:
        • 在一個HTML頁面中如果包含<img>標記的話,當瀏覽器解析到這些標記時,還會向服務器請求訪問標記中指定的文件,即再次建立連接併發出HTTP請求。
        • 如果HTML頁面中有一個超級鏈接:<a href=”http://www.itcast.cn”>itcast</a>,當點擊這個鏈接時,也會觸發瀏覽器與Web服務器開始一次新的HTTP通信。

    • HTTP消息格式
      • HTTP請求消息
        • 客戶端連上服務器後,向服務器請求某個web資源,稱之爲客戶端向服務器發送了一個HTTP請求。
        • Web服務器通過客戶端發送過來的這些請求信息,就可以確定向請求者回送什麼資源,以及根據客戶端的環境信息採用什麼方式進行回送等。
        • 一個完整的HTTP請求包括如下內容:
          • 一個請求行、若干消息頭、以及請求正文,其中的一些消息頭和正文都是可選的,消息頭和正文內容之間要用空行隔開。
        • 舉例:
      • HTTP響應消息
        • 一個HTTP響應代表服務器向客戶端回送的數據。
        • 在一個HTTP響應中,WEB服務器通過響應頭向web客戶端描述客戶端的請求成功與否,以及它所發送的數據類型等一些信息,客戶端通過這些信息,進而可以知道如何對數據進行處理。
        • 一個完整的HTTP響應包括如下內容:
          • 一個狀態行、若干消息頭、以及響應正文,其中的一些消息頭和正文都是可選的,消息頭和正文內容之間要用空行隔開。
        • 舉例:
    • HTTP請求行
      • 格式:請求方式 資源路徑 HTTP版本號<CRLF>
      • 舉例:GET /temp3o116.shtml HTTP/1.1
      • 請求方式:GET、POS、HEAD、OPTIONS、DELETE、TRACE、PUT
      • 用戶如沒有設置,默認情況下瀏覽器向服務器發送的都是get請求,例如在瀏覽器直接輸地址訪問,點超鏈接訪問等都是get,用戶如想把請求方式改爲post,可通過更改表單的提交方式實現。
      • 不管POST或GET,都用於向服務器請求某個WEB資源,這兩種方式的區別主要表現在數據傳遞上。
      • GET方式
        • 如請求方式爲GET方式,則可以在請求的URL地址後以?的形式帶上交給服務器的數據,多個數據之間以&進行分隔,例如:
          GET /mail/1.html?name=abc&password=xyz HTTP/1.1
        • GET方式的特點:
          • 在URL地址後附帶的參數是有限制的,其數據容量通常不能超過1K。
          • 請求參數會出現在地址欄上,不安全。
      • POST方式
        • 如請求方式爲POST方式,則可以在請求的正文內容中向服務器發送數據。
        • Post方式的特點:
          • 傳送的數據量無限制。
          • 請求參數會出現在正文部分,安全。
    • HTTP響應行
      • 格式: HTTP版本號 狀態碼 原因敘述<CRLF>
      • 舉例:HTTP/1.1 200 OK
      • 狀態碼用於表示服務器對請求的各種不同處理結果和狀態,它是一個三位的十進制數。
      • 響應狀態碼分爲5類,使用最高位爲1到5來進行分類如下所示:

      • 常用狀態碼:
        • 200(正常)
          表示一切正常,返回的是正常請求結果
        • 302/307(臨時重定向)
          指出被請求的文檔已被臨時移動到別處,此文檔的新的URL在Location響應頭中給出。
        • 304(未修改)
          表示客戶機緩存的版本是最新的,客戶機可以繼續使用它,無需到服務器請求。
        • 404(找不到)
          服務器上不存在客戶機所請求的資源。
        • 500(服務器內部錯誤)
          服務器端的程序發生錯誤
    • HTTP消息頭(請求和響應共性)
      • 使用消息頭,可以實現HTTP客戶機與服務器之間的條件請求和應答,消息頭相當於服務器和瀏覽器之間的一些暗號指令。
      • 每個消息頭包含一個頭字段名稱,然後依次是冒號、空格、值、回車和換行符
        如: Accept-Encoding: gzip, deflate
      • 消息頭字段名是不區分大小寫的,但習慣上講每個單詞的第一個字母大寫。
      • 整個消息頭部分中的各行消息頭可按任何順序排列。
      • 消息頭又可分爲通用信息頭、請求頭、響應頭、實體頭等四類。
      • 許多請求頭字段都允許客戶端在值部分指定多個可接受的選項,多個選項之間以逗號分隔。
      • 有些頭字段可以出現多次,例如,響應消息中可以包含有多個”Warning”頭字段。
    • HTTP常用請求頭
      • 請求頭字段用於客戶端在請求消息中向服務器傳遞附加信息,主要包括客戶端可以接受的數據類型(MIME類型)、壓縮方法、語言以及發出請求的超鏈接所屬頁面的URL地址等信息。
      • 常用請求頭:
        • Accept:瀏覽器可接受的MIME類型 (Tomcat\conf\web.xml記載着文件系統的文件擴展名和MIME類型的對應關係)
        • Accept-Charset: 瀏覽器通過這個頭告訴服務器,它支持哪種字符集
        • Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip 
        • Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。 可以在瀏覽器中進行設置。
        • Host:初始URL中的主機和端口 
        • Referer:包含一個URL,用戶從該URL代表的頁面出發訪問當前請求的頁面。作用:防盜鏈;廣告投放效果。
        • Content-Type:application/x-www-form-urlencoded  內容類型。只有表單時,且method爲post時有效。效果等同於form表單的屬性enctype="application/x-www-form-urlencoded"
        • If-Modified-Since:Wed, 02 Feb 2011 12:04:56 GMT   利用這個頭與服務器的文件進行比對,如果一致,則從緩存中直接讀取文件。
        • User-Agent:瀏覽器類型.
        • Content-Length:表示請求消息正文的長度 
        • Connection:表示是否需要持久連接。如果服務器看到這裏的值爲“Keep -Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接 ),則持久連接。
        • Cookie:這是最重要的請求頭信息之一 
        • Date:Date: Mon, 22 Aug 2011 01:55:39 GMT  請求時間GMT
    • HTTP常用響應頭
      • 響應頭字段用於向客戶端傳遞附加信息。
      • 常用響應頭:
        • Location:http://www.it315.org/index.jsp 指示新的資源的位置。結合302或307響應碼來使用,完成請求重定向。
        • Server:apache tomcat指示服務器的類型
        • Content-Encoding: gzip 服務器發送的數據採用的編碼類型
        • Content-Length:80 告訴瀏覽器正文的長度
        • Content-Language: zh-cn服務發送的文本的語言
        • Content-Type::text/html; charset=GB2312服務器發送的內容的MIME類型
        • Last-Modified:Tue, 11 Jul 2000 18:23:51 GMT文件的最後修改時間
        • Refresh: 1;url=http://www.it315.org指示客戶端刷新頻率。單位爲秒。默認刷新自己。
          刷新到別的資源:3;URL=/day04/1.html
        • Content-Disposition: attachment; filename=aaa.zip指示客戶端下載文件
        • Set-Cookie:SS=Q0=5Lb_nQ; path=/search服務器端發送的Cookie
        • Expires: -1  毫秒值,控制緩存的時間
        • Cache-Control: no-cache (1.1)  
        • Pragma: no-cache   (1.0)  以上三個頭控制資源不要緩存
        • Connection: close/Keep-Alive   
        • Date: Tue, 11 Jul 2000 18:23:51 GMT
  • Servlet開發基礎
    • Servlet概述
      • Servlet是sun公司提供的一門用於開發動態web資源的技術。
      • Sun公司在其API中提供了一個servlet接口,用戶若想開發一個動態web資源(即開發一個Java程序向瀏覽器輸出數據),需要完成以下2個步驟:
        • 編寫一個Java類,實現servlet接口。
        • 把開發好的Java類部署到web服務器中。
    • Servlet接口
      • javax.servlet.Servlet接口:任何的Servlet必須實現的接口(被容器調用)
      • void init(ServletConfig config):初始化一個Servlet時會被調用
      • void service(ServletRequest req,ServletResponse resp):針對用戶的每一次請求,此方法都會被調用
      • void destroy():當一個Servlet對象被摧毀時,調用該方法。
    • Servlet的編寫步驟
      1. 建立標準的javaWeb應用目錄結構
        FirstApp
        WEB-INF
        classes
        lib
        web.xml
      2. 在classes目錄下建立一個類,直接或間接的實現Servlet這個接口
        package com.itheima;
        import java.io.*;
        import javax.servlet.*;
        
        public class HelloServlet extends GenericServlet{
        	public void service(ServletRequest req,
                                     ServletResponse res)
                              throws ServletException,
                                     IOException{
        		String data = "hello servlet";					 
        		ServletOutputStream sos = res.getOutputStream();
        		sos.write(data.getBytes());
        		sos.close();
        	}
        
        }

      3. 3、編譯java源文件(編譯前把servlet-api.jar 加入到classpath中)
        set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
        進入到classes目錄中,執行以下語句進行編譯:
        javac -d . HelloServlet.java
      4. 修改web.xml,對servlet進行URL映射
        <?xml version="1.0" encoding="ISO-8859-1"?>
        
        
        <web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
        	<servlet>
        		<servlet-name>HelloServlet</servlet-name>
        		<servlet-class>com.itheima.HelloServlet</servlet-class>
        	</servlet>
        	<servlet-mapping>
        		<servlet-name>HelloServlet</servlet-name>
        		<url-pattern>/hello</url-pattern>
        	</servlet-mapping>
        </web-app>

      5. 訪問該Servlet的地址是:http://localhost:8080/FirstApp/hello
    • Servlet的執行過程
      1. 客戶端發出請求http://localhost:8080/Demo1/hello
      2. 根據web.xml文件的配置,找到<url-pattern>子元素的值爲“/hello”的<servlet-mapping>元素
      3. 讀取<servlet-mapping>元素的<servlet-name>子元素的值,由此確定Servlet的名字爲”HelloServlet”
      4. 找到<servlet-name>值爲HelloServlet的<servlet>元素
      5. 讀取<servlet>元素的子元素<servlet-class>的值,由此確定Servlet的類名爲cn.itcast.HelloServlet。
      6. 到Tomcat安裝目錄/webapps/Demo1/WEB-INF/classes/cn/itcast目錄下查找到HelloServlet.class文件
    • Servlet的執行過程圖解

      • Tomcat在加載Web應用時,就會把相應的web.xml文件中的數據讀入到內存中。因此當Tomcat需要參考web.xml文件時,實際上只需要從內存中讀取相關數據就可以了,無需再到文件系統中讀取web.xml。
    • Servlet的運行過程
      • Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求後:
        1. Web服務器首先檢查是否已經裝載並創建了該Servlet的實例對象。如果是,則直接執行第④步,否則,執行第②步。
        2. 裝載並創建該Servlet的一個實例對象。
        3. 調用Servlet實例對象的init()方法。
        4. 創建一個用於封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然後調用Servlet的service()方法並將請求和響應對象作爲參數傳遞進去。
        5. WEB應用程序被停止或重新啓動之前,Servlet引擎將卸載Servlet,並在卸載之前調用Servlet的destroy()方法。
      • Servlet的運行過程示意圖:







    • Servlet的生命週期
      • Servlet是一個供其他Java程序(Servlet引擎)調用的Java類,它不能獨立運行,它的運行完全由Servlet引擎來控制和調度。
      • 針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,也就是說Servlet實例對象一旦創建,它就會駐留在內存中,爲後續的其它請求服務,直至web容器退出,servlet實例對象纔會銷燬。
      • 在Servlet的整個生命週期內,Servlet的init方法只被調用一次。而對一個Servlet的每次訪問請求都導致Servlet引擎調用一次servlet的service方法。對於每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然後將這兩個對象作爲參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。 
      • 默認情況下:只有第一次訪問Servlet對象時,纔會被實例化,並調用init方法。
      • 當應用被卸載或者Tomcat被關掉時,纔會調用destroy方法,釋放Servlet佔用的資源。
      • 針對用戶的每一次請求,服務器都會採用線程的機制調用service方法。
      • 如果在<servlet>元素中配置了一個<load-on-startup>元素,那麼WEB應用程序在啓動時,就會裝載並創建Servlet的實例對象、以及調用Servlet實例對象的init()方法。舉例:
        <servlet>
        	<servlet-name>invoker</servlet-name>
        	<servlet-class>
        		org.apache.catalina.servlets.InvokerServlet
        	</servlet-class>
        	<load-on-startup>2</load-on-startup>
        </servlet>
        用途:爲web應用寫一個InitServlet,這個servlet配置爲啓動時裝載,爲整個web應用創建必要的數據庫表和數據。
      • 從提高Servlet容器運行性能的角度出發,Servlet規範爲Servlet規定了不同的初始化情形。如果有些Servlet專門負責在web應用啓動階段爲web應用完成一些初始化操作,則可以讓它們在web應用啓動時就被初始化。對於大多數Servlet,只需當客戶端首次請求訪問時才被初始化。假設所有的Servlet都在web應用啓動時被初始化,那麼會大大增加Servlet容器啓動web應用的負擔,而且Servlet容器有可能加載一些永遠不會被客戶訪問的Servlet,白白浪費容器的資源。
    • 在Eclipse中開發Servlet

    • Servlet API介紹
      • SUN公司定義了一套專門用於開發Servlet程序的Java類和接口,它們統稱爲Servlet API。
      • Servlet引擎與Servlet程序之間採用Servlet API進行通信。
      • 一個Servlet程序就是一個在服務器端運行的調用了Servlet API的Java類。
      • Servlet規範的類包:
        • javax.servlet:存放的接口、抽象類與具體協議無關
        • javax.servlet.http:存放的接口、抽象類與HTTP協議有關
      • Servlet API中提供了一個實現了Servlet接口的最簡單的Servlet類,其完整名稱爲javax.servlet.GenericServlet。
      • Servlet API中還提供了一個專用於HTTP協議的Servlet類,其名稱是javax.servlet.http.HttpServlet,它是GenericServlet的子類。
      • 我們編寫的Servlet程序通常只需要覆蓋service方法即可。
      • 對於繼承HttpServlet的子類,不應該覆蓋掉其中service方法。HttpServlet在實現Servlet接口時,覆寫了service方法,該方法體內的代碼會自動判斷用戶的請求方式,如爲GET請求,則調用HttpServlet的doGet方法,如爲Post請求,則調用doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。
    • Servlet的一些細節
      • 同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的註冊名。 
      • 在Servlet映射到的URL中也可以使用*通配符,但是只能有兩種固定的格式:一種格式是“*.擴展名”,另一種格式是以正斜槓(/)開頭並以“/*”結尾。
      • 例如:
        <servlet-mapping>
        	<servlet-name>
        		AnyName
        	</servlet-name>
        	<url-pattern>
        		*.do
        	</url-pattern>
        </servlet-mapping>
        
        <servlet-mapping>
        	<servlet-name>
        		AnyName
        	</servlet-name>
        	<url-pattern>
        		/action/*
        	</url-pattern>
        </servlet-mapping>

      • 對於如下的一些映射關係:
        Servlet1 映射到 /abc/* 
        Servlet2 映射到 /* 
        Servlet3 映射到 /abc 
        Servlet4 映射到 *.do 
        問題:
        當請求URL爲“/abc/a.html”,“/abc/*”和“/*”都匹配,哪個servlet響應
        Servlet引擎將調用Servlet1。
        當請求URL爲“/abc”時,“/abc/*”和“/abc”都匹配,哪個servlet響應
        Servlet引擎將調用Servlet3。
        當請求URL爲“/abc/a.do”時,“/abc/*”和“*.do”都匹配,哪個servlet響應
        Servlet引擎將調用Servlet1。
        當請求URL爲“/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應
        Servlet引擎將調用Servlet2。
        當請求URL爲“/xxx/yyy/a.do”時,“/*”和“*.do”都匹配,哪個servlet響應
        Servlet引擎將調用Servlet2。
      • 路徑匹配多個Servlet映射時:
        絕對匹配優先於通配符
        都是用通配符時,/開頭的優先級高
        都是用通配符時,都以/開頭又有多個匹配:從前往後開始匹配
      • 如果某個Servlet的映射路徑僅僅爲一個正斜槓(/),那麼這個Servlet就成爲當前Web應用程序的缺省Servlet。 
      • 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給缺省Servlet處理,也就是說,缺省Servlet用於處理所有其他Servlet都不處理的訪問請求。 
      • 在<tomcat的安裝目錄>\conf\web.xml文件中,註冊了一個名稱爲org.apache.catalina.servlets.DefaultServlet的Servlet,並將這個Servlet設置爲了缺省Servlet。
      • 當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet。 服務器中的html文件數據的讀取由缺省servlet完成。
    • 修改MyEclipse自動生成的Servlet的模板
      • 關閉MyEclipse。
      • 找到MyEclipse的安裝目錄。
      • 搜索*wizard*,找到com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar。
      • 打開,找到templates\Servlet.java,此文件就是模板文件。
      • (修改前先備份)修改該文件,再放回去。
    • ServletConfig接口
      • 在Servlet的配置文件中,可以使用一個或多個<init-param>標籤爲servlet配置一些初始化參數。例如:
        <servlet>
            <servlet-name>ServletDemo3</servlet-name>
            <servlet-class>com.itheima.servlet.ServletDemo3</servlet-class>
            <init-param>
            	<param-name>encoding</param-name>
            	<param-value>UTF-8</param-value>
            </init-param>
        	<init-param>
            	<param-name>aaa</param-name>
            	<param-value>yyy</param-value>
            </init-param>
            <load-on-startup>2</load-on-startup>
        </servlet>

      • 當servlet配置了初始化參數後,web容器在創建servlet實例對象時,會自動將這些初始化參數封裝到ServletConfig對象中,並在調用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,程序員通過ServletConfig對象就可以得到當前servlet的初始化參數信息。
      • ServletConfig:代表了針對當前Servlet的配置參數init-param中配置的參數。
      • 常用的方法:
        • String getInitParameter(String paramName):獲取指定參數名稱的取值
        • Enumeration getInitParameterNames():獲取所有的參數的名稱
        • String getServletName():返回當前Servlet實例的名稱
    • 線程安全問題
      • 儘量使用局部變量。
    • ServletContext接口
      • WEB容器在啓動時,它會爲每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。
      • ServletConfig對象中維護了ServletContext對象的引用,開發人員在編寫servlet時,可以通過ServletConfig.getServletContext方法獲得ServletContext對象。或者直接通過getServletContext方法獲得ServletContext對象。
      • 由於一個WEB應用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現通訊。
      • ServletContext對象通常也被稱之爲context域對象。
      • 域對象內部維護了一個Map。
      • ServletContext應用:
        • 多個Servlet通過ServletContext對象實現數據共享。
        • 獲取WEB應用的初始化參數。
          • 對於web.xml文件中的參數:
            <context-param>
            	<param-name>encoding</param-name>
            	<param-value>UTF-8</param-value>
            </context-param>
          • 可以使用下面的方法獲取參數:String getInitParameter(String paramName)
            Enumeration getInitParameterNames()
        • 實現Servlet的轉發。
          • RequestDispatcher getRequestDispatcher(String path):path:目標的地址。該地址必須以"/"開頭,此"/"就代表當前的應用
          • RequestDispatcher.forward(request,response);
        • 利用ServletContext對象讀取資源文件。
          • 資源文件通常有兩種方式:
            • 對於簡單的資源文件,即包含key=value的形式,我們一般採用properties,這些文件的擴展名一般爲*.properties。
            • 對於較複雜的資源文件,採用XML格式。
          • 讀取資源文件的三種方式:
            1. ResourceBundle:
              • 特點:只能讀取properties的配置文件。且只能讀取類路徑下的配置文件。
                    可以在非Web環境下使用。
            2. ServletContext:
              • getRealPath(String path):path資源的路徑。該地址必須以"/"開頭,此"/"就代表當前的應用,返回在磁盤上的實際絕對路徑。
              • 特點:讀取任何位置上的任何文件。
                    只能在web環境下使用。
            3. ClassLoader:
              • 特點:只能讀取類路徑下的配置文件。且可以加載任何的資源。
  • Servlet規範中核心接口類圖

  • HttpServletResponse與HttpServletRequest
    • HttpServletResponse
      • HttpServletResponse對象代表服務器的響應。這個對象中封裝了向客戶端發送數據、發送響應頭,發送響應狀態碼的方法。
      • 向客戶端輸出中文數據的問題:
        • 用OutputStream(字節流)發送數據:
          • response.getOutputStream().write(“中國”.getBytes());//以默認編碼發送數據
            response.getOutputStream().write("中國".getBytes("UTF-8"));//以UTF-8編碼發送數據,瀏覽器(默認用GB2312)會出現亂碼
          • 解決辦法:
            1. 通過更改瀏覽器的編碼方式:IE/”查看”/”編碼”/”UTF-8”(不可取)
            2. 通過設置響應頭告知客戶端編碼方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知瀏覽器數據類型及編碼
            3. 通過meta標籤模擬請求頭:out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
            4. 通過以下方法:response.setContentType("text/html;charset=UTF-8");
          • 總結:程序以什麼編碼輸出,就需要告知客戶端以什麼編碼顯示。
        • 用PrintWriter(字符流)發送數據:
          • response.getWriter().write(“中國” );以默認編碼發送數據 ISO-8859-1(沒有中國二字編碼),此時會發生亂碼
          • 解決辦法:
            • setCharacterEncoding(“UTF-8”);//更改編碼爲UTF-8
              response.setHead(“Context-type”,”text/html;charset=UTF-8”);//告訴客戶端編碼方式
            • 注意:不要忘記告訴客戶端的編碼方式。
            • 由於經常改動編碼,response提供了一種更簡單的方式
              response. setContentType(“text/html;charset=UTF-8”);其作用相當於以上兩條代碼。
      • response常見應用:
        • 文件下載

          • 問題:中文文件名亂碼或無法下載
          • 解決:將文件名進行編碼

        • 輸出隨機圖片

        • 發送http頭,控制瀏覽器定時刷新網頁
        • 通過response實現請求重定向。
          • 請求重定向指:一個web資源收到客戶端請求後,通知客戶端去訪問另外一個web資源,這稱之爲請求重定向。
          • 地址欄會變,併發送2次請求,增加服務器負擔。
          • 實現方式:
            response.sendRedirect()
          • 實現原理:
            302/307狀態碼和location頭即可實現重定向。
      • response細節
        • getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另一方法。 會拋異常。
        • Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response裏面獲取,Servlet引擎將這些數據當作響應消息的正文,然後再與響應狀態行和各響應頭組合後輸出到客戶端。 
        • Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎將調用close方法關閉該輸出流對象。 
    • HttpServletRequest
      • HttpServletRequest對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中,開發人員通過這個對象的方法,可以獲得客戶這些信息。
      • request常用方法:
        • 獲得客戶機信息:
          • getRequestURL方法返回客戶端發出請求時的完整URL。
          • getRequestURI方法返回請求行中的資源名部分。
          • getQueryString 方法返回請求行中的參數部分。
          • getRemoteAddr方法返回發出請求的客戶機的IP地址。
          • getRemoteHost方法返回發出請求的客戶機的完整主機名。
          • getRemotePort方法返回客戶機所使用的網絡端口號。
          • getLocalAddr方法返回WEB服務器的IP地址。
          • getLocalName方法返回WEB服務器的主機名。
          • getMethod得到客戶機請求方式。
        • 獲得客戶機請求頭:
          • getHead(name)方法 
          • getHeaders(String name)方法 
          • getHeaderNames方法 
        • 獲得客戶機請求參數(客戶端提交的數據):
          • getParameter(name)方法
          • getParameterValues(String name)方法
          • getParameterNames方法 
          • getParameterMap方法  //做框架用,非常實用
          • getInputStream
      • request常見應用:
        • 各種表單輸入項數據的獲取
        • 請求參數的中文亂碼問題
          • 客戶端提交的請求參數:客戶端當前使用什麼編碼,就以什麼編碼給你的程序傳遞數據。
            客戶用的頁面用的編碼,可以通過meta去指定。(建議使用UTF-8)
          • 程序中打印的亂碼問題:程序不知道你傳遞的數據編碼方式。
          • request.setCharacterEncoding("UTF-8")通知服務器程序,客戶端提交的數據查詢的是UTF-8碼錶。只能解決POST請求方式提交的數據。
          • get提交方式,查ISO-8859-1
            解決辦法:得到字符的原始字節序列,用UTF-8重新編碼。new String(name.getBytes("ISO-8859-1","UTF-8"));
  • JSP
    • JSP概述
      • JSP:Java Server Pages
      • JSP是簡化Servlet編寫的一種技術,它將Java代碼和html語句混合在同一個文件中編寫,只對網頁中要動態產生的內容採用Java代碼來編寫,而對固定不變的靜態內容採用普通靜態html頁面的方式編寫。
      • JSP頁面是由html語句和嵌套在其中的java代碼組成的一個普通文本文件,擴展名爲.jsp。
      • JSP中的java 代碼需要嵌套在<%和%>中,嵌套在<%和%>中的內容稱之爲腳本片段(Scriptlets),沒有嵌套在<%和%>中的內容稱之爲JSP的模板元素。
      • 腳本片段被當做java程序代碼被解釋執行,模板元素則被原封不動地輸出給瀏覽器。
      • JSP文件像普通的HTML文件一樣,可以放置在Web應用程序中的除了WEB-INF及其子目錄外的其他任何目錄中。
    • JSP程序舉例
      • simple.jsp文件
        <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
        <%
        String path = request.getContextPath();
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
        %>
        
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <html>
          <head>
            <base href="<%=basePath%>">
            
            <title>My JSP 'Simple.jsp' starting page</title>
            
        	<meta http-equiv="pragma" content="no-cache">
        	<meta http-equiv="cache-control" content="no-cache">
        	<meta http-equiv="expires" content="0">    
        	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        	<meta http-equiv="description" content="This is my page">
        	<!--
        	<link rel="stylesheet" type="text/css" href="styles.css">
        	-->
        
          </head>
          
          <body>
          	current time is 
            <%
            	String currentTime = new Date().toString();
            	out.println(currentTime);
             %>
          </body>
        </html>
        網頁運行結果:


    • JSP的運行原理
      • 每個JSP頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程序,接着再把這個Servlet源程序編譯成Servlet的class類文件,然後再由Web容器像調用普通Servlet程序一樣的方式來裝載和解釋執行這個Servlet程序。
      • 如果在翻譯或者編譯的過程中出現了任何錯誤,JSP引擎將中斷翻譯或編譯過程,並將錯誤的詳細信息發送給客戶端。
      • JSP頁面所創建的Servlet源文件和class類文件放置在<TOMCAT_HOME>\work\Cataina\localhost\應用 這個目錄下。
      • 一個JSP頁面只在第一次被訪問時,才需要被翻譯成Servlet程序,對於該JSP頁面的後續訪問,Web容器將直接調用其翻譯成的Servlet程序。
      • 在JSP頁面每次被訪問時,JSP引擎默認都會檢查該JSP文件和編譯成的Servlet類的最後更改時間,如果JSP文件發生了修改,JSP引擎將重新編譯該JSP文件。
      • 由simple.jsp生成的Servlet類名爲simple_jsp,simple_jsp繼承了org.apache.jasper.runtime.HttpJspBase類。HttpJspBase類是HttpServlet的一個子類,因此simple.jsp生成的類是HttpServlet的一個孫子類。顯然,simple_jsp類就是一個Servlet。
      • HttpJspBase類的init方法內部調用了jspInit和_jspInit這兩個方法,HttpJspBase類的destroy方法內部調用了jspDestroy和_jspDestroy這兩個方法。其中,init方法和destroy方法被final修飾,不能被覆蓋。通常覆蓋jspInit和jspDestroy方法來完成初始化和清尾的工作。
      • HttpJspBase類的service方法內僅僅是調用了_jspService方法,所以可以認爲_jspService方法的作用就相當於HttpServlet類的service方法。
      • Tips:out.print語句與out.write語句的區別:
        • 如果字符串對象的值爲null,print方法將輸出內容爲"null"的字符串,而write方法則是拋出NullPointerException異常。
    • JSP最佳實踐
      • 不管是JSP還是Servlet,雖然都可以用於開發動態web資源。但由於這2門技術各自的特點,在長期的軟件實踐中,人們逐漸把servlet作爲web應用中的控制器組件來使用,而把JSP技術作爲數據顯示模板來使用。
      • 其原因爲,程序的數據通常要美化後再輸出:
        讓JSP既用java代碼產生動態數據,又做美化會導致頁面難以維護。
        讓servlet既產生數據,又在裏面嵌套html代碼美化數據,同樣也會導致程序可讀性差,難以維護。
      • 因此最好的辦法就是根據這兩門技術的特點,讓它們各自負責各得,servlet只負責響應請求產生數據,並把數據通過轉發技術帶給jsp,數據的顯示jsp來做。
    • JSP基本語法
      • JSP頁面中可以包含模板元素、腳本元素、指令、EL(Expression Language)表達式、行爲元素和註釋等內容。
      • 有三種類型的腳本元素:JSP腳本片段、JSP表達式和JSP聲明,它們內部使用的都是java腳本代碼。
      • JSP模板元素
        • JSP頁面中的靜態HTML內容稱之爲JSP模板元素。
        • 它定義了網頁的基本骨架,即頁面的結構和外觀。
      • JSP表達式
        • 提供了一個將java變量或表達式的計算結果輸出到客戶端的簡化方式,它將要輸出的變量或表達式直接封裝在<%=和%>之中。
        • JSP表達式中的變量或表達式後面不能有分號,它被翻譯成Servlet程序中的一條out.print(...)語句。
      • JSP腳本片段
        • 嵌套在<%和%>之中的一條或多條java程序代碼。
        • 在JSP腳本片段中可以直接使用JSP提供的隱式對象來完成web應用程序特有的功能,例如,使用out.println語句將數據輸出到瀏覽器。
        • 多個腳本片段中的代碼可以互相訪問,猶如將所有的代碼放在一對<%和%>之中。
        • 單個腳本片段中的java語句可以是不完整的,但是,多個腳本片段組合後的結果必須是完整的java語句。
        • 注:實際開發中:JSP中不能出現一行Java腳本片段和Java腳本表達式。
      • JSP聲明
        • 在腳本片段中聲明的變量將成爲_jspService方法中的局部變量。
        • 如果希望在JSP頁面中爲其轉換成的Servlet定義成員變量和方法,就需要使用JSP聲明。
        • JSP聲明將java代碼封裝在<%!和%>之中,它裏面的代碼將被插進Servlet的_jspService方法的外面。
        • JSP聲明用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和成員方法,並且JSP聲明中的java代碼只能是靜態代碼塊、成員變量和成員方法的定義。
        • 多個靜態代碼塊、變量和函數可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。
        • 由於JSP隱式對象的作用範圍僅限於Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。
        • 對於JSP頁面沒有發生修改的情況下,對於JSP頁面的每次訪問請求,Servlet引擎都會調用其所生成的Servlet的_jspService方法進行響應。
      • EL表達式
        • EL表達式的基本語法格式爲"${表達式}",它可以出現在JSP自定義標籤和標準標籤的屬性值中,其計算結果將作爲標籤的屬性值或屬性值的一部分;EL表達式也可以出現在模板元素中,其計算結果將插入當前的輸出流中。
        • 如果表達式的計算結果爲null,JSP腳本表達式將輸出內容爲"null"的字符文本,而EL表達式會將它強制轉換成空字符串("")後再輸出,而不是顯示爲"null",這樣的處理結果非常有用。
        • 在EL表達式中還可以使用empty操作符來判斷一個參數是否爲null,某個集合或字符串中的內容是否爲空。
        • EL表達式還具有JavaScript等腳本語言的優點,能夠對字符串、數字等各種類型的數據進行自動轉換。
      • JSP註釋
        • JSP註釋的格式爲<%--註釋信息--%>。
        • JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被註釋的內容。
        • JSP註釋與JSP頁面中的java註釋和HTML註釋的區別:
          • JSP引擎在翻譯JSP頁面時,將忽略JSP註釋中的所有內容。
          • 在JSP引擎看來,出現在JSP腳本元素中的java註釋屬於java代碼的一部分,它們將被原封不動地插入進Servlet源文件中,但在Servlet源文件被編譯成class文件時,由java編譯程序忽略。
          • 在JSP引擎看來,JSP頁面中的HTML註釋就是一段文本,其處理方式與普通的文本內容完全一樣,都被轉換成out.write語句輸出到客戶端。
          • 出現在JSP腳本元素之外的/*、*/和//不再屬於java註釋,而屬於普通的文本字符,將被轉換成out.write語句輸出到客戶端。
          • 由於HTML註釋相當於一段普通文本,其中可以嵌入JSP的其他各種元素,JSP引擎依然會對這些嵌套的JSP元素進行解釋處理。
      • 特殊字符序列的轉義處理
    • JSP指令
      • JSP指令概述
        • JSP中定義了一種稱之爲JSP指令(directive)的元素,JSP指令是爲JSP引擎而設計的,它們不直接產生任何輸出,只是告訴引擎如何處理JSP頁面中的其餘部分。
        • JSP指令必須嵌套在<%@和%>之中,基本語法格式爲:<%@ 指令 屬性名="值" %>,其中屬性名是大小寫敏感的。
        • JSP中定義了page,include和taglib三種指令,每種指令中又都定義了一些各自的屬性。
      • page指令
        • page指令用於定義JSP頁面的各種屬性。
        • 無論page指令出現在JSP頁面的什麼地方,它作用的都是整個JSP頁面,最好將page指令放在整個JSP頁面的起始位置。
        • JSP中的page指令的完整語法如下:
          <%@ page
          [language="java"]
          [extends="package.class"]
          [import="package.class" | package.*]
          [session="true | false"]
          [info="text"]
          [errorPage="relative_url"]
          [isErrorPage="true | false"]
          [contentType="mimeType [;charset=characterSet]"]
          [pageEncoding="characterSet"]
          [isELIgnored="true | false"]
          %>
        • language屬性
          • 說明JSP頁面所使用的腳本語言,默認爲java。
        • extends屬性
          • 指定JSP頁面翻譯成的Servlet所繼承的父類,一般不要設置這個屬性,讓JSP引擎自行處理。
        • import屬性
          • 指定在JSP頁面翻譯成的Servlet源文件中導入的包或類。
          • 在JSP頁面翻譯成的Servlet源文件中,Jsp引擎將把page指令的import屬性翻譯成相應的import語句。
          • JSP引擎自動導入下面的包:
            • java.lang.*
            • javax.servlet.*
            • javax.servlet.jsp.*
            • javax.servlet.http.*
        • session屬性
          • 指定在JSP頁面翻譯成的Servlet中是否預先創建好session隱式對象,也就是指定在JSP腳本元素中是否可以使用session隱式對象。
          • 默認值爲true。
        • buffer屬性
          • 指定out隱式對象的緩衝區大小,默認值爲8KB。
          • 如果將buffer屬性設置爲none,則out對象不使用緩衝區
        • autoFlush屬性
          • 設置當out隱式對象的緩衝區已滿時,是將其中的內容刷新到客戶端,還是拋出緩衝區溢出的異常。
          • 默認值爲true。
        • isThreadSafe屬性
          • 設置JSP已滿是否是線程安全的,是否需要讓JSP已滿翻譯成的Servlet實現SingleThreadModel接口。
          • 默認值爲true。
        • info屬性
          • 用於將一個文本字符串定義爲JSP頁面翻譯成的Servlet的描述信息。
          • web容器可以通過Servlet.getServletInfo方法獲得該文本字符串。
        • errorPage屬性
          • 用於設置另外一個JSP頁面來處理當前JSP頁面發生的異常。
          • 配置全局錯誤提示頁面:(不是服務器轉發技術)
            web.xml
            <error-page>
            <exception-type>java.lang.Exception</exception-type>
            <location>/error.jsp</location>
            </error-page>
            <error-page>
            <error-code>404</error-code>
            <location>/404.jsp</location>
            </error-page>
        • isErrorPage屬性
          • 設置當前頁面是否是專門用於處理其他頁面的未捕獲異常的JSP頁面。
          • 默認值爲false。
        • contentType屬性
          • 設置響應正文的MIME類型和說明JSP文件中的文本內容的字符集編碼。
          • 默認的MIME類型爲text/html,默認字符集爲ISO-8859-1
        • pageEncoding屬性
          • 設置JSP引擎在翻譯JSP成爲Servlet時查詢的碼錶。
        • isELIgnored屬性
          • 指示是否忽略EL表達式。
          • 默認值false,不忽略。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章