文章目录
粗略实现购物车系统
1.实现products的JavaBean:
javabean编写规范:
- 1.属性私有,建议采用包装类型
- 2.访问器公有,标准的setter/getter驼峰命名形式,故属性名应大于2个字母,不应出现首2字母为大写的情况
- 3.有无参构造方法
- 4.实现Serializable接口
- 5.可以有多参或全参构造方法
- 6.可以有toString等对象信息展示方法
//Product.java
package shoppingcart;
import java.io.Serializable;
/**
* @author fhzheng
* <h1>产品实体</h1>
* <h1>javabean编写规范</h1>
* <li> 1.属性私有,建议采用包装类型
* <li> 2.访问器公有,标准的setter/getter驼峰命名形式,故属性名应大于2个字母,不应出现首2字母为大写的情况
* <li> 3.有无参构造方法
* <li> 4.实现Serializable接口
* <li> 5.可以有多参或全参构造方法
* <li> 6.可以有toString等对象信息展示方法
*/
public class Product implements Serializable {
/**
* <li>属性
*/
private static final long serialVersionUID = 1L;
private String id; //商品标识
private String name; //商品名称
private String description; //商品描述
private double price; //商品价格
private int num; //商品数量-即库存
public Product(){ }
public Product(
String id,
String name,
String description,
double price,
int num){
this.id=id;
this.name=name;
this.description=description;
this.price=price;
this.num=num;
}
public String getId() {
return (this.id);
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return (this.name);
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return (this.description);
}
public void setDescription(String description) {
this.description = description;
}
public double getPrice() {
return (this.price);
}
public void setPrice(double price) {
this.price = price;
}
public int getNum() {
return (this.num);
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "Product [id=" + id + ", name=" + name + ", description=" + description + ", price=" + price + ", num="
+ num + "]";
}
}
2.购物车业务组件的编写:
package shoppingcart;
import java.util.*;
/**
* @author fhzheng
* <h1> 购物车业务组件 </h1>
* <li> 1 购物车业务可以有多复杂呢?
* <li> 2 购物车中的商品数量和库存数量之间是什么关系
* <li> 3 加商品和移除商品时,有哪些动作要发生,业务才完整
* <li> 4 如果是真实的业务,数据存在库中,这些操作又将如何完成呢?
* <li> 5 业务组件是系统的核心
* <li> 6 不要低估直实业务的复杂性,思考企业级应用的挑战性
*
*/
public class ShopCart {
/**
* <li>是一个List对象,存放商品
* <li>相当于是模拟购物车本身
* <li>用它的add和remove功能
* <li>还有iterator功能实现遍历
*/
private ArrayList<Product> cart=null;
/**
* <li>用构造函数初始化购物车
*/
public ShopCart() {
cart=new ArrayList<Product>();
}
/**
* <li>向购物车中添加商品
* @param product
*/
public void addProductToCart(Product product){
boolean is = false;
//是否第一次购买
for(int i=0; i<cart.size(); i++){
//如果已经存在该商品,肯定不是第一次购买
if(cart.get(i).getId().equals(product.getId())){ // 已存在
is = true;
// 每次只添加一件,购物车中添加一件,库存就会少一件
cart.get(i).setNum(cart.get(i).getNum()-1); //为何为-1?
break;
}
}
//是第一次购买
if(is == false){
// 每次只添加一件
// 动作1 库存同步
product.setNum(99); // 假设库存均为100件,首次添加购物车后,剩99件
// 动作2 加购物车
cart.add(product);
}
}
/**
* <li>从购物车中删除一商品
* @param productId
*/
public void removeProductFromCart(String productId){
if(cart==null)
return;
//用迭代器遍历找商品
Iterator it=cart.iterator();
while(it.hasNext()){
Product item=(Product)it.next();
if(item.getId().equals(productId)){
// 动作1,从购物车中去掉该商品
it.remove();
// 动作2,库恢复
item.setNum(100);
return;
}
}
}
/**
* <li>计算购物车中的商品总价格
* @return
*/
public double getAllProductPrice(){
if(cart==null)
return 0;
double totalPrice=0;
// 购物车迭代器
Iterator it=cart.iterator();
while(it.hasNext()){
Product item=(Product)it.next();
//求的是之积之和,谁的积,谁的和?
totalPrice += item.getPrice()*(100-item.getNum());
}
return totalPrice;
}
/**
* 返回购物车所有产品信息
* @return
*/
public List getAllProductsFromCart(){
return cart;
}
}
其中核心部分讲解:
创建一个名为cart的列表,其目的在于将商品的属性直接添加进链表内,方便传参给其他类遍历购物车内的内容,比如实现增删。
private ArrayList<Product> cart=null;
shopcart()方法,为cart链表赋属性(product)
public ShopCart() {
cart=new ArrayList<Product>();
}
addProductToCart方法(添加购物车)
public void addProductToCart(Product product){
boolean is = false;
//是否第一次购买
for(int i=0; i<cart.size(); i++){ //遍历cart链表中的元素
//如果已经存在该商品,肯定不是第一次购买
if(cart.get(i).getId().equals(product.getId())){ // 已存在 //cart.get(i) 获取下标的映射值
//.getid()获取商品名 再判断和加入商品,此处名为product是否一致,一致则表明已经存在
is = true;
// 每次只添加一件,购物车中添加一件,库存就会少一件
cart.get(i).setNum(cart.get(i).getNum()-1); //为何为-1? //下标为i对应的商品库存--
break;
}
}
//是第一次购买
if(is == false){
// 每次只添加一件
// 动作1 库存同步
product.setNum(99); // 假设库存均为100件,首次添加购物车后,剩99件
// 动作2 加购物车
cart.add(product); //由于第一次购买,需要添加product到链表中
}
}
removeProductFromCart购物车中删除
public void removeProductFromCart(String productId){
if(cart==null)
return;
//用迭代器遍历找商品
Iterator it=cart.iterator();
while(it.hasNext()){
Product item=(Product)it.next();
if(item.getId().equals(productId)){
// 动作1,从购物车中去掉该商品
it.remove();
// 动作2,库恢复
item.setNum(100);
return;
}
}
}
3.ShoppingServlet编写
其中理解见注释
需要结合第四点,ShowProductServlet商品的显示理解。
//ShoppingServlet.java
package shoppingcart;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
* @author fhzheng
* <h1> 交易控制器 </h1>
* <li> 完成业务动作控制【路由】
*/
public class ShoppingServlet extends HttpServlet {
// java常量的定义方式和规范
private static final String CONTENT_TYPE = "text/html;charset=utf-8";
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
// 方法中的局部变量
ServletContext context = getServletContext();
//cart获取服务器中已经存在的属性为shopcart的链表对象
HttpSession session = request.getSession();
ShopCart cart = (ShopCart) session.getAttribute("shopCart");
// 控制器动作判别 获取html中用户的操作,action为button的属性
String action = request.getParameter("action");
if ("remove".equals(action)) { // 从购物车中移走一件产品
String removeId = request.getParameter("removeId");
注意此处的removeId来自于以下页面上的传参
/*out.println("<td><a href=\""+response.encodeURL("./shopping?action=remove&removeId=")+productItem.getId()+"\">删除</a>"*/
cart.removeProductFromCart(removeId);
} else if ("add".equals(action)) { // 添加
String[] productIds = request.getParameterValues("productId");// 获取当前用户选择的产品ID 见第四点传入
Map products = (Map) context.getAttribute("products"); // 从ServletContext对象中提取产品信息
//product
if (cart == null) {
cart = new ShopCart(); // 创建一个购物车对象
session.setAttribute("shopCart", cart);
}
if (productIds == null) {
productIds = new String[0];
}
for (int i = 0; i < productIds.length; i++) { // 将用户选择的产品添加到购物车中
Product product = (Product) products.get(productIds[i]);
cart.addProductToCart(product);
}
}
RequestDispatcher rd = request.getRequestDispatcher("/showcart");
rd.forward(request, response); // 转向购物车显示的Servlet--showcartservlet
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4.ShowProductServlet 商品显示理解
package shoppingcart;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
* @author fhzheng
* <h1> 产品显示控制器 </h1>
*
*/
public class ShowProductServlet extends HttpServlet {
private static final String CONTENT_TYPE="text/html;charset=utf-8";
private Map products; //映射对象 products
//下文中的操作 将5件商品按序号顺序存入map中,之后通过set定义productidset对象为键值对形式,用迭代器it来遍历里面的“键”
/*Set productIdSet=products.keySet();
Iterator it=productIdSet.iterator();*/
public void init() throws ServletException{
// 用HashMap来做商店,初始化各种商品,供所有用户来购买
// 初始时,商品库存数量均为100个
products=new HashMap(); //hashmap
products.put("001",new Product("001","海信电视机","58英寸,LED液晶显示,安卓操作系统,2014年上市",6999.00,100));
products.put("002",new Product("002","海尔洗衣机","洗涤容量6Kg,滚筒式,LED显示屏,内筒材料为不锈钢",3999.00,100));
products.put("003",new Product("003","格力空调","三级变频,壁式挂机,超静音,超长质保,强力除湿",3269.00,100));
products.put("004",new Product("004","海尔热水器","横式,专利金刚三层胆,专利金刚三层胆,60L",2780.00,100));
products.put("005",new Product("005","西门子冰箱","三门冰箱,电脑控温,总容积为231-280L,能效等级为一级",5780.00,100));
ServletContext context=getServletContext();
// 商店置于APP全局中,所有人共享可用,买走1份少1份
context.setAttribute("products",products);
}
public void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<head><title>ShowProductServlet</title></head>");
out.println("<body bgcolor=\"#ffffff\">");
out.println("<h1>商品显示</h1>");
out.println("<a href=\""+response.encodeUrl("./showcart")+"\">查看购物车</a>");
out.println("<form name=\"productForm\" action=\"./shopping\"method=\"post\">");
out.println("<input type=\"hidden\" name=\"action\" value=\"add\"/>");
out.println("<table border=\"1\" cellspacing=\"0\">");
out.println("<tr bgcolor=\"#cccccc\">");
out.println("<tr bgcolor=\"#cccccc\"><td>序号</td><td>商品名称</td><td>商品描述</td><td>商品价格(元)</td><td>库存数量</td><td>添至购物车</td></tr>");
//见上文
Set productIdSet=products.keySet();
Iterator it=productIdSet.iterator();
int number=1;
while(it.hasNext()){
String id=(String)it.next();
Product product=(Product)products.get(id);
out.println("<tr><td>"+number+++"</td>");
out.println("<td>"+product.getName()+"</td>");
out.println("<td>"+product.getDescription()+"</td>");
out.println("<td>"+product.getPrice()+"</td>");
out.println("<td>"+product.getNum()+"</td>");
out.println("<td><input type=\"checkbox\" name=\"productId\" value=\""
+product.getId()+"\"></td></tr>");
}
out.println("</table><p><input type=\"submit\" value=\"确定\"/>");
out.println("<input type=\"reset\" value=\"重置\"/></p>");
out.println("</form></body></html>");
out.close();
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
doGet(request,response);
}
public void destroy(){ }
}
5.购物车显示ShowCartServlet
//ShowCartServlet.java
package shoppingcart;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
* @author fhzheng
* <h1> 显示控制器 </h1>
* <li> 完成界面的渲染和数据组装
*/
public class ShowCartServlet extends HttpServlet{
private static final String CONTENT_TYPE="text/html;charset=utf-8";
public void doGet(
HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
HttpSession session=request.getSession();
ShopCart shopcart=(ShopCart)session.getAttribute("shopCart");
List products=null;
if(shopcart==null||(products=shopcart.getAllProductsFromCart())==null){
out.println("<html>");
out.println("<head><title>ShowCartServlet</title></head>");
out.println("<body bgcolor=\"#ffffff\">");
out.println("<p><h1>你目前没有购买任何商品</h1></p>");
out.println("<p><a href=\""+response.encodeUrl("./show")+"\">返回产品显示页</a></p>");
out.println("</body></html>");
out.close();
} else {
Iterator it=products.iterator();
out.println("<html>");
out.println("<head><title>ShowCartServlet</title></head>");
out.println("<body bgcolor=\"#ffffff\">");
out.println("<p><h1>你目前购买的商品为:</h1></p>");
out.println("<table border=\"1\" cellspacing=\"0\">");
out.println("<tr bgcolor=\"#cccccc\"><td>商品名称</td><td>商品描述</td><td>价格</td><td>购买数量</td><td>操作</td></tr>");
while(it.hasNext()){
Product productItem=(Product)it.next();
out.println("<tr><td>"+productItem.getName()+"</td>");
out.println("<td>"+productItem.getDescription()+"</td>");
out.println("<td>"+productItem.getPrice()+"</td>");
out.println("<td>"+(100-productItem.getNum())+"</td>");
out.println("<td><a href=\""+response.encodeURL("./shopping?action=remove&removeId=")+productItem.getId()+"\">删除</a>"); //删除后将跳转到shoppingservle组件中,进行删除操作后又将回到此页面故会发现商品已经被删除
}
out.println("</table>");
out.println("<p>目前您购物车的总价格为:"+shopcart.getAllProductPrice()+"元人民币。</p>");
out.println("<p></br><a href=\""+response.encodeURL("./show")+"\">返回产品显示页</a></p>");
out.println("</body></html>");
out.close();
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
doGet(request,response);
}
}
进行删除操作后又将回到此页面故会发现商品已经被删除
}
out.println(“”);
out.println(“
目前您购物车的总价格为:”+shopcart.getAllProductPrice()+“元人民币。
”);out.println(“
<a href=”“+response.encodeURL(”./show")+“”>返回产品显示页
“);out.println(”");
out.close();
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
doGet(request,response);
}
}