JSP中的隱含對(duì)象_第1頁(yè)
JSP中的隱含對(duì)象_第2頁(yè)
JSP中的隱含對(duì)象_第3頁(yè)
JSP中的隱含對(duì)象_第4頁(yè)
JSP中的隱含對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章JSP中的隱含對(duì)象

JSP中隱含對(duì)象的概念屬性(Attribute)JSP中的隱含對(duì)象錯(cuò)誤處理JSP中隱含對(duì)象的概念在本節(jié)中,您將了解以下內(nèi)容:

什么是JSP的隱藏對(duì)象JSP中有哪些隱藏對(duì)象JSP隱藏對(duì)象的定義JSP隱藏對(duì)象的由來(lái)JSP隱藏對(duì)象的定義6.1節(jié)publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)

throwsjava.io.IOException,ServletException{

JspFactory_jspxFactory=null;

PageContextpageContext=null;

HttpSessionsession=null;

ServletContextapplication=null;

ServletConfigconfig=null;

JspWriterout=null;

Objectpage=this;

...

_jspxFactory=JspFactory.getDefaultFactory();

response.setContentType("text/html;charset=GBK");

pageContext=_jspxFactory.getPageContext(this,request,response,

"",true,8192,true);

application=pageContext.getServletContext();

config=pageContext.getServletConfig();

session=pageContext.getSession();

out=pageContext.getOut();

...

}下面是一個(gè)普通的jsp頁(yè)面文件helloworld.jsp<%@pagecontentType="text/html;charset=GB2312"%><html><head><title>CH5-helloworld.jsp</title></head><body><%out.println("Helloworld,JSP!");%></body></html>我們知道,該文件被第一次瀏覽時(shí),jsp引擎將對(duì)其進(jìn)行轉(zhuǎn)譯。轉(zhuǎn)譯JSP隱藏對(duì)象的概念JSP隱藏對(duì)象的定義6.1節(jié)概念jsp頁(yè)面在運(yùn)行之前的轉(zhuǎn)譯過(guò)程中,jsp引擎為其_jspService方法定義了一些局部對(duì)象。由于jsp腳本都將轉(zhuǎn)譯成_jspService方法的代碼,因此這些局部對(duì)象在jsp腳本中是可直接使用的。這些局部對(duì)象一個(gè)通常的叫法為隱藏對(duì)象。通過(guò)分析_jspService方法的代碼,可知常用的隱藏對(duì)象有:pageContext PageContext類型session HttpSession類型

application ServletContext類型

config ServletConfig類型

out JspWriter類型

page Object類型

request HttpServletRequest類型response HttpServletResponse類型

常用的JSP隱藏對(duì)象JSP隱藏對(duì)象的定義6.1節(jié)隱含對(duì)象類型說(shuō)明pageContextjavax.servlet.jsp.PageContext本JSP頁(yè)面的上下文對(duì)象requestjavax.servlet.http.HttpServletRequest隱含請(qǐng)求信息sessionjavax.servlet.HttpSession表示會(huì)話對(duì)象applicationjavax.servlet.ServletContextJSP頁(yè)面所在Web應(yīng)用的上下文對(duì)象pagejava.lang.Object對(duì)當(dāng)前JSP頁(yè)面的引用,即Java中的thisconfigjavax.servlet.ServletConfigJSP頁(yè)面的ServletConfig對(duì)象responsejavax.servlet.HttpServletResponse響應(yīng)信息outjavax.servlet.JspWriterJSP的數(shù)據(jù)輸出對(duì)象exceptionjava.lang.Throwable異常處理第六章JSP中的隱含對(duì)象

JSP中隱含對(duì)象的概念屬性(Attribute)JSP中的隱含對(duì)象錯(cuò)誤處理屬性(Attribute)在本節(jié)中,您將了解以下內(nèi)容:

