Cookie實現商品瀏覽記錄--方式二:JS實現

使用Cookie實現商品瀏覽記錄:
方式二:JS方法實現cookie的獲取以及寫入。
當某一個產品被點擊時,觸發JS方法。利用JS方法判斷一下,此產品是否在瀏覽記錄中。若是不存在,則將產品ID加入到cookie中。不然將此id以前的id所有後移一位,而後將此id移動至第一位。
注意的問題是:經過js方法寫入cookie,在java代碼中獲取cookie的值,須要進行轉碼
java.net.URLDecoder.decode(listView,"UTF-8");

具體實現以下:
(1). JSP頁面:當瀏覽某一個產品時,調用goView(id)方法,並將產品id做爲參數傳入。
```
<dt><a href="javascript:goView(${product.ep_id});">.....</a></dt>
```
(2). 在JS文件中,建立goView()方法。該方法的功能是,根據id寫入cookie,並將頁面跳轉到Servlet中。
```
function goView(id) {
    var aid = id;
    var newCookie = "";
        //得到key值爲viewRecode的cookie的value值
    var oldCookie = getCookie("viewRecode");
        //若是oldCookie不爲null
    if (oldCookie) {
                //將value值按照","分割成數組
        var array = oldCookie.split(",");
                //若是產品id在此數組中,則判斷此id是否處於數組中第一個位置。若是不在第一個位置,則讓此產品位置以前的id所有後移一位,而後將此id至於第一個位置。不然數組不變。
        if (inArray(array, id)) {
            for ( var a = 0; a < array.length; a++) {
                if (array[a] == id) {
                    if (a != 0) {
                        array[a] = null;
                        for ( var j = a; j >= 0; j--) {
                            array[j] = array[j - 1];
                            array[j - 1] = null;
                        }
                        array[0] = id;
                    }
                }
            }
                        //將上述的數組按","拼接成字符串
            newCookie = array.join(",");
        }
        //若是id不在此數組中,則將此id放在原字符串的最前面,並用","分割。
            else {
            newCookie = id + "," + oldCookie;
        }
    }
    //若是cookie中不存在此key值,則是第一次訪問產品,key值爲 viewRecode的cookie不存在,則先設定value值爲此id。
    else {
        newCookie = id;
    }
        //最後,將cookie寫入進去.
    setCookie("viewRecode", newCookie);
        //頁面跳轉到servlet中.
    location.href = "servlet/ProductServlet?param=productView&pid="+id;
}


//根據Cookie的key值獲得對應的value.若是不存在,則返回null.
function getCookie(name)
{
  var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
  if(arr != null) return unescape(arr[2]); return null;
}


//若是str在array數組中,返回true;不然返回false
function inArray(array, str) {
    for(var a in array){
        if(array[a] == str){
            return true;
        }
    }
    return false;
}

//寫入cookie
function setCookie(name,value)
{
  var Days = 30;
  var exp  = new Date();
  exp.setTime(exp.getTime() + Days*24*60*60*1000);
  //在最後追加  ;path=/ 很是有必要。不然容易出現   在不一樣的目錄下,調用同一個js方法來存儲Cookie,到別的目錄取不出或取出的值是不對的這種狀況
  document.cookie = name + "="+ escape(value) +";expires="+ exp.toGMTString()+";path=/";
}
```
(3). 在Servlet中經過獲取Cookie中的值,獲得商品列表,並顯示到jsp頁面中。
```
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String param=request.getParameter("param");
        CookieService cookieService = new CookieSerivceImpl();
        Cookie[] cookies = request.getCookies();
        if("listView".equals(param)){
            String pid = request.getParameter("pid");
            List<Product> products = new ArrayList<Product>();
            //獲取cookie,讀取緩存
            String listView = "";
            if (cookies != null && cookies.length > 0) {
                for (Cookie c : cookies) {
                    if ("listView".equals(c.getName())) {
                        System.out.println(c.toString());
                        listView = c.getValue();
                        break;
                    }
                }
            }
            //這一步很是重要。由於Java接收JS傳遞值,須要解碼。不然","會被解析成 "%2C"
            //解碼以後的字符串就是正常的。
            String listView=java.net.URLDecoder.decode(listView,"UTF-8");
            //根據產品id列表得到產品列表
            products = cookieService.onLineProductList(listView);
            request.getSession().setAttribute("products", products);
            request.getRequestDispatcher("/servlet/ProductServlet?param=productView&pid="+pid).forward(request, response);
            out.flush();
            out.close();
    }
}
```
最後在頁面中經過EL表達式循環顯示出列表便可。
針對以上內容,歡迎指正!
謝謝你來看我!javascript

相關文章
相關標籤/搜索