文章目录

  • Servlet之session实践:session实现简易购物车
  • 1 过程分析
    • 1.1 Product类:存储商品信息
    • 1.2 ShoppingItem类:存储购买条目信息
    • 1.3 ShoppingCartServlet类:控制器类,商品显示和购物车显示等功能
  • 2 源码与测试结果
    • 2.1 目录结构
    • 2.2 源码
      • 2.2.1 Product.java
      • 2.2.2 ShoppingItem.java
      • 2.2.3 ShoppingCartServlet
    • 2.3 测试结果
      • 2.3.1 商品列表
      • 2.3.2 商品详细信息
      • 2.3.3 点击购买将商品添加到购物车
      • 2.3.4 删除一些不想要的产品

Servlet之session实践:session实现简易购物车

1 过程分析

1.1 Product类:存储商品信息

成员变量 描述
id 商品编号
name 商品名称
direction 商品描述
price 商品价格
成员方法 描述
public Produce(id,name,direction,price){…}
getXxx(){}、setXxx(…){}

1.2 ShoppingItem类:存储购买条目信息

成员变量 描述
Product product 商品信息
int quantity 商品数量
成员方法
public ShoppingItem(product,quantity){…}
getXxx(){}、setXxx(…){}

1.3 ShoppingCartServlet类:控制器类,商品显示和购物车显示等功能

成员方法
public void init(){}
doGet(){}
doPost(){}
showProductList(HttpServletResponse){} 显示所有商品信息
showProductDetails(HttpServletRequest,HttpServletResponse){} 显示商品详细信息
showCart(HttpServletRequest,HttpServletResponse){} 显示购物车信息
deleteItem(HttpServletRequest,HttpServletResponse){} 删除购物车中的某条商品

2 源码与测试结果

2.1 目录结构

2.2 源码

2.2.1 Product.java

package com.lab;/*** @author FX* @date 2020/09/14*/
public class Product {private int id;private String name;private String description;private float price;public Product(int id, String name, String description, float price) {this.id = id;this.name = name;this.description = description;this.price = price;}/*** @return the id*/public int getId() {return id;}/*** @param id the id to set*/public void setId(int id) {this.id = id;}/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the description*/public String getDescription() {return description;}/*** @param description the description to set*/public void setDescription(String description) {this.description = description;}/*** @return the price*/public float getPrice() {return price;}/*** @param price the price to set*/public void setPrice(float price) {this.price = price;}}

2.2.2 ShoppingItem.java

