Web基礎知識(12)- JSP (四)
JSP Cookies 處理、JSP JavaBean 的使用
1. JSP Cookies 處理
Cookie 不是 JSP 內建物件,Cookie 由伺服器生成併發送給瀏覽器(客戶端),瀏覽器會將其以文字檔案的形式儲存在某個目錄下。
例如,IE 瀏覽器把 cookie 資訊儲存在類似於 C://windows//cookies 的目錄下,當用戶再次訪問某個網站時,伺服器就會要求瀏覽器查詢並返回之前傳送的 cookie 資訊,來識別此使用者。
識別使用者通常有以下步驟:
(1) 伺服器把 cookie 資訊傳送到瀏覽器,例如:使用者 ID、使用者名稱稱等資訊。
(2) 瀏覽器在本地儲存這些資訊。
(3) 瀏覽器再次向伺服器傳送請求時,它會同時將本地儲存的 cookie 資訊一同傳送給伺服器,然後伺服器使用這些資訊來識別使用者或其它。
cookie 的作用表現在以下方面:
(1) 對特定物件的追蹤,如使用者的訪問次數、最後訪問時間等。
(2) 統計網頁的瀏覽次數。
(3) 在 cookie 有效期內,記錄使用者的登入資訊,簡化下一次的登入過程。
(4) 實現各種個性化服務,如”最近瀏覽過的商品“。
注意:由於 cookie 會將使用者的個人資訊儲存在客戶端,如使用者名稱、計算機名、以及瀏覽和登入的網站等。這些資訊可能會包含一些比較敏感的內容,所以從安全形度來說,使用 cookie 存在著一定的風險,因此不建議在 cookie 中儲存比較重要或隱私的內容。
1) cookie 常用方法
方法 | 說明 |
public void setDomain(String pattern) | 設定 cookie 的域名,如 biancheng.net |
public String getDomain() | 獲取 cookie 的域名 |
public void setMaxAge(int expiry) | 設定 cookie 有效期,單位:秒 |
public int getMaxAge() | 獲取 cookie 有效期,單位:秒。預設為 -1,表示 cookie 儲存到瀏覽器關閉為止 |
public String getName() | 返回 cookie 的名稱,名稱建立後將不能被修改 |
public void setValue(String newValue) | 設定 cookie 的值 |
public String getValue() | 獲取 cookie 的值 |
public void setPath(String uri) | 設定 cookie 的路徑,預設為當前頁面目錄以及子目錄下的所有 URL |
public String getPath() | 獲取 cookie 的路徑 |
public void setSecure(boolean flag) | 設定 cookie 是否要加密傳輸 |
public void setComment(String purpose) | 設定 cookie 註釋 |
public String getComment() | 返回 cookie 註釋,如果 cookie 沒有註釋,則返回 null |
2) JSP 使用 cookie
JSP 使用 cookie 主要分為以下幾個步驟。
(1) 建立 cookie 物件
建立 cookie 物件,name 代表 cookie 的名稱,value 表示該名稱對應的值,語法如下:
cookie cookie = new cookie(String name, String value);
注意:name 和 value 中不能包含空格和以下字元:
[ ] ( ) = , " / ? @ : ;
(2) 寫入 cookie
建立 cookie 物件後,呼叫 response.addCookie() 方法寫入 cookie,程式碼如下:
response.addcookie(cookie);
(3) 設定 cookie 有效期
呼叫 setMaxAge() 方法設定 cookie 的有效期(單位:秒),如將 cookie 有效期設定為 24 小時,程式碼如下:
cookie.setMaxAge(60*60*24);
(4) 讀取 cookie
呼叫 request.getCookies() 方法讀取 cookie,該方法返回 HTTP 請求中的 cookie 物件陣列,需要通過遍歷進行訪問。
(5) 刪除 cookie
刪除 cookie 步驟如下:
a) 獲取 cookie
b) 將要刪除的 cookie 有效期設定為 0
c) 呼叫 response.addCookie() 方法重新寫入 cookie
示例,cookie.jsp 程式碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>Cookie</title> 7 </head> 8 <body> 9 <% if ("POST".equals(request.getMethod())) { 10 // 處理中文亂碼 11 String username = URLEncoder.encode(request.getParameter("username"), "utf-8"); 12 //String username = request.getParameter("username"); 13 String password = request.getParameter("password"); 14 if ("admin".equals(username) && "123456".equals(password)) { 15 16 Cookie cookie_name = new Cookie("username", username); 17 cookie_name.setMaxAge(60 * 60 * 24); // 設定 cookie 有效期為24小時。 18 response.addCookie(cookie_name); 19 20 out.print("<p>Login successfully!</p>"); 21 out.print("<p>View cookie,click <a href='cookie_view.jsp'>Here</a></p>"); 22 23 } else { 24 out.print("<p>Login failed, invalid username or password!</p>"); 25 } 26 } else { %> 27 28 <h2>User Login</h2> 29 <form method="post" action=""> 30 <p>Username: <input type="text" name="username" value="admin" /></p> 31 <p>Password: <input type="text" name="password" value="123456" /></p> 32 <p><input type="submit" value="Login" /></p> 33 </form> 34 35 <% } %> 36 </body> 37 </html>
cookie_view.jsp 程式碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>Cookie View</title> 7 </head> 8 <body> 9 <%! 10 public Cookie getCookieByName(Cookie[] cookies, String name) { 11 if (cookies == null) { 12 return null; 13 } else { 14 for (Cookie cookie : cookies) { 15 if (cookie.getName().equals(name)) { 16 return cookie; 17 } 18 } 19 return null; 20 } 21 } 22 %> 23 24 <% 25 Cookie cookie_username = getCookieByName(request.getCookies(), "username"); 26 if (cookie_username != null) { 27 out.println("<p>Get username from cookie</p>"); 28 out.println("<p>username: " + cookie_username.getValue() + "</p>"); 29 out.print("<p>Remove cookie,click <a href='cookie_remove.jsp'>Here</a></p>"); 30 } else { 31 out.println("<p>No cookie, <a href='cookie.jsp'>Back</a></p>"); 32 } 33 %> 34 </body> 35 </html>
cookie_remove.jsp,程式碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>Cookie Remove</title> 7 </head> 8 <body> 9 <%! 10 public Cookie getCookieByName(Cookie[] cookies, String name) { 11 if (cookies == null) { 12 return null; 13 } else { 14 for (Cookie cookie : cookies) { 15 if (cookie.getName().equals(name)) { 16 return cookie; 17 } 18 } 19 return null; 20 } 21 } 22 %> 23 24 <% 25 Cookie cookie_username = getCookieByName(request.getCookies(), "username"); 26 if (cookie_username != null) { 27 cookie_username.setMaxAge(0); 28 response.addCookie(cookie_username); 29 response.sendRedirect("cookie_view.jsp"); 30 } else { 31 out.println("<p>No cookie, <a href='cookie.jsp'>Back</a></p>"); 32 } 33 %> 34 </body> 35 </html>
2. JSP JavaBean 的使用
Java 之父 James Gosling 在設計 Java 語言,為 Java 元件中封裝資料的 Java 類進行命名時,看到了桌子上的咖啡豆,於是靈機一動,就把它命名為“JavaBean”,bean 翻譯為“豆、豆子”。
在程式中,開發人員所要處理的是業務邏輯和資料,而這兩種操作都可以封裝成 JavaBean,一個應用程式中會使用很多的 JavaBean。由此可見,JavaBean 元件是應用程式的重要組成部分。
JavaBean 是可以重複使用的一個元件,是遵守 JavaBean API 規範的 Java 類。
一般情況下,JavaBean 要滿足以下要求:
(1) JavaBean 是一個公共類,並提供無參公有的構造方法;
(2) 需要被序列化並且實現了 Serializable 介面;
(3) 屬性私有化;
(4) 具有公共的訪問屬性的 getter 和 setter 方法;
1) JavaBean 屬性
一個 JavaBean 可以有多個屬性,屬性應該是可以訪問的,屬性型別可以是任何合法的 Java 資料型別,包括自定義的類。
JavaBean 的每個屬性通常都具有相應的 setter 和 getter 方法,setter 方法稱為屬性修改器,getter 方法稱為屬性訪問器。
方法 | 描述 |
getPropertyName() | 舉例來說,如果屬性的名稱為 Name,那麼這個方法的名字就要寫成 getName() 來讀取這個屬性。這個方法也稱為訪問器。 |
setPropertyName() | 舉例來說,如果屬性的名稱為 Name,那麼這個方法的名字就要寫成 setName() 來寫入這個屬性。這個方法也稱為寫入器。 |
2) 訪問 JavaBean
<jsp:useBean> 標籤可以在 JSP 中宣告一個 JavaBean,然後使用。聲明後,JavaBean 物件就成了指令碼變數,可以通過指令碼元素或其他自定義標籤來訪問。<jsp:useBean> 標籤的語法格式如下:
<jsp:useBean id="bean's name" scope="bean's scope" typeSpec/>
其中,根據具體情況,scope 的值可以是 page (預設值),request,session 或 application。id 值可任意只要不和同一 JSP 檔案中其它 <jsp:useBean> 中 id 值一樣就行了。
3) 訪問 JavaBean 物件的屬性
在 <jsp:useBean> 標籤主體中使用 <jsp:getProperty/> 標籤來呼叫 getter 方法,使用 <jsp:setProperty/> 標籤來呼叫 setter 方法,語法格式如下:
1 <jsp:useBean id="test" class="com.example.Test"> 2 <jsp:setProperty name="test" property="name" value="default value"/> 3 <jsp:getProperty name="test" property="url"/> 4 ... 5 </jsp:useBean>
name 屬性指的是 Bean 的 id 屬性。property 屬性指的是想要呼叫的 getter 或 setter 方法。
示例,Test.java 程式碼如下:
1 package com.example; 2 3 import java.io.Serializable; 4 5 public class Test implements Serializable { 6 7 private String name; 8 private String url; 9 10 public String getName() { 11 return name; 12 } 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public String getUrl() { 19 return url; 20 } 21 22 public void setUrl(String url) { 23 this.url = url; 24 } 25 }
javabean.jsp 程式碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ page import="java.net.*"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <title>JavaBean</title> 7 </head> 8 <body> 9 <p>JavaBean Test Page</p> 10 11 <jsp:useBean id="test" class="com.example.Test"> 12 <jsp:setProperty name="test" property="name" value="JavaBean Name"/> 13 <jsp:setProperty name="test" property="url" value="www.test.com"/> 14 </jsp:useBean> 15 16 <p>Name: <jsp:getProperty name="test" property="name"/></p> 17 <p>Url: <jsp:getProperty name="test" property="url"/></p> 18 19 </body> 20 </html>