JavaWeb Session學習——模擬購物車(教材學習筆記)
阿新 • • 發佈:2018-12-03
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模擬購物車的程式就完成了