Web開發四大作用域(轉)


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM