JSP內(nèi)置對象:我們在使用JSP進行頁面編程時可以直接使用而不需自己創(chuàng)建的一些Web容器已為用戶創(chuàng)建好的JSP內(nèi)置對象。如request,session,response,out等。
下面就JSP2.0給出的9個內(nèi)置對象:
內(nèi)置對象 | 類型 | 作用域 |
request | javax.servlet.http.HttpServletRequest | request |
response | javax.servlet.http.HttpServletResponse | response |
pageContext | javax.servlet.jsp.PageContext | page |
session | javax.servlet.http.HtpSession | session |
application | javax.servlet.jsp.ServletContext | application |
out | javax.servlet.jsp.JspWriter | page |
config | javax.servlet.ServletConfig | page |
page | java.lang.Object | page |
exception | java.lang.Throwable | page |
我們同樣可以根據(jù)它們的作用進行分類:
第一類:與Servlet有關(guān):page和config
第二類:與Input/Output有關(guān):out,request和response
第三類:與Context有關(guān):application,session和pageContext
第四類:與Error有關(guān):exception
一、屬性保存范圍
在JSP中可以通過setAttribute()和getAttribute()這兩個方法來設置和取得屬性。從而實現(xiàn)數(shù)據(jù)的共享。JSP提供了四種屬性保存范圍:response,request,session和application。
1、page:就是設置的屬性只能在當前頁面有效。通過pageContext的setAttribute()和getAttribute()。
2、request:指屬性在一次請求范圍內(nèi)有效。如果頁面從給一個頁面跳轉(zhuǎn)到另一個頁面,那么該屬性就失效了。這里所指的跳轉(zhuǎn)是指客戶端跳轉(zhuǎn),比如客戶單擊超鏈接跳轉(zhuǎn)到其他頁面或者通過瀏覽器地址欄瀏覽其他頁面。如果使用服務器端跳轉(zhuǎn)<jsp:forward>,則該屬性仍然生效。同理使用request對象的setAttribute()和getAttribute()。
3、session:指客戶瀏覽器與服務器一次會話范圍內(nèi),如果服務器斷開連接,那么屬性就失效了。同理通過session對象的setAttribute()和getAttribute()。session范圍的例外比如重新打開一個瀏覽器。
4、application:指在整個服務器范圍,知道服務器停止以后才會失效。同理通過application對象的setAttribute()和getAttribute()。application范圍就是保存的屬性只要服務器不重啟,就能在任意頁面中獲取,就算重新打開瀏覽器也是可以獲取屬性的。
二、移除屬性:在屬性的作用域還未到就想清除相應的屬性時,必須編程清除。即調(diào)用相應對象的removeAttribute()方法就可以移除指定屬性。
<%@ page language="java" contentType="text/html;charset=gb2312"%> <html> <head> <title>移除屬性</title> </head> <body> <%-- 在page范圍設置屬性 --%> <% pageContext.setAttribute("name","James"); //設置屬性name,其值為James pageContext.setAttribute("age","12"); //設置屬性age,其值為12 pageContext.setAttribute("sex","男"); //設置屬性sex,其值為男 %> <%-- 移除屬性--%> <% pageContext.removeAttribute("sex"); %> <%-- 取得page范圍屬性--%> <% String strName = (String)pageContext.getAttribute("name"); //取值屬性name的值 String strAge = (String)pageContext.getAttribute("age"); //取值屬性age的值 String strSex = (String)pageContext.getAttribute("sex"); //取值屬性sex的值 out.println("page范圍:name屬性值為" + strName + "<br>"); out.println("page范圍:age屬性值為" + strAge+ "<br>"); out.println("page范圍:sex屬性值為" + strSex); %> </body> </html>
結(jié)果頁面輸出:page范圍:name屬性值為James
page范圍:age屬性值為 12
page范圍:sex屬性值為 null
三、request對象:request對象不但可以用來設置和取得request范圍變量,還可以用來獲取客戶端請求參數(shù)、請求的來源、表頭、Cookies等。
1、request獲取客戶端請求參數(shù)方法
方法 | 返回值類型 | 方法說明 |
getParameter(String name) | String | 獲取參數(shù)名為name的參數(shù)值 |
getParameterNames() | Enumeration | 獲取所有參數(shù)的名稱,可與上一個方法合用獲取所有參數(shù)的值 |
getParameterValues(String name) | String[] | 獲取參數(shù)名為name的所有參數(shù),比如參數(shù)是多個checkbox |
getParameterMap() | Map | 獲取所有參數(shù)封裝的Map實例,通過Map實例的String[] get("id")方法返回對應參數(shù)名為id的值數(shù)組 |
2、request的其他方法
方法 | 返回值類型 | 方法說明 |
getHeader(String name) | String | 獲取指定標題名稱為name的標頭 |
getHeaderName() | Enumeration | 獲取所有的標頭名稱 |
getIntHeader(String name) | int | 獲取標題名稱為name的標頭,內(nèi)容以整數(shù)類型返回 |
getDateHeader(String name) | long | 獲取標題名稱為name的標頭,內(nèi)容以日期類型返回 |
getCookies() | Cookie | 獲取相關(guān)的Cookie |
getContextPath() | String | 獲取Context的路徑 |
getMethod() | String | 獲取客戶端的提交方式 |
getProtocol() | String | 獲取使用的HTTP協(xié)議 |
getQueryString() | String | 獲取請求的字符串 |
getRequestSessionId() | String | 獲取客戶端的Session ID |
getRequestURI() | String | 獲取請求的URI |
getRemoteAddr() | String | 獲取客戶端IP地址 |
四、response對象:用來向客戶端傳送輸出信息。
方法 | 返回值 | 方法說明 |
addCookie(Cookie cookie) | void | |
addDateHeader(String name,long date) | void | |
addHeader(String name,String value) | void | |
addIntHeader(String name,int value) | void | |
setDateHeader(String name,long date) | void | |
setHeader(String name,String value) | void | |
setIntHeader(String name,int value) | void | |
sendError(int sc) | void | 傳送狀態(tài)碼 |
sendError(int sc,String msg) | void | 傳送狀態(tài)碼和錯誤信息 |
setStatus(int sc) | void | 設置狀態(tài)碼 |
sendRedirect(String URL) | void | 頁面重定向,用來實現(xiàn)頁面跳轉(zhuǎn) |
注:這里的response對象的sendRedirect(String URL)方法設置頁面重定向?qū)⒏淖優(yōu)g覽器地址欄信息,所以也稱客戶端跳轉(zhuǎn)。
實例1:response對象實現(xiàn)頁面的自動刷新:只需要早JSP頁面中加上
<%--使用response對象的setIntHeader設置屬性Refresh的值(單位為秒)來實現(xiàn)頁面自動刷新--%> <% response.addIntHeader("Refresh",10); %>
實例2:實現(xiàn)頁面自動跳轉(zhuǎn):可以通過response對象的setHeader()方法添加一個標題為Refresh的標頭,并制定頁面跳轉(zhuǎn)時間及跳轉(zhuǎn)頁面,從而實現(xiàn)頁面自動跳轉(zhuǎn)。 <% response.setHeader("Refresh","10;URL=http://www.baidu.com"); %>
這里使用setHeader方法添加一個標題為"Refresh",值為"10,URL=http://www.baidu.com"的標頭。
五、out對象:用來向頁面輸出信息。
方法 | 返回值類型 | 方法說明 |
clear() | void | 清除網(wǎng)頁上輸出內(nèi)容 |
clearBuffer() | void | 清除緩沖區(qū)內(nèi)容 |
close() | void | 關(guān)閉緩沖區(qū),清除所有內(nèi)容 |
getBufferSize() | int | 取得緩沖區(qū)大小 |
getRemaining() | int | 取得緩沖區(qū)剩余大小 |
isAutoFulsh() | boolean | 獲得緩沖區(qū)是否進行自動清除的信息 |
print(String str) | void | 進行頁面輸出 |
println(String str) | void | 進行頁面輸出并換行 |
六、session對象:用來表示用戶的會話狀況,一般用于保存用戶的各種信息,直到生命周期超時或者被認為釋放掉為止。
方法 | 返回值類型 | 方法說明 |
getId() | String | 獲取session的ID |
getCreationTime() | long | 獲取session的生成時間 |
getLashAccessedTime() | long | 獲取用戶最后通過session發(fā)送請求時間 |
getMaxInactiveInterval() | long | 獲取session生命周期,如果超過這個時間則失效 |
invalidate() | void | 清空session內(nèi)容 |
isNew() | boolean | 判斷session是否為“新”的 |
setMaxInactiveInterval() | void | 設置session生命周期,如果超過這個時間則失效 |
七、application對象:用來取得和設置Servlet的相關(guān)信息。
方法 | 返回值類型 | 方法說明 |
getMajorVersion() | int | 獲取主要的Servlet API版本 |
getMinorVersion() | int | 獲取次要的Servlet API版本 |
getServerInfo() | String | 獲取服務器版本 |
getMimeType() | String | 獲取指定文件的MIME類型 |
getContext() | ServerContext | 獲取指定Local的Application context |
getRealPath | String | 獲取指定path的絕對路徑 |
八、pageContext對象:可以用來設置page范圍的屬性,還可以設置其他范圍屬性,不過需要指定范圍參數(shù),同時還可以獲取其他內(nèi)置對象。
方法 | 返回值 | 方法說明 |
getException() | Exception | 獲取當前的exception內(nèi)置對象 |
getOut() | JspWriter | |
getPage() | Object | |
getRequest() | ServletRequset | |
getResponse() | ServletResponse | |
getServletConfig() | ServletConfig | |
getServeltContext() | ServletContext | |
getSession() | HttpSession | |
getAttribute(String name,int scope) | Object | 獲取指定范圍的name屬性值 |
getAttributeNamesInScope(int scope) | Enumeration | 獲取指定范圍所有屬性名稱 |
getAttributesScope(String name) | int | 獲取屬性名稱為name的屬性范圍 |
removeAttribute(String name) | void | 移除屬性名稱為name的 屬性 |
removeAttribute(String name,int scope) | void | 移除指定范圍的屬性名稱為name的 屬性 |
setAttribute(String name,Object value,int scope) | void | 設置指定范圍的name屬性 |
findAttribute(String name) | Object | 尋找所有范圍的屬性名稱為name的屬性 |
九、page對象:page對象代表JSP轉(zhuǎn)譯后的Servlet,通過page對象可以非常方便地調(diào)用Servlet類中定義的方法。
實例1:通過page對象調(diào)用Servlet類中定義的方法
<%@ page language="java" contentType="text/html;charset=gb2312"%> <%@ page info="this is the page Object Practice" %> <html> <head> <title>page對象</title> </head> <body> <%--通過page對象調(diào)用Servlet中的getServletInfo()方法 --%> <% String info = ((javax.servlet.jsp.HttpJspPage)page).getServletInfo(); %> <%=info %> </body> </html>
輸出:this is the page Object Practice.
十、config對象:可以用來獲取Servlet的配置信息。
方法 | 返回值類型 | 方法說明 |
getInitParameter(name) | String | 獲取Servlet初始化參數(shù) |
getInitParameterNames() | Enumeration | 獲取Servlet所有初始化參數(shù)名稱 |
getServletContext() | ServletContext | 獲取當前Application context |
getServletName() | String | 獲取Servlet名稱 |
十一、exception對象:用來處理錯誤異常,如果要用exception對象,必須指定page中的isErrorPage屬性值為true。
實例:exception用來處理錯誤異常
1、包含錯誤的頁面:error.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" errorPage="ExceptionDemo01.jsp"%> <html> <head> <title>錯誤頁面</title> </head> <body> <% int[] arr = {1,2,3}; out.println(arr[3]); %> </body> </html>
注:error.jsp中arr[3]數(shù)組下表越界.需在page指令中指定errorPage的屬性值為相應的異常處理程序。
2、異常處理頁面:exceptionDo.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" isErrorPage="true"%> <%@page import="java.io.PrintStream"%> <html> <head> <title>處理錯誤異常</title> </head> <body> <%=exception%><br> <%=exception.getMessage()%><br> <%=exception.getLocalizedMessage()%><br> <% exception.printStackTrace(new java.io.PrintWriter(out)); %> </body> </html>
注:必須在page指令中指定屬性isErrorPage屬性值為true。也就是說這個頁面可以用于異常處理。
將會在exceptionDo.jsp中打印出error.jsp中的數(shù)組下標越界異常 信息