(JavaEE-07)JSP.md

#JSP JSP全稱是Java Server Pages,它和Servlet技術同樣,都是SUN公司定義的一種用於開發動態Web資源的技術。 JSP的編寫就像編寫HTML同樣簡單,可是與HTML不一樣的是,在JSP中,能夠編寫Java代碼,而且容許使用request、response等web開發經常使用對象,實現與瀏覽器的交互。html

demo:在JSP中輸出當前時間java

###JSP調用和運行原理web

  • 瀏覽器在訪問 jsp 頁面時,Web服務器是如何調用並執行一個 jsp 頁面呢?
    • 當你訪問web服務器中的JavaWeb應用時,若是訪問的不是一個Servlet,那麼都會訪問一個默認的Servlet,由這個默認的Servlet來定位資源。當服務器發現你請求是一個JSP時,web容器會把 jsp 翻譯成一個 Servlet,而後運行這個Servlet,再將結果返回給客戶端。
    • 翻譯 jsp 的過程是由Tomcat來完成的,生成的 Servlet源文件會保存在 Tomcat服務器的 work 文件夾中。
    • 查看翻譯後的Servlet的源碼就會發現,這個類的父類繼承了HttpServlet
    • 對於請求的處理,查看翻譯後的Servlet源碼(service方法)就會發現,在service方法中,輸出了咱們定義的html代碼,而且Java代碼也在這裏運行。
    • 在運行 service 方法時,該方法內部定義了不少局部變量,根據生成 Java 代碼的位置就能夠得知,這些變量和對象,能夠直接在 Java 代碼中使用,無需去建立。

###JSP最佳實踐express

  • 不論是JSP仍是Servlet,雖然均可以用於開發動態web資源。但因爲這2門技術各自的特色,在長期的軟件實踐中,人們逐漸把servlet做爲web應用中的控制器組件來使用,而把JSP技術做爲數據顯示模板來使用。
  • 其緣由爲,程序的數據一般要美化後再輸出
    • 讓jsp既用java代碼產生動態數據,又作美化會致使頁面難以維護
    • 讓servlet既產生數據,又在裏面嵌套html代碼美化數據,一樣也會致使程序可讀性差,難以維護
    • 所以最好的辦法就是根據這兩門技術的特色,讓它們各自負責各的,servlet只負責響應請求產生數據,並把數據經過轉發技術帶給jsp,數據的顯示jsp來作

