简陋的图书商城应用(无结算页面)

WEB应用总览

1.建立好相应的包,从底层开始开发

  domain包添加Book类

  

package cn.itcast.domain;

public class Book {
    private String id;
    private String name;
    private String author;
    private Double price;
    private String description;

    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Book(String id, String name, String author, Double price,
            String description) {
        super();
        this.id = id;
        this.name = name;
        this.author = author;
        this.price = price;
        this.description = description;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

}

2 用一个类模拟数据库,map保存书本

package cn.itcast.DB;

import java.util.LinkedHashMap;
import java.util.Map;

import cn.itcast.domain.Book;

//代表数据库
public class DB {
    private static Map map=new LinkedHashMap();
    static{
        map.put("1", new Book("1","javaweb", "张三", 20.0, "一本好书"));
        map.put("2", new Book("2","jsp", "李四", 50.0, "一本好书"));
        map.put("3", new Book("3","html", "王五", 40.0, "一本好书"));
        map.put("4", new Book("4","Spring", "张韧", 60.0, "一本好书"));
        map.put("5", new Book("5","Ajax", "张文博", 20.0, "一本好书"));
        map.put("6", new Book("6","struts", "周利强", 40.0, "一本好书"));
    }
    public static Map getAll(){
        return map;

    }
}

3 操作数据库的Dao类

package cn.itcast.dao;

import java.util.Map;

import cn.itcast.DB.DB;
import cn.itcast.domain.Book;

public class BookDao {
    public Map getAll(){
        return DB.getAll();

    }
    public Book find(String id){
        return (Book) DB.getAll().get(id);
        }

}

4 初步写出业务层

package cn.itcast.service;

import java.util.Map;

import cn.itcast.dao.BookDao;
import cn.itcast.domain.Book;
import cn.itcast.domain.Cart;

public class BusinessService {
    private BookDao dao=new BookDao();
    public Map getAllBook(){
        return dao.getAll();

    }
    public Book findBook(String id){
        return dao.find(id);

    }

5 图书商城首页

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>图书商城</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body style="text-align: center">
    <a style="font-size:50px"    href="${pageContext.request.contextPath }/servlet/ListBookServlet">浏览书籍</a> <br>
  </body>
</html>

