我们需要一个用来封装商品信息的商品类
package Semester_3.ShoppingCart;
/*
* 定义用来被购买的蛋糕类*/
public class cookie {
String name,ID;
public cookie(){}
public cookie(String ID,String name){
this.name = name;
this.ID = ID;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setID(String ID){
this.ID = ID;
}
public String getID(){
return this.ID;
}
}
一个用来模拟数据库的数据库模拟类
package Semester_3.ShoppingCart;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/*
* 创建一个模拟数据库的类*/
public class CookDB {
private static Map cooks = new LinkedHashMap<>();//一个只能在内部调用的数组,用来存放蛋糕
static{//静态代码块,当对象被创建的时候将自动运行,作用是添加数据
cooks.put("1",new cookie("1","A类蛋糕"));
cooks.put("2",new cookie("2","B类蛋糕"));
cooks.put("3",new cookie("3","C类蛋糕"));
cooks.put("4",new cookie("4","D类蛋糕"));
cooks.put("5",new cookie("5","E类蛋糕"));
}
//返回所有蛋糕的方法
public static Collection getAll(){
return cooks.values();
}
//返回按照ID定位蛋糕的方法
public static cookie getID(String ID){
return cooks.get(ID);
}
}
一个用来获取和转发Cookie对象的Servlet类
package Semester_3.ShoppingCart;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(name = "PurchaseServlet", value = "/PurchaseServlet")
public class PurchaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 首先获取有没有属性名为id的属性,并获取它的值
String ID = request.getParameter("id");
// 如果id值是空的,表示没有任何的数据传入,将重定向到展示数据的界面重新进行选择,此为边界条件
if(ID==null){
String url = "ListCakeServlet";
// 在这里完成重定向的动作
response.sendRedirect(url);
return;
}
// 获取数据库模拟类中的ID对应的蛋糕名称
cookie c =CookDB.getID(ID);
// 创建Session对象用来传递会话消息
HttpSession hs =request.getSession();
// 获取之前的会话消息,如果有就直接添加,如果没有就创建一个对象再进行添加动作
List ls = (List)hs.getAttribute("cart");
if(ls == null){
ls = new ArrayList();
hs.setAttribute("cart",ls);
}
ls.add(c);
// Cookie对象的传参,将来在浏览器端可以看到这个会话头的对应的属性值
Cookie cookie = new Cookie("JSESSIONID",hs.getId());
// 这个会话可以存储三十分钟
cookie.setMaxAge(60 * 30);
// 将这个请求路径设置为任何目录下都可以被访问
cookie.setPath("/");
// 开始储存Cookie对象
response.addCookie(cookie);
// 重定向到展示购物车界面,这个类仅完成会话参数的传递
String url = "CartServlet";
response.sendRedirect(url);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
一个用来展示商品列表的类
package Semester_3.ShoppingCart;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collection;
/*
* 显示所有可供购买的蛋糕列表,并通过点击购买添加到购物车中*/
@WebServlet(urlPatterns = "/ListCakeServlet")
public class ListCakeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用来设置返回头的标识,表示将要返回HTML有关的语句,并在页面中解析成为HTML代码格式并以UTF-8的编码格式进行加载
resp.setHeader("content-type","text/html;charset=utf-8");
// 创建数据库模拟类的对象,获取数据库中所有蛋糕的数据并返回为一个数组格式
Collection all = CookDB.getAll();
// 将数组中的格式遍历输出到HTML页面中进行展示
resp.getWriter().write("本站提供的蛋糕有:"+"
");
for(cookie c :all){
// GET请求方式,直接在重定向的时候在URL地址栏的位置携带数据
String url = "PurchaseServlet?id=" + c.getID();
//用来设置返回头的标识,表示将要返回HTML有关的语句,并在页面中解析成为HTML代码格式并以UTF-8的编码格式进行加载
resp.setHeader("content-type","text/html;charset=utf-8");
// 写入一个超链接标签,地址为Cookie数据转发类中,并携带有关数据
resp.getWriter().write(c.getName()+"点击购买
");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
// public static void main(String[] args) {
// Collection all = CookDB.getAll();
// for(cookie c :all){
// System.out.println(c.getName()+":"+c.getID());
// }
// }
}
最后是一个用来展示已经被购买的商品的购物车类
package Semester_3.ShoppingCart;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(name = "CartServlet", value = "/CartServlet")
public class CartServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//获取写入响应信息的输入流
PrintWriter writer = response.getWriter();
// 获取一个空的蛋糕对象
List ls =null;
// 这是一个标记,作用是判断是否有蛋糕被选择
boolean pruFlag = true;
// 参数的意义,当参数为true时,如果获取不到对象的Session对象则自动创建一个;false参数则表示不自动创建
HttpSession hs =request.getSession(false);
// 首先进入一个判断,当不存在Session对象时,则表示用户没有会话对象传入,将标记修改
if(hs==null){
pruFlag = false;
}else {
// 如果有会话对象,但是会话中没有cart相应的信息,则表示用户没有选择蛋糕,也修改标记将标记的值改变
ls = (List)hs.getAttribute("cart");
if(ls==null){
pruFlag= false;
}
}
// 最后渲染选择的蛋糕列表阶段,当标记一直没有被修改,则表示用户确实传入了一个会话对象,并且选择了蛋糕,则对用户选择的蛋糕进行渲染
if (pruFlag){
writer.write("您购买的蛋糕有:
");
double price = 0;
for(cookie c : ls){
writer.write(c.getName()+"
");
}
}
writer.write("返回蛋糕列表页");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
基本原理
Cookie类:对蛋糕信息的封装,以及对于蛋糕属性的设置和获取
具体实现:一个标准类,内部有带参数的构造方法,不带参数的构造方法,有成员变量,和针对每个成员变量的 get方法和set方法
CookDB:数据库模拟类,模拟了数据库中存储的商品信息
具体实现:类中包含一个私有的,静态的Map数组为本体,键对应ID编号,值对应不同的cookie也就是蛋糕 类的具体对象,内部用一个静态代码块封装了将所有蛋糕添加进数组的方法,所以每次重启项目的时候 都可以保证数组内部自动填充了相应的数据 内部有两个方法,一个按照ID获取对应的蛋糕类的方法,一个获取所有蛋糕的方法,一个 简单的模拟数据库存储数据的类就完成了
ListCakeServlet:一个展示所有蛋糕的展示页面,并且附带将选择的蛋糕的信息传递到其他类的功能
具体实现:首先获取所有的蛋糕列表,并使用for循环遍历,在遍历的时候,获取蛋糕的ID和蛋糕的名字 并写入一个超链接标签,当点击超链接的时候,将链接到会话类中并携带相应的蛋糕的信息
PurchaseServlet:会话类,将传递进来的信息封装进一个会话中传递给购物车类
具体实现:将蛋糕展示页面的信息获取到之后,首先会获取到传入的参数里有没有一个参数名为id的值,如果 有,则根据ID获取对应的蛋糕对象,用到的是模拟数据库类中的方法,将ID对应的蛋糕封装进一个数组中 进行传递,如果是一次接受数据,则创建一个数组,最后存储cookie对象并重定向到购物车类,这个类只做 传递参数的作用,并没有实际展示的效果
CartServlet:购物车类,展示用户选择的蛋糕
具体实现:将会话类中传递的信息在这个类中进行最终地展示,会话类中传递出了封装了所有用户选择的蛋糕的 数组对象,只需要遍历出这些蛋糕对象,并将获取每一个蛋糕的名字即可
具体流程
首先当数据库模拟类被加载进内存时,会自动执行静态代码中的内容完成商品的初始化。然后在商品展示页面 遍历数据库模拟类中的商品,当点击购买的时候,会携带着数据重定向到负责存储Cookie的类中, 判断是否有对应的cookie数据,如果没有就重定向到数据展示页面重新选择,如果有,就按照ID值获取 数据库模拟类中的商品实例对象存储进Cookie中,然后转发到商品展示类中。在商品展示类中获取对应的 Cookie值对应的商品对象,并将商品的信息获取并输出在网页中完成一个简易的购物车模拟类