前言

博主使用JavaWeb开发的一款商城项目,可以衍生出其他各种商品销售网站
前台: 书籍查看,分页,购物车,个人信息,登录注册,按类别检索
后台: 用户管理,类别管理,用户管理,订单管理

JavaWeb网上书店运行视频


下面介绍下该项目的实现过程

数据库设计

首先是数据库:


项目目录:

工具类

数据库操作

public class DBUtil {// 数据库驱动程序private String driver;// 数据库连接信息private String url;// 连接数据库的用户名private String username;// 连接数据库的密码private String password;// 连接对象private Connection con;// 预编译语句对象private PreparedStatement pstmt;// 查询结果分页时,每页显示记录数。public static final long PAGE_REC_NUM = 8;public void setDriver(String driver) {this.driver = driver;}public void setUrl(String url) {this.url = url;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}public DBUtil() {driver = "com.mysql.jdbc.Driver";url = "jdbc:mysql://localhost:3306/good_shop?characterEncoding=utf8&serverTimezone=UTC&useSSL=false";    // 数据库名meal可变username = "root";password = "px980305";  // 数据库密码可变}// 初始化方法,加载驱动程序,获得数据库的连接对象。private void init() {try {Class.forName(driver);con = DriverManager.getConnection(url, username, password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}// 数据库操作对象的关闭private void close() {if (pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (con != null) {try {con.close();} catch (SQLException e) {e.printStackTrace();}}}// 为预编译的SQL语句中的占位符?设置值,值被放在字符串数组params中。private void setParams(String[] params) {if (params != null) {for (int i = 0; i < params.length; i++) {try {pstmt.setString(i + 1, params[i]);} catch (SQLException e) {e.printStackTrace();}}}}// 执行更新类(增删改)的SQL语句,SQL语句中含有占位符。public int update(String sql, String[] params) {int result = 0;init();try {pstmt = con.prepareStatement(sql);setParams(params);result = pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {close();}return result;}// 执行更新类(增删改)的SQL语句,SQL语句中不含有占位符。public int update(String sql) {return update(sql, null);}// 执行返回多条记录的查询操作,结果被封装到List中。public List<Map<String, String>> getList(String sql, String[] params) {List<Map<String, String>> list = null;init();try {pstmt = con.prepareStatement(sql);setParams(params);ResultSet rs = pstmt.executeQuery();list = getListFromRS(rs);rs.close();} catch (Exception e) {e.printStackTrace();} finally {close();}return list;}public List<Map<String, String>> getList(String sql) {return getList(sql, null);}// 执行返回至多一条记录的查询操作,结果被封装到Map中。public Map<String, String> getMap(String sql, String[] params) {Map<String, String> m = null;List<Map<String, String>> l = getList(sql, params);if (l != null && l.size() != 0) {m = (Map<String, String>) (l.get(0));}return m;}public Map<String, String> getMap(String sql) {return getMap(sql, null);}// 将结果集中的内容封装到List中private List<Map<String, String>> getListFromRS(ResultSet rs) throws SQLException {List<Map<String, String>> list = new ArrayList<Map<String, String>>();ResultSetMetaData rsmd = rs.getMetaData();while (rs.next()) {Map<String, String> m = new HashMap<String, String>();for (int i = 1; i <= rsmd.getColumnCount(); i++) {String colName = rsmd.getColumnLabel(i);String s = rs.getString(colName);if (s != null) {m.put(colName, s);}}list.add(m);}return list;}// 查询结果分页时,返回分页信息的Map,包括总页数,每页记录数和当前页中的记录。public Map<String, Object> getPage(String sql, String[] params, String curPage) {Map<String, Object> page = new HashMap<String, Object>();String newSql = sql + " limit " + (Long.parseLong(curPage) - 1) * PAGE_REC_NUM + "," + PAGE_REC_NUM;List<Map<String, String>> pageList = getList(newSql, params);sql = sql.toLowerCase();String countSql = "";if (sql.indexOf("group") >= 0) {countSql = "select count(*) as tempNum from (" + sql + ") as temp";} else {countSql = "select count(*) as tempNum " + sql.substring(sql.indexOf("from"));}String count_s = (String) getMap(countSql, params).get("tempNum");long count = Long.parseLong(count_s);long totalPage = 0;if (count % PAGE_REC_NUM == 0)totalPage = count / PAGE_REC_NUM;elsetotalPage = count / PAGE_REC_NUM + 1;page.put("list", pageList);page.put("totalPage", totalPage);page.put("curpage", curPage);page.put("recNum", PAGE_REC_NUM);return page;}public Map<String, Object> getPage(String sql, String curPage) {return getPage(sql, null, curPage);}
}

文件下载与图片上传

package util;import java.io.File;
import java.io.IOException;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;public class FileUploadUtil {// 上传单一文件public static String uploadSingleFile(Part part, HttpServletRequest request) {String path = null;String fileName = getFileName(part);if (!fileName.equals("")) {// 得到上传文件的文件扩展名String fileExtName = getFileExtName(part);String newFileName = System.currentTimeMillis() + fileExtName;// 得到上传文件保存路径的服务器端硬盘物理路径String savePath = request.getServletContext().getRealPath("/img");File f = new File(savePath);if (!f.exists()) {f.mkdirs();}// 文件上传try {part.write(savePath + File.separator + newFileName);path = "img/" + newFileName;} catch (IOException e) {e.printStackTrace();}}return path;}/*** 根据请求头解析出文件名 请求头的格式:火狐和google浏览器下:form-data; name="file";* filename="snmp4j--api.zip" IE浏览器下:form-data; name="file";* filename="E:\snmp4j--api.zip"* * @param header 请求头* @return 文件名*/public static String getFileName(Part part) {/*** String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别* 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}* IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}*/String header = part.getHeader("content-disposition");String[] tempArr1 = header.split(";");/*** 火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}* IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}*/String[] tempArr2 = tempArr1[2].split("=");// 获取文件名,兼容各种浏览器的写法String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\") + 1).replaceAll("\"", "");return fileName;}public static String getFileExtName(Part part) {String fileName = getFileName(part);if(fileName.equals("")) {return "";}else {return fileName.substring(fileName.lastIndexOf("."));}}
}

时间格式转换

public class Times {public String getTime(){Long timeStamp = System.currentTimeMillis();  //获取当前时间戳SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp)))); return time;}}

Controller控制器(servlet)


管理员获取所有商品的servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");String gname=request.getParameter("gname");if(gname==""){gname="";}String curpage=request.getParameter("curpage");if(curpage==""){curpage="1";}Map<String, Object> cars=gs.getGoodsPage(gname, curpage);request.setAttribute("goods", cars);request.getRequestDispatcher("/admin/good_list.jsp").forward(request, response);}

商品数据库操作 service和dao结合了

public class GoodService {DBUtil db=new DBUtil();public  List<Map<String,String>> getGoods(String gname){String sql = "select goods.id id,goods.gname gname,goods.price price ,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.gname like '%"+gname+"%' order by id";return db.getList(sql);}public  Map<String, Object> getGoodsPage(String gname,String curpage,String uid){String sql = "select goods.id id,goods.gname gname,goods.price price ,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.gname like '%"+gname+"%' and goods.uid=? ";String[] params = new String[]{uid};return db.getPage(sql, params, curpage);}public  Map<String, Object> getGoodsPage(String gname,String curpage){String sql = "select goods.id id,goods.gname gname,goods.price price ,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.gname like '%"+gname+"%' ";return db.getPage(sql, null, curpage);}public  List<Map<String,String>> getGoodsByType(String type){String sql = "select goods.id id,goods.gname gname,goods.price price ,goods.info info,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where types.typename like '%"+type+"%' ";return db.getList(sql);}public int addGood(Good good) {// 带占位符的sql语句String sql = "insert into goods(gname,price,image,typeid,uid,info) values(?,?,?,?,?,?)";String[] params = new String[]{good.getGname(),good.getPrice(),good.getImage(),good.getTypeid(),good.getUid(),good.getInfo()};// 得到预编译的语句对象return db.update(sql, params);}public int delGood(String id) {String sql = "delete from goods where id=?";String[] params= {id};return db.update(sql,params);}public int update(Good good) {String sql= "update goods set gname=?,price=?,image=?,typeid=? where id=?";String[] params= {good.getGname(),good.getPrice(),good.getImage(),good.getTypeid(),String.valueOf(good.getId())};    return db.update(sql,params);}public  Good getGoodById(String id){String sql = "select goods.id id,goods.gname gname,goods.price price ,goods.info info,goods.uid uid,types.typename typename,goods.image image from goods inner join types on types.id=goods.typeid where goods.id=?  order by id";String[] params = {id};Map<String,String> g=db.getMap(sql, params);Good good=new Good();if(g!=null){good.setId(Integer.valueOf(id));good.setGname(g.get("gname"));good.setImage(g.get("image"));good.setPrice(g.get("price"));good.setInfo(g.get("info"));good.setUid(g.get("uid"));good.setTypename(g.get("typename"));}else{good=null;}return good;}
}

前端显示所有商品

<c:forEach items="${requestScope.goods.list }" var="good"><tr><td style="width:80px;height:70px"><img src="${basePath}/${good.image }" style="width:60px;height:50px"></td><td>${good.gname }</td><td>${good.price }元</td><td>${good.typename }</td><td><a href="${basePath}/GoodGetById?id=${good.id }"><button type="button" class="btn btn-success">编辑</button></a><a href="${basePath}/GoodDelServlet?id=${good.id }"><button type="button" class="btn btn-danger">删除</button></a></td></tr></c:forEach>

以下是项目界面展示




JavaWeb图书商城 网上书城相关推荐

