1. 程式人生 > >JavaWeb Session學習——模擬購物車(教材學習筆記)

JavaWeb Session學習——模擬購物車(教材學習筆記)

Cookie技術可以將使用者的資訊儲存在各自的瀏覽器中,並且可以在多次請求下實現資料的共享,但是如果傳遞的資訊較多,使用Cookie技術就會增大伺服器端程式的處理難度,這個時候我們就可以使用Session技術,

但是需要注意的是,Session技術同樣需要Cookie技術來為其傳遞ID屬性,下面通過一個模擬實現購物車的程式熟悉一下Session技術,

一、建立書本類Book

建立web-chapter05的web專案,並在其中建立cn.itcast.chapter05.session的包,並在包中建立一個Book類

package cn.itcast.chapter05.session;

import java.io.Serializable;

public class Book implements Serializable{
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	public Book() {
	
	}
	public Book(String id,String name) {
		this.id=id;
		this.name=name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}

其中Book類之所以需要繼承自Serializable,是因為Serializable表示此類是一個可序列化的類,

二、建立模擬資料庫類BookDB

package cn.itcast.chapter05.session;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

public class BookDB {
private static Map<String,Book> books =  new LinkedHashMap<String,Book>();
    static {
    	books.put("1", new Book("1", "javaweb開發"));
    	books.put("2", new Book("2", "java資料庫連線"));
    	books.put("3", new Book("3", "java基礎入門"));
    	books.put("4", new Book("4", "MySQL入門"));
    	books.put("5", new Book("5", "spring開發"));
    }
    //獲得所有圖書的方法
    public static Collection<Book> getAll(){
    	return books.values();
    }
    //根據指定學號查詢指定圖書
    public static Book getBook(String id) {
    	return books.get(id);
    }
	
}

程式碼中使用到了Map的相關知識,可以自行百度

三、建立一個名為ListBookServlet的servlet類

用於顯示所有可購買圖書的列表,通過單擊購買連結,便可將指定的圖書新增到購物車中,

package cn.itcast.chapter05.session;

import java.io.*;
import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class ListBookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");//此行是為了防止出現中文亂碼
		PrintWriter out = response.getWriter();
		Collection<Book> books = BookDB.getAll();
		out.write("本站提供的圖書有以下:<br />");
		for(Book book : books) {
			String url = "/chapter05/PurchaseServlet?id="+book.getId();
			out.write(book.getName()+"<a href='"+url+"'>點選購買</a><br />");
		}
		
	}

}

其中的PurchaseServlet還沒有建立,接下來就是建立這個

四、建立PurchaseServlet類

該類用來將使用者購買的圖書資訊儲存到Session物件中,並在使用者購買完圖書後將頁面重定向到已經購買的圖書列表

該類中使用ArrayList集合模擬一個購物車,然後將購買的所有圖書新增到購物車中,

package cn.itcast.chapter05.session;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class PurchaseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");//獲得使用者購買的商品的id
		if(id==null) {
			//如果沒有購買任何圖書,則重定向到所有圖書的介面,也就是ListBookServlet
			String url = "/chapter05/ListBookServlet";
			response.sendRedirect(url);
			return;
		}
		Book book = BookDB.getBook(id);
		//獲取或建立使用者的Session物件
		HttpSession session = request.getSession();
		//從session物件中獲得使用者的購物車
		List<Book> cart = (List<Book>) session.getAttribute("cart");
		if(cart==null) {
			//若為首次購買則為使用者建立一個購物車
			cart = new ArrayList<Book>();
			session.setAttribute("cart", cart);
		}
		//將商品放入購物車
		cart.add(book);
		//建立Cookie存放session的標記號
		Cookie cookie = new Cookie("JSESSIONID", session.getId());
		cookie.setMaxAge(60*30);//設定儲存時間,此時設定為30分鐘
		cookie.setPath("/chapter05");
		response.addCookie(cookie);
		//重定向到購物車頁面
		String url = "/chapter05/CartServlet";
		response.sendRedirect(url);
	}

}

五、建立CartServlet類

主要用於展示使用者已經購買的圖書列表

package cn.itcast.chapter05.session;

import java.io.*;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class CartServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");//此行是為了防止出現中文亂碼
		PrintWriter out = response.getWriter();
		//變數cart引用使用者的購物車
		List<Book> cart = null;
		//變數pruFlag標記是否購買過商品
		boolean pruFlag = true;
		//獲得使用者的Session
		HttpSession session = request.getSession(false);
		//如果session為null,則將pruFlag設定為false
		if(session==null) {
			pruFlag = false;
		}else {
			//獲得使用者購物車
			cart = (List<Book>) session.getAttribute("cart");
			//如果購物車為null,pruFlag設定為false
			if(cart==null) {
				pruFlag = false;
			}
		}
		
		if(pruFlag==false) {
			out.write("對不起!你還沒有購買任何商品!<br />");
		}else {
			//否則顯示使用者購買的資訊
			double price=0;
			for(Book book : cart) {
				out.write(book.getName()+"<br />");
			}
		}
	}

}

六、在web.xml中配置相關引數

<servlet>
    <description></description>
    <display-name>ListBookServlet</display-name>
    <servlet-name>ListBookServlet</servlet-name>
    <servlet-class>cn.itcast.chapter05.session.ListBookServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ListBookServlet</servlet-name>
    <url-pattern>/ListBookServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>PurchaseServlet</display-name>
    <servlet-name>PurchaseServlet</servlet-name>
    <servlet-class>cn.itcast.chapter05.session.PurchaseServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PurchaseServlet</servlet-name>
    <url-pattern>/PurchaseServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <description></description>
    <display-name>CartServlet</display-name>
    <servlet-name>CartServlet</servlet-name>
    <servlet-class>cn.itcast.chapter05.session.CartServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CartServlet</servlet-name>
    <url-pattern>/CartServlet</url-pattern>
  </servlet-mapping>

然後啟動tomcat

七、在瀏覽器中檢視

在網址欄輸入http://localhost:8080/web-chapter05/ListBookServlet會進入以下介面

然後點選幾個購買連結之後的介面如下:

至此,使用session模擬購物車的程式就完成了