概述:
JSP并沒有取代Servlet,是對Servlet的補充
JSP實質(zhì)是Servlet
JSP的頁面不需要編譯
可用任何文本編寫,后綴.jsp
在JSP容器中運行(Servlet是JSP容器,Tomcat是Servlet/JSP容器)
首次請求JSP,Servlet/JSP容器做兩件事:
????????1:JSP轉(zhuǎn)換為JSP實現(xiàn)類,該類是Servlet類
????????2:編譯該Servlet類
編寫JSP頁面:JSP語法 + Servlet API
與Servlet不同:JSP不需要在部署描述符中標注,或不需要映射成URL,可在瀏覽器中直接輸入頁面路徑調(diào)用
一、注釋(comment):
分兩種:
1: JSP備注:
注明該頁面的作用,不會發(fā)送至瀏覽器, 不能嵌套
以<%--開頭, 以--%>結束,<%--jsp comment--%>
2: HTML/XHTML備注:
JSP容器不處理,而是將其發(fā)送至瀏覽器
結束
用于標識JSP頁面
用于處理帶有很多JSP片段(fragment)的應用,通過查看瀏覽器HTML源代碼,可獲取某個HTML代碼生成了哪些JSP和片段
二、隱式對象(implicit Object):
不用創(chuàng)建,直接只用:
分別對應于Servlet中的相應對象:
request? --------? HttpServletRequest
response? -------? HttpServletResponse
out? -------------? JspWriter
session ---------? HttpSession
application ------? ServletContext
config? ----------? ServletConfig
pageContext ----? PageContext
page? ------------? HttpJspPage
exception? ------- Throwable? ? ? ?
三、三個句法元素:
1、指令(directive):
第一個JSP句法元素,指示JSP容器如何將JSP頁面轉(zhuǎn)換成Servlet的命令
page指令:
<%@page? attribute1="value1"? attribute2="value2"? ....%>
如:<%@page? import="java.util.ArrayList,java.util.Date"? session="false"? buffer="16KB"? contentType="text/html" ......%>
page可以放到JSP中任意地方
page可以多次出現(xiàn),但是值必須一致(import,contentType,encoding除外,import是作用疊加,contentType和encoding必須放在開頭,java發(fā)送內(nèi)容之前)
include指令:
將另一個文件的內(nèi)容放到當前JSP頁面中
多個JSP頁面公用的部分可以做成include文件
<%@? include? file="url" %>,url若以“/”開頭,表示絕對路徑,若沒有則表示相對路徑
include的文件擴展名:.jspf(表示JSP的fragment或者JSP segment)
2、腳本元素(scripting element):
是JSP的第二種句法,將Java代碼合并成一個JSP頁面
分三種:
Scriptlet:
是Java代碼塊,<%開頭,%>結尾
前一個Scriplet定義的變量,在后面的Scriplet中是可見
聲明:
聲明在JSP中使用的變量、方法
格式:<%!開頭, %>結尾
可放在JSP頁面的人和位置
同一個JSP可以有多個聲明
可以在聲明里,覆蓋JSP實現(xiàn)類的方法,比如jspInit, jspDestroy
表達式:
其運算結果自動填入out.print方法中被打印出來
格式:<%=開頭,%>結尾
比如:Today is <%= java.util.Calendar.getInstance().getTime() %>
等價于:Today is <%? out.print(java.util.Calendar.getInstance().getTime());? %>
3、動作(action):
第三種句法,被編譯成執(zhí)行某個操作的Java代碼
useBean動作:
將創(chuàng)建一個與某個Java對象相關的腳本變量
很容易將表現(xiàn)邏輯與業(yè)務邏輯分離
EL表達式出現(xiàn)后,useBean不常用了
如:創(chuàng)建一個Date實例,并與腳本變量today關聯(lián),之后用在一個表達式中
<%=today %>
setProperty 和 getProperty動作:
setProperty:在Java 對象中保存一個屬性
getProperty:獲取一個Java對象的屬性
如:頁面保存并輸出Customer實例的name屬性
Customer Name:
include動作:
此動作用于動態(tài)包含另一個資源、JSP頁面、一個Servlet、靜態(tài)的HTML頁面
include指令與include動作區(qū)別:
區(qū)別1:
include指令發(fā)生在頁面轉(zhuǎn)換時,JSP容器將頁面轉(zhuǎn)換成對應的Servlet實例時
include動作發(fā)生在請求時,可以傳遞參數(shù)
區(qū)別2:
include指令:被包含文件擴展名不重要
include動作:文件擴展名必須時.jsp,如果是jspf會被當作靜態(tài)文件處理
如:
forward動作:
將當前頁面跳轉(zhuǎn)到另一個不同的資源
如:將當前頁面跳到login.jsp
錯誤處理動作:
可以利用try語句處理Java代碼
也可以指定錯誤頁面
如:
errorHandler.jsp
<%@page isErrorPage="true" %>
An Error has occurred.
<% out.println(exception.toString()); %>
buggy.jsp:
<%@page errorPage="errorHandler.jsp" %>
<% Integer.parseInt("Throw me"); %>