JavaWeb实现简单购物车案例

我们需要一个用来封装商品信息的商品类

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值对应的商品对象,并将商品的信息获取并输出在网页中完成一个简易的购物车模拟类

你可能感兴趣的:(java,开发语言)