哪些JSP隱藏對(duì)象可以保存屬性屬性的作用范圍(Scope)可以使用屬性的隱藏對(duì)象屬性(Attribute)屬性6.2節(jié)我們通常會(huì)將request、session、application和pageContext歸為一類,原因在于:它們皆能借助屬性來(lái)做到數(shù)據(jù)分享。下表列出了一般儲(chǔ)存和取得屬性的方法,這些方法pageContext、request、session和application皆可使用。方法說(shuō)明voidsetAttribute(Stringname,Objectvalue)設(shè)定名稱為name的屬性,屬性的設(shè)置為valueEnumerationgetAttributeNamesInScope(intscope)取得所有scope范圍的屬性名稱組成的列舉表ObjectgetAttribute(Stringname)取得name屬性的值voidremoveAttribute(Stringname)刪除名稱為name的屬性可以使用屬性的隱藏對(duì)象屬性6.2節(jié)使用屬性的一般注意事項(xiàng)當(dāng)我們使用getAttribute(Stringname)取得name屬性的值時(shí),它返回一個(gè)java.lang.Object類型的對(duì)象,因此,還必須根據(jù)name屬性值的類型進(jìn)行類型轉(zhuǎn)換(Casting)工作。

例如,如果要取得String類型的Name屬性時(shí):

StringuserName=(String)pageContext.getAttribute(“userName”);

如果是Integer類型的Year屬性時(shí):

IntegerYear=(Integer)session.getAttribute("Year");在使用屬性存儲(chǔ)數(shù)據(jù)前,應(yīng)該首先根據(jù)對(duì)屬性的功能要求,確定準(zhǔn)備將屬性存儲(chǔ)在Request、Session、Application或PageContext的哪個(gè)之中,以便將相應(yīng)數(shù)據(jù)存入選定對(duì)象之中。

存入不同隱藏對(duì)象的屬性在功能上有很大區(qū)別。

request.setAttribute("Month",newInteger(12));

session.setAttribute("Day",newInteger(27));

application.setAttribute("Times",newInteger(10));屬性的范圍(Scope)屬性6.2節(jié)概念在使用屬性前,應(yīng)首先根據(jù)對(duì)屬性的功能要求,確定準(zhǔn)備將屬性存儲(chǔ)在Request、Session、Application或PageContext的哪個(gè)之中。這一點(diǎn)十分重要,這是因?yàn)檫@將決定屬性的作用范圍。換句話說(shuō),屬性的宿主對(duì)象決定了屬性的作用域、生存期等重要特性。范圍如上所述,JSP的屬性有四種宿主對(duì)象,也就有了四種作用范圍pagerequestsessionapplication。屬性的范圍(Scope)屬性6.2節(jié)概念屬性的范圍為page,指的是屬性只作用在當(dāng)前的JSP頁(yè)面范圍中。操作方法如果要將數(shù)據(jù)存入Page范圍,可用pageContext對(duì)象的setAttribute()方法;若要取得page范圍的數(shù)據(jù),可用pageContext對(duì)象的getAttribute()方法。屬性的范圍(Scope)屬性6.2節(jié)例子:PageScope1.jsp

<%@pagecontentType="text/html;charset=GB2312"%>

html>

<head>

<title>CH6-PageScope1.jsp</title>

</head>

<body>

<h2>Page范圍-pageContext</h2>

<%

pageContext.setAttribute("Name","scott");

pageContext.setAttribute("Password","tiger");

%>

<jsp:forwardpage="PageScope2.jsp"/>

</body>

</html>屬性的范圍(Scope)屬性6.2節(jié)例子:PageScope2.jsp

<%@pagecontentType="text/html;charset=GB2312"%>

<html>

<head><title>CH6-PageScope2.jsp</title></head>

<body>

<h2>Page范圍-pageContext</h2>

</br>

<%

StringName=(String)pageContext.getAttribute("Name");

StringPassword=(String)pageContext.getAttribute("Password");

out.println("Name="+Name);

out.println("Password="+Password);

%>

</body>

</html>屬性的范圍(Scope)request屬性6.2節(jié)概念:Request作用范圍的屬性隱藏對(duì)象request的生存期就是一次用戶請(qǐng)求的生存期,即從用戶的一次請(qǐng)求到向用戶返回相應(yīng)之間的服務(wù)器處理期間。存儲(chǔ)在request對(duì)象下的屬性在request的生存期中有效。為什么要研究request范圍在Servlet技術(shù)規(guī)范中,一次請(qǐng)求處理可能涉及到多個(gè)服務(wù)器資源或JSP頁(yè)面。比較典型的如jsp頁(yè)面的<jsp:forward>動(dòng)作和<jsp:include>動(dòng)作,就是在同一個(gè)用戶請(qǐng)求下在多個(gè)頁(yè)面之間進(jìn)行傳遞的。在使用<jsp:forward>動(dòng)作和<jsp:include>動(dòng)作時(shí),對(duì)于每一個(gè)頁(yè)面,它們處理的都是同一個(gè)請(qǐng)求,或者說(shuō),它們之間的請(qǐng)求是在這幾個(gè)頁(yè)面之間是共享的。當(dāng)接收到用戶發(fā)出新的請(qǐng)求時(shí),這個(gè)請(qǐng)求隨之失效,存放其中的屬性也同時(shí)失效。屬性的范圍(Scope)request屬性6.2節(jié)例子:RequestScope1.jsp