  6 由上可知,点击首页的浏览,跳转到一个WBE层的ListBookServlet

  

public class ListBookServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        BusinessService service=new BusinessService(); //WEB层统一调用业务层方法
        Map map=service.getAllBook();
        //获取数据库,并转发到一个jsp页面
        request.setAttribute("map", map);
        request.getRequestDispatcher("/WEB-INF/jsp/listbook.jsp").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}

7  在WEB-INF下新建目录jsp,再在jsp中 新建 listbook.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    <%-- 导入jstl包,将c.tld标签库引入 --%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>书籍列表</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body style="text-align: center">
   <h1>书籍列表</h1>
<center> <table  style="align: center" border="1"  width="80%" >
           <tr >
               <td >书名</td>
               <td>作者</td>
               <td>售价</td>
               <td>描述</td>
               <td>操作</td>
           </tr>
           <c:forEach var="entry" items="${map }">  <%-- JSTL中forEach标签,遍历map --%>
               <tr>
               <td>${entry.value.name} </td>
               <td>${entry.value.author}</td>
               <td>${entry.value.price}</td>
               <td>${entry.value.description}</td>
               <td>
               <a href="${pageContext.request.contextPath}/servlet/BuyServlet?id=${entry.value.id}" target="_blank">购买</a>
               </td>
               </tr>
           </c:forEach>    

</center>
  </body>
</html>

发布到服务器测试成功后接着完善功能

8 <a href="${pageContext.request.contextPath}/servlet/BuyServlet?id=${entry.value.id}" target="_blank">购买</a>

将要买的书的id发送到BuyServlet

所以我们准备WEB层新建BuyServlet

但此时有一个疑问,买的商品要放到哪里呢?正确的做法是买到购物车中,再结算,而购物车的每个购物项目都有自己相应的数目

so,先在domain中建立购物车Cart和购物项CartItem类。

package cn.itcast.domain;

import java.util.Map;

//存放书的购物项
public class CartItem {
    private Book book;  //书
    private int quantity;   //书的数量
    private double price;     //购物项的总价
    public Book getBook() {
        return book;
    }
    public void setBook(Book book) {
        this.book = book;
    }
    public int getQuantity() {
        return quantity;
    }
    //一旦数量改变,购物项的总价就改变
    public void setQuantity(int quantity) {
        this.quantity = quantity;
        this.price=this.book.getPrice()*this.quantity;
    }
    public double getPrice() {

        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }

}
package cn.itcast.domain;

import java.util.LinkedHashMap;
import java.util.Map;

//代表购物车
public class Cart {
    private Map<String,CartItem> map=new LinkedHashMap();
    private double price; //购物车总价
    public Map<String, CartItem> getMap() {
        return map;
    }
    public void setMap(Map<String, CartItem> map) {
        this.map = map;
    }
    //购物车总价为map中存放的所有购物项总价之和
    public double getPrice() {
        double totalprice=0;
        for(Map.Entry<String, CartItem> entry:map.entrySet()){
            CartItem item=entry.getValue();
            totalprice+=item.getPrice();
        }
        this.price=totalprice;
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    //每增加一本书,购物项中对应的书的数量加一
    public void add(Book book){
        CartItem item=map.get(book.getId());
        if(item==null){
            item =new CartItem ();
            item.setBook(book);
            item.setQuantity(1);
            map.put(book.getId(), item);
        }
        else{
            item.setQuantity(item.getQuantity()+1);
        }
    }

}

9 这时候我们再来新建BuyServlet

package cn.itcast.web.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.domain.Book;
import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;

public class BuyServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //根据id得到相应的书
        String id=request.getParameter("id");
        BusinessService service=new BusinessService();
        Book book=service.findBook(id);

        //得到购物车,将车加到购物车
        //购物车存在Session中
        Cart cart=(Cart) request.getSession().getAttribute("cart");
        if(cart==null){
            cart=new Cart();
            request.getSession().setAttribute("cart", cart);
        }
        cart.add(book);
        //转发到listcart.jsp,此处有瑕疵,刷新一次购买一次
        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    doGet(request, response);
    }

}

此处应该用重定向(或其他方法?)。。避免刷新一次购买一次,日后改

10 jsp文件夹中新建

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>   <%-- 导入jstl包,将c.tld标签库引入 --%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>购物车页面</title>
    <script type="text/javascript">
        //友好提示删除
         function deleteitem(id){
            var b=window.confirm("确认删除吗?");
        if(b){
        window.location.href="${pageContext.request.contextPath }/servlet/DeleteItemServlet?id="+id;
        }
        }
        //友好提示清空
         function clearcart(){
            var b=window.confirm("确认清空吗?");
        if(b){
        window.location.href="${pageContext.request.contextPath }/servlet/ClearCartServlet";
        }
        }

        //修改数量功能
        function changeQuantity(input,id,oldvalue){
            var quantity=input.value;
            //检查用户输入
            if(isNaN(quantity)||quantity<0){
                alert("请输入正整数");
                input.value=oldvalue;
                return;
            }  

        var b=window.confirm("确认修改数量吗?");
        if(b){
        window.location.href="${pageContext.request.contextPath }/servlet/ChangeQuantityServlet?id="+id + "&quantity="+quantity;

        }    

        }

    </script>

  </head>

   <body style="text-align: center">
   <h1>购物车列表</h1>
   <%-- jstl标签库if --%>
   <c:if test="${empty(cart.map)}">您没有购买任何物品</c:if>
   <c:if test="${!empty(cart.map)}">
   <table  width="80%" border="1" >
           <tr >
               <td>书名</td>
               <td>作者</td>
               <td>单价</td>
               <td>数量</td>
               <td>小计</td>
               <td>操作</td>
           </tr>
           <c:forEach var="entry" items="${ cart.map}">
               <tr>
               <td>${entry.value.book.name} </td>
               <td>${entry.value.book.author}</td>
               <td>${entry.value.book.price}</td>
               <td><input type="text" name="quantity" value="${entry.value.quantity}" style="width:30px" onchange="changeQuantity(this,${entry.value.book.id},${entry.value.quantity})"></td>
               <td>${entry.value.price}</td>
               <td>
               <a href="javascript:void(0)" onclick="deleteitem(${entry.key})" >删除</a>

               </td>
               </tr>
           </c:forEach>
           <tr>
                <td colspan="3">总价</td>
                <td colspan="2">${cart.price}元</td>
                <td colspan="1"><a href="javascript:clearcart()">清空购物车</a></td>
           </tr>
   </table>
   </c:if>
  </body>
</html>

11 再写相应的Servelet之前,要把业务层增加功能

package cn.itcast.service;

import java.util.Map;

import cn.itcast.dao.BookDao;
import cn.itcast.domain.Book;
import cn.itcast.domain.Cart;

public class BusinessService {
    private BookDao dao=new BookDao();
    public Map getAllBook(){
        return dao.getAll();

    }
    public Book findBook(String id){
        return dao.find(id);

    }
    //删除购物车中购物项目
    public void deleteCartItem(String id, Cart cart) {
        // TODO Auto-generated method stub
        cart.getMap().remove(id);
    }
    //清空购物车
    public void cleatCart(Cart cart) {
        // TODO Auto-generated method stub
        cart.getMap().clear();
    }
    //更改购物项数目
    public void changeItemQuantity(String id, int quantity, Cart cart) {
        // TODO Auto-generated method stub
        cart.getMap().get(id).setQuantity(quantity);
    }

}

12写相应的Servelet

ackage cn.itcast.web.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.domain.Book;
import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;

public class DeleteItemServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String id=request.getParameter("id");
        BusinessService service=new BusinessService();
        Cart cart=(Cart) request.getSession().getAttribute("cart");
        service.deleteCartItem(id,cart);

        //删除后跳回购物车
        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
package cn.itcast.web.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;

public class ClearCartServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        BusinessService service=new BusinessService();
        Cart cart=(Cart) request.getSession().getAttribute("cart");
        service.cleatCart(cart);
        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}
package cn.itcast.web.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.domain.Cart;
import cn.itcast.service.BusinessService;

public class ChangeQuantityServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String id=request.getParameter("id");
        int quantity=Integer.parseInt(request.getParameter("quantity"));

        BusinessService service=new BusinessService();
        Cart cart=(Cart) request.getSession().getAttribute("cart");
        service.changeItemQuantity(id,quantity,cart);
        request.getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    doGet(request, response);
    }

}

发布效果

点击几次购买

清空

修改数量

总结:没有解决刷新又购买一次和又删除一次的问题

   界面功能太少

   没有对用户输入进行用java代码校正。

时间: 2024-07-30 20:33:00

简陋的图书商城应用(无结算页面)的相关文章

JavaWeb网上图书商城完整项目--day02-4.regist页面提交表单时对所有输入框进行校验

1.现在我们要将table表中的输入的参数全部提交到后台进行校验,我们提交我们是按照表单的形式提交,所以我们首先需要在table表外面添加一个表单 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core&

Day24-26 项目练习(图书商城)

图书商城 环境搭建 导入原型 用户模块 分类模块 图书模块 购物车模块 订单模块 ? 2 功能分析 前台 用户模块: 注册 激活 登录 退出 分类模块: 查看所有分类 图书模块: 查询所有图书 按分类查询图书 查询图书详细(按id查) 购物车模块: 添加购物车条目: 清空所有条目: 删除指定条目: 我的购物车(按用户查询购物车) 订单模块: 生成订单: 我的订单(按用户查询订单) 按id查询订单 确认收货 付款功能(只是跳转到银行页面) 付款回调功能(由银行来调用我们这个方法,表示用户已经付款成

【Java EE 学习第25天】【网上图书商城项目实战】

一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理员): 1.登陆 2.角色管理 3.用户管理 4.图书分类 5.图书管理 6.图书商家 7.发货管理 三.项目截图 1.普通用户 (1)浏览(分类浏览,代码重用) 分类浏览: 单本书浏览: (2)普通用户登陆 (3)普通用户注册 (4)普通用户购物 浏览页面加入购物车: 详情页加入购物车 (5)查看

web day24 小项目练习图书商城, 用户,模块(注册,激活,登陆,退出),分类/图书模块

图书商城 模块 用户模块 分类模块 图书模块 购物车模块 订单模块 功能分析 前台 用户模块:注册/激活/登陆/退出 分类模块:查看所有分类 图书模块:查询所有图书/按分类查询图书/查询图书详细(id) 购物车模块:添加/清空/删除购物车条目 /我的购物车(按用户查询) 订单模块:生成订单/我的订单(按用户查询)/按id查询订单/确认收货/ /付款功能(只跳转到银行页面)/付款回调功能 后台 管理员:登陆 分类管理:增/删/改/查 图书管理(我的):增(上传图片)/删/改/查 订单模块:查询所有

web day26 小项目练习图书商城 后台分类管理模块,图书管理模块,前台登陆过滤

后台 后台的内容,必须要设置权限 用户可以访问一个网站的哪些内容? dao:不行 / service:不行 servlet:能 / jsp:能 用户可以访问的只有WEB层 分类管理 功能:增删改查 相关类 其他不变,为管理员提供单独的Servlet,然后给这个Servlet添加过滤器! web.servlet.admin:AdminCategoryServlet 查看所有分类 (略)同前台 只是转发到不同的页面 添加分类 add.jsp→AdminCatetgoryServlet#add() 1

MVC模式开发图书商城项目分析

MVC模式开发图书商城项目分析 1. 功能分析 1.用户注册 2.用户登录 3.添加商品(CURD) 4.商品查看-- 列表查询 5.商品详情页面 6.将商品添加购物车 7.查看购物车 8.修改购物车 9.生成订单 10.订单查看(取消) 11.在线支付 12.下载销售榜单 游客(未登录): 注册.登陆.商品查看 商城注册用户 : 商品查看.添加商品到购物车.购物车管理.生成订单.订单管理.在线支付 管理员 : 添加商品.商品管理.查看订单 .榜单查看(导出) 2. 系统设计 1技术选型 (系统

利用pushState开发无刷页面切换

利用pushState开发无刷页面切换<转> 相关文档:https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulatingthebrowser_history 实现目标 页面的跳转(前进后退,点击等)不重新请求页面 页面URL与页面展现内容一致(符合人们对传统网页的认识) 在不支持的浏览器下降级成传统网页的方式 使用到的API history.state 当前URL下对应的状态信息.如果当前URL不是通过pushSta

ASP.NET—015:ASP.NET中无刷新页面实现

原文作者:杨友山 原文地址:http://blog.csdn.net/yysyangyangyangshan/article/details/39679823 前面也说过在asp.net中前后前交互的问题.使用了ajax.js的方法:$.post和$.ajax. http://blog.csdn.net/yysyangyangyangshan/article/details/22755007和http://blog.csdn.net/yysyangyangyangshan/article/det

Javaweb实现的优优图书商城(开放源码)

原文地址:http://www.cnblogs.com/liaoyu 源码地址:https://github.com/liaoyu/uushop 贴出一个大学时做的小项目,供有需要的朋友参考,名为优优图书商城,下面为关于它的一些介绍 主要功能介绍: 用户注册.登录.个人信息管理.通过邮件找回密码 图书搜索.购买.在线浏览,购物车管理 后台echart图表显示.源代码在线编辑 主要技术: 数据库 : mysql 后台语言: Java 后台框架: Hibernate Spring JPA Compa