程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> java四大域總結,java四大域

java四大域總結,java四大域

編輯:JAVA綜合教程

java四大域總結,java四大域


最近學完了web部分,發現有些地方總是單個容易理解,可是把所有的放在一起來大雜燴,總是有那麼幾個知識點容易混淆。其實網上的資料已經夠多了,雖然也不乏辛勞的搬運工。可是最終的目的不就是要我們自身理解嗎?自己理解了的東西才正真是我們的。作為額外的獎勵,我們先來關注一下JSP的九大隱式對象。

可以看看下圖中關於JSP的九大隱式對象,它們可總是被老師們說是重點重點哦。

 

 

作用域------顧名思義,起作用的大小范圍也!如果是你自己去學習一個知識點,你要達到哪些目標才算是對一個知識點稱得上是懂得,理解,掌握呢?從扁神醫的望聞問切,到數據庫的增刪改查,所有的事物開始也不外乎:是什麼?有什麼用?怎麼用?為什麼可以這麼用?故而,我覺得咱們應該把握以下問題,帶著這些問題去學習,發現自己的不足,才是學習的上策。

1)作用域的實際大小。(是什麼?)

2)  作用域的作用。(有什麼用?)

3)怎麼使用這些作用域。(怎麼用?)

4)它這樣使用實現的原理。(為什麼可以這麼用?)

 

下面開始逐一分析:

(一)servletcontext域(application域)

1)作用域的實際大小。(是什麼?)

  servletcontext域起作用的范圍是:整個web應用程序。

  數據產生之後,不僅等會還要用 ,還要給別人用,則請使用servletcontext。

  它是四個域中范圍最大的域。

2)  作用域的作用。(有什麼用?)

  由於一個web應用中的所有servlet共享同一個servletcontext對象,所以多個servlet通過servletcontext對象實現了數據在不同servlet之間的共享。

3)怎麼使用這些作用域。(怎麼用?)

  a)可以通過編程的方式綁定,也可以作為web應用的全局變量被所有Servlet和JSPs訪問

 

      

設置Context屬性:

              ServletContext application=this.getServletContext();

              application.setAttribute("person1",new Person("Jim"));

              application.setAttribute("person2",new Person("Green"));

      獲取Context屬性:

              ServletContext application=this.getServletContext();

              Enumberation persons=application.getAttributeNames();

               while(persons.hasMoreElements()){

                      String name=(String)persons.nextElement();

                      Person p=(Person)persons.getAttribute(name);

                      application.removeAttribute(name);
              }

 

  b)為整個web應用配置context域:

  修改web.xml配置文件,加入以下內容

  <context -param>

    <param-name>data</param-name>

    <param-value>Hello world !</param-value>

  </context - param>

  從Servlet中訪問這些初始化參數:

              ServletContext application=this.getServletContext();

              out.println(application.getInitParameter("data"));

 

  c)讀取資源文件

     使用ServletContext接口可以直接訪問web應用中的靜態內容文檔結構.包括HTML,GIF和JPEG文件。如以下方法:
         .getResource()
         .getResourceAsStream()
   這兩個方法的參數都是以"/"開頭的字符串,表示資源相對於context根的相對路徑.文檔結構可以存在於服務器文件系統,或是war包中,或是在遠程服務器上,抑或其他位置。不可以用來獲得動態資源,比如,getResource("/index.jsp"),這個方法將返回該jsp文件的源碼,而不是動態頁面.可以用 "Dispatching Requests" 獲得動態內容.列出web應用中可被訪問的資源,可以使用getResourcePaths(String path)方法。

             

4)它這樣使用實現的原理或優缺點。(為什麼可以這麼用?)

  servlet並不適合做數據輸出,故需要將數據轉發給JSP文件進行美化再輸出給客戶端。

  JSP中可嵌入java代碼,這使得它接收java數據變得可能。同時,由於servletcontext域可使整個web應用共享該數據,因此而帶來“線程安全”問題同樣影響對轉發的數據,故而需要使用request域。

 

(二)Httpsession域(session域)

1)作用域的實際大小。(是什麼?)

  Httpsession的作用域是:一次會話。

  數據產生之後顯示給用戶了,等會還要使用的情況下使用Httpsession域。

  它是四個域中范圍第二大的域。

2)  作用域的作用。(有什麼用?)

  (會話范圍)在第一次調用request.getSession()方法時,服務器會檢查是否已經有對應的session。如果沒有,就在內存中創建一個session並返回。當一短時間內(默認30分鐘)session沒有被使用,則服務器會銷毀該session。若服務器非正常關閉,未到期的session也會跟著銷毀。若調用session提供的invalidate()方法,可以立即銷毀session。

3)怎麼使用這些作用域。(怎麼用?)

  

  a) jsp中操作session
    (String)request.getSession().getAttribute("username"); // 獲取
    request.getSession().setAttribute("username", "xxx");  // 設置

   b) java中操作session
    //servlet中
    request.getSession();
    session.getAttribute("username");
    session.setAttribute("username", "xxx");
    session.setMaxInactiveInterval(30*60);
    session.invalidate();
 
    //struts中方法1
    ServletActionContext.getRequest().getSession().setAttribute("username", "xxx");
    ServletActionContext.getRequest().getSession().getAttribute("username");
    ServletActionContext.getRequest().getSession().setMaxInactiveInterval(30*60);
    ServletActionContext.getRequest().getSession().invalidate();

    //struts中方法2
    ActionContext.getContext().getSession().put("username", "xxx");
    ActionContext.getContext().getSession().get("username");
    ActionContext.getContext().getSession().clear();

   c) web.xml中操作session
    <session-config>  
        <session-timeout>30</session-timeout>  
    </session-config>

   d) tomcat-->conf-->conf/web.xml
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

 

 

 