<%@pagecontentType="text/html;charset=GB2312"%>

<html>

<head>

<title>CH6-RequestScope1.jsp</title>

</head>

<body>

<h2>Request范圍-request</h2>

<%

request.setAttribute("Name","mike");

request.setAttribute("Password","browser");

%>

<jsp:forwardpage="RequestScope2.jsp"/>

</body>

</html>屬性的范圍(Scope)request屬性6.2節(jié)例子:RequestScope2.jsp

<%@pagecontentType="text/html;charset=GB2312"%>

<html><head><title>CH6-RequestScope2.jsp</title></head>

<body>

<h2>Request范圍-request</h2>

<%

StringName=(String)request.getAttribute("Name");

StringPassword=(String)request.getAttribute("Password");

out.println("Name="+Name);

out.println("Password="+Password);

%>

</body>

</html>屬性的范圍(Scope)session屬性6.2節(jié)概念session屬性的作用范圍為一段用戶持續(xù)和服務(wù)器所連接的時(shí)間,但與服務(wù)器斷線后,這個(gè)屬性就無(wú)效。在Web應(yīng)用開發(fā)中,Session屬性是使用非常頻繁的。正如在第四章講到的,在Servlet中,維護(hù)會(huì)話的高級(jí)形式是利用HttpSession對(duì)象,在JSP中維護(hù)會(huì)話的主要途徑就是利用session屬性。我們應(yīng)該注意到,在_jspService()方法中,session對(duì)象的初始化是以下方式:

session=pageContext.getSession();也就是說(shuō),在jsp腳本中,可以確保session對(duì)象是可用的。屬性的范圍(Scope)session屬性6.2節(jié)JSP頁(yè)面中使用session對(duì)象的一個(gè)典型片斷<%

intvisitCount=1;

//查看是否綁定了visitCount屬性。如果沒(méi)有綁定,則說(shuō)明用戶是第一次訪問(wèn)頁(yè)面

if(session.getAttribute("visitCount")==null){//是第一次訪問(wèn)

visitCount=1;

}else{//不是第一次訪問(wèn)

visitCount=((Integer)session.getAttribute("visitCount")).intValue();

visitCount++;

}

session.setAttribute("visitCount",newInteger(visitCount));

%><p>SessionID=<%=session.getId()%></p>屬性的范圍(Scope)application屬性6.2節(jié)概念application對(duì)象的作用范圍在服務(wù)器一開始執(zhí)行服務(wù),到服務(wù)器關(guān)閉為止。application的范圍最大、停留的時(shí)間也最久,所以使用時(shí)要特別注意,不然可能會(huì)造成服務(wù)器負(fù)載越來(lái)越重的情況。建立范圍為application的屬性只要將數(shù)據(jù)存入application對(duì)象,數(shù)據(jù)的Scope就為application。如

application.setAttribute("visitCount",newInteger(visitCount));

第六章JSP中的隱含對(duì)象

JSP中隱含對(duì)象的概念屬性(Attribute)JSP中的隱含對(duì)象錯(cuò)誤處理JSP中的隱含對(duì)象在本節(jié)中,您將了解以下隱藏對(duì)象的具體操作方法:

page對(duì)象config對(duì)象request對(duì)象response對(duì)象out對(duì)象session對(duì)象application對(duì)象pageContext對(duì)象JSP中的隱藏對(duì)象page對(duì)象JSP中的隱藏對(duì)象6.3節(jié)page對(duì)象代表JSP本身,更準(zhǔn)確地說(shuō)它代表JSP被轉(zhuǎn)譯后的Servlet,我們?cè)贘SP轉(zhuǎn)義后生成的Servlet類源代碼中,可以看到JSP容器是這樣初始化page對(duì)象的:

Objectpage=this;因此,它可以調(diào)用Servlet類所定義的方法。如:<%@pageinfo="這是一個(gè)JSP頁(yè)面"ContentType="text/html;charset=GB2312"%>