package com.lab;/*** @author FX* @date 2020/09/14*/
public class ShoppingItem {private Product product;private int quantity;public ShoppingItem(Product product, int quantity) {// TODO Auto-generated constructor stubthis.product = product;this.quantity = quantity;}/*** @return the product*/public Product getProduct() {return product;}/*** @param product*            the product to set*/public void setProduct(Product product) {this.product = product;}/*** @return the quantity*/public int getQuantity() {return quantity;}/*** @param quantity*            the quantity to set*/public void setQuantity(int quantity) {this.quantity = quantity;}}

2.2.3 ShoppingCartServlet

package com.lab;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;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 javax.servlet.http.HttpSession;/*** Servlet implementation class ShoppingCartServlet* * @author FX* @date 2020/09/14**/
@WebServlet(name = "/ShoppingCartServlet",urlPatterns = {"/products", "/viewProductDetails", "/addToCart", "/viewCart", "/deleteItem"})
// 当匹配urlPatterns时,是按照其中选项的顺序,按序依次匹配
// 当用户首次访问该Servlet时,执行showProductList(),显示商品信息
public class ShoppingCartServlet extends HttpServlet {// 用一个List对象存放商品productsprivate List<Product> products = new ArrayList<Product>();//商品列表的初始化public void init() throws ServletException {products.add(new Product(0, "单反相机", "尼康性价比最高的单反相机", 4159.95F));products.add(new Product(1, "华为手机", "华为公司的最新Mate40", 5999.99F));products.add(new Product(2, "笔记本电脑", "联想公司的新一代产品", 4999.95F));products.add(new Product(3, "平板电脑", "苹果公司的新产品", 2999.95F));}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String uri = request.getRequestURI();// 根据请求URI决定调用那个方法/*System.out.println(request.getRequestURI());System.out.println(request);System.out.println(request.getMethod());Enumeration<String> headers = request.getHeaderNames();while (headers.hasMoreElements()) {String heard = (String)headers.nextElement();String value = request.getHeader(heard);System.out.println(heard + "=" + value);}*/if (uri.endsWith("/products")) {showProductList(response);System.out.println("01");} else if (uri.endsWith("/viewProductDetails")) {showProductDetails(request, response);System.out.println("02");} else if (uri.endsWith("/viewCart")) {showCart(request, response);System.out.println("03");} else if (uri.endsWith("/deleteItem")) {deleteItem(request, response);}}// 显示所有的商品信息private void showProductList(HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<html><head><title>商品列表</title></head>" + "<body><p>商品列表</p><ul>");for (Product product : products) {out.println("<li>" + product.getName() + "(" + product.getPrice() + ")(" + "<a href='viewProductDetails?id="+ product.getId() + "'>详细信息</a>)");}out.println("</ul>");out.print("<a href='viewCart'>查看购物车</a>");out.println("</body></html>");}// 显示商品的详细信息private void showProductDetails(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();int productId = 0;// 根据商品编号返回商品对象Product product;try {productId = Integer.parseInt(request.getParameter("id"));} catch (NumberFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();}product = getProduct(productId);if (product != null) {out.println("<html><head><title>商品详细信息</title></head>" + "<body><p>商品详细信息</p>");out.println("<form action='addToCart' method='post'>");out.println("<!--<tr><td>商品编号</td><td>--><input type='hidden' name='id' value='" + product.getId()+ "'</input><!--</td>-->");out.println("<table>");out.println("<tr><td>商品名</td><td>" + product.getName() + "</td>");out.println("<tr><td>商品描述</td><td>" + product.getDescription() + "</td></tr>");out.println("<tr><td>商品价格</td><td>" + product.getPrice() + "</td></tr>");out.println("<tr><td><input name='quantity'></td><td><input type='submit' value='购买'></td></tr>");out.println("<tr><td><a href='products'>商品列表</a></td></tr></table>");} else {out.println("没有找到相关产品!");}}// 根据商品编号返回商品对象的方法private Product getProduct(int productId) {for (Product product : products) {if (product.getId() == productId) {return product;}}return null;}// 当用户输入购买数量,点击“购买”按钮后,通过表单的post方式发送请求(请求由doPost()处理),将用户够买的商品添加到购物车,购物车也是用List实现的。@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 将够买商品添加到购物车int productId = 0;int quantity = 0;try {productId = Integer.parseInt(request.getParameter("id"));quantity = Integer.parseInt(request.getParameter("quantity"));} catch (NumberFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();}Product product = getProduct(productId);if (product != null && quantity > 0) {// 创建一个商品条目ShoppingItem shoppingItem = new ShoppingItem(product, quantity);// 创建一个会话对象HttpSession session = request.getSession();// 在会话对象中查找购物车对象List<ShoppingItem> cart = (List<ShoppingItem>)session.getAttribute("cart");if (cart == null) {// 如果在会话对象上没找到购物车对象,则创建购物车对象,并将其添加到会话对象中cart = new ArrayList<ShoppingItem>();session.setAttribute("cart", cart);}// 将商品添加到购物车对象中cart.add(shoppingItem);}//showCart(request, response);//直接请求转发会产生:购物车刷新一次,添加一次最后一次已近加入购物车的商品response.sendRedirect("viewCart");/*response.sendRedirect("viewCart.jsp");*当改造成jsp界面跳转时,此处应该用“重定向”,防止购物车刷新一次,添加一次最后一次已近加入购物车的商品**/}// 显示购物车信息private void showCart(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<html><head><title>购物车</title></head>");out.println("<body><p>代付款商品</p>");// 遍历购物车中的商品条目HttpSession session = request.getSession();List<ShoppingItem> cart = (List<ShoppingItem>)session.getAttribute("cart");if (cart != null) {out.println("<table>");out.println("<tr><td style='width:50px'>数量</td>" + "<td style='80px'>商品</td>" + "<td style='80px'>价格</td>"+ "<td style='80px'>小计</td>" + "<td style='80px'>是否删除</td>");double allcost = 0.0;for (ShoppingItem shoppingItem : cart) {Product product = shoppingItem.getProduct();int quantity = shoppingItem.getQuantity();if (quantity != 0) {float price = product.getPrice();// double subtotal = ((quantity*100) * (price*100))/10000;double subtotal = ((int)(quantity * price * 100 + 0.5)) / 100;out.println("<tr><td>" + quantity + "</td>" + "<td>" + product.getName() + "</td>" + "<td>" + price+ "</td>" + "<td>" + subtotal + "</td>");out.println("<td><a href='deleteItem?id=" + product.getId() + "'>删除</a></td></tr>");allcost += subtotal;}}out.println("<tr><td colspan='4' style='text-align:right'>总计:" + allcost + "</td></tr>");} else {out.println("<p>您的购物车还未加入商品哦!</p>");}out.println("<tr><td><a href='products'>商品列表</a></td></tr>");out.println("</table></body></html>");}// 购物车删除private void deleteItem(HttpServletRequest request, HttpServletResponse response) throws IOException {int productId=Integer.parseInt(request.getParameter("id"));Product product=getProduct(productId);HttpSession session=request.getSession();List<ShoppingItem>cart=(List<ShoppingItem>)session.getAttribute("cart");Iterator<ShoppingItem> iterator=cart.iterator();for (;iterator.hasNext();){ShoppingItem shoppingItem = (ShoppingItem)iterator.next();Product product1=shoppingItem.getProduct();int productId1=product1.getId();if (productId1==productId) {System.out.println("删除的产品:"+product1.getName());iterator.remove();//用迭代器iterator.remove()解决并发修改异常,用cart.remove(shoppingItem)产生该异常}}/*ConcurrentModificationException异常与解决* * 参考:https://blog.csdn.net/Jiangshan11/article/details/83038857* https://www.cnblogs.com/zhuyeshen/p/10956822.html* * for (ShoppingItem shoppingItem : cart) {Product product1=shoppingItem.getProduct();int productId1=product1.getId();if (productId1==productId) {System.out.println("删除的产品:"+product1.getName());cart.remove(shoppingItem);}}*/showCart(request, response);}
}

2.3 测试结果

2.3.1 商品列表

查看购物车:为空

2.3.2 商品详细信息


输入购买数量、点击购买:

2.3.3 点击购买将商品添加到购物车

2.3.4 删除一些不想要的产品


注:jsp界面的改造等待后期更新,更多功能和请关注后期更新“购物车”专栏。有问题之处希望各位交流指正。

Servlet之session实践:session实现简易购物车相关推荐

