javascript
JSP基础教程
JSP技術是以Java語言作為腳本語言的,JSP網頁為整個服務器端的Java庫單元提供了一個接口來服務于HTTP的應用程序。
1.Java簡介
??????? 1)為什么使用JSP?
??????????????? JSP程序與CGI程序有著相似的功能,但和CGI程序相比,JSP程序有如下優勢:
??????????????????????? 性能更加優越,因為JSP可以直接在HTML網頁中動態嵌入元素而不需要單獨引用CGI文件。
??????????????????????? 服務器調用的是已經編譯好的JSP文件,而不像CGI/Perl那樣必須先載入解釋器和目標腳本。
??????????????????????? JSP基于Java Servlets API,因此,JSP擁有各種強大的企業級Java API,包括JDBC,JNDI,EJB,JAXP等等。
??????????????????????? JSP頁面可以與處理業務邏輯的servlets一起使用,這種模式被Java servlet 模板引擎所支持。
????????????????最后,JSP是Java EE不可或缺的一部分,是一個完整的企業級應用平臺。這意味著JSP可以用最簡單的方式來實現最復雜的應用。
??????? 2)JSP的優勢
??????????????? 與ASP相比:JSP有兩大優勢。首先,動態部分用Java編寫,而不是VB或其他MS專用語言,所以更加強大與易用。第二點就是JSP易于移植到非MS平臺上。
??????????????? 與純 Servlets相比:JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句。
??????????????? 與SSI相比:SSI無法使用表單數據、無法進行數據庫鏈接。
??????????????? 與JavaScript相比:雖然JavaScript可以在客戶端動態生成HTML,但是很難與服務器交互,因此不能提供復雜的服務,比如訪問數據庫和圖像處理等等。
??????????????? 與靜態HTML相比:靜態HTML不包含動態信息。
2.JSP結構
??????? 1)Web服務器是使用JSP來創建網頁
??????????????? 就像其他普通的網頁一樣,您的瀏覽器發送一個HTTP請求給服務器。
??????????????? Web服務器識別出這是一個對JSP網頁的請求,并且將該請求傳遞給JSP引擎。通過使用URL或者.jsp文件來完成。
??????????????? JSP引擎從磁盤中載入JSP文件,然后將它們轉化為servlet。這種轉化只是簡單地將所有模板文本改用println()語句,并且將所有的JSP元素轉化成Java代碼。
??????????????? JSP引擎將servlet編譯成可執行類,并且將原始請求傳遞給servlet引擎。
??????????????? Web服務器的某組件將會調用servlet引擎,載入并執行servlet類。在執行過程中,servlet產生HTML格式的輸出并將其內嵌于HTTP response中上交給Web服務器。
??????????????? Web服務器以靜態HTML網頁的形式將HTTP response返回到您的瀏覽器中。
??????????????? 最終,Web瀏覽器處理HTTP response中動態產生的HTML網頁,就好像在處理靜態網頁一樣。
??????? 2)一般情況下,JSP引擎會檢查JSP文件對應的servlet是否已經存在,并且檢查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于對應的servlet,那么容器就可以確定JSP文件沒有被修改過并且servlet有效。這使得整個流程與其他腳本語言(比如PHP)相比要高效快捷一些。 總的來說,JSP網頁就是用另一種方式來編寫servlet而不用成為Java編程高手。除了解釋階段外,JSP網頁幾乎可以被當成一個普通的servlet來對待。
3.JSP生命周期
??????? 1)JSP生命周期就是從創建到銷毀的整個過程,類似于servlet生命周期,區別在于JSP生命周期還包括將JSP文件編譯成servlet。 以下是JSP生命周期中所走過的幾個階段
??????????????? 編譯階段:servlet容器編譯servlet源文件,生成servlet類。
??????????????? 初始化階段:加載與JSP對應的servlet類,創建其實例,并調用它的初始化方法。
??????????????? 執行階段:調用與JSP對應的servlet實例的服務方法。
??????????????? 銷毀階段:調用與JSP對應的servlet實例的銷毀方法,然后銷毀servlet實例?。
??????? 2)JSP編譯
??????????????? 瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個文件。如果這個文件沒有被編譯過,或者在上次編譯后被更改過,則編譯這個JSP文件,步驟如下。
??????????????????????? 解析JSP文件。
??????????????????????? 將JSP文件轉為servlet。
??????????????????????? 編譯servlet。
??????? 3)JSP初始化
??????????????? 容器載入JSP文件后,它會在為請求提供任何服務前調用jspInit()方法。如果您需要執行自定義的JSP初始化任務,復寫jspInit()方法就行了。
??????????????? 一般來講程序只初始化一次,servlet也是如此。通常情況下您可以在jspInit()方法中初始化數據庫連接、打開文件和創建查詢表。
??????? 4)JSP執行
??????????????? 這一階段描述了JSP生命周期中一切與請求相關的交互行為,直到被銷毀。 當JSP網頁完成初始化后,JSP引擎將會調用_jspService()方法。_jspService()方法需要一個HttpServletRequest對象和一個HttpServletResponse對象作為它的參數,
??????????????? _jspService()方法在每個request中被調用一次并且負責產生與之相對應的response,它還負責產生所有7個HTTP方法的回應,比如GET、POST、DELETE等等。
??????? 5)JSP清理
??????????????? JSP生命周期的銷毀階段描述了當一個JSP網頁從容器中被移除時所發生的一切。jspDestroy()方法在JSP中等價于servlet中的銷毀方法。當您需要執行任何清理工作時復寫jspDestroy()方法,比如釋放數據庫連接或者關閉文件夾等。
4.JSP語法
??????? 1)腳本程序
??????????????? 腳本程序可以包含任意量的Java語句、變量、方法或表達式,只要它們在腳本語言中是有效的。
??????????????? 腳本程序的語法格式:<% 代碼片段 %>
??????????????? 您也可以編寫與其等價的XML語句,格式:<jsp:scriptlet> 代碼片段</jsp:scriptlet>
??????????????? 任何文本、HTML標簽、JSP元素必須寫在腳本程序的外面。
??????? 2)中文編碼問題
??????????????? 如果我們要在頁面正常顯示中文,我們需要在 JSP 文件頭部添加以下代碼:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>。
??????? 3)JSP聲明
??????????????? 一個聲明語句可以聲明一個或多個變量、方法,供后面的Java代碼使用。在JSP文件中,您必須先聲明這些變量和方法然后才能使用它們。
??????????????? JSP格式:<%! declaration;[ declaration;]+... %>
??????????????? XML格式:<jsp:declaration> 代碼片段</jsp:declaration>
??????? 4)JSP表達式
??????????????? 一個JSP表達式中包含的腳本語言表達式,先被轉化成String,然后插入到表達式出現的地方。由于表達式的值會被轉化成String,所以您可以在一個文本行中使用表達式而不用去管它是否是HTML標簽。表達式元素中可以包含任何符合Java語言規范的表達式,但是不能使用分號來結束表達式。
??????????????? JSP表達式的語法格式:<%= 表達式 %>
??????????????? XML格式:<jsp:expression> 表達式</jsp:expression>
??????? 5)JSP注釋
??????????????? JSP注釋主要有兩個作用:為代碼作注釋以及將某段代碼注釋掉。
??????????????? 注釋的語法格式:
??????????????????????? <%-- 注釋 --%>??????? JSP注釋,注釋內容不會被發送至瀏覽器甚至不會被編譯,內部可以包含Java代碼。
??????????????????????? <!-- 注釋 -->??????? HTML注釋,通過瀏覽器查看網頁源代碼時可以看見注釋內容
??????????????????????? <\%??????? 代表靜態 <%常量
??????????????????????? %\>??????? 代表靜態 %> 常量
??????????????????????? \'??????? 在屬性中使用的單引號
??????????????????????? \"??????? 在屬性中使用的雙引號
??????? 6)JSP指令
??????????????? JSP指令用來設置與整個JSP頁面相關的屬性。
??????????????? JSP指令語法格式:<%@ directive attribute="value" %>
??????????????? 這里有三種指令標簽:
??????????????????????? <%@ page ... %>??????? 定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等
??????????????????????? <%@ include ... %>??????? 包含其他文件
??????????????????????? <%@ taglib ... %>??????? 引入標簽庫的定義,可以是自定義標簽
??????? 7)JSP行為
??????????????? JSP行為標簽使用XML語法結構來控制servlet引擎。它能夠動態插入一個文件,重用JavaBean組件,引導用戶去另一個頁面,為Java插件產生相關的HTML等。
??????????????? 行為標簽只有一種語法格式,它嚴格遵守XML標準:<jsp:action_nameattribute="value"/>
??????????????? 行為標簽基本上是一些預先就定義好的函數,下表羅列出了一些可用的JSP行為標簽:
??????????????????????? jsp:include???????????? 用于在當前頁面中包含靜態或動態資源
??????????????????????? jsp:useBean????????? 尋找和初始化一個JavaBean組件
??????????????????????? jsp:setProperty????? 設置 JavaBean組件的值
??????????????????????? jsp:getProperty????? 將?JavaBean組件的值插入到 output中
??????????????????????? jsp:forward???????????? 從一個JSP文件向另一個文件傳遞一個包含用戶請求的request對象
??????????????????????? jsp:plugin?????????????? 用于在生成的HTML頁面中包含Applet和JavaBean對象
????????????????????????jsp:element??????????? 動態創建一個XML元素
??????????????????????? jsp:attribute??????????? 定義動態創建的XML元素的屬性
??????????????????????? jsp:body???????????????? 定義動態創建的XML元素的主體
??????????????????????? jsp:text?????????????????? 用于封裝模板數據
??????? 8)JSP隱含對象
??????????????? JSP支持九個自動定義的變量,江湖人稱隱含對象。這九個隱含對象的簡介見下表:
??????????????????????? request?????????????? HttpServletRequest類的實例
??????????????????????? response??????????? HttpServletResponse類的實例
??????????????????????? out????????????????????? PrintWriter類的實例,用于把結果輸出至網頁上
??????????????????????? session?????????????? HttpSession類的實例
??????????????????????? application????????? ServletContext類的實例,與應用上下文有關
??????????????????????? config????????????????? ServletConfig類的實例
??????????????????????? pageContext?????? PageContext類的實例,提供對JSP頁面所有對象以及命名空間的訪問
??????????????????????? page???????????????????類似于Java類中的this關鍵字
??????????????????????? Exception?????????? Exception類的對象,代表發生錯誤的JSP頁面中對應的異常對象
??????? 9)控制流語句
??????????????? JSP提供對Java語言的全面支持。您可以在JSP程序中使用Java API甚至建立Java代碼塊,包括判斷語句和循環語句等。
??????? 10)循環語句
??????????????? 在JSP程序中可以使用Java的三個基本循環類型:for,while,和 do…while。
??????? 11)JSP運算符
??????????????? JSP支持所有Java邏輯和算術運算符。
??????? 12)JSP字面量
??????????????? JSP語言定義了以下幾個字面量:
??????????????????????? 布爾值(boolean):true 和 false;
??????????????????????? 整型(int):與 Java 中的一樣;
??????????????????????? 浮點型(float):與 Java 中的一樣;
??????????????????????? 字符串(string):以單引號或雙引號開始和結束;
??????????????????????? Null:null。
5.JSP指令
??????? 1)JSP指令格式
??????????????? JSP指令用來設置整個JSP頁面相關的屬性,如網頁的編碼方式和腳本語言。語法格式:<%@ directive attribute="value" %>
??????????????? 指令可以有很多個屬性,它們以鍵值對的形式存在,并用逗號隔開。JSP中的三種指令標簽:
??????????????????????? <%@ page ... %>????????? 定義網頁依賴屬性,比如腳本語言、error頁面、緩存需求等等
??????????????????????? <%@ include ... %>?????? 包含其他文件
??????????????????????? <%@ taglib ... %>????????? 引入標簽庫的定義
??????? 2)Page指令
??????????????? Page指令為容器提供當前頁面的使用說明。一個JSP頁面可以包含多個page指令。
??????????????? Page指令的語法格式:<%@ page attribute="value" %>等價的XML格式:<jsp:directive.pageattribute="value"/>
??????? 3)屬性
??????????????? buffer??????????????? 指定out對象使用緩沖區的大小
??????????????? autoFlush????????? 控制out對象的?緩存區
??????????????? contentType????? 指定當前JSP頁面的MIME類型和字符編碼
??????????????? errorPage????????? 指定當JSP頁面發生異常時需要轉向的錯誤處理頁面
??????????????? isErrorPage?????? 指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面
??????????????? extends?????????????指定servlet從哪一個類繼承
??????????????? import????????????????導入要使用的Java類
??????????????? info??????????????????? 定義JSP頁面的描述信息
??????????????? isThreadSafe??? 指定對JSP頁面的訪問是否為線程安全
??????????????? language?????????? 定義JSP頁面所用的腳本語言,默認是Java
??????????????? session????????????? 指定JSP頁面是否使用session
??????????????? isELIgnored?????? 指定是否執行EL表達式
??????????????? isScriptingEnabled??? 確定腳本元素能否被使用
??????? 4)Include指令
??????????????? JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。
??????????????? Include指令中的文件名實際上是一個相對的 URL 地址。如果您沒有給文件關聯一個路徑,JSP編譯器默認在當前路徑下尋找。
??????????????? Include指令的語法格式:<%@ include file="文件相對 url 地址" %>
??????????????? XML語法格式:<jsp:directive.includefile="文件相對 url 地址"/>
??????? 5)Taglib指令
??????????????? JSP API允許用戶自定義標簽,一個自定義標簽庫就是自定義標簽的集合。Taglib指令引入一個自定義標簽集合的定義,包括庫路徑、自定義標簽。
??????????????? URL屬性確定標簽庫的位置,prefix屬性指定標簽庫的前綴。
??????????????? Taglib指令的語法:<%@ taglib uri="uri" prefix="prefixOfTag" %>
??????????????? XML語法格式:<jsp:directive.tagliburi="uri"prefix="prefixOfTag"/>
6.JSP動作元素
??????? 1)簡介
??????????????? 與JSP指令元素不同的是,JSP動作元素在請求處理階段起作用。JSP動作元素是用XML語法寫成的。
??????????????? 利用JSP動作可以動態地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。
??????????????? 動作元素只有一種語法,它符合XML標準:<jsp:action_nameattribute="value"/>
??????????????? 動作元素基本上都是預定義的函數,JSP規范定義了一系列的標準動作,它用JSP作為前綴,可用的標準動作元素如下:
??????????????????????? jsp:include?????????????????? 在頁面被請求的時候引入一個文件。
??????????????????????? jsp:useBean????????????????尋找或者實例化一個JavaBean。
??????????????????????? jsp:setProperty??????????? 設置JavaBean的屬性。
??????????????????????? jsp:getProperty??????????? 輸出某個JavaBean的屬性。
??????????????????????? jsp:forward????????????????? 把請求轉到一個新的頁面。
??????????????????????? jsp:plugin???????????????????? 根據瀏覽器類型為Java插件生成OBJECT或EMBED標記。
??????????????????????? jsp:element????????????????? 定義動態XML元素
??????????????????????? jsp:attribute????????????????? 設置動態定義的XML元素屬性。
??????????????????????? jsp:body?????????????????????? 設置動態定義的XML元素內容。
??????????????????????? jsp:text???????????????????????? 在JSP頁面和文檔中使用寫入文本的模板
??????? 2)常見屬性
??????????????? id屬性:id屬性是動作元素的唯一標識,可以在JSP頁面中引用。動作元素創建的id值可以通過PageContext來調用。
??????????????? scope屬性:用于識別動作元素的生命周期,scope屬性定義相關聯id對象的壽命。 scope屬性有四個可能的值: (a) page, (b)request, (c)session, 和 (d) application。
??????? 3)<jsp:include>動作元素
??????????????? <jsp:include>動作元素用來包含靜態和動態的文件。該動作把指定文件插入正在生成的頁面。語法格式如下:<jsp:includepage="相對 URL 地址"flush="true"/>
??????????????? 前面已經介紹過include指令,它是在JSP文件被轉換成Servlet的時候引入文件,而這里的jsp:include動作不同,插入文件的時間是在頁面被請求的時候。
??????????????? 以下是include動作相關的屬性列表:
??????????????????????? page??????????????? 包含在頁面中的相對URL地址。
??????????????????????? flush??????????????? 布爾屬性,定義在包含資源前是否刷新緩存區。
??????? 4)<jsp:useBean>動作元素
??????????????? jsp:useBean動作用來加載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因為它使得我們可以發揮 Java 組件復用的優勢。
??????????????? jsp:useBean動作最簡單的語法:<jsp:useBeanid="name"class="package.class"/>
??????????????? 在類載入后,我們既可以通過 jsp:setProperty 和 jsp:getProperty 動作來修改和檢索bean的屬性。以下是useBean動作相關的屬性列表:
??????????????????????? class????????? 指定Bean的完整包名。
??????????????????????? type??????????? 指定將引用該對象變量的類型。
??????????????????????? beanName??????? 通過 java.beans.Beans 的 instantiate() 方法指定Bean的名字。
??????? 5)<jsp:setProperty>動作元素
??????????????? jsp:setProperty用來設置已經實例化的Bean對象的屬性。有兩種用法:
??????????????????????? 可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,不管jsp:useBean找到了一個現有的Bean,還是新建了一個Bean實例,jsp:setProperty都會執行。
??????????????????????? 把jsp:setProperty放入jsp:useBean元素的內部。jsp:setProperty只有在新建Bean實例時才會執行,如果是使用現有實例則不執行jsp:setProperty。
??????????????? jsp:setProperty動作有下面四個屬性:
??????????????????????? name????????? name屬性是必需的。它表示要設置屬性的是哪個Bean。
??????????????????????? property????? property屬性是必需的。它表示要設置哪個屬性。
?????????????????????????????????????????? 有一個特殊用法:如果property的值是"*",表示所有名字和Bean屬性名字匹配的請求參數都將被傳遞給相應的屬性set方法。
??????????????????????? value????????? value 屬性是可選的。該屬性用來指定Bean屬性的值。
?????????????????????????????????????????? 字符串數據會在目標類中通過標準的valueOf方法自動轉換成數字、boolean、Boolean、 byte、Byte、char、Character。
?????????????????????????????????????????? boolean和Boolean類型的屬性值(比如"true")通過 Boolean.valueOf轉換。
?????????????????????????????????????????? int和Integer類型的屬性值(比如"42")通過Integer.valueOf轉換。
?????????????????????????????????????????? value和param不能同時使用,但可以使用其中任意一個。
??????????????????????? param???????? param 是可選的。指定哪個請求參數作為Bean屬性的值。如果當前請求沒有參數,則什么事情也不做,系統不會把null傳遞給Bean屬性的set方法。
?????????????????????????????????????????? 你可以讓Bean自己提供默認屬性值,只有當請求參數明確指定了新值時才修改默認屬性值。
??????? 6)<jsp:getProperty>動作元素
??????????????? jsp:getProperty動作提取指定Bean屬性的值,轉換成字符串,然后輸出。
??????????????? getProperty相關聯的屬性:
??????????????????????? name????????? 要檢索的Bean屬性名稱。Bean必須已定義。
??????????????????????? property????? 表示要提取Bean屬性的值
??????? 7)<jsp:forward> 動作元素
??????????????? jsp:forward動作把請求轉到另外的頁面。jsp:forward標記只有一個屬性page。語法格式:<jsp:forwardpage="相對 URL 地址"/>
??????????????? forward相關聯的屬性:
??????????????????????? page??????? page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,可以是一個JSP頁面或者一個 Java Servlet。
??????? 8)<jsp:plugin>動作元素
??????????????? jsp:plugin動作用來根據瀏覽器的類型,插入通過Java插件 運行Java Applet所必需的OBJECT或EMBED元素。
??????????????? 如果需要的插件不存在,它會下載插件,然后執行Java組件。 Java組件可以是一個applet或一個JavaBean。
??????????????? plugin動作有多個對應HTML元素的屬性用于格式化Java 組件。param元素可用于向Applet 或 Bean 傳遞參數。
??????? 9)<jsp:element> 、 <jsp:attribute>、 <jsp:body>動作元素
??????????????? <jsp:element> 、 <jsp:attribute>、 <jsp:body>動作元素動態定義XML元素。動態是非常重要的,這就意味著XML元素在編譯時是動態生成的而非靜態。
??????? 10)<jsp:text>動作元素
??????????????? <jsp:text>動作元素允許在JSP頁面和文檔中使用寫入文本的模板,語法格式如下:<jsp:text>模板數據</jsp:text>
??????????????? 以上文本模板不能包含其他元素,只能只能包含文本和EL表達式(注:EL表達式將在后續章節中介紹)。
??????????????? 請注意,在XML文件中,您不能使用表達式如 ${whatever > 0},因為>符號是非法的。 你可以使用 ${whatever gt 0}表達式或者嵌入在一個CDATA部分的值。
??????????????? 如果你需要在 XHTML 中聲明 DOCTYPE,必須使用到<jsp:text>動作元素。
7.JSP隱式對象
??????? 1)簡介
??????????????? JSP隱式對象是JSP容器為每個頁面提供的Java對象,開發者可以直接使用它們而不用顯式聲明。JSP隱式對象也被稱為預定義變量。
??????????????? JSP所支持的九大隱式對象:
??????????????????????? request????????? HttpServletRequest類的實例
??????????????????????? response?????? HttpServletResponse類的實例
??????????????????????? out???????????????? PrintWriter類的實例,用于把結果輸出至網頁上
??????????????????????? session????????? HttpSession類的實例
??????????????????????? application???? ServletContext類的實例,與應用上下文有關
??????????????????????? config??????????? ServletConfig類的實例
??????????????????????? pageContext?????? PageContext類的實例,提供對JSP頁面所有對象以及命名空間的訪問
??????????????????????? page????????????? 類似于Java類中的this關鍵字
??????????????????????? Exception??????Exception類的對象,代表發生錯誤的JSP頁面中對應的異常對象
??????? 2)request對象
??????????????? request對象是javax.servlet.http.HttpServletRequest 類的實例。
??????????????? 每當客戶端請求一個JSP頁面時,JSP引擎就會制造一個新的request對象來代表這個請求。
??????????????? request對象提供了一系列方法來獲取HTTP頭信息,cookies,HTTP方法等等。
??????? 3)response對象
??????????????? response對象是javax.servlet.http.HttpServletResponse類的實例。當服務器創建request對象時會同時創建用于響應這個客戶端的response對象。
????????????????response對象也定義了處理HTTP頭模塊的接口。通過這個對象,開發者們可以添加新的cookies,時間戳,HTTP狀態碼等等。
??????? 4)out對象
??????????????? out對象是 javax.servlet.jsp.JspWriter 類的實例,用來在response對象中寫入內容。
??????????????? 最初的JspWriter類對象根據頁面是否有緩存來進行不同的實例化操作。可以在page指令中使用buffered='false'屬性來輕松關閉緩存。
??????????????? JspWriter類包含了大部分java.io.PrintWriter類中的方法。不過,JspWriter新增了一些專為處理緩存而設計的方法。
??????????????? JspWriter類會拋出IOExceptions異常,而PrintWriter不會。
??????????????? 下面列出了我們將會用來輸出boolean,char,int,double,String,object等類型數據的重要方法:
??????????????????????? out.print(dataType dt)????????? 輸出Type類型的值
??????????????????????? out.println(dataType dt)?????? 輸出Type類型的值然后換行
??????????????????????? out.flush()????????????????????????????? 刷新輸出流
??????? 5)session對象
??????????????? session對象是 javax.servlet.http.HttpSession 類的實例。和Java Servlets中的session對象有一樣的行為。session對象用來跟蹤在各個客戶端請求間的會話。
??????? 6)application對象
??????????????? application對象直接包裝了servlet的ServletContext類的對象,是javax.servlet.ServletContext 類的實例。
??????????????? 這個對象在JSP頁面的整個生命周期中都代表著這個JSP頁面。這個對象在JSP頁面初始化時被創建,隨著jspDestroy()方法的調用而被移除。
??????????????? 通過向application中添加屬性,則所有組成您web應用的JSP文件都能訪問到這些屬性。
??????? 7)config對象
??????????????? config對象是 javax.servlet.ServletConfig 類的實例,直接包裝了servlet的ServletConfig類的對象。
??????????????? 這個對象允許開發者訪問Servlet或者JSP引擎的初始化參數,比如文件路徑等。
??????????????? 以下是config對象的使用方法,不是很重要,所以不常用: config.getServletName()
??????????????? 它返回包含在<servlet-name>元素中的servlet名字,注意,<servlet-name>元素在 WEB-INF\web.xml 文件中定義。
??????? 8)pageContext 對象
??????????????? pageContext對象是javax.servlet.jsp.PageContext 類的實例,用來代表整個JSP頁面。這個對象主要用來訪問頁面信息,同時過濾掉大部分實現細節。
??????????????? 這個對象存儲了request對象和response對象的引用。application對象,config對象,session對象,out對象可以通過訪問這個對象的屬性來導出。
??????????????? pageContext對象也包含了傳給JSP頁面的指令信息,包括緩存信息,ErrorPage URL,頁面scope等。
??????????????? 這個類定義了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。
??????????????? 它也提供了40余種方法,有一半繼承自javax.servlet.jsp.JspContext 類。其中一個重要的方法就是removeArribute(),可接受一個或兩個參數。
??????? 9)page 對象
??????????????? 這個對象就是頁面實例的引用。它可以被看做是整個JSP頁面的代表。page 對象就是this對象的同義詞。
??????? 10)exception 對象
??????????????? exception 對象包裝了從先前頁面中拋出的異常信息。它通常被用來產生對出錯條件的適當響應。
8.JSP客戶端請求
??????? 1)簡介
??????????????? 當瀏覽器請求一個網頁時,它會向網絡服務器發送一系列不能被直接讀取的信息,因為這些信息是作為HTTP信息頭的一部分來傳送的。詳細的可以查閱HTTP協議。
??????????????? 下面列出了瀏覽器端信息頭的一些重要內容,在以后的網絡編程中將會經常見到這些信息:
??????????????????????? Accept????????????????????? 指定瀏覽器或其他客戶端可以處理的MIME類型。它的值通常為?image/png?或?image/jpeg
??????????????????????? Accept-Charset??????? 指定瀏覽器要使用的字符集。比如 ISO-8859-1
??????????????????????? Accept-Encoding????? 指定編碼類型。它的值通常為?gzip?或compress
??????????????????????? Accept-Language???? 指定客戶端首選語言,servlet會優先返回以當前語言構成的結果集,如果servlet支持這種語言的話。比如 en,en-us,ru等
??????????????????????? Authorization??????????? 在訪問受密碼保護的網頁時識別不同的用戶
??????????????????????? Connection?????????????? 表明客戶端是否可以處理HTTP持久連接。持久連接允許客戶端或瀏覽器在一個請求中獲取多個文件。Keep-Alive?表示啟用持久連接
??????????????????????? Content-Length????????僅適用于POST請求,表示 POST 數據的字節數
??????????????????????? Cookie????????????????????? 返回先前發送給瀏覽器的cookies至服務器
??????????????????????? Host???????????????????????? 指出原始URL中的主機名和端口號
??????????????????????? If-Modified-Since???? 表明只有當網頁在指定的日期被修改后客戶端才需要這個網頁。 服務器發送304碼給客戶端,表示沒有更新的資源
??????????????????????? If-Unmodified-Since???? 與If-Modified-Since相反, 只有文檔在指定日期后仍未被修改過,操作才會成功
??????????????????????? Referer??????????????????? 標志著所引用頁面的URL。比如,如果你在頁面1,然后點了個鏈接至頁面2,那么頁面1的URL就會包含在瀏覽器請求頁面2的信息頭中
??????????????????????? User-Agent????????????? 用來區分不同瀏覽器或客戶端發送的請求,并對不同類型的瀏覽器返回不同的內容
??????? 2)HttpServletRequest類
??????????????? request對象是javax.servlet.http.HttpServletRequest類的實例。每當客戶端請求一個頁面時,JSP引擎就會產生一個新的對象來代表這個請求。
??????????????? request對象提供了一系列方法來獲取HTTP信息頭,包括表單數據,cookies,HTTP方法等。
??????????????? 在JSP編程中常用的獲取HTTP信息頭的方法:
??????????????????????? Cookie[] getCookies()??????? 返回客戶端所有的Cookie的數組
??????????????????????? Enumeration getAttributeNames()??????? 返回request對象的所有屬性名稱的集合
??????????????????????? Enumeration getHeaderNames()??????? 返回所有HTTP頭的名稱集合
??????????????????????? Enumeration getParameterNames()??????? 返回請求中所有參數的集合
??????????????????????? HttpSession getSession()??????? 返回request對應的session對象,如果沒有,則創建一個
??????????????????????? HttpSession getSession(boolean create)??????? 返回request對應的session對象,如果沒有并且參數create為true,則返回一個新的session對象
??????????????????????? Locale getLocale()??????? 返回當前頁的Locale對象,可以在response中設置
??????????????????????? Object getAttribute(String name)??????? 返回名稱為name的屬性值,如果不存在則返回null。
??????????????????????? ServletInputStream getInputStream()??????? 返回請求的輸入流
??????????????????????? String getAuthType()??????? 返回認證方案的名稱,用來保護servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP沒設置保護措施
??????????????????????? String getCharacterEncoding()??????? 返回request的字符編碼集名稱
??????????????????????? String getContentType()??????? 返回request主體的MIME類型,若未知則返回null
??????????????????????? String getContextPath()??????? 返回request URI中指明的上下文路徑
????????????????????????String getHeader(String name)??????? 返回name指定的信息頭
??????????????????????? String getMethod()??????? 返回此request中的HTTP方法,比如 GET,,POST,或PUT
??????????????????????? String getParameter(String name)??????? 返回此request中name指定的參數,若不存在則返回null
??????????????????????? String getPathInfo()??????? 返回任何額外的與此request URL相關的路徑
??????????????????????? String getProtocol()??????? 返回此request所使用的協議名和版本
??????????????????????? String getQueryString()??????? 返回此 request URL包含的查詢字符串
??????????????????????? String getRemoteAddr()??????? 返回客戶端的IP地址
??????????????????????? String getRemoteHost()??????? 返回客戶端的完整名稱
??????????????????????? String getRemoteUser()??????? 返回客戶端通過登錄認證的用戶,若用戶未認證則返回null
??????????????????????? String getRequestURI()??????? 返回request的URI
??????????????????????? String getRequestedSessionId()??????? 返回request指定的session ID
??????????????????????? String getServletPath()??????? 返回所請求的servlet路徑
??????????????????????? String[] getParameterValues(String name)???????返回指定名稱的參數的所有值,若不存在則返回null
??????????????????????? boolean isSecure()??????? 返回request是否使用了加密通道,比如HTTPS
??????????????????????? int getContentLength()??????? 返回request主體所包含的字節數,若未知的返回-1
??????????????????????? int getIntHeader(String name)??????? 返回指定名稱的request信息頭的值
??????????????????????? int getServerPort()??????? 返回服務器端口號
9.服務器響應
??????? 1)簡介
??????????????? Response響應對象主要將JSP容器處理后的結果傳回到客戶端。可以通過response變量設置HTTP的狀態和向客戶端發送數據,如Cookie、HTTP文件頭信息等。
??????????????? 狀態行包含HTTP版本信息,比如HTTP/1.1,一個狀態碼,比如200,還有一個非常短的信息對應著狀態碼,比如OK。
??????????????? 下面摘要出了HTTP1.1響應頭中最有用的部分,在網絡編程中您將會經常見到它們:
???????????????????????? Allow?????????????? 指定服務器支持的request方法(GET,POST等等)
???????????????????????? Cache-Control??????? 指定響應文檔能夠被安全緩存的情況。通常取值為?public,private?或no-cache?等。
???????????????????????????????????????????????????????? Public意味著文檔可緩存,Private意味著文檔只為單用戶服務并且只能使用私有緩存。No-cache 意味著文檔不被緩存。
?????????????????????????Connection?????????? 命令瀏覽器是否要使用持久的HTTP連接。close值命令瀏覽器不使用持久HTTP連接,而keep-alive 意味著使用持久化連接。
???????????????????????? Content-Disposition??????? 讓瀏覽器要求用戶將響應以給定的名稱存儲在磁盤中
?????????????????????????Content-Encoding??????? 指定傳輸時頁面的編碼規則
???????????????????????? Content-Language??????? 表述文檔所使用的語言,比如en, en-us,,ru等
???????????????????????? Content-Length??????? 表明響應的字節數。只有在瀏覽器使用持久化 (keep-alive) HTTP 連接時才有用
???????????????????????? Content-Type??????? 表明文檔使用的MIME類型
???????????????????????? Expires??????? 指明啥時候過期并從緩存中移除
???????????????????????? Last-Modified??????? 指明文檔最后修改時間。客戶端可以 緩存文檔并且在后續的請求中提供一個?If-Modified-Since請求頭
?????????????????????????Location??????? 在300秒內,包含所有的有一個狀態碼的響應地址,瀏覽器會自動重連然后檢索新文檔
???????????????????????? Refresh??????? 指明瀏覽器每隔多久請求更新一次頁面。
???????????????????????? Retry-After??????? 與503 (Service Unavailable)一起使用來告訴用戶多久后請求將會得到響應
???????????????????????? Set-Cookie??????? 指明當前頁面對應的cookie
??????? 2)HttpServletResponse類
??????????????? response 對象是 javax.servlet.http.HttpServletResponse 類的一個實例。就像服務器會創建request對象一樣,它也會創建一個客戶端響應。
??????????????? response對象定義了處理創建HTTP信息頭的接口。通過使用這個對象,開發者們可以添加新的cookie或時間戳,還有HTTP狀態碼等等。
??????????????? 下面列出了用來設置HTTP響應頭的方法,這些方法由HttpServletResponse 類提供:
??????????????????????? String encodeRedirectURL(String url)??????? 對sendRedirect()方法使用的URL進行編碼
??????????????????????? String encodeURL(String url)??????? 將URL編碼,回傳包含Session ID的URL
????????????????????????boolean containsHeader(String name)??????? 返回指定的響應頭是否存在
??????????????????????? boolean isCommitted()??????? 返回響應是否已經提交到客戶端
??????????????????????? void addCookie(Cookie cookie)??????? 添加指定的cookie至響應中
??????????????????????? void addDateHeader(String name, long date)???????添加指定名稱的響應頭和日期值
??????????????????????? void addHeader(String name, String value)???????添加指定名稱的響應頭和值
??????????????????????? void addIntHeader(String name, int value)???????添加指定名稱的響應頭和int值
??????????????????????? void flushBuffer()??????? 將任何緩存中的內容寫入客戶端
??????????????????????? void reset()??????? 清除任何緩存中的任何數據,包括狀態碼和各種響應頭
??????????????????????? void resetBuffer()??????? 清除基本的緩存數據,不包括響應頭和狀態碼
??????????????????????? void sendError(int sc)??????? 使用指定的狀態碼向客戶端發送一個出錯響應,然后清除緩存
??????????????????????? void sendError(int sc, String msg)??????? 使用指定的狀態碼和消息向客戶端發送一個出錯響應
??????????????????????? void sendRedirect(String location)??????? 使用指定的URL向客戶端發送一個臨時的間接響應
??????????????????????? void setBufferSize(int size)??????? 設置響應體的緩存區大小
??????????????????????? void setCharacterEncoding(String charset)???????指定響應的編碼集(MIME字符集),例如UTF-8
??????????????????????? void setContentLength(int len)??????? 指定HTTP servlets中響應的內容的長度,此方法用來設置 HTTP Content-Length 信息頭
????????????????????????void setContentType(String type)??????? 設置響應的內容的類型,如果響應還未被提交的話
??????????????????????? void setDateHeader(String name, long date)???????使用指定名稱和值設置響應頭的名稱和內容
??????????????????????? void setHeader(String name, String value)???????使用指定名稱和值設置響應頭的名稱和內容
??????????????????????? void setIntHeader(String name, int value)???????使用指定名稱和值設置響應頭的名稱和內容
??????????????????????? void setLocale(Locale loc)??????? 設置響應的語言環境,如果響應尚未被提交的話
????????????????????????void setStatus(int sc)??????? 設置響應的狀態碼
10.JSP HTTP狀態碼
??????? 1)簡介
??????????????? HTTP請求與HTTP響應的格式相近,都有著如下結構:
??????????????????????? 以狀態行+CRLF(回車換行)開始
??????????????????????? 零行或多行頭模塊+CRLF
??????????????????????? 一個空行,比如CRLF
??????????????????????? 可選的消息體比如文件,查詢數據,查詢輸出
??????????????? 狀態行包含HTTP版本,一個狀態碼,和狀態碼相對應的短消息。
????????2)設置HTTP狀態碼的方法
??????????????? 下面列出了HttpServletResponse 類中用來設置狀態碼的方法:
??????????????????????? public void setStatus ( int statusCode )
??????????????????????????????? 此方法可以設置任意的狀態碼。如果您的響應包含一個特殊的狀態碼和一個文檔,請確保在用PrintWriter返回任何內容前調用setStatus方法
??????????????????????? public void sendRedirect(String url)
??????????????????????????????? 此方法產生302響應,同時產生一個?Location?頭告訴URL 一個新的文檔
??????????????????????? public void sendError(int code, String message)
??????????????????????????????? 此方法將一個狀態碼(通常為 404)和一個短消息,自動插入HTML文檔中并發回給客戶端
11.JSP表單處理
??????? 1)簡介
??????????????? 我們在瀏覽網頁的時候,經常需要向服務器提交信息,并讓后臺程序處理。瀏覽器中使用 GET 和 POST 方法向服務器提交數據。
??????? 2)GET 方法
??????????????? GET方法將請求的編碼信息添加在網址后面,網址與編碼信息通過"?"號分隔。例:http://www.runoob.com/hello?key1=value1&key2=value2
??????????????? GET方法是瀏覽器默認傳遞參數的方法,一些敏感信息,如密碼等建議不使用GET方法。
??????????????? 用GET時,傳輸數據的大小有限制 (注意不是參數的個數有限制),最大為1024字節。
??????? 3)POST 方法
??????????????? 一些敏感信息,如密碼等我們可以通過POST方法傳遞,POST提交數據是隱式的。
?????????????? POST提交數據是不可見的,GET是通過在url里面傳遞的(可以看一下你瀏覽器的地址欄)。
?????????????? JSP使用getParameter()來獲得傳遞的參數,getInputStream()方法用來處理客戶端的二進制數據流的請求。
??????? 4)JSP 讀取表單數據
??????????????? getParameter(): 使用 request.getParameter() 方法來獲取表單參數的值。
??????????????? getParameterValues(): 獲得如checkbox類(名字相同,但值有多個)的數據。 接收數組變量 ,如checkbox類型
??????????????? getParameterNames():該方法可以取得所有變量的名稱,該方法返回一個Emumeration。
??????????????? getInputStream():調用此方法來讀取來自客戶端的二進制數據流。
??????? 5)讀取所有表單參數
??????????????? 以下我們將使用 HttpServletRequest 的 getParameterNames() 來讀取所有表單參數,該方法可以取得所有變量的名稱,該方法返回一個枚舉。
??????????????? 一旦我們有了一個 Enumeration(枚舉),我們就可以調用 hasMoreElements() 方法來確定是否還有元素,以及使用nextElement()方法來獲得每個參數的名稱。
12.JSP過濾器
??????? 1)簡介
??????????????? JSP 和 Servlet 中的過濾器都是 Java 類。
??????????????? 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。
??????????????? 可以將一個或多個過濾器附加到一個 Servlet 或一組 Servlet。過濾器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 頁面。
??????????????? 過濾器是可用于 Servlet 編程的 Java 類,可以實現以下目的:
??????????????????????? 在客戶端的請求訪問后端資源之前,攔截這些請求。
??????????????????????? 在服務器的響應發送回客戶端之前,處理這些響應。
??????????????? 根據規范建議的各種類型的過濾器:
??????????????????????? 身份驗證過濾器(Authentication Filters)。
??????????????????????? 數據壓縮過濾器(Data compression Filters)。
??????????????????????? 加密過濾器(Encryption Filters)。
??????????????????????? 觸發資源訪問事件過濾器。
??????????????????????? 圖像轉換過濾器(Image Conversion Filters)。
??????????????????????? 日志記錄和審核過濾器(Logging and Auditing Filters)。
??????????????????????? MIME-TYPE 鏈過濾器(MIME-TYPE Chain Filters)。
??????????????????????? 標記化過濾器(Tokenizing Filters)。
??????????????????????? XSL/T 過濾器(XSL/T Filters),轉換 XML 內容。
??????????????? 過濾器通過 Web 部署描述符(web.xml)中的 XML 標簽來聲明,然后映射到您的應用程序的部署描述符中的 Servlet 名稱或 URL 模式。
??????????????? 當 Web 容器啟動 Web 應用程序時,它會為您在部署描述符中聲明的每一個過濾器創建一個實例。
??????????????? Filter的執行順序與在web.xml配置文件中的配置順序一致,一般把Filter配置在所有的Servlet之前。
??????? 2)Servlet 過濾器方法
??????????????? 過濾器是一個實現了 javax.servlet.Filter 接口的 Java 類。javax.servlet.Filter 接口定義了三個方法:
??????????????????????? public void doFilter (ServletRequest, ServletResponse, FilterChain)
??????????????????????? 該方法完成實際的過濾操作,當客戶端請求方法與過濾器設置匹配的URL時,Servlet容器將先調用過濾器的doFilter方法。FilterChain用戶訪問后續過濾器。
??????????????????????? public void init(FilterConfig filterConfig)
??????????????????????? web 應用程序啟動時,web 服務器將創建Filter 的實例對象,并調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而為后續的用戶請求作好攔截的準備工作(filter對象只會創建一次,init方法也只會執行一次)。開發人員通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。
??????????????????????? public void destroy()
??????????????????????? Servlet容器在銷毀過濾器實例前調用該方法,在該方法中釋放Servlet過濾器占用的資源。
??????? 3)FilterConfig 使用
??????????????? Filter 的 init 方法中提供了一個 FilterConfig 對象。
??????? 4)Web.xml 中的 Servlet 過濾器映射(Servlet Filter Mapping)
??????????????? 定義過濾器,然后映射到一個 URL 或 Servlet,這與定義 Servlet,然后映射到一個 URL 模式方式大致相同。在部署描述符文件web.xml 中創建 filter 標簽。
??????????????? 我們在配置中指定 為/*,那么過濾器適用于所有的 Servlet,如果您只想在少數的 Servlet 上應用過濾器,您可以指定一個特定的 Servlet 路徑。
??????? 5)使用多個過濾器
??????????????? Web 應用程序可以根據特定的目的定義若干個不同的過濾器。
??????? 6)過濾器的應用順序
??????????????? web.xml 中的 filter-mapping 元素的順序決定了 Web 容器應用過濾器到 Servlet 的順序。修改過濾器的順序,需要在 web.xml 文件中修改 filter-mapping 元素順序。
??????? 7)web.xml配置各節點說明
??????????????? <filter>指定一個過濾器。
??????????????????????? <filter-name>用于為過濾器指定一個名字,該元素的內容不能為空。
??????????????????????? <filter-class>元素用于指定過濾器的完整的限定類名。
??????????????????????? <init-param>元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。
??????????????????????? 在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。
??????????????? <filter-mapping>元素用于設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑
??????????????????????? <filter-name>子元素用于設置filter的注冊名稱。該值必須是在<filter>元素中聲明過的過濾器的名字
??????????????????????? <url-pattern>設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
??????????????? <servlet-name>指定過濾器所攔截的Servlet名稱。
??????????????? <dispatcher>指定過濾器所攔截的資源被 Servlet 容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST。用戶可以設置多個<dispatcher>子元素用來指定 Filter 對資源的多種調用方式進行攔截。
??????????????? <dispatcher>子元素可以設置的值及其意義
??????????????????????? REQUEST:當用戶直接訪問頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法訪問時不會調用
??????????????????????? INCLUDE:如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用。
????????????????????????FORWARD:如果目標資源是通過RequestDispatcher的forward()方法訪問時,那么該過濾器將被調用,除此之外,該過濾器不會被調用。
??????????????????????? ERROR:如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。
13.JSP Cookie處理
??????? 1)簡介
??????????????? Cookie是存儲在客戶機的文本文件,它們保存了大量軌跡信息。在servlet技術基礎上,JSP顯然能夠提供對HTTP cookie的支持。
????????????????通常有三個步驟來識別回頭客:
??????????????????????? 服務器腳本發送一系列cookie至瀏覽器。比如名字,年齡,ID號碼等。
??????????????????????? 瀏覽器在本地機中存儲這些信息,以備不時之需。
??????????????????????? 當下一次瀏覽器發送任何請求至服務器時,它會同時將這些cookie信息發送給服務器,然后服務器使用這些信息來識別用戶或者干些其它事情。
??????? 2)Cookie 剖析
??????????????? Cookie通常在HTTP信息頭中設置(雖然JavaScript能夠直接在瀏覽器中設置cookie)。
??????????????? Set-Cookie信息頭包含一個鍵值對,一個GMT(格林尼治標準)時間,一個路徑,一個域名。鍵值對會被編碼為URL。有效期域是個指令,告訴瀏覽器在什么時候可以清除這個cookie。
??????????????? 如果瀏覽器被配置成可存儲cookie,那么它將會保存這些信息直到過期。如果用戶訪問的任何頁面匹配了cookie中的路徑和域名,那么瀏覽器將會重新將這個cookie發回給服務器。
??????????????? JSP腳本通過request對象中的getCookies()方法來訪問這些cookie,這個方法會返回一個Cookie對象的數組。
??????? 3)Servlet Cookie 方法
??????????????? public void setDomain(String pattern)??????? 設置cookie的域名,比如w3cschool.cc
??????????????? public String getDomain()??????? 獲取cookie的域名,比如w3cschool.cc
??????????????? public void setMaxAge(int expiry)??????? 設置cookie有效期,以秒為單位,默認有效期為當前session的存活時間
??????????????? public int getMaxAge()??????? 獲取cookie有效期,以秒為單位,默認為-1 ,表明cookie會活到瀏覽器關閉為止
??????????????? public String getName()??????? 返回 cookie的名稱,名稱創建后將不能被修改
??????????????? public void setValue(String newValue)??????? 設置 cookie的值
??????????????? public String getValue()??????? 獲取cookie的值
??????????????? public void setPath(String uri)??????? 設置cookie 的路徑,默認為當前頁面目錄下的所有URL,還有此目錄下的所有子目錄
??????????????? public String getPath()??????? 獲取cookie 的路徑
??????????????? public void setSecure(boolean flag)??????? 指明cookie是否要加密傳輸
??????????????? public void setComment(String purpose)??????? 設置注釋描述 cookie的目的。當瀏覽器將cookie展現給用戶時,注釋將會變得非常有用
??????????????? public String getComment()??????? 返回描述cookie目的的注釋,若沒有則返回null
??????? 4)使用JSP設置Cookie
??????????????? 創建一個Cookie對象: 調用Cookie的構造函數,使用一個cookie名稱和值做參數,它們都是字符串。 名稱和值中不能包含空格和[]()=," / ? @ : ;字符。
??????????????? 設置有效期:調用setMaxAge()函數表明cookie在多長時間(以秒為單位)內有效。下面的操作將有效期設為了24小時。
??????????????? 將cookie發送至HTTP響應頭中:調用response.addCookie()函數來向HTTP響應頭中添加cookie。
??????? 5)使用 JSP 讀取 Cookie
??????????????? 想要讀取cookie,您就需要調用request.getCookies()方法來獲得一個javax.servlet.http.Cookie對象的數組,然后遍歷這個數組,使用getName()方法和getValue()方法來獲取每一個cookie的名稱和值。
??????? 6)使用JSP刪除Cookie
??????????????? 獲取一個已經存在的cookie然后存儲在Cookie對象中。
??????????????? 將cookie的有效期設置為0。
??????????????? 將這個cookie重新添加進響應頭中。
14.JSP Session
??????? 1)簡介
??????????????? HTTP是無狀態協議,這意味著每次客戶端檢索網頁時,都要單獨打開一個服務器連接,因此服務器不會記錄下先前客戶端請求的任何信息。
??????????????? 有三種方法來維持客戶端與服務器的會話:
??????????????????????? Cookies
??????????????????????????????? 網絡服務器可以指定一個唯一的session ID作為cookie來代表每個客戶端,用來識別這個客戶端接下來的請求。
??????????????????????????????? 這可能不是一種有效的方式,因為很多時候瀏覽器并不一定支持cookie,所以我們不建議使用這種方法來維持會話。
??????????????????????? 隱藏表單域
??????????????????????????????? 一個網絡服務器可以發送一個隱藏的HTML表單域和一個唯一的session ID。例:<inputtype="hidden"name="sessionid"value="12345">,
這個條目意味著,當表單被提交時,指定的名稱和值將會自動包含在GET或POST數據中。每當瀏覽器發送一個請求,session_id的值就可以用來保存不同瀏覽器的軌跡。
這種方式可能是一種有效的方式,但點擊<A HREF>標簽中的超鏈接時不會產生表單提交事件,因此隱藏表單域也不支持通用會話跟蹤。
??????????????????????? 重寫URL
??????????????????????????????? 您可以在每個URL后面添加一些額外的數據來區分會話,服務器能夠根據這些數據來關聯session標識符。舉例來說,http://w3cschool.cc/file.htm;sessionid=12345, session標識符為sessionid=12345,服務器可以用這個數據來識別客戶端。相比而言,重寫URL是更好的方式來,就算瀏覽器不支持cookies也能工作,但缺點是您必須為每個URL動態指定session ID,就算這是個簡單的HTML頁面。
??????? 2)session對象
??????????????? JSP利用servlet提供的HttpSession接口來識別一個用戶,存儲這個用戶的所有訪問信息。默認情況下,JSP允許會話跟蹤,一個新的HttpSession對象將會自動地為新的客戶端實例化。禁止會話跟蹤需要顯式地關掉它,通過將page指令中session屬性值設為false來實現,例:<%@ page session="false" %>
????????????????JSP引擎將隱含的session對象暴露給開發者。由于提供了session對象,開發者就可以方便地存儲或檢索數據。列出了session對象的一些重要方法:
??????????????????????? public Object getAttribute(String name)???????返回session對象中與指定名稱綁定的對象,如果不存在則返回null
??????????????????????? public Enumeration getAttributeNames()??????? 返回session對象中所有的對象名稱
??????????????????????? public long getCreationTime()??????? 返回session對象被創建的時間, 以毫秒為單位,從1970年1月1號凌晨開始算起
??????????????????????? public String getId()??????? 返回session對象的ID
??????????????????????? public long getLastAccessedTime()??????? 返回客戶端最后訪問的時間,以毫秒為單位,從1970年1月1號凌晨開始算起
??????????????????????? public int getMaxInactiveInterval()??????? 返回最大時間間隔,以秒為單位,servlet 容器將會在這段時間內保持會話打開
??????????????????????? public void invalidate()??????? 將session無效化,解綁任何與該session綁定的對象
??????????????????????? public boolean isNew()??????? 返回是否為一個新的客戶端,或者客戶端是否拒絕加入session
??????????????????????? public void removeAttribute(String name)???????移除session中指定名稱的對象
??????????????????????? public void setAttribute(String name, Object value)????????使用指定的名稱和值來產生一個對象并綁定到session中
??????????????????????? public void setMaxInactiveInterval(int interval)???????用來指定時間,以秒為單位,servlet容器將會在這段時間內保持會話有效
??????? 3)刪除Session數據
??????????????? 當處理完一個用戶的會話數據后,您可以有如下選擇:
??????????????????????? 移除一個特定的屬性:調用public void removeAttribute(String name)? 方法來移除指定的屬性。
??????????????????????? 刪除整個會話:調用public void invalidate() 方法來使整個session無效。
??????????????????????? 設置會話有效期:調用 public void setMaxInactiveInterval(int interval)? 方法來設置session超時。
??????????????????????? 登出用戶:支持servlet2.4版本的服務器,可以調用 logout()方法來登出用戶,并且使所有相關的session無效。
??????????????????????? 配置web.xml文件:如果使用的是Tomcat,可以向下面這樣配置web.xml文件:
??????????????????????????????? <session-config><session-timeout>15</session-timeout>
??????????????????????????????? </session-config>超時以分鐘為單位,Tomcat中的默認的超時時間是30分鐘。
??????????????????????? Servlet中的getMaxInactiveInterval( ) 方法以秒為單位返回超時時間。如果在web.xml中配置的是15分鐘,則getMaxInactiveInterval( ) 方法將會返回900。
15.JSP文件上傳
??????? 1)簡介
??????????????? JSP 可以與 HTML form 標簽一起使用,來允許用戶上傳文件到服務器。上傳的文件可以是文本文件或圖像文件或任何文檔。
??????????????? 本章節我們使用 Servlet 來處理文件上傳,使用到的文件有:
??????????????????????? upload.jsp : 文件上傳表單。
??????????????????????? message.jsp : 上傳成功后跳轉頁面。
??????????????????????? UploadServlet.java : 上傳處理 Servlet。
??????????????????????? 需要引入的 jar 文件:commons-fileupload-1.3.2、commons-io-2.5.jar。
??????? 2)創建一個文件上傳表單
??????????????? 下面的 HTML 代碼創建了一個文件上傳表單。以下幾點需要注意:
??????????????????????? 表單 method 屬性應該設置為 POST 方法,不能使用 GET 方法。
??????????????????????? 表單 enctype 屬性應該設置為 multipart/form-data.
??????????????????????? 表單 action 屬性應該設置為在后端服務器上處理文件上傳的 Servlet 文件。下面的實例使用了UploadServlet Servlet 來上傳文件。
??????????????????????? 上傳單個文件,您應該使用單個帶有屬性 type="file" 的 <input .../> 標簽。
??????????????????????? 多個文件上傳,包含多個 name 屬性值不同的 input 標簽。輸入標簽具有不同的名稱屬性的值。瀏覽器會為每個 input 標簽關聯一個瀏覽按鈕。
16.日期處理
??????? 1)簡介
??????????????? 使用JSP最重要的優勢之一,就是可以使用所有Java ?API。本章將會詳細地講述Java中的Date類,它在java.util包下,封裝了當前日期和時間。
??????????????? Date類有兩個構造函數。第一個構造函數使用當前日期和時間來初始化對象。Date()
??????????????? 第二個構造函數接受一個參數,這個參數表示從1970年1月1日凌晨至所要表示時間的毫秒數。Date(long millisec)
??????? 2)處理方法
??????????????? boolean after(Date date)??????? 如果比給定的日期晚,則返回true,否則返回false
??????????????? boolean before(Date date)??????? 如果比給定的日期早,則返回true,否則返回false??????
| ? | ????????????? Object clone( )??????? 獲取當前對象的一個副本 |
??????????????? int compareTo(Date date)??????? 如果與給定日期相等,則返回0,如果比給定日期早,則返回一個負數,如果比給定日期晚,則返回一個正數
??????????????? int compareTo(Object obj)??????? 與 compareTo(Date) 方法相同,如果 obj 不是Date類或其子類的對象,拋出ClassCastException異常
??????????????? boolean equals(Object date)??????? 如果與給定日期相同,則返回true,否則返回false
??????????????? long getTime( )??????? 返回從1970年1月1日凌晨至此對象所表示時間的毫秒數
??????????????? int hashCode( )??????? 返回此對象的哈希碼
??????????????? void setTime(long time)??????? 使用給定參數設置時間和日期,參數time表示從1970年1月1日凌晨至time所經過的毫秒數
??????????????? String toString( )??????? 將此對象轉換為字符串并返回這個字符串
??????? 3)日期比較
??????????????? 就像我在開頭所提到的,您可以在JSP腳本中使用任何Java方法。如果您想要比較兩個日期,可以參照下面的方法來做:
??????????????????????? 使用getTime()方法得到毫秒數,然后比較毫秒數就行了。
??????????????????????? 使用before(),after(),equals()方法。比如,new Date(99,2,12).before(new Date(99,2,18))返回true。
??????????????????????? 使用compareTo()方法,這個方法在Comparable接口中定義,在Date中實現。
??????? 4)使用SimpleDateFormat格式化日期
??????????????? SimpleDateFormat使用一種地區敏感的方式來格式化和解析日期,它允許您使用自定義的模式來格式化日期和時間。
??????? 5)SimpleDateFormat格式碼
??????????????? G:時代標識符;y:4位數年份;M:月;d:日;h:12小時制, A.M./P.M. (1~12);H:24小時制;m:分鐘;s:秒;S:毫秒;E:星期;D:一年中的某天;F:一個月中某星期的某天;w:一年中的某星期;W:一個月中的某星期;a:A.M./P.M. 標記;k:一天中的某個小時 (1~24);K:一天中的某個小時,A.M./P.M. (0~11);z:時區;':文本分隔;":單引號
17.JSP頁面重定向
??????? 1)簡介
??????????????? 當需要將文檔移動到一個新的位置時,就需要使用JSP重定向了。
??????????????? 最簡單的重定向方式就是使用response對象的sendRedirect()方法。這個方法的簽名如下:public void response.sendRedirect(String location)throws IOException
??????????????? 這個方法將狀態碼和新的頁面位置作為響應發回給瀏覽器。您也可以使用setStatus()和setHeader()方法來得到同樣的效果:
??????????????????????? String site = "http://www.runoob.com" ;response.setStatus(response.SC_MOVED_TEMPORARILY);response.setHeader("Location", site);
18.JSP點擊量統計
??????? 1)簡介
??????????????? 有時候我們需要知道某個頁面被訪問的次數,這時我們就需要在頁面上添加頁面統計器,頁面訪問的統計一般在用戶第一次載入時累加該頁面的訪問數上。
??????????????? 要實現一個計數器,您可以利用應用程序隱式對象和相關方法getAttribute()和setAttribute()來實現。
??????????????? 這個對象表示JSP頁面的整個生命周期中。當JSP頁面初始化時創建此對象,當JSP頁面調用jspDestroy()時刪除該對象。
??????????????? 在應用中創建變量的語法:application.setAttribute(String Key, Object Value);
??????????????? 讀取該變量的方法如下:application.getAttribute(String Key);
??????????????? 在頁面每次被訪問時,你可以讀取計數器的當前值,并遞增1,然后重新設置,在下一個用戶訪問時就將新的值顯示在頁面上。
??????? 2)復位計數器
??????????????? 使用以上方法,在 web 服務器重啟后,計數器會被復位為 0,即前面保留的數據都會消失,你可以使用以下幾種方式解決該問題:
??????????????????????? 在數據庫中定義一個用于統計網頁訪問量的數據表 count,字段為 hitcount,hitcount 默認值為0,將統計數據寫入到數據表中。
??????????????????????? 在每次訪問時我們讀取表中 hitcount 字段。
??????????????????????? 每次訪問時讓 hitcount 自增 1。
??????????????????????? 在頁面上顯示新的 hitcount 值作為頁面的訪問量。
??????????????????????? 如果你需要統計每個頁面的訪問量,你可以使用以上邏輯將代碼添加到所有頁面上。
19.JSP自動刷新
??????? 1)簡介
??????????????? 想象一下,如果要直播比賽的比分,或股票市場的實時狀態,或當前的外匯配給,該怎么實現呢?顯然,要實現這種實時功能,您就不得不規律性地刷新頁面。
??????????????? JSP提供了一種機制來使這種工作變得簡單,它能夠定時地自動刷新頁面。
????????????????刷新一個頁面最簡單的方式就是使用response對象的setIntHeader()方法。這個方法的簽名如下: public void setIntHeader(String header, int headerValue)
??????????????? 這個方法通知瀏覽器在給定的時間后刷新,時間以秒為單位。
20.JSP發送郵件
??????? 1)簡介
??????????????? 雖然使用JSP實現郵件發送功能很簡單,但是需要有JavaMail API,并且需要安裝JavaBean Activation Framework。
????????????????下載并解壓這些文件,在根目錄下,您將會看到一系列jar包。將mail.jar包和activation.jar包加入CLASSPATH變量中。
總結
- 上一篇: 工作182:表格渲染
- 下一篇: 前端学习(2700):重读vue电商网站