1. 程式人生 > >java中Servlet之域物件

java中Servlet之域物件

在Servlet裡面,有三個非常常用而且重要的物件,它們是:
1. Request (Request域)
2. Session (Session域)
3. ServletContext (ServletContext域)


這三個物件與別的物件有什麼特殊之處呢?
答:這三個物件可以存放資料.


Request的setAttribute()與getAttribute的用法:


RequestA:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

System.out.println("RequestA....");
String password = "123456xxx";
request.setAttribute("data", password);

// 請求分派可以跳轉到 HTML,Servlet,JSP...
request.getRequestDispatcher("/b").forward(request, response);
//response.sendRedirect("/day05/b");

}


RequestB:
public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {
System.out.println("RequestB....");
String data = (String)request.getAttribute("data");
System.out.println("data = " + data);
}


溫馨提示:
Request能夠存放資料,但是隻在一個請求範圍內生效!


----------------------------------------------------------------------------


ServletContext是什麼東西?
答:ServletContext是一個物件,這個物件代表整個Web應用,說白了就是代表整個網站。



ServletContext存放資料的作用與方法:
ServletContext存放資料的優點是:整個網站的動態頁面都能夠取到資料。


RequestA:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestA....");
String password = "123456xxx";
// 取出ServletContext的方式:
// ServletContext代表我們整個網站
ServletContext context = this.getServletContext();
context.setAttribute("data", password);
response.sendRedirect("/day05/b");
}


RequestB:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestB....");
String data = (String)this.getServletContext().getAttribute("data");
System.out.println("data = " + data);
}


ServletContext還有另外一個優點:
可以讀取web.xml檔案裡的初始化資訊。


<context-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</context-param>


ServletContext context = this.getServletContext();
String str = context.getInitParameter("encoding");


----------------------------------------------------------------------------


Session也可以存放資料:
同樣的,通過setAttribute()與getAttribute()這兩個方法:


A:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestA....");

// 獲取Session物件,通過request.getSession()方法
HttpSession session = request.getSession();
session.setAttribute("data", "12345xxx");
}


B:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("RequestB....");
String data = (String)request.getSession().getAttribute("data");
response.getOutputStream().write(data.getBytes());
}


Session的作用域範圍與ServletContext的區別:
ServletContext是整個網站
Seesion的作用域:
1. 如果是IE7.0及以前的版本,那麼Session的作用域範圍是一個瀏覽器。
2. 如果是IE7.0之後的版本,那麼Session的作用域範圍是一個使用者。
現在的瀏覽器版本都進行了升級,對Session的作用域範圍都進行的擴大。


ServletContext: 多個使用者
Seesion:單個使用者


----------------------------------------------------------------------------


總結:
Request的作用域範圍只限於一個請求


Session的作用域範圍是一個使用者
[最新的瀏覽器版本,老版本的瀏覽器如IE6,7的作用域範圍只限於一個作瀏覽器]


ServletContext的作用域範圍是所有使用者以及所有瀏覽器版本。




使用場景:
原則:存放資料的時候儘量選擇作用域範圍小的物件。
1. 如果你的資料在一個請求處理完之後就不需要再用了,那麼你就要選擇Request在存。
2. 如果你的資料在一個請求處理完之後等一會還要會,那你就用Session。
3. 如果你的資料在整個網站都要用,那就用ServletContext。


----------------------------------------------------------------------------


講Session原理:
“會話技術”
什麼叫會話?
電話?
計算機瀏覽器上的會話?


HTTP協議的特點:無狀態。
使用會話技術可以解決http無狀態所帶來的問題。


會話技術的實現方式有以下三種:
1. Cookie技術 [在客戶端的計算機上存放資料]
2. Session技術 [在伺服器的計算機上存放資料]
3. URL重寫技術 [伺服器絕招]




Cookie技術:
存:
public class SaveCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 建立Cookie物件
Cookie cookie = new Cookie("name", "zhangsan");

// 設定Cookie有效時間(單位是秒 60秒*6)
cookie.setMaxAge(60 * 6);