<html><head><title>CH6-PageInfo.jsp</title></head>

<body>

<h2>page隱含對(duì)象</h2>

PageInfo=<%=((javax.servlet.jsp.HttpJspPage)page).getServletInfo()%>

</body>

</html>config對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)config對(duì)象里存放著一些Servlet初始化的數(shù)據(jù),config對(duì)象和page對(duì)象一樣都很少被用到。config對(duì)象實(shí)現(xiàn)了javax.servlet.ServletConfig接口,它共有下列四種方法:

publicStringgetInitParameter(name)publicjava.util.EnumerationgetInitParameterNames()publicServletContextgetServletContext()publicSringgetServletName()上述前兩種方法可以讓config對(duì)象取得Servlet初始參數(shù)值,如果指定的初始參數(shù)值不存在,就返回null。config對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)config.jsp<%@pagecontentType="text/html;charset=GBK"%>

<html>

<head><title>CH6–Config.jsp</title></head>

<bodybgcolor="#ffffff">

<h3>

ServletName:<%=config.getServletName()%><br>

JSPAuthor:<%=config.getInitParameter("Author")%><br>

Date:<%=config.getInitParameter("Date")%><br>

Info:<%=config.getInitParameter("Info")%><br>

</h3>

</body>

</html>request對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)request對(duì)象包含所有請(qǐng)求的信息,如:請(qǐng)求的來(lái)源、標(biāo)頭、cookies和請(qǐng)求相關(guān)的參數(shù)值等等。JSP網(wǎng)頁(yè)中的request對(duì)象實(shí)現(xiàn)了javax.servlet.http.HttpServletRequest接口。所以在JSP中,如果需要用戶請(qǐng)求信息的所有細(xì)節(jié),都可以通過(guò)request對(duì)象獲得。request對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)Request.jsp<body>

<h2>request對(duì)象所提供的方法</h2>

getParameter("Name"):<%=request.getParameter("name")%><br>

getParameter("Number"):<%=request.getParameter("password")%><br>

<%

request.setAttribute("Produce","JBuilder9");

request.setAttribute("Manufacturer:","Borland");

%>

getAttribute("Name"):<%=request.getAttribute("Name")%><br>

getAttribute("Number"):<%=request.getAttribute("Number")%><br><br>

getAuthType():<%=request.getAuthType()%><br>

getProtocol():<%=request.getProtocol()%><br>

getMethod():<%=request.getMethod()%><br>

……request對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)http://localhost:8080/RequestResponse/request.jsp?name=Scott&password=Tigerresponse對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)JSP中的response對(duì)象實(shí)現(xiàn)了javax.servlet.http.HttpServletResponse接口。它的主要用途就是將JSP處理數(shù)據(jù)后的結(jié)果傳回到客戶端。

<%@pageimport="java.util.*"%>

<%

response.setContentType("text/html");

response.setStatus(HttpServletResponse.SC_OK);

response.addHeader("MyName","Scott");

response.addIntHeader("MyAge",21);

response.addDateHeader("MyBirthday",newDate(1982,10,1).getTime());

response.addCookie(newCookie("myCookie","Helloworld!"));

%>

<html>

<head><title></title></head><body><p>HelloWorld!</p></body>

</html>response對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)用TCPMonitor截獲的響應(yīng)信息如下所示

HTTP/1.1200OK

Content-Type:text/html;charset=ISO-8859-1

MyBirthday:Tue,31Oct388216:00:00GMT

Date:Sat,02Apr200515:50:44GMT

MyAge:21

MyName:Scott

Server:ApacheTomcat/4.0.6(HTTP/1.1Connector)

Transfer-Encoding:chunked

Set-Cookie:myCookie=Helloworld!

Set-Cookie:

JSESSIONID=0EC14FBB719910F2BF1E26A0BA7CA639;Path=/responseweb

69