###JSP語法編程

  • JSP模版元素
    • JSP頁面中的HTML內容稱之爲JSP模版元素
    • JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀
  • JSP表達式
    • JSP腳本表達式(expression)用於將程序數據輸出到客戶端,語法:<%= 變量或表達式 %>,舉例:當前時間:<%= new java.util.Date() %>
    • JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,而後在相應位置用out.print(…) 將數據輸給客戶端,因此在JSP表達式中不能使用 ";"。
  • JSP腳本片斷
    • JSP腳本片段(scriptlet)用於在JSP頁面中編寫多行Java代碼。語法:<% java代碼 %>
    • 注意:JSP腳本片段中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片段中的Java代碼將被原封不動地放到Servlet的_jspService方法中
    • JSP腳本片段中的Java代碼必須嚴格遵循Java語法
    • 在一個JSP頁面中能夠有多個腳本片段,在兩個或多個腳本片段之間能夠嵌入文本、HTML標記和其餘JSP元素
    • 多個腳本片段中的代碼能夠相互訪問,猶如將全部的代碼放在一對<% %>之中的狀況
    • 單個腳本片段中的Java語句能夠是不完整的,可是,多個腳本片段組合後的結果必須是完整的Java語句(好比,循環處理模版元素)
  • JSP聲明
    • JSP頁面中編寫的全部代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面(類成員),語法:<%! java 代碼 %>
    • JSP聲明可用於定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法
    • 多個靜態代碼塊、變量和方法能夠定義在一個JSP聲明中,也能夠分別單獨定義在多個JSP聲明中
    • JSP隱式對象的做用範圍僅限於Servlet的_jspService方法,因此在JSP聲明中不能使用這些隱式對象
    • JSP聲明中,能夠覆蓋翻譯Servlet中的方法(知道就行)
  • JSP註釋
    • JSP註釋的格式:<%-- 註釋信息 --%>
    • JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被註釋的內容(與html註釋的區別)
  • JSP指令
    • JSP指令(directive)是爲JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其他部分。在JSP 2.0規範中共定義了三個指令
      • page指令
      • include指令
      • taglib指令
    • JSP指令的基本語法格式:<%@ 指令 屬性名="值" %>,舉例:<%@ page contentType="text/html;charset=utf-8"%>
    • 若是一個指令有多個屬性,這多個屬性能夠寫在一個指令中,也能夠分開寫
    • Page指令
      • page指令用於定義JSP頁面的各類屬性,不管page指令出如今JSP頁面中的什麼地方,它做用的都是整個JSP頁面,爲了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置
      • JSP 2.0規範中定義的page指令的完整語法:
        • language = "java",指定頁面所嵌用的語言是Java
        • extends = "package.class ",指定翻譯後的Servlet的父類(不要修改)
        • import = "{ package.class | pageckage.* }, ...",在java代碼中須要使用的包或類(自動導入的包:java.lang.* ; javax.servlet.* ; javax.servlet.jsp.* ; javax.servlet.http.* ;)

          能夠在一條page指令的import屬性中引入多個類或包,其中的每一個包或類之間使用逗號分隔。 也能夠分開寫多條,每條導入一個包或類。瀏覽器

        • session="true/false",指定翻譯後的Servlet是否默認建立Session對象,默認值是true
        • buffer="none | 8KB | sizeKB",指定JSP的緩衝大小,默認8kb。(在使用out對象寫數據的時候,不是直接寫給客戶端的,而是寫入緩衝區,緩衝區滿了纔會寫到客戶端)
        • autoFlush = "true | false ",緩衝區滿了,是否自動刷新。默認爲true
        • isThreadSafe = "true | false ",指定JSP是否線程安全的。true表示非線程安全,false表示線程安全
        • errorPage = "relative_url",指定JSP的錯誤處理頁面
          • errorPage屬性的設置必須使用相對路徑,若是以「/」開頭,表示相對於當前WEB應用程序的根目錄(不是站點根目錄),不然,表示相對於當前頁面。
          • 有時候錯誤提示頁面不必定會顯示,緣由是錯誤信息量過小,沒有達到緩衝區輸出的值(1024字節)。能夠設置瀏覽器(不可取),也能夠增長信息量
          • 能夠在web.xml文件中使用<error-page>元素爲整個WEB應用程序設置錯誤處理頁面,其中<exception-type>子元素指定異常類的徹底限定名,<location>元素指定以"/"開頭的錯誤處理頁面的路徑
          • 使用<error-page>配置時,還能夠根據錯誤代碼數字來配置<error-code>,配置404,500等
          • JSP中的屬性配置,優先級大於web.xml的配置
        • isErrorPage = "true | false",指定JSP是否錯誤處理頁面,默認false。若是是錯誤處理頁面,在翻譯成Servlet時,就能夠獲取封裝好的異常對象
        • contentType = "mimeType [ ; charset = characterSet]" 如: " text/html ; charset = "UTF-8",告訴jsp引擎,該jsp的類型以及編碼
        • pageEncoding = "characterSet",指定整個jsp的編碼
        • isELIgnored = "true | false",指定該JSP是否忽略EL表達式,默認false。
      • 使用page指令解決JSP中文亂碼
        • JSP的亂碼在Tomcat6.0之後已經獲得很好的解決,再加上Eclipse工具,基本不會有亂碼,會根據pageEcoding來自動更改文件編碼
        • 之前的亂碼主要是操做系統默認保存文件的編碼與Tomcat的默認編碼不一致形成的
        • pageEncoding = "characterSet",通知JSP引擎用什麼編碼來翻譯JSP文件
        • contentType ,通知翻譯後的Servlet用什麼類型和編碼來設置response,好讓瀏覽器正常顯示(若是設置了pageEncoding,這個設置能夠不寫,可是若是使用記事本編寫JSP,就須要再次設置)
    • include指令
      • include指令用於引入其它JSP頁面,若是使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。因此include指令引入一般也稱之爲靜態引入(編譯時包含,編譯時引入)
      • 語法:<%@ include file="relativeURL"%>,其中的file屬性用於指定被引入文件的路徑。路徑以「/」開頭,表示表明當前web應用
      • 被引入的文件必須遵循JSP語法
      • 被引入的文件可使用任意的擴展名,即便其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它裏面的內容,爲了見明知意,JSP規範建議使用.jspf(JSP fragments)做爲靜態引入文件的擴展名
      • 因爲使用include指令將會涉及到2個JSP頁面,並會把2個JSP翻譯成一個servlet,因此這2個JSP頁面的指令不能衝突(除了pageEncoding和導包除外)
    • taglib指令(導入標籤庫,後續講解)
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息