1、JSP頁面由兩部分構成:
·靜態部分:標準的HTML標籤、靜態的頁面內容。這些內容與靜態的HTML 頁面相同。
·動態部分:受Java程序控制的內容,這些內容由Java程序來動態生成
2、JSP頁面中<% 和 %>之間放置Java腳本。
3、JSP生成的servlet文件放在work路徑對應的web目錄下。
4、相關說明:
·JSP文件在JSP服務器內運行。
·JSP文件必須生成Servlet才能執行。
·每個JSP頁面的第一個訪問者速度很慢,因爲必須等待JSP編譯成Servlet。
·JSP頁面的訪問者無需安裝任何客戶端,甚至不需要可以運行Java的運行環境,因爲JSP傳送到客戶端的是HTML頁面
5、JSP註釋格式:<%-- 註釋內容 --%>。HTML註釋可以在客戶端查看源代碼時看到,但JSP註釋不會發送到客戶端。
6、JSP聲明格式:<%!聲明部分 %>,可用於聲明變量和方法。JSP中的聲明會被轉換成對應Servlet中的成員變量和成員方法。
<%!
// 聲明一個變量。
public int count;
//聲明一個方法。
public String info() {
return “hello”;
}
%>
7、JSP輸出格式:<%= 表達式 %>。注意輸出表達式語法後不能有分號。
8、JSP腳本將轉換成Servlet裏的_jspService方法的可執行性代碼。這意味着JSP小腳本部分也可以聲明變量,但聲明的變量是局部變量,不能使用private、public等訪問修飾符修飾,也不可使用static修飾。同時,JSP腳本中也不可以定義方法。
9、JSP的三個編譯指令:
·page:該指令是針對當前頁面的指令
·include:用於包含另一個頁面。
·taglib:用於定義和訪問自定義標籤。
使用語法格式如下:
<%@ 編譯指令名 屬性名=”屬性值” ... >
10、page指令爲與JSP頁面的頂端,一個JSP頁面可以使用多條page指令。語法如下:
<%@ page
[languate=”java”]
[extneds=”package.class”]
[import=”package.class|package.*, ...”]
[session=”true|false”]
[buffer=”none|8KB|size Kb”]
[autoFlush=”true|false”]
[isThreadSafe=”true|false]
[info=”test”]
[errorPage=”relativeURL”]
[contentType=”mimeType [; charset=”characterSet]” | “text/html; charSet=”ISO-8859-1”]
[pageEncoding=”ISO-8859-1”]
[isErrorPage=”true|false”]
%>
11、info屬性指定了JSP頁面的描述信息,可以使用getServletInfo方法獲取該描述信息。
12、errorPage屬性實質上是JSP的異常處理機制,JSP腳本不要求強制處理異常,及時改異常時checked異常。如果JSP頁面在運行中跑出未處理的異常,系統將自動跳轉到errorPage屬性指定的頁面,如果errorPage沒有指定錯誤頁面,系統規則直接把異常信息呈獻給客戶端瀏覽器。
13、使用include指令,可以將一個外部文件嵌入到當前的JSP文件中,同時解析這個JSP語句(如果有的話)。這是個靜態的include語句。語法如下:
<%@include file=”relativeURLSpec” %>
14、如果被嵌入的文件經常改變,建議使用<jsp:include>操作指令,因爲它是動態的include語句。
15、靜態include還會將被包含頁面的編譯指令也包含進來,如果兩個頁面的編譯指令衝突,那麼頁面就會出錯。
16、JSP的7個動作指令:
·jsp:forward:執行頁面轉向,將請求的處理轉發到先一個頁面。
·jsp:param:用於傳遞參數,必須與其他參數的標籤一起使用。
·jsp:include:用於動態引入一個JSP頁面。
·jsp:plugin:用於下載JavaBean或Applet客戶端執行。
·jsp:useBean:用於創建一個JavaBean的實例。
·jsp:setProperty:設置JavaBean實例的屬性值。
·jsp:getProperty:輸出JavaBean實例的屬性值。
17、forward指令用於將頁面響應轉發到另外的頁面。既可以轉發靜態的HTML頁面,也可以轉發動態的JSP頁面,或者轉發到容器中的Servlet。格式如下:
JSP 1.0:
<jsp:forward page = “{relativeURL|<%= expression %>}” />
JSP 1.1 以上:
<jsp:forward page=”{relativeURL|<%= expression %>}” >
{<jsp:param ... />}
</jsp:forward>
第二種語法用於在轉發時增加額外的請求參數。增加請求的參數值可以通過HttpServletRequest類的getParameter()方法獲取。
18、執行forward指令時,用戶請求的地址不變。轉發請求時,客戶端的請求參數不會丟失。
19、<jsp:include>指令是一個動態的include指令,也用於包含某個頁面,但它不會導入被include頁面的編譯指令,僅僅將被導入頁面的body內容插入到本頁面。語法格式如下:
JSP 1.0:
<jsp:include page = “{relativeURL|<%= expression %>}” flush=”true”/>
JSP 1.1 以上:
<jsp:include page = “{relativeURL|<%= expression %>}” flush=”true”/>
{<jsp:param ... />}
</jsp:forward>
flush屬性用於指定輸出緩存是否轉移到被導入文件中。
20、靜態導入和動態導入的區別:
·靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個整體Servlet;而動態導入只是使用一個include方法來插入目標頁面的內容。
·靜態導入時被導入頁面的編譯指令會起作用;而動態導入時被導入頁面的編譯指令則失去作用,只是插入被導入頁面的body內容。
·動態包含還可以增加額外的參數。
21、<jsp:useBean> <jsp:setProperty> <jsp:getProperty> 這三個指令與JavaBean相關。其中useBean用於在JSP頁面中初始化一個Java實例;setProperty指令用於爲JavaBean實例的屬性設置值;getProperty指令用於輸出JavaBean實例的屬性。
22、useBean語法格式:
<jsp:useBean id=”name” class=”classname” scope=”page|request| session|application” />
23、setProperty、getProperty語法格式:
<jsp:setProperty name=”BeanName” property=”propertyName” value=”value” />
<jsp:getProperty anme=”BeanName” property=”propertyName” />
24、JSP腳本中的9個內置對象:
·application:javax.servlet.ServletContext實例,該實例代表JSP所屬的Web應用本身,可用於JSP頁面,或者在Servlet之間交換信息。常用的方法有getAttribute(String attrName)、setAttribute(String attrName, String attValue)和getInitParameter(String paramName)等。
·config:javax.servlet.ServletConfig的實例,該實例代表該JSP的配置信息。常用的方法有getInitParameter(String paramName)和getInitParameters()等方法。實時上,JSP頁面通常無需配置,也就不存在配置信息。因此,該對象更多地在Servlet中有效。
·exception:java.lang.Throwable 實例,該實例代表其他頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page的isErrorPage屬性爲true時,該對象纔可以使用。常用的方法有getMessage()和printStackTrace()等。
·out:javax.servlet.jsp.JspWriter的實例。該實例代表JSP頁面的輸出流,用於輸出內容,形成HTML頁面。
·page:代表頁面本身,通常沒有太大用處。也就是Servlet中的this,其類型就是生成的Servlet類,能用page的地方就可以用this。
·pageContext:javax.servlet.jsp.PageContext的實例,該對象代表該JSP頁面的上下文,使用該對象可以訪問頁面中的共享數據。常用的方法有getServletContext() 和getServletConfig()等。
·request:javax.servlet.http.HttpServletRequest的實例,該對象封裝了一次請求,客戶單的請求參數都被封裝在該對象裏。這是一個常用的對象,獲取客戶端請求參數必須使用該對象。常用的方法有:getParameter(String paramName)、getParameterValues(String paramName)、setAttribute(String attrName, Object attrValue)、getAttribute(String attrName) 和 setCharacterEncoding(String env)等。
·response:javax.servlet.http.HttpServletResponse的實例,代表服務器對客戶端的響應。通常很少使用給對象直接響應,而是使用out對象,除非要生成非字符的響應。而response對象常用語重定向,常用的方法有:getOutputStream()、setRedirect(String location)等。
·session:javax.servlet.http.HttpSession的實例,該對象代表一次會話。當客戶端瀏覽器與站點建立連接時,會話開始;當客戶端關閉瀏覽器時,會話結束,常用的方法有:getAttribute(String attrName)、setAttribute(String attrName, Object attrValue)等。
25、JSP中的內置對象本質上要麼是Servlet類中service方法的形參,要麼是方法內的局部變量。
26、Web服務器處理客戶端請求步驟:
① 啓動單獨的線程。
② 使用I/O讀取用戶的請求數據。
③ 從請求數據中解析參數
④ 處理用戶請求
⑤ 生成響應數據
⑥ 使用I/O流向客戶端發送請求數據。
其中:①、②和⑥步驟是通用的,可以有Web服務器來完成,剩餘步驟則需要開發者來實現。
27、Web服務器會提供4個Map結構,用於web應用中不同組件進行數據交互:application、session、request、page。
28、通常只把Web應用的狀態放到application中。
29、application可以獲得用戶的配置參數(使用getInitParameter方法):
<context-param>
<param-name> ... </param-name>
<param-value>...</param-value>
</context-param>
30、config對象可以獲取Servlet的配置參數(getInitParameter):
<servlet>
<servlet-name> ... </servlet>
<jsp-file> ... </jsp-file>
<init-param>
<param-name> ... </param-name>
<param-value> ... </param-value>
</init-param>
</servlet>
31、如果希望JSP頁面可以獲取web.xml配置文件中的配置信息,則必須通過該JSP配置的路徑來訪問該頁面,因爲只有這樣訪問JSP頁面纔會讓配置參數起作用。
32、JSP聲明部分依然需要處理Checked異常,JSP的異常處理機制對JSP聲明不起作用。
33、out對象代表一個頁面的輸出流,通常用於在頁面上輸出變量值及常量。一般在使用輸出表達式的地方,都可以使用out對象來達到同樣的效果。
34、pageContext對象代表頁面的上下文,該對象主要用於訪問JSP之間的共享數據。使用pageContext可以訪問page、request、session、application範圍的變量。常用方法有getAttribute和setAttribute,同時包含4個常量用於訪問不同範圍的值:PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE。
35、pageContext還可以用於獲取其他的內置對象:getRequest()、getResponse()、getServletConfig()、getServletContext()、getSession()。
36、request對象是JSP中重要的內置對象,每個request對象封裝着一次用戶請求,並且所有的請求參數都封裝在request對象中,因此request對象是獲取請求參數的重要途徑。常用方法有:
·String getParameter(String paramName):獲取paramName請求參數的值。
·Map getParameterMap():獲取所有請求參數名和參數值組成的Map對象
·Enumeration getParameterNames():獲取所有請求參數名組成的Enumeration對象。
·String[] getParameterValues(String paraName):paramName請求參數的值,當該請求參數有多個值時,該方法將返回多個值組成的數組。
·String getHeader(String name):獲取指定請求頭的值。
·java.util.Enumeration<String> getHeaderNames():獲取所有請求頭的名稱。
·java.util.Enumeration<String> getHeaders(String name):獲取指定請求頭的多個值。
·int getIntHeader(String name):獲取指定請求頭的值,並將該值轉換爲整數值。
37、客戶端發送請求參數通常有2種情況:
·GET方式請求:直接在瀏覽器地址欄中輸入訪問地址所發送的請求或提交表單發送請求時,該表單對應的form元素沒有設置method屬性,或method屬性爲get,這幾種請求都是GET方式的請求。GET方式的請求會將請求參數的名和值轉換成字符串,並附加在原URL之後,因此,可以在地址欄中看到請求參數的參數名和參數值。且GET請求傳送的數據量較小,一般不能大於2KB
·POST方式請求:這種方式通常使用提交表單(由form HTML元素表示)的方式來發送,且需要設置form元素的method屬性爲post。POST方式傳送的數據量較大,通常認爲POST請求參數的大小不受限制,且往往取決於服務器的限制,POST請求傳輸的數據量總比GET傳輸的數據量大,而且POST方式發送的請求參數以及對應的值放在HTML HEADER中傳輸,用戶不能再地址欄中看到請求參數值,安全性相對較高。
38、使用GET方式發出請求後,URL變爲如下格式:
url?param1=value1¶m2=value2&...paramN=valueN
39、執行forward請求時,請求參數和request範圍內的屬性不會丟失。
40、request還有一個功能就是執行forward和include,可以替代JSP所提供的的forward和include指令:
request.getRequestDispatcher(path).include(request, response);
request.getRequestDispatcher(path).forward(request, response);
41、response對象代表服務器對客戶端的響應。大部分時候,程序無需使用response來響應客戶端的請求,因爲有個更簡單的對象——out,它代表頁面輸出流,直接使用out更簡單。但out是JSpWriter的實例,JspWriter是Writer的子類,Writer是字節流,無法輸出非字符的內容。假如需要在JSP頁面中動態生成一幅位圖、或者輸出一個PDF文檔,使用out作爲響應對象將無法完成,此時必須使用response輸出。
42、response對象還可用於重定向請求,以及用於向客戶端增加cookie。
43、使用response重定向:
response.sendRedirect(path);
重定向後,頁面地址欄的URL會發生改變。
44、forward和redirect的對比:
轉發(forward) |
重定向(redirect) |
執行forward後依然是上一次請求 |
執行redirect後生成第二次請求 |
forward的目標頁面可以訪問原請求的請求參數,因爲依然是同一次請求,所有原請求的請求參數,request範圍的屬性全部都在 |
redirect的目標頁面不能訪問原請求的請求參數,因爲是第二次請求了,所有原請求的請求參數、request範圍的屬性全部丟失。 |
地址欄裏請求的URL不會改變 |
地址來改爲重定向的目標URL。相當於在瀏覽器地址欄裏輸入新的URL後按回車鍵 |
45、Cookie通常用於網站記錄客戶的某些信息,比如客戶的用戶名及客戶的喜好等。一旦用戶下次登錄,網站可以獲取到客戶的相關信息,根據這些客戶信息,網站可以對客戶提供更友好的服務。Cookie與Session的不同之處在於:Session會隨瀏覽器的關閉而失效,但Cookie會一直放在客戶端的機器上,除非超出Cookie的生命期限。
46、處於安全性的原因,使用Cookie客戶端瀏覽器必須支持Cookie才行。客戶端瀏覽器完全可以設置禁用Cookie。
47、增加Cookie步驟:
① 創建Cookie實例,Cookie的構造器爲Cookie(String name, String value)。
Cookie c = new Cookie(“username”, name);
② 設置Cookie的生命期限,即該Cookie在多長時間內生效:
c.setMaxAge(24 * 3600)
③ 向客戶端寫Cookie。
response.addCookie(c);
48、session對象也是一個非常常用的對象,這個對象代表一次用戶會話。一次用戶會話的含義是:從客戶端瀏覽器連接服務器開始,到客戶端瀏覽器與服務器斷開連接位置,這個過程就是一次會話。
49、session通常用於跟蹤用戶的會話信息,如判斷用戶是否登錄系統,或者購物車應用中,用於跟蹤用戶購買的商品等。
50、session範圍內的屬性可以在多個頁面之間跳轉共享。一旦關閉瀏覽器,即session結束,session範圍內的屬性將全部丟失。
51、session機制通常用於保存客戶端的狀態信息,這些狀態信息需要保存到Web服務器的硬盤上,所以要求session裏的屬性值必須是可序列化的,否則將會引發不可序列化的異常。