Web開發中的域問題:PageContext,Request,Session,ServletContext(Application)

來源:互聯網
上載者:User

標籤:http   io   ar   使用   java   sp   for   檔案   資料   

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應用的配置資訊和配置參數。

 

 

Web開發中的域問題:PageContext,Request,Session,ServletContext(Application)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.