前面講了servlet入門實(shí)踐現(xiàn)在開(kāi)始介紹jsp入門實(shí)踐,開(kāi)發(fā)環(huán)境的搭建請(qǐng)參考我前面的tomcat的文章,jsp入門教程分為上下兩部分,第一部分簡(jiǎn)單講解:jsp語(yǔ)法的規(guī)范,以及三大編譯指令,七個(gè)動(dòng)作指令和九大內(nèi)置對(duì)象,生命周期講解等。
全部代碼下載:鏈接
1.jsp簡(jiǎn)介:
JSP全名為Java Server Pages,中文名叫java服務(wù)器頁(yè)面,其根本是一個(gè)簡(jiǎn)化的Servlet設(shè)計(jì),它[1] 是由Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點(diǎn)類似ASP技術(shù),它是在傳統(tǒng)的網(wǎng)頁(yè)HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件,后綴名為(*.jsp)。 用JSP開(kāi)發(fā)的Web應(yīng)用是跨平臺(tái)的,既能在Linux下運(yùn)行,也能在其他操作系統(tǒng)上運(yùn)行。
第一個(gè)jsp程序:
- 在eclipse中建立動(dòng)態(tài)web工程
- 在WebContent上右擊建立jsp文件
- 在jsp文件中輸入如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print("hello peace");
%>
</body>
</html>
- 在瀏覽器中輸入如下:http://localhost:8080/工程名/NewFile.jsp
顯示如下:
01 -
JSP作為servlet的變體,jsp的文件會(huì)被翻譯成servlet文件:文件位置為Tomcat按住給你目錄:apache-tomcat-7.0.64/work/Catalina/localhost/stuJsp/org/apache/jsp
02
打開(kāi)java文件可以看到該文件根servlet的文件類似:有_jspInit(),jspDestroy(),_jspService()方法。并將jsp文件中的代碼生成了_jspService()方法中的代碼
03
2.JSP語(yǔ)法:
2.1.JSP腳本:
腳本程序,就是為了在HTML中穿插java代碼,可以包含任意語(yǔ)法真確的java語(yǔ)句,變量,方法或表達(dá)式。生成servlet源碼時(shí)該處的代碼被放到_jspService()方法中
- 腳本程序的語(yǔ)法:
<% 代碼片段 %>
就像第一個(gè)jsp程序那樣
<%
out.print("hello peace");
%>
- 注意:腳本中不能出現(xiàn)標(biāo)簽和jsp元素,記住只能寫java就行;但是可以穿插寫:如下:
<%
for(int i=0;i<5;i++)
{
out.print("hello peace"+i);
%>
<br/>
<%
out.print("換行符穿插在中間了,一樣會(huì)被循環(huán)輸出");
}//for循環(huán)結(jié)束
%>
2.2.JSP聲明:
一個(gè)聲明語(yǔ)句可以聲明一個(gè)或多個(gè)變量、方法,供后面的Java代碼使用。在JSP文件中,您必須先聲明這些變量和方法然后才能使用它們。生成servlet源碼時(shí)該處的代碼成為類的屬性和方法;
- JSP聲明的語(yǔ)法:
<%! declaration; [ declaration; ]+ ... %> - 演示如下:
<%! private int i=10; %>
<%!
public void test(){
int a=0;
int b=2;
a=a+b;
System.out.print(a);
}
%>
- 查看生成的servlet文件可以知道剛才在jsp聲明的變量和方法,成為了相應(yīng)的屬性和方法
2.3JSP表達(dá)式:
一個(gè)JSP表達(dá)式中包含的腳本語(yǔ)言表達(dá)式,先被轉(zhuǎn)化成String,然后插入到表達(dá)式出現(xiàn)的地方,作用相當(dāng)于腳本中的out(輸出)
由于表達(dá)式的值會(huì)被轉(zhuǎn)化成String,所以您可以在一個(gè)文本行中使用表達(dá)式而不用去管它是否是HTML標(biāo)簽。
表達(dá)式元素中可以包含任何符合Java語(yǔ)言規(guī)范的表達(dá)式,但是不能使用分號(hào)來(lái)結(jié)束表達(dá)式。
生成servlet源碼時(shí)該處的代碼被放到_jspService()方法中
- JSP表達(dá)式的語(yǔ)法格式
<%= 表達(dá)式 %> - 演示如下:
<%--在腳本處聲明的變量是局部變量不能帶有修飾符 --%>
<%
String nick="sisi";
int a=10,b=10;
%>
3.jsp表達(dá)式:<br/>
<%--表達(dá)式可以輸出相當(dāng)于out.write 不需要分號(hào)結(jié)束--%>
<%=(a-b) %>
<%=nick %>
<hr/>
2.4JSP注釋:
JSP注釋不會(huì)出現(xiàn)在html的源碼中 可以用來(lái)注釋jsp的代碼,html注釋會(huì)出現(xiàn)在html的源碼中;
- JSP注釋的語(yǔ)法格式:
<%-- 這里可以填寫 JSP 注釋 --%> - 演示如下:
1.jsp注釋:<br/>
<%-- 這些注釋不會(huì)出現(xiàn)在html的源碼中 可以用來(lái)注釋jsp的代碼--%>
3.三大編譯指令:
JSP編譯指令用來(lái)設(shè)置與整個(gè)JSP頁(yè)面相關(guān)的屬性;
主要有三大編譯指令:
<%@ page ... %> 定義頁(yè)面的依賴屬性,比如腳本語(yǔ)言、error頁(yè)面、緩存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入標(biāo)簽庫(kù)的定義,可以是自定義標(biāo)簽
3.1page指令介紹:
Page指令為容器提供當(dāng)前頁(yè)面的使用說(shuō)明。一個(gè)JSP頁(yè)面可以包含多個(gè)page指令。
- Page指令的語(yǔ)法格式:
<%@ page attribute="value" %> -
屬性:
04 - 演示如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.Random"%>
3.2include指令介紹:(靜態(tài)包含)
JSP可以通過(guò)include指令來(lái)包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會(huì)被同時(shí)編譯執(zhí)行。
- Include指令的語(yǔ)法格式如下:
<%@ include file="url" %> - Include指令中的文件名實(shí)際上是一個(gè)相對(duì)的URL。如果您沒(méi)有給文件關(guān)聯(lián)一個(gè)路徑,JSP編譯器默認(rèn)在當(dāng)前路徑下尋找。
- 演示如下:
<%-- 1.原理是把被包含的頁(yè)面(header.jsp)
的內(nèi)容翻譯到包含頁(yè)面(index.jsp)中,合并成翻譯成一個(gè)java源文件,
再編譯運(yùn)行?。?,這種包含叫靜態(tài)包含(源碼包含)
2.被包含頁(yè)面中不需要出現(xiàn)全局的html標(biāo)簽了!??!
(如html、head、body)--%>
<%@include file="/common/header.jsp"%>
3.3taglib指令介紹:
JSP API允許用戶自定義標(biāo)簽,一個(gè)自定義標(biāo)簽庫(kù)就是自定義標(biāo)簽的集合。Taglib指令引入一個(gè)自定義標(biāo)簽集合的定義,包括庫(kù)路徑、自定義標(biāo)簽。
- taglib指令的語(yǔ)法:
<%@ taglib uri="uri" prefix="prefixOfTag" %> - uri為屬性確定的標(biāo)簽位置,prefix屬性指定標(biāo)簽庫(kù)的前綴。此處后面會(huì)進(jìn)一步介紹;
- 演示如下:
自己定義的標(biāo)簽庫(kù)
<%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
4.七大動(dòng)作指令介紹:
動(dòng)作指令與編譯指令不同,編譯指令時(shí)通知servlet引擎的處理消息,而動(dòng)作指令只是運(yùn)行時(shí)的動(dòng)作。編譯指令在將JSP編譯成Servlet時(shí)起作用,而處理指令通常可替換成JSP腳本,它只是JSP腳本的標(biāo)準(zhǔn)化寫法。
(1)JSP:forward 執(zhí)行頁(yè)面轉(zhuǎn)向,將請(qǐng)求的處理轉(zhuǎn)發(fā)到下一個(gè)頁(yè)面。
(2)JSP:param 用于傳遞參數(shù),必須與其他支持參數(shù)的標(biāo)簽一起使用
(3)JSP:include 用于動(dòng)態(tài)引入一個(gè)JSP頁(yè)面
(4)JSP:plugin 用于下載JavaBean或者Applet到客戶端執(zhí)行
(5) JSP:useBean 創(chuàng)建一個(gè)Javabean實(shí)例
(6) JSP:setProperty 設(shè)置JavaBean實(shí)例的屬性值
(7)JSP:getProperty 獲取JavaBean實(shí)例的屬性值
4.1jsp:forward指令
jsp:forward動(dòng)作把請(qǐng)求轉(zhuǎn)到另外的頁(yè)面。jsp:forward標(biāo)記只有一個(gè)屬性page。
- 語(yǔ)法格式如下所示:
<jsp:forward page="Relative URL" /> - page屬性:page屬性包含的是一個(gè)相對(duì)URL。page的值既可以直接給出,也可以在請(qǐng)求的時(shí)候動(dòng)態(tài)計(jì)算,可以是一個(gè)JSP頁(yè)面或者一個(gè) Java Servlet.
- 執(zhí)行forward指令時(shí),用戶請(qǐng)求的地址依然沒(méi)有發(fā)生改變,仍然是一次請(qǐng)求,但頁(yè)面內(nèi)容完全變?yōu)楸籪orward目標(biāo)頁(yè)的內(nèi)容。執(zhí)行forward指令轉(zhuǎn)發(fā)請(qǐng)求時(shí),客戶端的請(qǐng)求參數(shù)不會(huì)丟失。類似于servlet中的
getRequestDispatcher("/GetData").forward(request, response); - 可以附帶增加額外的請(qǐng)求參數(shù):配合JSP:param動(dòng)作指令
<%--轉(zhuǎn)發(fā) jsp:foward
參數(shù) jsp:param
<jsp:forward page="/action2.jsp">
<jsp:param value="peace" name="name"/>
<jsp:param value="123456" name="pass"/>
</jsp:forward>
--%>
4.2jsp:include指令(動(dòng)態(tài)包含)
jsp:include>動(dòng)作元素用來(lái)包含靜態(tài)和動(dòng)態(tài)的文件。該動(dòng)作把指定文件插入正在生成的頁(yè)面
- 語(yǔ)法格式如下:
<jsp:include page="relative URL" flush="true" /> - 前面介紹過(guò)include的編譯指令與前面不同的是這里的是動(dòng)態(tài)包含,靜態(tài)包含是在JSP文件被轉(zhuǎn)換成Servlet的時(shí)候引入文件,而這里的jsp:include動(dòng)作不同,插入文件的時(shí)間是在頁(yè)面被請(qǐng)求的時(shí)候。如果被包含的頁(yè)面是jsp一樣會(huì)另一個(gè)生成servlet;
- 屬性介紹:
page:被包含頁(yè)面的url
flush:布爾屬性,定義在包含資源前是否刷新緩存區(qū)。 - 可以附帶增加額外的請(qǐng)求參數(shù):配合JSP:param動(dòng)作指令
<%--動(dòng)態(tài)包括 --%>
動(dòng)態(tài)包括:
<jsp:include page="/common/header1.jsp">
<jsp:param value="lucc" name="name"/>
</jsp:include>

4.3jsp:userBean,setProperty,getProperty指令
這三個(gè)指令都是與JavaBean相關(guān)的指令,其中userBean指令用于在JSP頁(yè)面中初始化一個(gè)java實(shí)例,setProperty指令用于為JavaBean實(shí)例的屬性設(shè)置值;getProperty指令用于輸出JavaBean實(shí)例的屬性。
- jsp:useBean動(dòng)作簡(jiǎn)單的語(yǔ)法為:
<jsp:userBean id="name" class="classname" scope="page|request|session|application"/>
其中,id屬性是JavaBean的實(shí)例名,class屬性確定JavaBean的實(shí)現(xiàn)類。scope屬性用于指定JavaBean實(shí)例的作用范圍。 - jsp:setProperty的語(yǔ)法格式:
<jsp:setProperty name="BeanName" property="propertyName" value="propertyValue"/>
其中,name屬性是要確定JavaBean的實(shí)例名,property屬性要確定設(shè)置屬性的屬性名,value屬性時(shí)要確定屬性名對(duì)應(yīng)的值。 - jsp:getProperty的語(yǔ)法格式:
<jsp:getProperty name="BeanName" name="propertyName"/>
其中,name屬性時(shí)要確定JavaBean的實(shí)例名,name屬性是指定要獲取的屬性名對(duì)應(yīng)的值。 - 演示如下:
<%--useBean setProperty getProperty --%>
<%--創(chuàng)建Student的實(shí)例
實(shí)例名稱為student
屬性范圍為page
--%>
<hr/>
<jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/>
<%--設(shè)置student的name值 --%>
<jsp:setProperty name="student" property="name" value="peace"/>
<%--輸出 student的name值--%>
name:<jsp:getProperty name="student" property="name" />
4.3jsp:param,plugin指令
param用于設(shè)置參數(shù)值,這個(gè)指令本身不能單獨(dú)使用,因此單獨(dú)的param指令沒(méi)有實(shí)際意義,param指令可以與以下指令結(jié)合使用
jsp:include jsp:forward jsp:plugin。使用方法上面已經(jīng)介紹;
plugin指令主要用于下載服務(wù)器端的JavaBean或Applet到到客戶端執(zhí)行,由于程序在客戶端執(zhí)行,因此客戶端必須安裝虛擬機(jī)。該指令用處較少,不做介紹;
4.4整體演示如下:
需要建立,action.jsp本文件,以級(jí)轉(zhuǎn)發(fā)頁(yè)面action2.jsp,被包含頁(yè)面/common/header1.jsp,JavaBean:Student類
<%--轉(zhuǎn)發(fā) jsp:foward
參數(shù) jsp:param
<jsp:forward page="/action2.jsp">
<jsp:param value="peace" name="name"/>
<jsp:param value="123456" name="pass"/>
</jsp:forward>
--%>
<%--動(dòng)態(tài)包括 --%>
動(dòng)態(tài)包括:
<jsp:include page="/common/header1.jsp">
<jsp:param value="lucc" name="name"/>
</jsp:include>
<%--useBean setProperty getProperty --%>
<%--創(chuàng)建Student的實(shí)例
實(shí)例名稱為student
屬性范圍為page
--%>
<hr/>
<jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/>
<%--設(shè)置student的name值 --%>
<jsp:setProperty name="student" property="name" value="peace"/>
<%--輸出 student的name值--%>
name:<jsp:getProperty name="student" property="name" />
5. 9大內(nèi)置對(duì)象介紹
JSP腳本中包含9個(gè)內(nèi)置對(duì)象,這9個(gè)內(nèi)置對(duì)象都是Servlet API接口的實(shí)例,只是JSP規(guī)范對(duì)他們默認(rèn)進(jìn)行了初始化(由JSP頁(yè)面對(duì)應(yīng)的Servlet的_jspService()方法來(lái)創(chuàng)建這些實(shí)例)。也就是它們已經(jīng)是對(duì)象,可以直接使用。

