步骤 2 : OrderItem 步骤 3 : ProductDAO 步骤 4 : 购买商品 步骤 5 : 显示购物车内容 步骤 6 : 购买相同商品 步骤 7 : 配置web.xml 步骤 8 : 测试 步骤 9 : 练习-删除订单项 步骤 10 : 答案-删除订单项 步骤 11 : 练习-加入购物车 步骤 12 : 答案-加入购物车
暂时不需要为OrderItem创建表,因为在这个环节OrderItem还是保存在Session中的
package bean;
public class OrderItem {
private int id;
private Product product;
private int num;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
因为购买的时候,提交到服务器的是pid, 而OrderItem类的product属性是一个Product类型
所以ProductDAO需要根据id获取Product对象 package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import bean.Product;
public class ProductDAO {
public static void main(String[] args) {
System.out.println(new ProductDAO().getProduct(1).getName());
}
public Product getProduct(int id) {
Product result = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "select * from product where id = ?";
PreparedStatement ps = c.prepareStatement(sql);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
result = new Product();
result.setId(id);
String name = rs.getString(2);
float price = rs.getFloat(3);
result.setName(name);
result.setPrice(price);
}
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public List<Product> ListProduct() {
List<Product> products = new ArrayList<Product>();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/cart?characterEncoding=UTF-8",
"root", "admin");
String sql = "select * from product order by id desc";
PreparedStatement ps = c.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Product product = new Product();
int id = rs.getInt(1);
String name = rs.getString(2);
float price = rs.getFloat(3);
product.setId(id);
product.setName(name);
product.setPrice(price);
products.add(product);
}
ps.close();
c.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return products;
}
}
购买行为本身就是创建一个OrderItem对象
在负责购买商品的OrderItemAddServlet 中,进行如下流程 1. 获取购买数量 2. 获取购买商品的id 3. 根据id获取商品对象 4. 创建一个新的OrderItem对象 5. 从session中取出一个List , 这个List里面存放陆续购买的商品。 如果是第一次从session中获取该List,那么它会是空的,需要创建一个ArrayList 6. 把新创建的OrderItem对象放入该List 中 7. 跳转到显示购物车的listOrderItem package servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.OrderItem;
import bean.Product;
import dao.ProductDAO;
public class OrderItemAddServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int num = Integer.parseInt(request.getParameter("num"));
int pid = Integer.parseInt(request.getParameter("pid"));
Product p = new ProductDAO().getProduct(pid);
OrderItem oi = new OrderItem();
oi.setNum(num);
oi.setProduct(p);
List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");
if (null == ois) {
ois = new ArrayList<OrderItem>();
request.getSession().setAttribute("ois", ois);
}
ois.add(oi);
response.sendRedirect("/listOrderItem");
}
}
显示购物车的OrderItemListServlet 其实什么也没做,因为数据已经在session准备好了,直接服务端跳转到listOrderItem.jsp
在listOrderItem.jsp中,从session中遍历出所有的OrderItem。 因为保存在OrderItem 上的是一个Product对象,所以很容易就可以通过EL表达式遍历出商品的名称和价格。 ${oi.product.name}
${oi.product.price} package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.Product;
import dao.ProductDAO;
public class OrderItemListServlet extends HttpServlet
{
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("listOrderItem.jsp").forward(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<h1 align="center" >购物车</h1>
<table align='center' border='1' cellspacing='0'>
<tr>
<td>商品名称</td>
<td>单价</td>
<td>数量</td>
<td>小计</td>
</tr>
<c:forEach items="${ois}" var="oi" varStatus="st">
<tr>
<td>${oi.product.name}</td>
<td>${oi.product.price}</td>
<td>${oi.num}</td>
<td>${oi.product.price*oi.num}</td>
</tr>
</c:forEach>
</table>
遍历session中所有的OrderItem
如果找到对应的product.id一样的条目,就调整其数量 如果没有找到,就新增加一条 package servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bean.OrderItem;
import bean.Product;
import dao.ProductDAO;
public class OrderItemAddServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int num = Integer.parseInt(request.getParameter("num"));
int pid = Integer.parseInt(request.getParameter("pid"));
Product p = new ProductDAO().getProduct(pid);
OrderItem oi = new OrderItem();
oi.setNum(num);
oi.setProduct(p);
List<OrderItem> ois = (List<OrderItem>) request.getSession().getAttribute("ois");
if (null == ois) {
ois = new ArrayList<OrderItem>();
request.getSession().setAttribute("ois", ois);
}
boolean found = false;
for (OrderItem orderItem : ois) {
if (orderItem.getProduct().getId() == oi.getProduct().getId()) {
orderItem.setNum(orderItem.getNum() + oi.getNum());
found = true;
break;
}
}
if (!found)
ois.add(oi);
response.sendRedirect("/listOrderItem");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>ProductListServlet</servlet-name>
<servlet-class>servlet.ProductListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProductListServlet</servlet-name>
<url-pattern>/listProduct</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserLoginServlet</servlet-name>
<servlet-class>servlet.UserLoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserLoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>OrderItemAddServlet</servlet-name>
<servlet-class>servlet.OrderItemAddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OrderItemAddServlet</servlet-name>
<url-pattern>/addOrderItem</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>OrderItemListServlet</servlet-name>
<servlet-class>servlet.OrderItemListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OrderItemListServlet</servlet-name>
<url-pattern>/listOrderItem</url-pattern>
</servlet-mapping>
</web-app>
从登陆页面开始,登陆后到产品显示页面,然后修改购买数量,最后点击购买
http://127.0.0.1/login.jsp
在订单项后面增加一个删除按钮,表示可以删除这个订单项
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
答案在右上角的:cart_practise_delete.rar
目前是购买,并且跳转到购物车页面。
修改为"加入购物车“,点击之后,"加入购物车“几个字变灰,不可点。 当前页面也不跳转。 通过ajax把这个数据提交到后台,加入购物车。 要准备一个显示购物车连接。
HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
问答区域
2023-08-10
站长的”加入购物车“是不是有点问题
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-08-18
found不太理解
2 个答案
四方1 跳转到问题位置 答案时间:2023-08-09 什么乱七八糟的,逻辑混乱……
found=FALSE是没找到,购物车里没有,就进if,然后add
12345678923ws 跳转到问题位置 答案时间:2022-02-26 你看,首先if只有true才会执行,!found=ture。说明没有同一件商品加入,当有同一件商品加入时,在集合里面修改数量,这里不再添加
回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
2021-06-15
删除订单项加入购物车怎么使用那两个文件
2021-06-10
用ajax后OrderItemAddServlet里的response.sendRedirect("/listOrderItem");就不生效了吗?
2021-03-01
OrderItem的id属性可否去掉
提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 33 条以前的提问,请 点击查看
提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
|