1. 程式人生 > >web四大作用域

web四大作用域

web開發中四個域物件
1.page域指pageContent(jsp有效)
2.request域指HttpServletRequest(一次請求)
3.session域指HTTPSession(一次會話)
4.application域指ServletContext(當前web應用)
他們之所以是域物件,原因是他們都內建了map集合,都有setAttribute和getAttribute方法。而且他們的name都是String型別,而value都是Object型別。
二.生命週期
page:jsp頁面被執行,生命週期開始,jsp頁面執行完畢,生命週期結束。
request:客戶傳送一個請求,開始,伺服器返回響應。請求結束,生命週期結束。
seesion:使用者訪問瀏覽器訪問,建立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應用的配置資訊和配置引數。