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

下載本文檔

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

文檔簡介

第六章JSP中的隱含對象

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

什么是JSP的隱藏對象JSP中有哪些隱藏對象JSP隱藏對象的定義JSP隱藏對象的由來JSP隱藏對象的定義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();

...

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

application ServletContext類型

config ServletConfig類型

out JspWriter類型

page Object類型

request HttpServletRequest類型response HttpServletResponse類型

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

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

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

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

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

如果是Integer類型的Year屬性時:

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

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

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

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

application.setAttribute("Times",newInteger(10));屬性的范圍(Scope)屬性6.2節(jié)概念在使用屬性前,應(yīng)首先根據(jù)對屬性的功能要求,確定準備將屬性存儲在Request、Session、Application或PageContext的哪個之中。這一點十分重要,這是因為這將決定屬性的作用范圍。換句話說,屬性的宿主對象決定了屬性的作用域、生存期等重要特性。范圍如上所述,JSP的屬性有四種宿主對象,也就有了四種作用范圍pagerequestsessionapplication。屬性的范圍(Scope)屬性6.2節(jié)概念屬性的范圍為page,指的是屬性只作用在當前的JSP頁面范圍中。操作方法如果要將數(shù)據(jù)存入Page范圍,可用pageContext對象的setAttribute()方法;若要取得page范圍的數(shù)據(jù),可用pageContext對象的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作用范圍的屬性隱藏對象request的生存期就是一次用戶請求的生存期,即從用戶的一次請求到向用戶返回相應(yīng)之間的服務(wù)器處理期間。存儲在request對象下的屬性在request的生存期中有效。為什么要研究request范圍在Servlet技術(shù)規(guī)范中,一次請求處理可能涉及到多個服務(wù)器資源或JSP頁面。比較典型的如jsp頁面的<jsp:forward>動作和<jsp:include>動作,就是在同一個用戶請求下在多個頁面之間進行傳遞的。在使用<jsp:forward>動作和<jsp:include>動作時,對于每一個頁面,它們處理的都是同一個請求,或者說,它們之間的請求是在這幾個頁面之間是共享的。當接收到用戶發(fā)出新的請求時,這個請求隨之失效,存放其中的屬性也同時失效。屬性的范圍(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ù)器所連接的時間,但與服務(wù)器斷線后,這個屬性就無效。在Web應(yīng)用開發(fā)中,Session屬性是使用非常頻繁的。正如在第四章講到的,在Servlet中,維護會話的高級形式是利用HttpSession對象,在JSP中維護會話的主要途徑就是利用session屬性。我們應(yīng)該注意到,在_jspService()方法中,session對象的初始化是以下方式:

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

intvisitCount=1;

//查看是否綁定了visitCount屬性。如果沒有綁定,則說明用戶是第一次訪問頁面

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

visitCount=1;

}else{//不是第一次訪問

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

visitCount++;

}

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

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

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

第六章JSP中的隱含對象

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

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

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

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

<body>

<h2>page隱含對象</h2>

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

</body>

</html>config對象

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

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

JSP中的隱藏對象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對象

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

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

<h2>request對象所提供的方法</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對象

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

JSP中的隱藏對象6.3節(jié)JSP中的response對象實現(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對象

JSP中的隱藏對象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對象

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

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

HttpSessionsession=null;

……

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

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

ServletContextapplication=null;

……

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

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

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

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

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

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

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

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

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

我們在編寫JSP時的語法有錯誤,導致JSP容器無法將JSP網(wǎng)頁編譯成Servlet類文件(.class),例如:500InternalServerError,500是指HTTP的錯誤狀態(tài)碼,因此是ServerErro

溫馨提示

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

評論

0/150

提交評論