1. 程式人生 > 其它 >Web基礎知識(12)- JSP (四)

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>