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