  1. 基于javaweb+mysql的网上图书商城网上书店(java+SSM+Jsp+MySQL+Redis+JWT+Shiro+RabbitMQ+EasyUI)

    这个项目涉及到Shiro整合JWT.秒杀功能所具备的基本要求(限流.乐观锁.接口隐藏.JMeter高并发测试等等).消息中间件RabbitMQ的异步邮件通知和死信队列.沙箱支付宝模拟支付等等技术亮点. ...

  2. 关于JavaWeb图书商城答辩问题总结

    1.如何解决sql注入问题 sql注入一般发生在我们的登录模块,在java中,我们使用PreparedStatement实现处理sql语句,因此不会发生sql注入问题 select * from us ...

  3. JavaWeb图书商城-实现逻辑

    源码地址:https://gitee.com/peng_peng3/store.git 点击:效果展示 文章记录了个人觉得比较重要的核心代码逻辑.使用的mvc三层模式,而且这次项目没有用到任何框架,纯 ...

  4. JavaWeb小项目——网上书城

    注:重新配置数据库信息和邮箱信息(有具体的配置文件) 有兴趣的可以下载学习,有问题欢迎联系作者 git源码:https://github.com/QingboTian/bookstore 数据库文件及 ...

  5. JavaWeb大作业-网上书城(源码+文档+数据库+答辩)

    该项目采用技术jsp.servlet.jdbc.以及前端框架jQuery,tomcat服务器.mysql数据库 开发工具eclipse,项目属于MVC模式,含有源码.论文.配套开发软件.软件安装教程. ...

  6. PHP+Mysql图书商城 网上校园图书购物商城 基于PHP图书商城的系统设计与实现 效果图

  7. 基于javaweb的网上图书商城系统(java+ssm+jsp+mysql+redis+jwt+shiro+rabbitmq+easyui)

    基于javaweb的网上图书商城系统(java+ssm+jsp+mysql+redis+jwt+shiro+rabbitmq+easyui) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥ ...

  8. Java项目:JavaWeb实现网上图书商城系统

    作者主页:编程指南针 简介:Java领域优质创作者.CSDN博客专家  Java项目.简历模板.学习资料.面试题库.技术互助 文末获取源码 项目编号:BS-SC-010 开发工具:IDEA / ECL ...

  9. javaweb JAVA JSP图书销售系统JSP网上书店商城JSP购物系统JSP网上书店JSP图书在线销售系统JSP图书商城jsp二手图书销售系

    JSP图书销售系统JSP网上书店商城JSP购物系统JSP网上书店JSP图书在线销售系统JSP图书商城jsp图书销售系 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查 ...

最新文章

  1. Go语言基础语法--注释、基础结构2
  2. reduce_sum() got an unexpected keyword argument 'keep_dims'
  3. POJ 1380 坐标旋转
  4. JDK源码解析之 java.lang.Long
  5. 信息学奥赛一本通(1244:和为给定数)
  6. Linux系统故障处理案例(一)【转】
  7. day 13 课后作业
  8. 20191024:单调栈问题的引出
  9. 计算机网络—PPP协议和HDLC协议
  10. 区分.net、c#、asp.net三者间的关系
  11. 第十三届蓝桥杯大赛个人赛全国总决赛准考证开放下载
  12. Linux中Tomcat的安装及配置
  13. 《JavaScript DOM编程艺术》知识整理
  14. Fiori 磁贴配置
  15. 4.10 期货每日早盘操作建议
  16. 互联网的SEDA高并发架构
  17. Android开发学什么
  18. Python获取免费代理IP,并全部测试一遍,结果大失所望
  19. Unity中的资源管理-几种常见的序列化方式
  20. 局部非饱和性的含义_范里安-微观经济学现代观点讲义(new)

热门文章

  1. socket error 10038查错
  2. 最全数学各个分支简介
  3. Pixhawk飞控代码(2019.11.28)
  4. PX4模块设计之四十四: bmp280模块
  5. 位,字,字节,字地址,字节单元,字存储单元等区别
  6. 如何对列表/元组进行排序(列表/元组)?
  7. 我的markdown编辑器
  8. 汉字五行 五格五行 喜用神
  9. nvl2与nvl使用区别
  10. python一些运维模块熟悉