Web開發中的四個域對象(范圍由小到大):
page(jsp有效) request(一次請求) session(一次會話) application(當前web應用)
page域指的是pageContext.
request域指的是HttpServletRequest
session 域指的是HTTPSession
application 域指的是ServletContext
之所以他們是域對象,原因就是他們都內置了map集合,都有setAttribute getAttribute方法。而且他們的name都是String類型,而value都是Object類型。
他們都有自己固定的生命周期和作用域。
這四個對象的生命周期(生命周期就是值對象的創建到銷毀的期間):
page:jsp頁面被執行,生命周期開始,jsp頁面執行完畢,聲明周期結束。
request:用戶發送一個請求,開始,服務器返回響應,請求結束,生命周期結束。
session:用戶打開瀏覽器訪問,創建session(開始),session超時或被聲明失效,該對象生命周期結束。
application:web應用加載的時候創建。Web應用被移除或服務器關閉,對象銷毀。[結束]。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
注意:
1.Page只在當前jsp有效,每次請求分別對應不同的request.
2.Request,只在當前請求有效,每次請求分別對應不同的request域
【Request域】可以調用request這個隱含對象的getAttribute()方法來訪問具有這種范圍類型的對象。也可以使用getParameter(String name) return String來獲取XML里傳遞給它的參數。
String data = "XBY request";
request.setAttribute("data4",data);
request.getRequestDispatcher("/1.jsp").forward(request, response);
Request可以用於Forward
String data = (String)request.getAttribute("data");
out.write(data);
【如果在forward前將在Servlet程序中寫入的部分內容已經被真正地傳送到客戶端,forward方法將拋出IllegalStateException異常。】關鍵在跳轉后要return.
如果在調用Forward方法前向servlet引擎的緩沖區(response)中寫入內容,只要寫入到緩沖區的內容還沒有真正輸出到客戶端,forward方法將可以被正常執行,原來寫入到緩沖區的內容 會被清空,但是,已經寫入到HttpServletResponse對象的響應字段信息保持有效。
Forward請求轉發特點:
1.客戶端只發出了一次請求,而服務器端有多個資源調用
2.客戶端瀏覽器端RUL不會變化。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
3.Session只在一次會話中有效,會話結束就無法取到數據了。getAttribute(String name) return Object
HttpSession session = request.getSession();
session.setAttribute("name", "電視");
response.setCharacterEncoding("UTF-8");//處理中文亂碼問題
response.setContentType("text/html;charset=UTF-8");//處理中文亂碼問題
PrintWriter out = response.getWriter();//處理中文亂碼問題
HttpSession session = request.getSession();
String product = (String)session.getAttribute("name");
out.write(product);
只有當getSession()時,服務器才會為該瀏覽器創建session,他的生命周期默認為30min。
<session-config>
<session-timeout>10</session-timeout>
</session-config>
當使用request.getSession(false);時,就是查看session,不生成session.例如在查看已購買東西時,會使用。//ie8的話,開2個瀏覽器還是共享一個session,ie7是服務器把sessionid寫進了瀏覽器的進程中,而ie8是服務器實現了多個同一款瀏覽器的session共享。
【cookie】如果沒有指定Cookies對象的有效期,則Cookies對象只存在於客戶端的內存。當瀏覽器關閉時,Cookies就會失效。
HttpSession session = request.getSession();
String sessionid = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionid);
cookie.setPath("/servlet");
cookie.setMaxAge(30*60);
response.addCookie(cookie);
session.setAttribute("name", "電視");//重新寫cookie。設置時間。
如果禁用cookie,就是使用利用URL重寫技術讓瀏覽器的URL帶上SESSIONID。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
4.application:在JSP自動生成的Servlet文件中,是這樣定義的:final javax.servlet.ServletContext application;
ServletContext域:
1.這是一個容器
2.說明這個容器的作用范圍是整個應用程序范圍
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="xby ok";
this.getServletContext().setAttribute("data", data);
System.out.println("write ok!");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String value = (String)this.getServletContext().getAttribute("data");
System.out.println(value);
}
【補】ServletContext可以轉發Servlet,但是Servlet不方便顯示。
forward:
String data="xby yes!";
this.getServletContext().setAttribute("data", data);
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/1.jsp");
rd.forward(request, response);
這樣不好,因為涉及到多線程問題,ServletContext會被同一應用中的所有Servlet所共享】
通過ServletContext讀取web資源:
InputStream in= this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties props = new Properties();
props.load(in);
String username = props.getProperty("username");
String passwd = props.getProperty("passwd");
獲得資源文件路徑(用於上傳下載):
String path= this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
FileInputStream in = new FileInputStream(path);】
使用ServletContext管理相關的資源。webapp都是在jvm下執行的,所以絕對路徑就是在jvm的路徑。
ServletContext會在服務器啟動時創建,目錄在webapps中;服務器停止時會銷毀這個ServletContext.------------------------------------------------------------------------------------------------------------------------------------------------------------- -
四個域對象在選擇的時候,能用范圍小的絕不用范圍大的:
page:數據只是暫時存在集合,在jsp頁面的其他地方要用,用page(頁面中自定義的map)
(什么時候需要用map了,就用page)
Request:【程序產生數據,數據顯示完后就沒有用了】
數據只是做顯示的,看完了就沒用了。就存request域,請求轉發,Servlet產生的處理結果(數據)交給jsp顯示。數據轉發可以帶數據。
Session:【程序產生數據,顯示后等會還需要使用】
數據給用戶看完了,一定還要用,會話結束了就沒用了
用戶登錄,用戶信息發給客戶端看,看完了,一會訪問別的頁面還要看用戶信息。
購物車,購物車成功了,給用戶看購物車,待會隨時間可以查看購物車
請求重定向,因為是兩次請求,每一次請求的數據,第二次請求還要看。
application:【ServletContext在jsp中另一個名字就是application,數據顯示后,等會還需要用,還需要給別人用,例如聊天室】
數據給一個用戶用完了,別人還要用;
聊天室,聊天記錄,需要給所有的用戶看;統計網站在線人數,所有看到的應該是一個數
【總結】:四個域對象在選擇的時候,能用范圍小的絕不用范圍大的。
1.需要定義Map時不如用page,
2.請求Servlet,轉發給jsp的數據存request,
3.請求重定向帶過去的數據存Session,
4.全局的數據存application。
4.ServletContext:WEB容器在啟動時,他會為每一個【WEB應用程序】都創建一個對應的ServletContext對象,它代表【當前WEB應用】,駐留在服務器的內存里。
在一個contex中的數據都是共享的,它是web應用的配置信息和配置參數。
(轉自 http://www.cnblogs.com/boyangx/p/4081050.html)