JSP初始化該9個(gè)對(duì)象的地方可以通過(guò)生成的servlet類看到如下:

request、response兩個(gè)對(duì)象是_jspService()方法的形參,當(dāng)Tomcat調(diào)用該方法時(shí)會(huì)初始化這兩個(gè)對(duì)象。而page、pageContext、application、config、session、out都是_jspService()方法的局部變量,由該方法完成初始化。
5.1稍簡(jiǎn)單再介紹:詳細(xì)介紹可以觀看我的Servlet入門實(shí)踐
- application:javax.servlet.ServletContext的實(shí)例,該實(shí)例代表JSP所屬的Web應(yīng)用本身,可用于JSP頁(yè)面,或者在Servlet之間交換信息。常用的方法有g(shù)etAttribute(StringattName)、setAttribute(String attName , String attValue)和getInitParameter(StringparamName)等。
- config:javax.servlet.ServletConfig的實(shí)例,該實(shí)例代表該JSP的配置信息。常用的方法有g(shù)etInitParameter(StringparamName)和getInitParameternames()等方法。事實(shí)上,JSP頁(yè)面通常無(wú)須配置,也就不存在配置信息。因此,該對(duì)象更多地在Servlet中有效。
- exception:java.lang.Throwable的實(shí)例,該實(shí)例代表其他頁(yè)面中的異常和錯(cuò)誤。只有當(dāng)頁(yè)面是錯(cuò)誤處理頁(yè)面,即編譯指令page的isErrorPage屬性為true時(shí),該對(duì)象才可以使用。常用的方法有g(shù)etMessage()和printStackTrace()等。
- out:javax.servlet.jsp.JspWriter的實(shí)例,該實(shí)例代表JSP頁(yè)面的輸出流,用于輸出內(nèi)容,形成HTML頁(yè)面。
- page:代表該頁(yè)面本身,通常沒(méi)有太大用處。也就是Servlet中的this,其類型就是生成的Servlet類,能用page的地方就可用this。
- pageContext:javax.servlet.jsp.PageContext的實(shí)例,該對(duì)象代表該JSP頁(yè)面上下文,使用該對(duì)象可以訪問(wèn)頁(yè)面中的共享數(shù)據(jù)。常用的方法有g(shù)etServletContext()和getServletConfig()等。這個(gè)對(duì)象存儲(chǔ)了request對(duì)象和response對(duì)象的引用。application對(duì)象,config對(duì)象,session對(duì)象,out對(duì)象可以通過(guò)訪問(wèn)這個(gè)對(duì)象的屬性來(lái)導(dǎo)出。PageContext類定義了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余種方法,有一半繼承自javax.servlet.jsp.JspContext 類。其中一個(gè)重要的方法就是removeArribute(),它可接受一個(gè)或兩個(gè)參數(shù)。比如,pageContext.removeArribute("attrName")移除四個(gè)scope中相關(guān)屬性,但是下面這種方法只移除特定scope中的相關(guān)屬性:
pageContext.removeAttribute("attrName", PAGE_SCOPE); - request:javax.servlet.http.HttpServletRequest的實(shí)例,該對(duì)象封裝了一次請(qǐng)求,客戶端的請(qǐng)求參數(shù)都被封裝在該對(duì)象里。這是一個(gè)常用的對(duì)象,獲取客戶端請(qǐng)求參數(shù)必須使用該對(duì)象。常用的方法有g(shù)etParameter(String paramName)、getParameterValues(StringparamName)、setAttribute(String 8. 8/ attrName,Object attrValue)、getAttribute(StringattrName)和setCharacterEncoding(String env)等。
- response:javax.servlet.http.HttpServletResponse的實(shí)例,代表服務(wù)器對(duì)客戶端的響應(yīng)。通常很少使用該對(duì)象直接響應(yīng),而是使用out對(duì)象,除非需要生成非字符響應(yīng)。而response對(duì)象常用于重定向,常用的方法有g(shù)etOutputStream()、sendRedirect(java.lang.String location)等。
- session:javax.servlet.http.HttpSession的實(shí)例,該對(duì)象代表一次會(huì)話。當(dāng)客戶端瀏覽器與站點(diǎn)建立連接時(shí),會(huì)話開(kāi)始;當(dāng)客戶端關(guān)閉瀏覽器時(shí),會(huì)話結(jié)束。常用的方法有:getAttribute(String attrName)、setAttribute(StringattrName, Object attrValue)等。
5.2四個(gè)域?qū)ο螅?/h2>
- 四個(gè)域?qū)ο螅?br>
pageContext-------- page域
request -------- request域
session-------- session域
application --------context域
- 域?qū)ο笞饔茫?br>
保存數(shù)據(jù) 和 獲取數(shù)據(jù) ,用于數(shù)據(jù)共享。
- 域?qū)ο蠓椒ǎ?br>
setAttribute("name",Object) 保存數(shù)據(jù)
getAttribute("name") 獲取數(shù)據(jù)
removeAttribute("name") 清除數(shù)據(jù)
- 域?qū)ο笞饔梅秶?br>
page域: 只能在當(dāng)前jsp頁(yè)面中使用(當(dāng)前頁(yè)面)
request域: 只能在同一個(gè)請(qǐng)求中使用(轉(zhuǎn)發(fā))
session域: 只能在同一個(gè)會(huì)話(session對(duì)象)中使用(私有的)
context域: 只能在同一個(gè)web應(yīng)用中使用。(全局的)
5.3 整體演示如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--out對(duì)象:對(duì)應(yīng)jspwriter
--%>
<%
/* for(int i=0;i<=1024;i++){
out.write("a");
}
System.out.println("當(dāng)前緩存區(qū)大小:"+out.getBufferSize());
System.out.println("剩余緩存區(qū)大?。?+out.getRemaining()); */
//如果不刷新則,123先輸出;
//out.flush();
response.getWriter().write("123");
%>
<%--
application對(duì)象:對(duì)應(yīng)servlet中的context
存儲(chǔ)的屬性,是整個(gè)應(yīng)用共享的;同樣可以獲得配置參數(shù);
--%>
<%
//存儲(chǔ)屬性
application.setAttribute("name", "peace");
%>
<%=application.getInitParameter("keys") %>
<%--
config對(duì)象:對(duì)應(yīng)servlet中的config
用處不是很大
--%>
<%=config.getServletName() %>
<%--
exception對(duì)象:在錯(cuò)誤頁(yè)面中有效,可以獲得異常屬性
親發(fā)生錯(cuò)誤:該對(duì)象只有當(dāng)編譯指令page的isErrorPage="true"才有效
<%=exception.getMessage() %>
--%>
<%--
request對(duì)象:對(duì)應(yīng)servlet中的request
--%>
<%=request.getLocalName() %>
<%--
response對(duì)象:對(duì)應(yīng)servlet中的response
--%>
<%
response.getWriter().println("hello respose");
%>
<%--
session對(duì)象:對(duì)應(yīng)servlet中的session
--%>
<%
session.setAttribute("pass", "567");
%>
<%--
pagecontext對(duì)象:jsp的頁(yè)面對(duì)象
可以獲得其他八個(gè)對(duì)象:
--%>
<%
//獲得其他對(duì)象
response.getWriter().write("是否相等?"+(out==pageContext.getOut())+"<br/>");
%>
<%--可以往不同的域中存對(duì)象 --%>
<%
pageContext.setAttribute("message", "wang");
pageContext.setAttribute("age", "22", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("qq", "374126165", pageContext.SESSION_SCOPE);
pageContext.setAttribute("tl","1881679",pageContext.APPLICATION_SCOPE);
//重定向到另一個(gè)頁(yè)面取得數(shù)據(jù):
response.sendRedirect(request.getContextPath()+"/pageget.jsp");
//刪除存儲(chǔ)的對(duì)象
pageContext.removeAttribute("age",PageContext.REQUEST_SCOPE );
%>
</body>
</html>
6.JSP生命周期講解:
request -------- request域
session-------- session域
application --------context域
getAttribute("name") 獲取數(shù)據(jù)
removeAttribute("name") 清除數(shù)據(jù)
request域: 只能在同一個(gè)請(qǐng)求中使用(轉(zhuǎn)發(fā))
session域: 只能在同一個(gè)會(huì)話(session對(duì)象)中使用(私有的)
context域: 只能在同一個(gè)web應(yīng)用中使用。(全局的)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--out對(duì)象:對(duì)應(yīng)jspwriter
--%>
<%
/* for(int i=0;i<=1024;i++){
out.write("a");
}
System.out.println("當(dāng)前緩存區(qū)大小:"+out.getBufferSize());
System.out.println("剩余緩存區(qū)大?。?+out.getRemaining()); */
//如果不刷新則,123先輸出;
//out.flush();
response.getWriter().write("123");
%>
<%--
application對(duì)象:對(duì)應(yīng)servlet中的context
存儲(chǔ)的屬性,是整個(gè)應(yīng)用共享的;同樣可以獲得配置參數(shù);
--%>
<%
//存儲(chǔ)屬性
application.setAttribute("name", "peace");
%>
<%=application.getInitParameter("keys") %>
<%--
config對(duì)象:對(duì)應(yīng)servlet中的config
用處不是很大
--%>
<%=config.getServletName() %>
<%--
exception對(duì)象:在錯(cuò)誤頁(yè)面中有效,可以獲得異常屬性
親發(fā)生錯(cuò)誤:該對(duì)象只有當(dāng)編譯指令page的isErrorPage="true"才有效
<%=exception.getMessage() %>
--%>
<%--
request對(duì)象:對(duì)應(yīng)servlet中的request
--%>
<%=request.getLocalName() %>
<%--
response對(duì)象:對(duì)應(yīng)servlet中的response
--%>
<%
response.getWriter().println("hello respose");
%>
<%--
session對(duì)象:對(duì)應(yīng)servlet中的session
--%>
<%
session.setAttribute("pass", "567");
%>
<%--
pagecontext對(duì)象:jsp的頁(yè)面對(duì)象
可以獲得其他八個(gè)對(duì)象:
--%>
<%
//獲得其他對(duì)象
response.getWriter().write("是否相等?"+(out==pageContext.getOut())+"<br/>");
%>
<%--可以往不同的域中存對(duì)象 --%>
<%
pageContext.setAttribute("message", "wang");
pageContext.setAttribute("age", "22", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("qq", "374126165", pageContext.SESSION_SCOPE);
pageContext.setAttribute("tl","1881679",pageContext.APPLICATION_SCOPE);
//重定向到另一個(gè)頁(yè)面取得數(shù)據(jù):
response.sendRedirect(request.getContextPath()+"/pageget.jsp");
//刪除存儲(chǔ)的對(duì)象
pageContext.removeAttribute("age",PageContext.REQUEST_SCOPE );
%>
</body>
</html>
理解JSP底層功能的關(guān)鍵就是去理解它們所遵守的生命周期。JSP生命周期就是從創(chuàng)建到銷毀的整個(gè)過(guò)程,類似于servlet生命周期,區(qū)別在于JSP生命周期還包括將JSP文件編譯成servlet。
6.1JSP執(zhí)行過(guò)程:
訪問(wèn):http://localhost:8080/工程名/NewFile.jsp
- 訪問(wèn)到NewFile.jsp頁(yè)面,tomcat掃描到j(luò)sp文件,在/work/Catalina/localhost/stuJsp/org/apache/jsp把jsp文件翻譯成java源文件
(NewFile.jsp -> NewFile_jsp.java) (翻譯) - tomcat服務(wù)器把java源文件編譯成class字節(jié)碼文件 (編譯)
(NewFile_jsp.java ->NewFile_jsp.class) - tomcat服務(wù)器構(gòu)造NewFile_jsp類對(duì)象
- tomcat服務(wù)器調(diào)用NewFile_jsp類里面方法,返回內(nèi)容顯示到瀏覽器。
第一次訪問(wèn)jsp:走(1)(2)(3)(4)
之后的訪問(wèn):走(4)
注意:jsp文件修改了或jsp的臨時(shí)文件被刪除了,要重新走翻譯(1)和編譯(2)的過(guò)程
6.2JSP生命周期:
- JSP編譯:
當(dāng)瀏覽器請(qǐng)求JSP頁(yè)面時(shí),JSP引擎會(huì)首先去檢查是否需要編譯這個(gè)文件。如果這個(gè)文件沒(méi)有被編譯過(guò),或者在上次編譯后被更改過(guò),則編譯這個(gè)JSP文件。編譯為servlet; - JSP初始化:
容器載入JSP文件后,它會(huì)在為請(qǐng)求提供任何服務(wù)前調(diào)用jspInit()方法。你可以重寫該方法:在jsp聲明段
<%!
public void jspInit(){
initVar++;
System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
}
%>
- JSP執(zhí)行:
這一階段描述了JSP生命周期中一切與請(qǐng)求相關(guān)的交互行為,直到被銷毀。每一次服務(wù)請(qǐng)求都會(huì)執(zhí)行_jspService()方法。 - JSP清理:
JSP生命周期的銷毀階段描述了當(dāng)一個(gè)JSP網(wǎng)頁(yè)從容器中被移除時(shí)所發(fā)生的一切,一般只有在容器停止部署該工程才執(zhí)行:jspDestroy()方法 你可以進(jìn)行重寫
<%!
public void jspDestroy(){
destroyVar++;
System.out.println("jspDestroy(): JSP被銷毀了"+destroyVar+"次");
} %>
- JSP與servlet的生命周期對(duì)比
Servlet的生命周期:
1)構(gòu)造方法(第1次訪問(wèn))
2)init方法(第1次訪問(wèn))
3)service方法
4)destroy方法
Jsp的生命周期:
1)翻譯: jsp->java文件
2)編譯: java文件->class文件(servlet程序)
3)構(gòu)造方法(第1次訪問(wèn))
4)init方法(第1次訪問(wèn)):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
6.3演示如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
//記錄執(zhí)行次數(shù):
private int initVar=0;
private int serviceVar=0;
private int destroyVar=0;
%>
<%!
public void jspInit(){
initVar++;
System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
}
public void jspDestroy(){
destroyVar++;
System.out.println("jspDestroy(): JSP被銷毀了"+destroyVar+"次");
}
%>
<%
serviceVar++;//
System.out.println("_jspService(): JSP共響應(yīng)了"+serviceVar+"次請(qǐng)求");
//對(duì)各個(gè)的執(zhí)行次數(shù)計(jì)數(shù)
String content1="初始化次數(shù) : "+initVar;
String content2="響應(yīng)客戶請(qǐng)求次數(shù) : "+serviceVar;
String content3="銷毀次數(shù) : "+destroyVar;
%>
<%-- 輸出顯示 --%>
<h1><%=content1 %></h1>
<h1><%=content2 %></h1>
<h1><%=content3 %></h1>
</body>
</html>
顯示如下:

來(lái)自伊豚wpeace(blog.wpeace.cn)