// 把cookie物件放在response物件裡面,輸出給客戶端
response.addCookie(cookie);
}
}
取:
public class GetCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
PrintWriter out = response.getWriter();
if (cookies != null) {
for (Cookie c : cookies) {
out.write(c.getName() + "=" + c.getValue() + "<br/>");
}
}
}
}




Session是實現會話技術的其中一種手段,那麼Session什麼時候開始呢?
答: 當呼叫getSession()的時候, Session的生命週期就開始了.




如果客戶端瀏覽器禁用Cookie,那麼“Cookie技術”和“Session技術”將無法實現會話的功能。
此時可以使用“URL重寫技術”來實現會話的功能。
URL重寫技術原理:就是在每個訪問的路徑後面加上一個ID值。


URL重寫技術通過Response的EncodeURL()方法實現。


public class URLServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();

// 使用URL重寫技術,首先要開啟Session,也就是要呼叫getSession()方法
request.getSession();

// response.encodeURL()作用是在一個訪問路徑的後面加上JSESSIONID
String u1 = response.encodeURL("/day05/sa");
String u2 = response.encodeURL("/day05/sb");

String link1 = "<a href='" + u1 + "'>購買衣服</a>";
String link2 = "<a href='" + u2 + "'>結帳</a>";

//String link1 = "<a href='/day05/sa'>購買衣服</a>";
//String link2 = "<a href='/day05/sb'>結帳</a>";

out.write(link1 + "<br/><br/>" + link2);
}
}
/*
<a href='/day05/sa'>購買衣服</a><br/><br/>
<a href='/day05/sb'>結帳</a>


<a href='/day05/sa;jsessionid=9C3303DCB2632226ABA7507ED97DABFB'>購買衣服</a><br/><br/>
<a href='/day05/sb;jsessionid=9C3303DCB2632226ABA7507ED97DABFB'>結帳</a>
*/

相關推薦

javaServlet物件

在Servlet裡面,有三個非常常用而且重要的物件,它們是:1. Request (Request域)2. Session (Session域)3. ServletContext (ServletContext域)這三個物件與別的物件有什麼特殊之處呢?答:這三個物件可以存放

Servlet三種物件的總結

什麼是域物件? 有的同學聽到“域物件”這個詞感到很高階,其實沒那麼複雜。儲存資料的區域就稱為“域物件”。 打個比喻:你家有一個池塘,池塘裡面有魚,有蝦,有螃蟹等等。這些水產品就是資料,整個池塘就是“域物件”。你可以將一些魚、蝦放進池塘裡,也可以從池塘裡撈出來。這

servlet的四大物件

1.域物件的作用: 用於儲存資料,獲取資料。可以在不同的動態資源之間共享資料。 案例1:    Servlet1(用於傳引數) Servlet2(用於獲取引數) name=“zhangsan”

Servlet如何將json物件轉化為Java的自定義物件

