使用Servlet技术~购物车-04

购物车的设计思想:一个商品对象,一个商品对象集合(这里使用HashMap).

购物车的功能:商品列表展示,点击查看详情(查看之后会被加入最近浏览的历时记录里),加入购物车,购物车商品展示(商品名称、数量、价格、以及最后的总价。)

在这里,不涉及 servlet,因为servlet就是处理业务逻辑代码,比如:点击商品查看详情,就是根据 商品ID查询商品,绑定到一个对象,再将对象绑定到对应作用域,比如request,session等,然后页面用标签取出来。

主要讲解,一个设计的思想,极其为什么这么设计。

购物车属性:商品总价格,HashMap<k,v>   k:商品对象    v:购买的商品数量    这样设计,一个商品做为键,对应购买数量做为值。

1、首先有一个商品对象,记录商品信息,例如:商品ID,商品名称,价格,如下:

private String itemId;

    private String itemName;

    private Double price;

//getter/setter方法()

但是这个必须重写 Object 的两个方法:hashCode,equals 为什么?此次是为了防止重复的商品再次做为一个新商品加入购物车,正确的做法是,存在购物车的商品就应该在原有商品购买的数量上进行叠加。

代码重写如下:

    /*@Override
    public int hashCode() {
      // TODO Auto-generated method stub
      return this.getId()+this.name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
      // TODO Auto-generated method stub
      if(this == obj){
        return true;
      }
      if(obj instanceof Items){
        Items i = (Items)obj;
        if(this.getId() == i.getId() && this.getName() == i.getName()){
          return true;
        }else{
          return false;
        }
      }else{
        return false;
      }
    }*/

这里为什么要这么搞?文章结尾会做本质上的区别。

2、购物车对象

    private HashMap<Items, Integer> goods;//K:商品对象,V:购买的数量
    private Double totalPrice; //总价格

//getter/setter方法(略)

/**购物车操作方法**/

//增加商品

public boolean addGoodsInCart(Items item,Integer count){

  if(goods.containsKey(item)){

    goods.put(item, goods.get(item)+count);
  }else{
    goods.put(item, count);
  }

  callTotalPrice();//计算总价格
  return true;
}

//删除商品

public boolean removeGoodsFromCart(Items item){

  goods.remove(item);
  callTotalPrice();
  return true;
}

//计算总价格

public Double callTotalPrice(){

  Double sum = 0.0;
  Set<Items> keys = goods.keySet();
  Iterator<Items> it = keys.iterator();
  while(it.hasNext()){
    Items item = it.next();
    sum = sum + item.getPrice()*goods.get(item);
    //System.err.println(item.getPrice()+"*"+goods.get(item)+"="+sum);
  }
  this.setTotalPrice(sum);
  return this.getTotalPrice();
}

下面只提供,main方法,因为,如果要从页面操作的话,就关系到数据库或者说使用session来存储数据,比较繁杂,这里简洁的写法,这里提供main方法:

public static void main(String[] args) {

  Items i1 = new Items(1,"足球",20.00);
  Items i2 = new Items(2,"篮球",30.00);
  Items i3 = new Items(1,"足球",40.00);

  Cart c = new Cart();

  c.addGoodsInCart(i1, 1);
  c.addGoodsInCart(i2, 2);
  c.addGoodsInCart(i3, 5);

  Set<Map.Entry<Items, Integer>> items = c.getGoods().entrySet();
  for (Map.Entry<Items, Integer> obj : items) {
    Items item = obj.getKey();
    Integer count = obj.getValue();
    //System.out.println(obj.toString());
    System.out.println("商品:"+item.getName()+",价格:"+item.getPrice()+"数量:"+count);

  }

  System.out.println("总共:"+c.getTotalPrice());
}

3、关于浏览过商品思路,存放在cookie.         

根据查看详情收集 id,并且id之间用","分割,然后存放在cookie当中

<%
  String list ="";
  //从客户端获得Cookies集合
  Cookie[] cookies = request.getCookies();
  //遍历这个Cookies集合
  if(cookies!=null&&cookies.length>0)
  {
    for(Cookie c:cookies)
    {
      if(c.getName().equals("ListViewCookie"))
      {
        list = c.getValue();
      }
    }
  }

  list+=request.getParameter("id")+",";
  //如果浏览记录超过1000条,清零.
  String[] arr = list.split(",");
  if(arr!=null&&arr.length>0)
  {
    if(arr.length>=1000)
    {
      list="";
    }
  }
  Cookie cookie = new Cookie("ListViewCookie",list);
  response.addCookie(cookie);

%>

将cookid中存放的 list格式为:id1,id2,id3 这个格式字符串传到后台,后台通过封装成一个List<商品对象>,到页面即可展示出来。

扩展:

判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法<资料如下>

资料地址:http://blog.sina.com.cn/s/blog_5396eb5301013ugt.html

对象存在堆内存。

首先说建议的情况:    比如你的对象想放到Set集合或者是想作为Map的key时,那么你必须重写equals()方法,这样才能保证唯一性。当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该在重写equals()    方法的同时,也重写hashCode()方法。

    必须重写hashCode()的情况:
       如果你的对象想放进散列存储的集合中(比如:HashSet,LinkedHashSet)或者想作为散列Map(例如:HashMap,LinkedHashMap等等)的Key时,在重写equals()方法的同时,必须重写hashCode()方法。

    1.hashCode()方法存在的主要目的就是提高效率。
    2.在集合中判断两个对象相等的条件,其实无论是往集合中存数据,还是从集合中取数据,包括如果控制唯一性等,都是用这个条件判断的,条件如下:
         首先判断两个对象的hashCode是否相等,如果不相等,就认为这两个对象不相等,就完成了。如果相等,才会判断两个对象的equals()是否相等,如果不相等,就认为这两个对象不相等,如果相等,那就认为这两个对象相等。

最后总结一句话就是,hashCode()方法存在的主要目的就是提高效率,但是如果你想把对象放到散列存储结构的集合中时,是必须要重写的。

完毕!

时间: 2024-11-05 14:46:55

使用Servlet技术~购物车-04的相关文章

java servlet开发购物车功能,实现增删改查结算等功能。

原文:java servlet开发购物车功能,实现增删改查结算等功能. 源代码下载地址:http://www.zuidaima.com/share/1550463494130688.htm 购物车功能:增删改查,结算等功能,主要技术为:servlet对数据库的访问... 源代码截图:

CGI与Servlet技术对比

CGI:Common Gateway Interface,通用网关接口. CGI处理步骤 首先,客户端(即Web浏览器)根据某资源的URL向Web服务器提出请求:Web服务器的守护进程(HTTP Daemon)将此请求的参数通过标准输入和环境变量传递给指定的CGI程序,并启动此应用程序进行处理,如要存取数据库服务器上数据库的数据,则向数据库服务器发出处理请求,数据库服务器将执行结果返回给CGI程序,CGI程序把处理结果通过标准输出返回给HTTP Daemon进程,再由HTTP Daemon进程返

漫谈Servlet技术

1.要谈到Servlet技术,不得不先谈谈动态网页的概念. 编写过网页的人都知道,浏览器能够根据HTML静态标记语言来显示各式各样的网页.但是如果我们需要在网页上完成一些业务逻辑:比如登陆验证.或者说网页显示的内容在服务器的数据库中.如果是这样,除了负责显示的HTML标记之外,必须还要有完成这些业务功能的代码存在.这种网页我们就叫做动态网页. 对于静态网页而言,服务器上存在的是一个个纯HTML文件.当客户端浏览器发出HTTP请求时,服务器可以根据请求的URL找到对应的HTML文件,并将HTML代

Java Web之Servlet技术

1.Servlet基础 针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax.servlet.http,Servlet就是一种实现了Servlet接口的类,它由Web容器(Tomcat/Jetty等)负责调用并创建,用于接收和响应用户请求.Servlet接口中定义了5个抽象方法: 方法 功能 void init(ServletConfig config) 负责Servlet初

【Java】Java Servlet 技术简介

Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创建您能够想像到的任意复杂度的 Web 应用程序,以及作为一名专业编程人员,您如何才能最有效地使用 servlet. 5 评论: Roy W. Miller ([email protected]), 独立的软件开发辅导员.程序员和作者, RoleModel Software 2004 年 12 月 2

Java Servlet技术

当Web刚开始被用来传送服务时,服务提供者就已经意识到了动态内容的需要.Applet是为了实现这个目标的一种最早的尝试,它主要关注使用客户端平台来交付动态用户体验.与此同时,开发人员也在研究如何使用服务器平台实现这个目标.开始的时候,公共网关接口(Common Gateway Interface ,CGI)脚本是生成动态内容的主要技术.虽然使用得非常广泛,但CGI脚本技术有很多的缺陷,这包括平台相关性和缺乏可扩展性.为了避免这些局限性,Java Servlet技术应运而生.它能够以一种可移植的方

javaSE学习笔记—Servlet技术(11)

如果大家要开发一个动态的网站,那么就必须要学习一种动态的网页开发技术.那么在SUN提供的JavaEE中主要包含两种开发动态网页的技术:Servlet和JSP技术. Servlet技术简介 Servlet技术是SUN提供的一种开发动态网页的核心组件之一.可以方便的开发动态网页.主要用得语言是java,开发者只需要实现相应的接口或者继承相应的类,那么你的java文件就是一个动态的网页.当然好需要一些额外的配置即可. 一个Servlet其实就是一个运行在web server上得一个java程序. Se

servlet技术学习随笔

进入这里学习的第二天!开始着手想看servlet,前面看到javabean jsp 跟这个servlet的MVC框架!真心觉得很重要,技术这种东西学会了就很懂!学不会再怎么解释都不明白.看了一整上午!没怎么搞明白!才想起来以前学习c#的土办法!各种去百度!起查……终于算是有点懂得了! (1).  PrintWriter out = response.getWriter();当一个Servlet响应的时候将响应信息通过out对象输出到网页上,当响应结束时它自动被关闭.PrintWriter用处是将

Java Servlet 技术简介

Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创建您能够想像到的任意复杂度的 Web 应用程序,以及作为一名专业编程人员,您如何才能最有效地使用 servlet. 4 评论: Roy W. Miller ([email protected]), 独立的软件开发辅导员.程序员和作者, RoleModel Soft