4)它這樣使用實現的原理。(為什麼可以這麼用?)

  HttpSession在服務器中,為浏覽器創建獨一無二的內存空間,在其中保存了會話相關的信息。服務器創建session出來後,會把session的id號,以cookie的形式回寫給客戶機,這樣,只要客戶機的浏覽器不關,再去訪問服務器時,都 會帶著session的id號去,服務器發現客戶機浏覽器帶session id過來了,就會使用內存中與之對應的session為之服務。如果要問我為什麼,我也不知道啊!

 

(三)ServletRequest域(request域)

1)作用域的實際大小。(是什麼?)

  ServletRequset域是:整個請求鏈(請求轉發也存在)。

  數據產生之後,只需要使用一次,這種情況下請使用ServletRequset域。

  它是四個域中范圍排第三的域。

2)  作用域的作用。(有什麼用?)

  在整個請求鏈中共享數據。

  最常用到:在servlet中處理好的數據交給JSP顯示,此時參數就可以放置在ServletRequset域中帶過去。

3)怎麼使用這些作用域。(怎麼用?)

  a) 獲得客戶機信息的方法
      getRequestURL方法返回客戶端發出請求時的完整URL。
      getRequestURI方法返回請求行中的資源名部分。
      getQueryString 方法返回請求行中的參數部分。
      getRemoteAddr方法返回發出請求的客戶機的IP地址
      getRemoteHost方法返回發出請求的客戶機的完整主機名
      getRemotePort方法返回客戶機所使用的網絡端口號
      getLocalAddr方法返回WEB服務器的IP地址。
      getLocalName方法返回WEB服務器的主機名
      getMethod得到客戶機請求方式
   b) 獲得客戶機請求頭
      getHeader(string name)方法
      getHeaders(String name)方法
      getHeaderNames方法
   c) 獲得客戶機請求參數(客戶端提交的數據)
      getParameter(name)方法
      getParameterValues(String name)方法
      getParameterNames方法
      getParameterMap方法

4)它這樣使用實現的原理。(為什麼可以這麼用?)

  在service方法調用前由服務器創建,傳入service方法。整個請求結束,request生命結束。

 

(四)PageContext域(page域)

1)作用域的實際大小。(是什麼?)

  PageContext域的作用范圍是:整個JSP頁面。

  它是四個域中范圍最小的一個域。

2)  作用域的作用。(有什麼用?)  
  a) 它可以獲取其它八大隱式對象,可以認為它是一個入口對象。

  b) 獲取其它所有域中的數據。

  c) 跳轉到其它資源。其身上提供了forword和sendRedirect方法,簡化了轉發和重定向的操作。 

3)怎麼使用這些作用域。(怎麼用?)

  以下以一個簡單的JSP頁面程序為例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title>pageContext對象_例1</title></head>
<body><br>
<%
//使用pageContext設置屬性,該屬性默認在page范圍內
pageContext.setAttribute("name","地球");
request.setAttribute("name","太陽系");
session.setAttribute("name","銀河系");
//session.putValue("name","麥哲倫系");
application.setAttribute("name","宇宙");
%>
page設定的值:<%=pageContext.getAttribute("name")%><br>
request設定的值:<%=pageContext.getRequest().getAttribute("name")%><br>
session設定的值:<%=pageContext.getSession().getAttribute("name")%><br>
application設定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
范圍1內的值:<%=pageContext.getAttribute("name",1)%><br>
范圍2內的值:<%=pageContext.getAttribute("name",2)%><br>
范圍3內的值:<%=pageContext.getAttribute("name",3)%><br>
范圍4內的值:<%=pageContext.getAttribute("name",4)%><br>
<!--從最小的范圍page開始,然後是reques、session以及application-->
<%pageContext.removeAttribute("name",3);%>
pageContext修改後的session設定的值:<%=session.getValue("name")%><br>
<%pageContext.setAttribute("name","宇宙",4);%>
pageContext修改後的application設定的值:<%=pageContext.getServletContext().getAttribute("name")%><br>
值的查找:<%=pageContext.findAttribute("name")%><br>
屬性name的范圍:<%=pageContext.getAttributesScope("name")%><br>
</body></html>

 

 

 

顯示結果:

 

page設定的值:地球
request設定的值:太陽系
session設定的值:銀河系
application設定的值:宇宙
范圍1內的值:地球
范圍2內的值:太陽系
范圍3內的值:銀河系
范圍4內的值:宇宙
pageContext修改後的session設定的值:null
pageContext修改後的application設定的值:宇宙
值的查找:地球
屬性name的范圍:1

 

 

 

 

4)它這樣使用實現的原理。(為什麼可以這麼用?)

   pageContext對象,這個對象代表頁面上下文,該對象主要用於訪問JSP之間的共享數據。當對JSP的請求時開始,當響應結束時銷毀。

 

 

 



 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved