Java Web中JSP實現數據傳遞和保存重點總結

獲取表單提交的數據:

JSP(Java Server Pages)

從瀏覽器到服務器是瀏覽器發送請求(request)

從服務器到瀏覽器是瀏覽器接收響應(response)

【通過JSP來實現】

request對象:

主要用於處理客戶端請求

request對象常用方法:

方法名稱

說明

String  getParameter(String name)

根據表單組件名稱獲取提交數據

String[ ]  getParameterValues(String name)

獲取表單組件對應多個值時的請求數據

Void  setCharacterEncoding(String charset)

指定每個請求的編碼

RequestDispatcher getRequestDispatcher(String path)

返回一個RequestDispatcher對象,該對象的forward( )方法用於轉發請求

URL  getContextPath()

獲得上下文路徑的路徑指的就是到WebRoot

示例彙總:

1. 請求對象:request

request作用域:請求的範圍,在一次請求的範圍內

public String getParameter(String name)

HTML代碼:

<input type= "text" name= "userName" >

JSP代碼:

String userName =request.getParameter("userName );

注:有快捷鍵Ctrl+Alt+向下的箭頭就能複製上一行

2. 獲取同名的多個參數

HTML代碼:

<input type="checkbox" name="mailId" value=" 10001"/>

<input type="checkbox" name="mailId" value="10002"/>

<input type="checkbox" name="mailId" value="10003"/>

<input type="checkbox" name="mailId" value="10004" />

<input type="checkbox" name="mailId" value="10005" />

JSP代碼:

String[ ] mailId=request.getParameterValues("mailId ");

if(mailId!=null& mailId.length!=0){ 

//循環mailds訪問提交的數據

}else{

//未提交與參數maild相關的數據

}

表單提交到JSP,中文亂碼問題解決方法:

編碼方式

收錄的字符

gb2312

常用簡體漢字

Gbk

簡體和繁體漢字

utf-8

所有國家需要的字符

不同表單提交方式,解決方法不同:

get與post區別:

比較項

get

post

參數出現在URL中

長度限制

安全性

URL可傳播

1. get提交方式的中文亂碼解決辦法:

方法一:治標

語法:

字符串.getBytes("ISO-8859-1"),"utf-8"

示例:

String userName = request.getParameter("username");

userName=new String(userName.getBytes("ISO-8859-1"),"utf-8");

方法二:治本

配置tomcat\conf\server.xmI文件

<Connector connectionTimeout " 20000" port="8080"

protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

2. post提交方式的中文亂碼解決辦法:

在提交的JSP頁面填入一句代碼

語法:

request.setCharacterEncoding("utf-8");

3. 使用request轉移信息中中文亂碼解決辦法:

語法:

傳遞部分使用URLEncoder.encode()來設置編碼

現字符串 = URLEncoder.encode(原字符串, "UTF-8");

接收部分使用URLDecoder.decode()來解碼

現字符串= URLDecoder.decode(原字符串, "UTF-8");

在請求中存取屬性:

1. 在請求中保存屬性:

public void setAttribute(String name,Object o)

request.setAttribute("mess", "註冊失敗");

request.setAttribute()的作用域僅限於一次請求

2.  在請求中獲取屬性

public Object getAttribute(String name)

注:

3. 在使用屬性值的時候要做非空判斷,否則會出現空指針異常

示例:

String mess=request.getAttribute(" mess");

mess.length();

這麼寫是錯的,應該先判斷:

String mess=(String)request.getAttribute("mess");

if(mess!=null){

//在請求中取到"mess"屬性對應的屬性值,正常使用mess數據

}else{

//在請求中沒有取到"mess"屬性對應的屬性值,使用備選方案

}

4. 它的返回值類型是Object類型,需要做數據類型的轉換

 

JSP內置對象response:

response對象用於響應客戶請求並向客戶端輸出信息

頁面重定向(見下方詳細說明):

  1. void sendRedirect(String location)
  2. 客戶端將重新發送請求到指定的URL

 

轉發與重定向:

1. 轉發(頁面實現跳轉了,請求的信息也一起轉移

用戶進行一次請求,但是服務器內部自動完成了跳轉,服務器的行爲無形中延長了request作用域;所以用戶看到的地址欄並不是應該的最後的跳轉地址,依然是上一個地址。

RequestDispatcher對象

forward()方法

示例:

  1. request.getRequestDispatcher("url"),forward(request,response)
  2. <jsp;forward page="url" />

2. 重定向(頁面實現跳轉了,但是請求的信息不一起轉移

用戶進行一次請求,服務器只是提示用戶要跳轉但是自己沒有進行跳轉,所以不會轉移信息。

將用戶請求重新定位到一個新的URL

response.sendRedirect("url")

如果想讓重定向也能傳遞信息要使用如下方法:

String mess = "成功";

mess = URLEncoder.encode(mess, "UTF-8");

response.sendRedirect(request.getContextPath()+"/index.jsp?mess="+mess);

在轉到頁面要使用如下方法:

String mess = request.getParameter("mess");

mess = URLDecoder.decode(mess, "UTF-8");

out.println(mess);

其中:?參數=的語法結構就是在傳遞參數;但是在傳遞中文時會出現亂碼的情況,詳細介紹請看前面的“中文亂碼的解決”。

3. 轉發與重定向的區別

轉發:

  1. 轉發是在服務器端發揮作用,將同一請求在服務器資源之間進行傳遞
  2. 客戶端瀏覽器的地址欄不會顯示轉向後的地址

重定向:

  1. 重定向是在客戶端發揮作用,通過發送一個新的請求實現頁面轉向
  2. 在地址欄中可以顯示轉向後的地址

比較項

轉發

重定向

URL變化

重新發出請求

不會

是否攜帶請求

目標URL要求

僅本Web應用

任意URL

重定向是客戶端行爲,轉發是服務器行爲

 

內置對象:

JSP已經準備好的,可以直接使用的對象(其中前五個比較重要):

1. 請求對象:request :主要用於處理客戶端請求的數據信息

2. 輸出對象:out :用於向客戶端輸出數據

     用來輸出和System.print不同,不用點出來

3. 響應對象:response :用於響應客戶端請求並向客戶端輸出信息

4. 應用程序對象:application :類似於系統的全局變量,用於實現Web應用中的資源共享

5. 會話對象:session :用於記錄會話狀態的相關信息

6. 頁面上下文對象:pageContext

7. 頁面對象:page

8. 配置對象:config

9. 異常對象:exception

其中的page可以理解成this(當前對象,作用域最小)  作用域僅限於當前頁面,只能在當前頁面訪問到attribute

 

session中的setAttribute()作用域是一次會話:

會話:一個會話就是瀏覽器和服務器之間的一次通話;會話可以在多次請求中保存和使用數據;一個會話就是在一段時間內,一個客戶端與Web服務器的一連串相關的交互過程;會話可以在多次請求中保存和使用數據:

public void setAttribute(String name, Object value);

用法:session.setAttribute("userName","張三丰");

public Object getAttribute(String name);

用法:String username=(String) session.getAttribute("userName");

session與窗口的關係:

  1. 每個session對象都與一個瀏覽器窗口對應 ,重新開啓一個瀏覽器窗口,可以重新創建一個session對象(不同版本瀏覽器可能有所差別)
  2. 通過超鏈接打開的新窗口,新窗口的session與其父窗口的session相同

session是一種機制,是服務器端使用的用來記錄同一個客戶端狀態的一個機制—sessionId來判斷哪個客戶端:session.getId();  public String getId(); 【得到當前客戶端的編號,每一個session有一個唯一的sessionId】

同一個瀏覽器不管打開多少次都會顯示同一個客戶ID;不同的瀏覽器的到的客戶ID不同

session是單用戶多頁面可共享,session是保存在服務器端的

session對象常用方法:

方法名稱

說明

String getId()

獲取sessionid

void setMaxInactiveInterval(int interval)

設定session的非活動時間

int getMaxInactiveInterval()

獲取session的有效非活動時間(以秒爲單位)

void invalidate()

設置session對象失效

void setAttribute(String key, Object value)

以key/value的形式保存對象值

Object getAttribute(String key)

通過key獲取對象值

void removeAttribute(String key)

從session中刪除指定名稱(key)所對應的對象

會話的清除和過期:

Session的數據是在服務器端的,服務器保存的會話數據量會越來越大,從而導致性能問題;所以若沒有清理機制,會導致性能問題或服務器崩潰:

1. 程序主動清除session數據

手動設置失效:session.invalidate()   【程序裏最常用的方法】

移除會話的一個屬性:

public void setAttribute(String name);

用法:session.removeAttribute("userName");

2. 服務器主動清除長時間沒有再次發出請求的session

設置會話過期時間超時失效:

方法一:通過setMaxInactiveInterval( )方法,單位是秒

public void setMaxInactiveInterval (int Interval);

示例:

<%

session.setAttribute("login","admin");

session.setMaxInactiveInterval(600);

response.sendRedirect("admin.jsp");

%>

方法二:通過設置項目的web.xml或Tomcat目錄下的/conf/web.xml文件,單位是分鐘

<session-config>

    <session-timeout>10</session-timeout>

</session-config>

 

include指令:

除了首頁面,其它頁面中同樣需要加入登錄驗證,有沒有辦法避免冗餘代碼的出現?

可以將一些共性的內容寫入一個單獨的文件中,然後通過include指令引用該文件

方法一:

創建登錄驗證文件 loginControl.jsp

示例:

<%

String login = (String) session.getAttribute("login");

if (login == null) {

  response.sendRedirect("index.jsp");

       return;

} %>

方法二:

在後臺首頁面中使用include指令引用登錄驗證文件

示例:

<%@  include file="loginControl.jsp" %>

 

JSP內置對象application:

application實現用戶之間的數據共享

application對象的常用方法

方法名稱

說  明

void setAttribute(String key,Object value)

以key/value的形式保存對象值

Object getAttribute(String key)

通過key獲取對象值

String getRealPath(String path)

返回相對路徑的真實路徑

示例:統計網站訪問次數的實現:

一個用戶進行多次刷新頁面

多個用戶訪問頁面

分析:

  1. 每個用戶都需要使用訪問次數
  2. application可在整個項目中共享使用數據
  3. 使用application實現計數器
  4. 每次訪問該頁面,計數器加1

解決方法:

public void setAttribute(String name, Object object)

application.setAttribute(String name, Object object);

 

public Object getAttribute(String name)

application.getAttribute(String name);

 

統計頁:

<%

       Integer count = (Integer) application.getAttribute("count");

       if (count != null) {

              count = 1 + count;

       } else {

              count = 1;         

       }

       application.setAttribute("count", count);

%>

顯示頁:

<%

       Integer i = (Integer) application.getAttribute("count");

       out.println("您好,您是第 " + i + " 位訪問本網站的用戶");

%>

但是服務器停了之後重新啓動就會重新計數

 

三個對象對比:

request、session、application

相同點:都可以存儲屬性

不同點:

  1. request中存儲的數據僅在一個請求中可用
  2. session中存儲的數據在一個會話的有效期內可用
  3. application中存儲的數據在整個Web項目中可用

 

JSP常用內置對象的作用域:

1. page作用域:

對應的作用域訪問對象爲pageContext 對象

page的作用域指本JSP頁面的範圍:

pageContext.setAttribute(鍵,值)

pageContext.getAttribute(鍵)

2. request作用域:

對應的作用域訪問對象爲request 對象

request的作用域內的對象則是與客戶端的請求綁定在一起

3. session作用域:

對應的作用域訪問對象爲session 對象

session的作用域是一次會話

4. application作用域:

對應的作用域訪問對象爲application 對象

application的作用域是面對整個Web應用程

 

 

cookie:

跟蹤用戶的整個會話

cookie通過在客戶端記錄信息;給客戶端發送一個通行證,每一個客戶一個

cookie的本質:

Web服務器保存在客戶端的一小段文本信息

cookie的作用:

  1. 對特定對象的追蹤
  2. 實現各種個性化服務
  3. 簡化登錄

安全性能:容易泄露信息

cookie以文件方式保存數據:

創建cookie對象:

Cookie newCookie = new Cookie(String key, String value);

添加數據:

public void addCookie(Cookie cookie)

response.addCookie(newCookie);

獲取數據:

public Cookie[] getCookies()   【返回值是一個數據】

Cookie[] cookies = request.getCookies();

設置有效期:

public void setMaxAge(int expiry)

只要打開一個瀏覽器訪問一個服務器時默認會發回來一個cookie名字是JsessionID,內容是一串數字和字母合起來。所以可以知道session是基於cookie的。

cookie對象的常用方法:

方法名稱

說  明

void setMaxAge(int expiry)

設置cookie的有效期,以秒爲單位

void setValue(String value)

在cookie創建後,對cookie進行賦值

String getName()

獲取cookie的名稱

String getValue()

獲取cookie的值

int getMaxAge()

獲取cookie的有效時間,以秒爲單位

setPath("/")

設置返回值,加上setPath("/");這句話說明cookie對於整個工程是可見的,如果不加這句話cookie只對當前這個路徑和它的子目錄可見;

當在cookie中使用中文的時候會出現中文亂碼,此時要使用encode設置編碼和decode解碼來實現:

示例:

1. encode設置編碼

userName = URLEncoder.encode(userName, "UTF-8");

Cookie cookie = new Cookie("username",userName);

2. decode解碼

username = cookies[i].getValue();

username = URLDecoder.decode(username, "UTF-8");

cookie與session的對比:

1. session:

  1. 在服務器端保存用戶信息
  2. session中保存的是Object類型
  3. 隨會話的結束而將其存儲的數據銷燬
  4. 保存重要的信息

2. Cookie

  1. 在客戶端保存用戶信息
  2. cookie保存的是 String類型
  3. cookie可以長期保存在客戶端
  4. 保存不重要的用戶信息

JavaBean:

  1. 就是一個Java類
  2. 封裝業務邏輯
  3. 封裝數據                 

JavaBean的優勢:

  1. 解決代碼重複編寫,減少代碼冗餘
  2. 功能區分明確
  3. 提高了代碼的維護性

從JavaBean的功能上可以分爲:

  1. 封裝數據
  2. 封裝業務

封裝數據的JavaBean:

技巧:

使用工具自動生成getter/setter方法:

Alt+Shift+S ---> Generate Getters and Setters

除了要建立的util包之外一般還有service包:

名字都是:***Service:接口 <--- 業務邏輯

Dao(接口)---> DaoImpl(接口實現類):數據庫的數據操作

一般一個Dao對應一張數據表(*******)

總結:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章