jsp(Java Server Pages)技術(shù)
簡(jiǎn)介
JSP是一種建立在Servlet規(guī)范功能之上的動(dòng)態(tài)網(wǎng)頁技術(shù)。也就是在網(wǎng)頁文件中嵌入java代碼和JSP標(biāo)記陕见,用于產(chǎn)生動(dòng)態(tài)內(nèi)容泣侮。 JSP文件在用戶第一次請(qǐng)求時(shí)即彪,會(huì)被編譯成Servlet,然后由這個(gè)Servlet處理用戶的請(qǐng)求活尊。
JSP的運(yùn)行機(jī)制
-
JSP容器管理JSP頁面生命周期的兩個(gè)階段:
- 翻譯階段:
當(dāng)有一個(gè)對(duì)JSP頁面的客戶請(qǐng)求到來時(shí)隶校,JSP容器檢驗(yàn)JSP頁面的語法是否正確,將JSP頁面轉(zhuǎn)換為Servlet
源文件 jsp--->java - 編譯階段:
調(diào)用javac工具類編譯將Servlet源文件生成字節(jié)碼文件蛹锰。 java->class
執(zhí)行階段:
Servlet容器加載轉(zhuǎn)換后的Servlet類深胳,實(shí)例化一個(gè)對(duì)象處理客戶端的請(qǐng)求,在請(qǐng)求處理完成后铜犬,響應(yīng)對(duì)象被JSP容器接受舞终,容器將HTML格式的響應(yīng)信息發(fā)送到客戶端。 調(diào)用_jspService()
- 翻譯階段:
第一次加載JSP頁面時(shí)癣猾,因?yàn)橐獙SP文件轉(zhuǎn)換為Servlet類敛劝,響應(yīng)速度較慢,再次請(qǐng)求時(shí)纷宇,JSP容器就會(huì)直接執(zhí)行第一次請(qǐng)求時(shí)產(chǎn)生的Servlet攘蔽,不會(huì)重新轉(zhuǎn)換JSP文件,在JSP執(zhí)行期間呐粘,JSP容器會(huì)檢查JSP文件满俗,看是否有更新或修改,如果有作岖,JSP容器會(huì)再次編譯JSP或者Servlet唆垃,如果沒有更新或者修改,直接執(zhí)行前面產(chǎn)生的Servlet.
-
JSP頁面轉(zhuǎn)換后的Servlet類必須實(shí)現(xiàn)javax.servlet.jsp.JspPage接口痘儡,絕大多數(shù)情況下辕万,JSP頁面都使用HTTP協(xié)議,所以在JSP頁面轉(zhuǎn)換后的Servlet類必須實(shí)現(xiàn)javax.servlet.jsp.HttpJspPage接口,該接口繼承自JspPage接口渐尿。
_jspService(HttpServletRequest request, HttpServletResponse response); 該方法用來處理業(yè)務(wù)邏輯醉途。
JSP語法
一個(gè)JSP頁面由元素和模板數(shù)據(jù)組成,元素是必須由JSP容器處理砖茸。元素有三種類型
指令元素隘擎,腳本元素,動(dòng)作元素凉夯。
-
腳本元素 :嵌套寫java代碼
-
聲明(Declaration) (聲明各種變量货葬,方法和內(nèi)部類看生成的結(jié)果)
- 語法: <%!聲明的內(nèi)容%>
- 作用: 在servlet中聲明一些成員變量、成員方法和內(nèi)部類
- 特點(diǎn): 聲明被翻譯進(jìn)servlet后變成了成員變量劲够、成員方法和內(nèi)部類
- 注意: 不能使用表達(dá)式和隱含對(duì)象
-
表達(dá)式(Expression)
語法: <%=expression%>
作用: 將expression輸出到out(輸出流)中震桶,
expression可以是算術(shù)、邏輯征绎、常量蹲姐、 關(guān)系表達(dá)式、變量人柿、有返回值的方法淤堵、jsp中的9種隱含對(duì)象。
-
9種隱含對(duì)象:
- page:當(dāng)前的jsp頁面顷扩,指針this
- pageContext:當(dāng)前的jsp頁面的上下文
- request:封裝請(qǐng)求的信息
- response:封裝響應(yīng)
- session:會(huì)話
- application:指web應(yīng)用
- out:輸出流
- config:配置信息
- exception:異常信息。當(dāng)isErrorPage=true時(shí)慰毅,才可以使用該對(duì)象
特點(diǎn): 表達(dá)式翻譯進(jìn)servlet后變成了out.print(expression),該代碼處于_jspService()方法中隘截。
注意: expression都一律被轉(zhuǎn)換成字符串后再寫到輸出流out(JspWriter)中。另外汹胃,expression中不能有分號(hào)(;)婶芭。
-
腳本(Scriptlet)
* 語法: <%java code%>
* 作用: 在jsp中嵌入java代碼,不能嵌入成員變量着饥、成員方法犀农。所以在此模塊申明的變量為局部變量。任何邏輯的代碼都可以放在腳本標(biāo)簽中宰掉。如for循環(huán),匿名內(nèi)部類,連接數(shù)據(jù)庫,創(chuàng)建對(duì)象等- 特點(diǎn): 腳本被翻譯進(jìn)servlet的_jspService()方法中呵哨。
-
-
指令元素:指令主要用來提供整個(gè)
JSP網(wǎng)頁相關(guān)的信息,并且用來設(shè)定JSP頁面的相關(guān)屬性-
page指令
語法: <%@ page attributeName="attribuerValue"...%>
作用: 利用page指令中的屬性可以和容器進(jìn)行通信轨奄,這些屬性的設(shè)置孟害,對(duì)整個(gè)jsp都有影響。
-
page指令中的屬性:
- language="java"
定義當(dāng)前頁面使用的編程語言挪拟,目前只能是java - contentType="text/html;charset=UTF-8"
定義response中的內(nèi)容類型和編碼格式和jsp頁面的編碼格式挨务,翻譯后變成response.setContentType("text/html;charset=UTF-8")。 - pageEncoding="UTF-8"
定義當(dāng)前jsp頁面的編碼格式 - isErrorPage="true|false" 默認(rèn)為false
表明當(dāng)前的頁面是否為其它頁面的errorPage目標(biāo),如果設(shè)置為true谎柄,則可以使用exception對(duì)象丁侄。反之,如果設(shè)置為false朝巫,則不可以使用exception對(duì)象 - errorPage="error.jsp"
默認(rèn)忽略,定義此頁面出現(xiàn)異常時(shí)調(diào)用的頁面 - import="package.class,package2.class2"
和一般的java import意義一樣鸿摇,用","來隔開 - session="true|false" 默認(rèn)為true
指定這個(gè)jsp中是否可以使用session - buffer="none|8kb|sizekb" 默認(rèn)為8kb
指定到客戶端輸出流的緩沖模式,如果是none則不緩沖捍歪,如果指定數(shù)值户辱,那么輸出就用不小于這個(gè)值的緩沖區(qū)進(jìn)行緩沖。 - autoFlush="true|false" 默認(rèn)為true
true 當(dāng)緩沖區(qū)滿時(shí)糙臼,到客戶端的輸出被刷新
false 當(dāng)緩沖區(qū)滿時(shí)庐镐,出現(xiàn)運(yùn)行異常,表示緩沖溢出 - isThreadSafe="true|false" 默認(rèn)為true
用來設(shè)置jsp文件是否能支持多線程的使用变逃。如為true必逆,那么一個(gè)jsp能夠同時(shí)處理多個(gè)用戶的請(qǐng)求,反之揽乱,一個(gè)jsp只能一次處理一個(gè)請(qǐng)求名眉。 - info="text"
關(guān)于jsp頁面的信息,定義一個(gè)字符串凰棉,可以使用getServletInfo()獲得
l2. extends="package.class"
指定jsp對(duì)應(yīng)的servlet類繼承某個(gè)父類 - isELIgnored="true|false"
指定EL表達(dá)式語言是否被忽略损拢,如為true則忽略,反之可以使用EL撒犀。
- language="java"
-
include指令
- 語法: <%@ include file="url"%>福压,稱為靜態(tài)導(dǎo)入(靜態(tài)包含)
作用: 在一個(gè)頁面中導(dǎo)入另一個(gè)頁面的內(nèi)容(這些內(nèi)容一般不會(huì)有變化,如公司的標(biāo)題和版權(quán)等信息)或舞。
特點(diǎn): 在jsp翻譯成servlet后就將被導(dǎo)入的頁面內(nèi)容嵌入到servlet中荆姆。導(dǎo)入時(shí)間發(fā)生在翻譯階段。被導(dǎo)入的資源:html映凳、xml胆筒、jsp等
優(yōu)點(diǎn): 執(zhí)行效率高(只翻譯一次)
-
缺點(diǎn): 當(dāng)被導(dǎo)入頁面的內(nèi)容發(fā)生變化,那么jsp必須要重新被翻譯诈豌。如果導(dǎo)入的多個(gè)頁面仆救,其中的一個(gè)頁面的內(nèi)容發(fā)生變化,就需要將所有的頁面都翻譯一次矫渔。
static { _jspx_dependants = new java.util.ArrayList(1); _jspx_dependants.add("/day10/static.jsp"); }
- 語法: <%@ include file="url"%>福压,稱為靜態(tài)導(dǎo)入(靜態(tài)包含)
taglib指令
<%@ taglib uri="" prefix=""%>
例如: 導(dǎo)入jstl標(biāo)簽庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
指定在jsp中要使用的標(biāo)簽庫描述文件(*.tld)的路徑
-
動(dòng)作元素(jsp自帶的標(biāo)準(zhǔn)標(biāo)簽)
語法: <jsp:tagName/>
- 動(dòng)態(tài)導(dǎo)入(動(dòng)態(tài)包含)
語法:
<jsp:include page="url" flush="true|false"/>
或者
<jsp:include page="url" flush="true|false">
{<jsp:param …/>}*
</jsp:include>特點(diǎn): 動(dòng)態(tài)導(dǎo)入發(fā)生在執(zhí)行階段派桩,也就是在運(yùn)行serlvet的時(shí)候才動(dòng)態(tài)生成被導(dǎo)入頁面的內(nèi)容,然后嵌入到調(diào)用頁面蚌斩,最后將兩個(gè)頁面的內(nèi)容一起铆惑,返回給客戶端范嘱。
注意: 在翻譯階段并沒有生成被導(dǎo)入頁面的內(nèi)容。沒有跳轉(zhuǎn)员魏,請(qǐng)求還是同一個(gè)缺點(diǎn): 執(zhí)行效率沒有靜態(tài)導(dǎo)入高
-
優(yōu)點(diǎn): 如果被導(dǎo)入頁面的內(nèi)容發(fā)生變化丑蛤,調(diào)用頁面不必重新翻譯。
_jspService(){ org.apache.jasper.runtime.JspRuntimeLibrary .include(request, response, "dynamic.jsp", out, false); }
JSP隱含對(duì)象
JSP容器生成的Servlet類的_jspService()方法中撕阎,定義的幾個(gè)對(duì)象我們可以在編寫JSP頁面時(shí)使用的隱含對(duì)象受裹。page: 當(dāng)前的jsp頁面,指針this
pageContext: 當(dāng)前的jsp頁面的上下文
request: 封裝請(qǐng)求的信息
response: 封裝響應(yīng)
session: 會(huì)話
application: 指web應(yīng)用
out: 輸出流
config: 配置信息
exception: 異常信息
其中pageContext 對(duì)象提供了以下方法:
訪問其他隱含對(duì)象的方法
- getRequest()
- getResponse()
- getSession()
- getServletContext()
- JspWriter getOut()
- getServletConfig()
- Object getPage()
- Exception getException()
還可以用來保存屬性虏束,但是只能在當(dāng)前頁面中獲取
- setAttribute(String name,Object val);
- Object getAttribute(String name);
還可以設(shè)置和得到其他范圍對(duì)象中保存的屬性
setAttribute(String name,Object val,int scope);
Object getAttribute(String name,int scope);
removeAttribute(String name,int scope)
刪除指定范圍內(nèi)名字為name的屬性removeAttribute(String name)
刪除所有范圍內(nèi)名字為name的屬性findAttribute(String name)
該方法會(huì)按照page,request,session,application范圍順序搜索指定名字的屬性棉饶。PageContext.PAGE_SCOPE 頁面范圍
PageContext.REQUEST_SCOPE 請(qǐng)求范圍
PageContext.SESSION_SCOPE 會(huì)話范圍
PageContext.APPLICATION_SCOPE 應(yīng)用程序范圍
exception
對(duì)象表示了JSP頁面運(yùn)行時(shí)產(chǎn)生的異常,該對(duì)象只有在錯(cuò)誤頁面(page指令中指定isErrorPage=true的頁面)中才可以使用镇匀。當(dāng)JSP頁面運(yùn)行發(fā)生錯(cuò)誤時(shí),JSP容器會(huì)自動(dòng)調(diào)用指定的錯(cuò)誤處理頁面照藻,如果JSP頁面使用errorPage屬性定義了錯(cuò)誤頁面,那么在web.xml文件中定義的任何錯(cuò)誤頁面將不會(huì)被使用
對(duì)象和范圍
在JSP中汗侵,有4中范圍
- page范圍:
具有page范圍的對(duì)象被綁定到j(luò)avax.servlet.jsp.PageContext對(duì)象中幸缕,在這個(gè)范圍中的對(duì)象,只能在創(chuàng)建對(duì)象的頁面中訪問晰韵。page范圍內(nèi)的對(duì)象发乔,在客戶端每次請(qǐng)求JSP頁面時(shí)創(chuàng)建,在頁面向客戶端發(fā)送回響應(yīng)或請(qǐng)求被轉(zhuǎn)發(fā)到其他資源后被刪除雪猪。 - request范圍
具有request范圍的對(duì)象被綁定到j(luò)avax.servlet.http.HttpServletRequest對(duì)象中栏尚。在調(diào)用forward()方法轉(zhuǎn)向的頁面或調(diào)用include()方法包含的頁面中,都可以訪問這個(gè)范圍內(nèi)的對(duì)象只恨。 - session范圍
具有session返回的對(duì)象被綁定到j(luò)avax.servlet.http.HttpSession對(duì)象中译仗,JSP容器為每次會(huì)話,創(chuàng)建一個(gè)HttpSession對(duì)象坤次,在會(huì)話期間,可以訪問session范圍內(nèi)的數(shù)據(jù) - application范圍
具有application范圍的對(duì)象被綁定到j(luò)avax.servlet.ServletContext中斥赋,在web應(yīng)用程序運(yùn)行期間缰猴,所有頁面都可以訪問這個(gè)范圍內(nèi)的對(duì)象