  1. Session机制二(简易购物车案例)

    一:案例一(简易购物车) 1.目录结构 2.step1.jsp 1 <%@ page language="java" contentType="text/html; ...

  2. Servlet session: 用session实现简单 购物车

    目录 实现步骤 导航栏 Book BookDB listBookServlet purcharseServlet cartServlet web.xml 实现步骤 1. 创建 Book 封装图书信息 ...

  3. Servlet之Cookie和Session

    会话技术 在了解cookie和session之前,需要先了解一个概念:会话 1. 概念 在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话.web应用中的会话过程类似于生活中的 ...

  4. Servlet的Cookie和Session机制

    Servlet Cookies Cookies定义:Cookies是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息. Cookies作用:会话保持,如完成用户的登录与状态保持 Cookie ...

  5. JavaWeb之Servlet:Cookie 和 Session

    会话 现实生活中我们会用手机跟对方对话,拿起手机,拨号,然后对面接听,跟着互相通话,最后会话结束. 这个过程也可以用我们的B/S模式来描述: 打开浏览器->输入地址->发出请求->服 ...

  6. javaweb练手项目jsp+servlet简易购物车系统

    简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...

  7. Web页面或app等前端页面之Java Web的JSP、Servlet、Cookie、Session等技术小结

    Java Web学习,掌握JSP.Servlet.Cookie.Session等内容,使用JSTL进行数据展示完成实际应用. 2.3.1 XML基础 XML的用途.语法规则.语义约束.如何解析XML, ...

  8. java购物车项目代码_javaweb练手项目jsp+servlet简易购物车系统

    简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...

  9. java 重写session_使用Shiro重写Session 自定义SESSION

    引入shiro的jar包 1.2.3 org.apache.shiro shiro-core ${shiroVersion} org.apache.shiro shiro-web ${shiroVer ...

最新文章

  1. Sql注入和Html注入
  2. 成功要养成的习惯和改掉的习惯
  3. java集合框架图(一)
  4. Hibernate组件(Component)映射
  5. express+mongodb+vue实现增删改查-全栈之路
  6. 三维重建:三维空间中平面的旋转公式
  7. html5 ariicle,42068 RECEPTACLE, FASTON,™ .110 SERIES CUSTOMER DR
  8. 展示一个基本的正则用例
  9. 关于移动端滚动穿透问题的解决
  10. Deeplearning4j 手写体数字识别
  11. 【java基础知识】设置表格内容居中显示,表格字体大小调整,表格列宽调整
  12. WF本质论第一章的代码
  13. resample函数_使用Pandas的resample函数处理时间序列数据的技巧
  14. Python基础__函数
  15. Zabbix SNMP traps使用
  16. 【企业】质量管理:如何使用 5WHY 分析法解决处理问题
  17. Java8新特性之日期和时间
  18. 5G注册流程分级详解
  19. 我的世界java版钻石剑附魔_我的世界钻石剑怎么附魔 钻石剑附魔100级指令
  20. win7 关闭计算机休眠,Win7关闭休眠的方法

热门文章

  1. WSO2 Business Process Server(BPS)详细教程:结合Application Server服务(附源码下载)
  2. word的自定义编号+自定义多级列表+交叉引用
  3. 享元模式(Flyweight Pattern)
  4. vim多行编辑、多行删除
  5. 【安全】awvs使用(二)
  6. Babel presets stage
  7. html视觉彩条区域怎么打,创意彩条装饰教案.doc
  8. 小程序 Android手机显示正常,ios手机显示空白
  9. 不会装逼的手机语音助手
  10. python 将三维数据转为二维_python 二维矩阵转三维矩阵示例