Servlet學習筆記(七)—— JSP概述
1.Servlet兩個缺陷:
①所有HTML標簽必須包在Java字符串中,使得發送HTTP響應十分繁瑣;
②所有文本和HTML標簽都必須進行硬編碼,即使對表示層做極其微小的修改,也需要重新編譯。
2.注釋:
(1)JSP備注:<% %>,不會發送到浏覽器,不能嵌套
(2)HTML備注:,不被容器處理,直接發送到浏覽器,用途之一是標識JSP頁面。在處理帶有許多JSP片段的應用程序時,開發者通過查看HTML源代碼,可以輕松查出某個HTML代碼部分生成了那個JSP頁面。
3.隱式對象:
對象
類型
request
javax.servlet.http.HttpServletRequest
response
javax.servlet.http.HttpServletResponse
out
javax.servlet.jsp.JspWriter
session
javax.servlet.http.HttpSession
application
javax.servlet.ServletContext
config
javax.servlet.ServletConfig
pageContext
javax.servlet.jsp.PageContext
page
javax.servlet.jsp.HttpjspPage
exception
java.lang.Throwable
out類似於HttpServletResponse中調用
page對象表示當前的JSP頁面
getWriter()之後得到的java.io.PrintWriter
4.三個句法元素:
(1)指令directive:指示JSP轉換器應該如何將某JSP頁面轉換為Servlet
①page:就當前JSP頁面的某些方面對JSP轉換器提出指示 。page指令可以出現在頁面的任何位置。只是當它包含contentType或者pageEncoding屬性時,必須放在所有模板數據之前,並且是在利用Java 代碼發送任何內容之前。這是因為必須在發送任何內容之前設置內容類型和字符編碼。
②include:將另一個文件的內容放在當前的JSP頁面中。文件擴展名.jspf
(2)腳本元素scripting:將Java代碼和比高成一個JSP頁面
①Scriplet:在一個Scriplet中定義的變量,對於它後面的其他Scriplet也是可見的
②聲明:能在JSP頁面使用的變量和方法
③表達式:Today is <%= java.util.Calendar.getInstance().getTime() %> 表達式後面不需要分號
關閉腳本元素:隨著Expression Language的發展,建議利用EL來訪問服務器端的對象,而不是在JSP頁面中編寫Java代碼。因此,原本開啟的腳本元素,可以在部署描述符的
中定義一個scripting-invalid元素,將它關閉,例如:
*.jsp
<scripting-invalid>true</scripting-invalid>
(3)動作action:被編譯成執行某個動作的Java代碼
①useBean:創建一個與某個Java對象相關的腳本變量,將表現邏輯與業務邏輯分開
②setProperty與getProperty:保存與獲取一個java對象中的一個屬性
③include動作:
include指令和include動作的區別:
include指令是在頁面轉換時使用,比如JSP容器將頁面轉換成一個生成的Servlet的時候;include動作是在發生請求的時候使用。
可以通過include動作傳遞參數,但是include指令不可以。
使用include指令時,被包含資源的文件擴展名並不重要;使用include動作時,文件擴展名必須是jsp
④forward:將當前頁面跳轉到另一個不同的資源
forword與redirect的區別:
http://zhulin902.iteye.com/blog/939049
http://www.Bkjia.com/kf/201109/105650.html
5.錯誤處理:
(1)用try語句處理Java代碼
(2)指定一個頁面,讓它在應用程序遇到未捕捉的異常時顯示出來。
利用page指令的isErrorPage屬性,就可以把一個JSP頁面變成一個錯誤處理頁面
6.概述:
(1)Jsp頁面也是一個Servlet,但簡單的多:
①不需要編譯JSP頁面;
②*.jsp為擴展名的文本文件,可以用任意文本編輯器編寫。
(2)JSP頁面在JSP容器中運行,Servlet容器一般也是JSP容器。Tomcat就是一個Servlet/JSP容器。
(3)第一次請求一個JSP頁面時,容器所做的兩件事:
①將JSP頁面轉換車一個JSP頁面實現類,即一個實現javax.servlet.jsp.JspPage或者javax.servlet.jsp.HttpjspPage接口的Java類。JspPage是javax.servlet.Servlet的子接口,所以每個Jsp頁面都編程一個Servlet。
②轉換成功,容器編譯Servlet類,加載和實例化Java字節碼,執行它通常對Servlet所做的生命周期操作。
(4)對於同一個JSP頁面的後續請求,容器會查看這個JSP頁面自從最後一次轉換以來是否被修改過。如果修改過,就會重新轉換、編譯、執行;若沒有,則執行內存中已經存在的Servlet。所以,第一次掉一個JSP頁面的時間比後續請求都更長。解決這個問題的措施:
①配置應用程序,在應用程序啟動而不是初始請求的時候,調用所有的JSP頁面進行轉換編譯。
②預先編譯JSP頁面,並將它們以Servlet的方式進行部署。
(5)JSP API的4個包:
①javax.servlet.jsp
②javax.servlet.jsp.target
③javax.el
④javax.servlet.jsp.el
(6)JSP 頁面包含句法元素和模板數據:
①<% 和%>就是句法元素,HTML標簽和文本就是模板數據。
(7)JSP不需要在部署描述符中進行標注,或者映射成一個URL
(8)添加完一個新的JSP頁面不需要重啟Tomcat
7.如何查看JSP轉譯成servlet後的源代碼?
在eclipse的工作區\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\(項目名)\org\apache\jsp這裡。