<html>……</html>0out對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)out對(duì)象能把結(jié)果輸出到網(wǎng)頁(yè)上。通常我們最常使用out.println(Stringname)和out.print(Stringname),它們兩者最大的差別在于println()在輸出的數(shù)據(jù)后面會(huì)自動(dòng)加上換行的符號(hào);反之,print()不會(huì)在數(shù)據(jù)后自動(dòng)換行。out對(duì)象除了這兩種方法最常使用之外,它還有一些方法(見下表),這些方法主要是用來(lái)控制管理輸出的緩沖區(qū)(buffer)和輸出流(outputstream)。方法說(shuō)明voidclear()清除輸出緩沖區(qū)的內(nèi)容voidclearBuffer()清除輸出緩沖區(qū)的內(nèi)容voidclose()關(guān)閉輸出流,清除所有的內(nèi)容intgetBufferSize()取得目前緩沖區(qū)的大小(KB)intgetRemaining()取得目前使用后還剩下的緩沖區(qū)大小(KB)booleanisAutoFlush()如果返回為true,表示如緩沖區(qū)滿了,會(huì)自動(dòng)清除;若為false,表示如果緩沖區(qū)滿了,不會(huì)自動(dòng)清除,而會(huì)產(chǎn)生異常處理session對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)session對(duì)象實(shí)現(xiàn)javax.servlet.http.HttpSession接口。它主要用于識(shí)別每一個(gè)用戶,然后針對(duì)每一個(gè)別用戶的要求,給予正確的響應(yīng)。下面程序用來(lái)說(shuō)明JSP網(wǎng)頁(yè)被編譯成Servlet時(shí),session對(duì)象是如何初始化的:

HttpSessionsession=null;

……

session=pageContext.getSession();也就是說(shuō),在JSP頁(yè)面中,session對(duì)象總是可用的。application對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)application對(duì)象實(shí)現(xiàn)了javax.servlet.ServletContext接口,它主要功用在于取得或更改Servlet的設(shè)定。在_jspService()方法中,application對(duì)象以下列形式被初始化:

ServletContextapplication=null;

……

application=pageContext.getServletContext();可以看出application對(duì)象存儲(chǔ)了當(dāng)前Web應(yīng)用的ServletContext。在JSP腳本中,我們可以直接使用application引用當(dāng)前ServletContext而不必考慮初始化問(wèn)題。pageContext對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)pageContext對(duì)象能夠存取其他隱含對(duì)象。當(dāng)隱含對(duì)象本身也支持屬性時(shí),pageContext對(duì)象也提供存取那些屬性的方法。不過(guò)在使用下列方法時(shí),需要指定范圍的參數(shù):ObjectgetAttribute(Stringname,intscope)

返回name屬性,范圍為scope的屬性對(duì)象,返回類型為java.lang.ObjectEnumerationgetAttributeNamesInScope(intscope)

返回所有屬性范圍為scope的屬性名稱,返回類型為EnumerationvoidremoveAttribute(Stringname,intscope)

刪除屬性名稱為name,范圍為scope的屬性對(duì)象voidsetAttribute(Stringname,Objectvalue,intscope)

指定屬性對(duì)象的名稱為name、值為value、范圍為scopeexception對(duì)象

JSP中的隱藏對(duì)象6.3節(jié)當(dāng)JSP網(wǎng)頁(yè)有錯(cuò)誤時(shí)會(huì)產(chǎn)生異常,而exception對(duì)象就來(lái)針對(duì)這個(gè)異常做處理。exception對(duì)象和session對(duì)象一樣,并不是在每一個(gè)JSP網(wǎng)頁(yè)中都能夠使用。若要使用exception對(duì)象時(shí),必須在page指令中設(shè)定:<%@pagecontentType="text/html;charset=GB2312"isErrorPage="true"%>第六章JSP中的隱含對(duì)象

JSP中隱含對(duì)象的概念屬性(Attribute)JSP中的隱含對(duì)象錯(cuò)誤處理錯(cuò)誤處理在本節(jié)中,您將了解以下內(nèi)容:JSP網(wǎng)頁(yè)轉(zhuǎn)義成Servlet類時(shí)發(fā)生的錯(cuò)誤轉(zhuǎn)義成的Servlet類處理用戶請(qǐng)求階段的錯(cuò)誤兩類錯(cuò)誤產(chǎn)生的原因和處理方法。錯(cuò)誤處理轉(zhuǎn)譯時(shí)錯(cuò)誤

錯(cuò)誤處理6.4節(jié)轉(zhuǎn)義處理時(shí)錯(cuò)誤產(chǎn)生的一般原因:

我們?cè)诰帉慗SP時(shí)的語(yǔ)法有錯(cuò)誤,導(dǎo)致JSP容器無(wú)法將JSP網(wǎng)頁(yè)編譯成Servlet類文件(.class),例如:500InternalServerError,500是指HTTP的錯(cuò)誤狀態(tài)碼,因此是ServerErro

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論