前段ajax$("#form1").submit(function() { var cname = $("input[name=cname]").val(); var sup_compan

java的類和物件

類 類在客觀世界裡是不存在的,是描寫物件的資訊 類是模子,確定物件將會擁有的特徵(屬性)和行為(方法)  類的特點 類是物件的型別 具有相同屬性和方法的一組物件的集合 屬性(特徵) int cpu  = 5.5; int screen 

014-java的位元組碼物件

    String string = "abc"; Class cls1 = string.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String");

JAVAOOAD(面向物件分析與設計依賴倒置原則)程式碼例項

簡介:什麼是依賴倒置原則? 軟體設計中,多層次之間相互依賴關係需要倒置為抽象類或介面,而不是直接依賴於具體的實現。 具體表現為: 1、上層模組不應該直接依賴下層實現,而應該依賴下層的抽象 2、每一個單獨的層次,抽象不應該依賴於細節,而細節應該依賴於抽象。 現在有一個使用者類UserBea

Servlet三大物件的應用

javaweb開發中就不能不談Servlet三大域物件的應用(request、session、application(ServletContext))。 1. request request是表示一個請求,只要發出一個請求就會建立一個request,它的作用域:僅在當前請求中有效。 用處:常用於伺服

javajson轉化成物件物件轉化成json

 首先要帶入第三方工具類jar包 gson 1,普通類: public void test() { //1、建立Gson物件 Gson gson = new Gson(); User user = new User(1, "liujinghan", "123456",

Java使用FastJSON進行物件的序列化和反序列化

Java中使用FastJSON進行物件的序列化和反序列化 1.新增依賴,maven的pom.xml檔案中新增以下依賴 <dependency> <groupId>com.alibaba</groupId> <arti

java類方法與物件方法區別

public class Test { /** * 下面這個方法就是靜態方法,應該就是樓主所說的類方法~~ * 靜態方法必須定義成static的,在類Test被例項化以前就已經存在於記憶體中 * 靜態方法使所有該類的例項也就是物件共有的方法 */ public static void f1() {

Java如何獲得一個物件所對應的類及Class類的簡單理解

Java中如何獲得一個物件所對應的類及Class類的簡單理解 前言 在之前的學習中,所用的程式語言主要是Python,最近開始學習Java,熟悉Python的同學應該會知道在Python中有一個函式type(),通過這個函式可以非常方便地獲得一個變數的型別。那麼在Java中可不可以實

Java5種建立物件的方法,你知道幾種?

作為一個Java開發者,一種面向物件的語言,我們每天都建立很多物件。但後續我們開發中,採用了spring的依賴管理系統,我們就很少自己去建立物件了,全部交給容器去託管,那麼本篇文章回源塑本,講述一下java中能夠建立一個物件的5中方法。 本文最大的特色是,我不僅給出案例,

JAVA基礎知識面向物件

本文章主要簡單講述了類的定義,物件的建立與使用,類的封裝,構造方法,內部類,類的繼承,介面與異常處理等知識。 1,類的定義 && 物件的建立與使用 && 類的封裝 a,類的定義: class Person{              i

java 類方法與物件方法

public class Test { /** * 下面這個方法就是靜態方法,應該就是樓主所說的類方法~~ * 靜態方法必須定義成static的,在類Test被例項化以前就已經存在於記憶體中 * 靜態方法使所有該類的例項也就是物件共有的方法 */ public s

ServletRequest物件與Response物件

概述 使用者傳送了一個HTTP請求到Web容器(一個Web應用對應一個Web容器),Web容器建立了一個HttpServletRequest的request物件,將使用者傳送的請求資料封裝到了這個request物件當中;然後它又建立了一個HttpServletReque

javanew出來一個物件和定義一個物件賦值為空有什麼不同

new 一個物件出來,比如SomeClass sc=new SomeClass();這個時候已經為sc這個物件分配了指向 new SomeClass() 所建立的記憶體空間。即對這個物件sc進行了例項化。而SomeClass sc=null,則sc物件未進行例項化,是一個空的物件,未能指向任何記憶體空間。

javaArrayListclear記憶體回收

右邊為呼叫clear後記憶體情況 現將list.clear改為 list=null,再看看執行情況 賦值NULL後不僅列表中的物件變成了垃圾,為列表分配的空間也會回收 clear()只是清除了物件的引用,使那些物件成為垃圾

java序列化一個物件儲存在檔案的簡單過程

為什麼要序列化?因為在儲存一個物件或者大型資料型別時,因為平臺的不同(比如作業系統不同),需要通過網路傳遞時,需要適應對方的環境或者網路的協議,要將物件的資料轉化成一種標準的位元組流序列,從而能在其他平臺還原出來和符合網路傳輸的要求。所有分散式應用常常需要跨平臺,跨網路,因此

java的作用有哪些?

java中變數主要有3中型別:成員變數、靜態變數(java中沒有全域性變數一說)、區域性變數 成員變數:作用範圍與類的例項化物件的作用範圍相同,類被例項化時成員變數才會在記憶體中分配空間並初始化,生命週期和被例項化物件的生命週期一樣。 靜態變數:用static修飾,不依賴於任何特定的例項