九大內置對象 | ||||
內置對象 | 類型 | 說明 | 作用域 | |
request | javax.servlet.ServletRequest | 請求對象——在 一次請求/一個Request請求周期 中傳遞數據,請求結束后,數據不可訪問,用于頁面之間的值的傳遞 | 用戶請求期 | |
response | javax.servlet.SrvletResponse | 響應對象——用來響應客戶端請求并向客戶端輸出信息 | 頁面執行期 | |
out | javax.servlet.jsp.JspWriter | 輸出對象——表示輸出流,該流將作為請求的響應發送到客戶端 | 頁面執行期 | |
javax.servlet.http.HttpSession | 會話對象——在一個session會話周期中,用于存儲有關用戶會話的所有信息 | 會話周期 | ||
javax.servlet.ServletContext | 應用程序對象——用于實現用戶之間的數據共享,負責提供應用程序在服務器中運行時的一些全局信息 | 整個程序運行期 | ||
pageContext | javax.servlet.jsp.PageContext | 頁面上下文對象——此對象提供所有四個作用域層次的屬性查詢和修改能力,它也提供了轉發請求到其它資源和包含其他資源的方法 | 頁面執行期 | |
page | javax.lang.Object | 頁面對象——只在當前JSP頁面內有效,提供對網頁上定義的所有對象的訪問,其表示的就是頁面本身 | 頁面執行期 | |
config | javax.servlet.ServletConfig | 配置對象——是ServletConfig的實例,代理當前jsp頁面配置,提供配置信息 | 頁面執行期 | |
Execpiton | javax.lang.Throwable | 例外對象——此對象指JSP文件運行時所產生的例外對象,也就是JSP引擎在執行代碼時拋出的異常,此對象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true"%>”的JSP文件中使用,也就是說只有在page指令中具有屬性isErrorPage="true"時才有效 | 頁面執行期 |
Out對象時一個輸出流,用來向客戶端輸出數據。Out對象用于各種數據的輸出。其常用方法如下。
1. out.PRint():輸出各種類型數據。
2.out.newLine():輸出一個換行符。
3.out.close():關閉流。
out 對象方法 | |||
返回類型 | 方法名稱 | 說明 | |
void | clear() | 清除輸出緩沖區的內容,但是不輸出到客戶端 | |
void | clearBuffer() | 清除輸出緩沖區的內容,并輸出到客戶端 | |
void | close() | 關閉輸出流,清除所有內容 | |
void | flush() | 輸出緩沖區里面的數據 | |
int | getBufferSize() | 獲取以kb為單位的目前緩沖區大小 | |
int | getRemaining() | 獲取以kb為單位的緩沖區中未被占用的空間大小 | |
boolean | isAutoFlush() | 是否自動刷新緩沖區 | |
void | newLine() | 輸出一個換行字符 | |
void | print(Object) | 將指定類型的數據輸出到Http流,不換行 | |
void | println(Object) | 將指定類型的數據輸出到Http流,并輸出一個換行符 | |
Appendable | append(char c | CharSequence cxq, int start, int end | CharSequence cxq ) | 將一個字符或者實現了CharSequence接口的對象添加到輸出流的后面 |
1.request的getParameter()方法是最為常用的,使用此方法可以獲得上一頁面的所提交的參數值、例如:注冊頁面(reginput.jsp)通過HTML表單為注冊提交頁面(reginfo.jsp)提交了兩個參數,
名稱分別為name和pwd,通過調用request.getParameter("name")和request.getParameter("pwd")就可以獲取這兩個參數的值
2.在注冊頁面中,出現了多個復選框,復選框的名字都是channel,在注冊提交頁面中使用getParameterValues("channel")方法就可以獲取一個置字符串是數組,可以該數組中存儲的是所有選中的
復選框對應的值。
3.request對象的setCharacterEncoding()方法用于設置字符集,可以用來解決中文亂碼問題,
為什么會出現中文亂碼問題?
常用字符集編碼有ASCII,ISO-8859-1,GB2312,GBK,Unicode,UTF-8等,java在其內部使用Unicode字符集來表示字符,這樣就存在Unicode字符集和本地字符集進行轉換的過程。在Web應用中,
通常都包括了瀏覽器,Web服務器,Web應用程序和數據庫等部分,每一部分都有可能使用不同的字符集,從而導致字符數據在各種不同的字符集之間轉換時,出現亂碼問題。
request 對象方法 | |||
返回類型 | 方法名稱 | 說明 | |
Object | getAttribute(String name) | 返回由name指定的屬性值,該屬性不存在時返回null | |
Enumeration | getAttributeNames() | 返回request對象的所有屬性名稱的集合 | |
String | getAuthType() | 返回用來保護servlet的認證方法的名稱,未受保護時返回null | |
String | getCharacterEncoding() | 返回請求中的字符編碼方法,可以在response對象中設置 | |
int | getContentLength() | 返回請求的BODY的長度,不能確定長度時返回-1??梢栽趓esponse中設置 | |
String | getContentType() | 返回在response中定義的內容類型 | |
String | getContentPath() | 返回請求的路徑 | |
Cookie[] | getCookies() | 返回客戶端所有的Cookie的數組 | |
Enumeration | getHeaderNames() | 返回所有HTTP頭的名稱的集合 | |
Enumeration | getHeaders(String name) | 返回指定HTTP頭的所有值的集合 | |
String | getHeader(String name) | 返回指定名稱的HTTP頭的信息 | |
long | getDateHeader(String name) | 返回指定名稱的Data類型的HTTP頭的信息 | |
int | getIntHeader(String name) | 返回指定名稱的Int類型的HTTP頭的信息 | |
ServletInputStream | getInputStream() | 返回請求的輸入流 | |
Locale | getLocale() | 返回當前頁的Locale對象(此對象有兩個方法,分別是getDisplayCountry和getDisplayLanguage),可以在response中設定 | |
Enumeration | getLocales() | 返回請求中所有的Locale對象的集合 | |
String | getLocalName() | 獲取響應請求的服務器端主機名 | |
String | getLocalAddr() | 獲取響應請求的服務器端地址 | |
int | getLocalPort() | 獲取響應請求的服務器端端口 | |
String | getMethod() | 獲取客戶端向服務器端發送請求的方法(GET、POST) | |
String | getParameter(String name) | 獲取客戶端發送給服務器端的參數值 | |
Map | getParameterMap() | 該方法返回包含請求中所有參數的一個Map對象 | |
Enumeration | getParameterNames() | 返回請求中所有參數的集合 | |
String[] | getParameterValues(String name) | 獲得請求中指定參數的所有值 | |
String | getQueryString() | 返回get方法傳遞的參數字符串,該方法不分解出單獨的參數 | |
String | getPathInfo() | 取出請求中處于ServletPath和QueryString之間的額外信息 | |
String | getPathTranslated() | 返回用getPathInfo()方法取得的路徑信息的實際路徑 | |
String | getProtocol() | 返回請求使用的協議。可以是HTTP1.1或者HTTP1.0 | |
BufferedReader | getReader() | 返回請求的輸入流對應的Reader對象,該方法和getInputStream()方法在一個頁面中只能調用一個 | |
String | getRemoteAddr() | 獲取發出請求的客戶端ip地址 | |
String | getRemoteHost() | 獲取發出請求的客戶端主機名 | |
String | getRemoteUser() | 返回經過客戶端驗證的用戶名,未經驗證返回null | |
int | getRemotePort() | 返回發出請求的客戶端主機端口 | |
String | getRealPath(String path) | 返回給定虛擬路徑的物理路徑 | |
RequestDispatcher | getRequestDispatcher(String path) | 按給定的路徑生成資源轉向處理適配器對象(轉發) | |
String | getRequestedSessionId() | 返回請求的session的標識 | |
String | RequestURI() | 返回發出請求的客戶端地址,但是不包括請求的參數字符串 | |
StringBuffer | getRequestURI() | 返回響應請求的服務器端地址 | |
String | getScheme() | 獲取協議名稱,缺省值為HTTP協議 | |
String | getServerName() | 返回響應請求的服務器名稱 | |
String | getServletPath() | 獲取客戶端所請求的腳本文件的文件路徑 | |
int | getServerPort() | 獲取響應請求的服務器端主機端口號 | |
void | removeAttribute(String name) | 在屬性列表中刪除指定名稱的屬性 | |
void | setAttribute(String name, Object value) | 在屬性列表中添加/刪除指定的屬性 | |
void | setCharacterEncoding(String charset) | 設置請求的字符編碼格式 | |
HttpSession | getSession() | getSession(boolean create) | 獲取session,如果create為true,在無session的情況下創建一個 | |
boolean | isRequestedSessionIdFromCookie() | 檢查請求的會話ID是否為通過Cookie傳入 | |
boolean | isRequestedSessionIdFromURL() | 檢查請求的會話ID是否為通過URL傳入 | |
boolean | isRequestedSessionIdValid() | 檢查請求的會話ID是否仍然有效 | |
boolean | isSecure() | 檢查請求是否使用安全鏈接,如果HTTPS等 | |
boolean | isUserInRole(String role) | 檢查已經通過驗證的用戶是否在是role所指定的角色 | |
Principal | getUserPrincipal() | 返回包含用戶登陸名的一個java.security.Principal對象 |
response對象:
1.對客戶端的請求作出回應,將Web服務器處理后的結果發回客戶端。
2.屬于javax.servlet.HttpServletResponse接口的實例。
response 對象方法 | |||
返回類型 | 方法名稱 | 說明 | |
void | addCookie(Cookie cookie) | 添加一個Cookie對象,保存客戶端信息 | |
void | addDateHeader(String name, long value) | 添加一個日期類型的HTTP頭信息,覆蓋同名的HTTP頭信息 | |
void | addHeader(String name, String value) | 添加一個HTTP頭,覆蓋同名的舊HTTP頭 | |
void | addIntHeader(String name, int value) | 添加一個整型的HTTP頭,覆蓋同名的舊HTTP頭 | |
boolean | containsHeader(String name) | 判斷指定的HTTP頭是否存在 | |
String | encodeRedirectURL(String url) | 對sendRedirect()方法使用的URL進行編碼 | |
String | encodeURL(String url) | 將URL予以編碼,回傳包含session ID的URL | |
void | flushBuffer() | 強制把當前緩沖區的內容發送到客戶端 | |
int | getBufferSize() | 取得以kb為單位的緩沖區大小 | |
String | getCharacterEncoding() | 獲取響應的字符編碼格式 | |
String | getContentType() | 獲取響應的類型 | |
Locale | getLocale() | 獲取響應的Locale對象 | |
ServletOutputStream | getOutputStream() | 返回客戶端的輸出流對象 | |
PrintWriter | getWriter() | 獲取輸出流對應的writer對象 | |
boolean | isCommitted() | 判斷服務器端是否已經將數據輸出到客戶端 | |
void | reset() | 清空buffer中的所有內容 | |
void | sendError(int xc | int xc, String msg) | 發送錯誤,包括狀態碼和錯誤信息 | |
void | sendRedirect(String locationg) | 把響應發送到另外一個位置進行處理(轉發) | |
void | setBufferSize(int size) | 設置以kb為單位的緩沖區大小 | |
void | setCharacterEncoding(String charset) | 設置響應使用的字符編碼格式 | |
void | setContentLength(int length) | 設置響應的BODY長度 | |
void | setContentType(String type) | 設置響應的類型 | |
void | setDateHeader(String name, long value) | 設置指定名稱的Data類型的HTTP頭的值 | |
void | setHeader(String name, String value) | 設置指定名稱的HTTP頭的值 | |
void | setIntHeader(String name, int value) | 設置指定名稱的int類型的HTTP頭的值 | |
void | setStatus(int xc) | 設置響應狀態碼,新值會覆蓋當前值 |
轉發圖解:
重定向圖解:
如果想從一個頁面重定向到另一個目標頁面,這個時候使用的是轉發操作,
request.getRequestDispatcher("main.jsp").forward(request,response);
重定向和轉發:
01.從客戶端發送的請求數量來看,重定向是向服務器發送了兩次請求。而轉發是服務器內部進的操作,只發送了一次請求,request對象中的數據可以保留 。
02.從URL顯示的角度來說:重定向這兩次請求都是直接受瀏覽器干預的。也就是說重定向后url地址欄里看到的地址發生變化了。而轉發是由服務器內部從一個資源頁面定位到另一個資源頁面,并沒有經過瀏覽器干預,所以url地址欄沒有發生改變。
結論:要想在request中保存數據,那么就使用轉發,否則使用重定向。
重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。因為,當你使用重定 向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,因為瀏覽器還得發出一個新的請求。同時,由于重定向方式產生了一個新的請求,所以經過一次重定向后,request內的對象將無法使用。
怎么選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的對象,所以他是第一選擇。但是由于在轉發之后,瀏覽器中URL仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉發。
不要僅僅為了把變量傳到下一個頁面而使用session作用域,那會無故增大變量的作用域,轉發也許可以幫助你解決這個問題。
重定向:以前的request中存放的變量全部失效,并進入一個新的request作用域。
轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。
1. 重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。因為,
當你使用重定向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,因為瀏覽器還得發出一個新的請求。同時,由于重定向方式產生了一個新的請求,所以經過一次重定向后,request內的對象將無法使用。
怎么選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的對象,所以他是第一選擇。但是由于在轉發之后,瀏覽器中URL仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉發。
2. 不要僅僅為了把變量傳到下一個頁面而使用session作用域,那會無故增大變量的作用域,轉發也許可以幫助你解決這個問題。
重定向:以前的request中存放的變量全部失效,并進入一個新的request作用域。
轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。
重定向過程:
客戶瀏覽器發送http請求----》
web服務器接受后發送302響應要求客戶瀏覽器發送一個新的http請求----》
客戶端瀏覽器接受此響應后在發送一個新的http請求到服務器----》
服務器根據此請求尋找資源并發送給客戶,
它可以重定向到任意URL,
不能共享request范圍內的數據。
轉發過程:
客戶瀏覽器發送http請求----》
web服務器接受此請求后調用內部的一個方法在容器內部完成請求處理和轉發動作----》
將目標資源發送給客戶,它只能在同一個web應用中使用,可以共享request范圍內的數據。
怎么選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的對象,
所以他是第一選擇。但是由于在轉發之后,瀏覽器中URL仍然指向開始頁面,
此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉發。
還是老樣子先看看圖:
TTP協議是無狀態的,即信息無法通過HTTP協議本身進傳遞。為了跟蹤用戶的操作狀態,asp應用SESSION對象。JSP使用一個叫HttpSession的對象實現同樣的功能。HTTPSession 是一個建立在cookies 和URL-rewriting上的高質量的界面。
Session的信息保存在服務器端,Session的id保存在客戶機的cookie中。事實上,在許多服務器上,如果瀏覽器支持的話它們就使用cookies,但是如果不支持或廢除了的話就自動轉化為URL-rewriting,session自動為每個流程提供了方便地存儲信息的方法。
Session一般在服務器上設置了一個30分鐘的過期時間,當客戶停止活動后自動失效。Session 中保存和檢索的信息不能是基本數據類型如 int, double等,而必須是java的相應的對象,如Integer, Double。
Httpsession具有如下API:
getId 此方法返回唯一的標識,這些標識為每個session而產生。當只有一個單一的值與一個session聯合時,或當日志信息與先前的sessions有關時,它被當作鍵名用。
GetCreationTime 返回session被創建的時間。最小單位為千分之一秒。為得到一個對打印輸出很有用的值,可將此值傳給Date constructor 或者GregorianCalendar的方法setTimeInMillis。
GetLastaccessedTime 返回session最后被客戶發送的時間。最小單位為千分之一秒。
GetMaxInactiveInterval 返回總時間(秒),負值表示session永遠不會超時。
getAttribute 取一個session相聯系的信息。(在jsp1.0中為 getValue)
Integer item = (Integer) session.getAttrobute("item") //檢索出session的值并轉化為整型
setAttribute 提供一個關鍵詞和一個值。會替換掉任何以前的值。(在jsp1.0中為putValue)
session.setAttribute("ItemValue", itemName); // ItemValue 必須不是must簡單類型
在應用中使用最多的是getAttribute和setAttribute。現以一個簡單的例子來說明session的應用, test1.jsp(信息寫入session),test2.jsp(從session讀出信息)。
1 test1.jsp 2 3 <HTML> 4 5 <HEAD> 6 7 <TITLE> Document </TITLE> 8 9 </HEAD>10 11 <BODY BGCOLOR="#FFFFFF">12 session.setAttribute("str",new String(“this is test”));13 </BODY>14 15 </HTML>16 test2.jsp17 <HTML>18 19 <HEAD>20 <TITLE> New Document </TITLE>21 22 </HEAD>23 24 <BODY BGCOLOR="#FFFFFF">25 <%26 String ls_str=null;27 ls_str=(String)session.getAttribute("str");28 out.println(“從session里取出的值為:”+ls_str);29 %>30 </BODY>31 32 </HTML>
新聞熱點
疑難解答