前言

今天,博主接了一个小任务,开发一款JavaWeb网上点餐系统,此外要将该系统更改为鞋城销售系统,药品销售系统以及茶叶销售系统。话不多说,开干!
客户要求,使用他提供的一套数据库操作工具类,博主看了一下,封装挺完善,商量好价格后,便开始了工作!限时两天,四套程序,难度也是不低呀。

工具类介绍

首先我们看一下数据库工具类
数据库工具类对数据库的增删改查进行了封装,其中,查询封装为List与Page两种类型

首先是将其封装为 List 链表形式的数据

// 执行返回多条记录的查询操作,结果被封装到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;}

下面是封装数据集信息,通过相关的方法获取数据表字段的名称并与之对应

// 将结果集中的内容封装到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;}

如此,数据封装便完成了,而Page的方法实现是在List的基础上添加了其他属性。page工具添加了一个分页查询属性,及在原本的sql语句后面加上了limit **,此外,还需对整个数据表的数据进行查询,从而确定分页的页数,然后将List作为Object保存到Map中,然后再将总页数,当前页数等信息也封装进去,如此,Page的封装便完成了。

// 查询结果分页时,返回分页信息的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;}

当然,还要只能查询一条信息的那种,及我们只获取该数据集中的第一条信息即可

// 执行返回至多一条记录的查询操作,结果被封装到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;}

至此,项目中最重要的查询操作的封装便完成了,接下来便是完成对数据库中改增删的操作了。

// 执行更新类(增删改)的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语句中的占位符?设置值,值被放在字符串数组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();}}}}

此外,还有对文件上传工具类的封装

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;}

在开发工程中,由于涉及下单的日期等问题,博主又封装了时间工具

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;}

至此,封装的工具类便介绍完毕了,接下来我们就要用这一套工具类来完成我们的项目

界面展示

四个项目都是商城销售项目,而其工具类相同,故而项目基本一致,不同之处也就是在一些方法,类的命名方面与前端界面上。
下面将这四个项目的界面展示一下





开发步骤详解

下面,便来介绍这个项目的开发步骤
首先,我们需要来确定我们的前端界面,博主在之前总是自己来做界面,然而结果总是差强人意,之后便使用了一些前端框架,博主常用的是Bootstrap,此外,还会直接拿一些前端的界面来直接用,在这四套系统中,鞋城系统的UI则是博主积攒下的,而其他的三个项目则是自己开发的,其实就是应用了相关的组件,如表单,按钮等,总体来看,界面较为简洁。

大家如果需要学习,可以去搜索 BootStrap中文网 学习相关的前端界面开发方法

言归正传,开始我们的开发步骤
JavaWeb的开发一般都是要遵循三层架构或MVC设计模式,按照客户的demo看也比较接近

项目目录截图如图所示


按照执行步骤,都要先通过发送Servlet请求来去执行相应的Servlet,然后去调用服务层的逻辑代码以获取数据信息并封装返还,将最终的结果渲染返回至界面,从而完成一次请求

那么我们以查询操作为例来进行讲解一下实现步骤。

举例

以鞋城后台管理系统中的商品列表为例,该查询结果中包含List与一些分页属性。
首先,我们要知道,要想获取数据,就要发送servlet请求

紧接着,对号入座找到相应的servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//设置请求与相应的编码格式,防止乱码String sname=request.getParameter("sname");//获取鞋子名称参数if(sname==""){sname="";}String curpage=request.getParameter("curpage");//获取当前页参数Map<String, Object> shoes=shs.getShoesPage(curpage,sname);//将返还结果封装返还request.setAttribute("shoes", shoes);   //将数据保存在request域中,可以在页面中显示   request.getRequestDispatcher("/admin/shoe_list.jsp").forward(request, response);//响应返还到相应页面}

服务层调用实现数据库相关操作

public  Map<String, Object> getShoesPage(String curpage,String sname){String sql = "select shoes.id id,shoes.sname sname,shoes.price price ,types.typename typename,shoes.image image from shoes inner join types on types.id=shoes.typeid where shoes.sname like '%"+sname+"%' ";return db.getPage(sql, curpage);}

至此便将数据获取完毕了,将信息封装在Map中再依次返还,最终到了我们的界面中
使用el表达式将我们的数据从request域中读取出来

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

实现分页判断

<nav aria-label="..."><ul class="pager"><c:choose><c:when test="${requestScope.shoes.curpage eq 1  }"><li><a href="#">上一页</a></li></c:when><c:otherwise><li><a href="${basePath}/ShoeServlet?curpage=${requestScope.shoes.curpage-1 }&&sname=">上一页</a></li></c:otherwise></c:choose><li><a href="#">第 ${requestScope.shoes.curpage} 页</a></li><c:choose><c:when test="${requestScope.shoes.curpage eq requestScope.shoes.totalPage  }"><li><a href="#">下一页</a></li></c:when><c:otherwise><li><a href="${basePath}/ShoeServlet?curpage=${requestScope.shoes.curpage+1 }&&sname=">下一页</a></li></c:otherwise></c:choose></ul></nav>

至此,该项目的查询操作便完成了,至于其他方法的实现,也是如法炮制,相信通过完成这样一个项目,我们便可以对JavaWeb技术有了更深的了解。

码字不易,给个赞呗!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2021年6月15日更新

近日,博主在原有系统框架的基础上,衍生出了其他的项目,其中一个为名画宣传网站,其类型与博客系统类似,具体功能如下:
后台功能:
管理员登录注册 名画管理(增删改查) 名画类别管理 用户管理 评论管理
前台功能
用户登陆注册 名画浏览 按类别检索名画 评论

主要实现功能模块截图

首页
实现流程
获取名画列表信息,我们根据其性质可以将其分为List与Page形式。其中List即为将所有的名画信息保存在List列表中
详情

评论列表

**后台系统名画
评论管理


名画类别管理

名画添加

那么我们来讲解下这个系统的实现步骤
首先我们需要访问Servlet,其功能为一个超链接,我们的Servlet可以获取请求并给返回结果,其中,其支持get与post两种请求方式,对于一般的超链接请求,可以使用get处理,而对于表单提交的信息,则可以使用post方式提交

首先找到我们的查询超链接

** href="${basePath}/ImgUserServlet?aname=" class=“dreamer”>首页**
再对应找到相关的servlet


然后到了service层

 public  List<Map<String,String>> getArticle(String aname){String sql = "select article.id id,article.aname aname,article.times times ,article.info info,types.typename typename,article.image image from article inner join types on types.id=article.typeid where article.aname like '%"+aname+"%' order by id";return db.getList(sql);}

将结果返回即可,而在jsp页面中则可以用requestScope.对象名.属性名的方式来获取对应字段的信息

 <c:forEach items="${requestScope.typelist }" var="type"><a href="${basePath}/ImgGetByType?type=${type.typename}">${type.typename}</a><span></span></c:forEach>

JavaWeb商品销售系统的设计与实现相关推荐

  1. 基于java的网上花店销售系统_基于web的花店销售系统的设计与实现

    基于web的花店销售系统的设计与实现(论文13000字) 摘要:本系统是一个相对简单的基本应用系统,主要满足传统的花店运营需要,将自己的销售渠道扩展到网上,通过简单的管理,提供给最终消费者产品的展现. ...

  2. 基于java的线上购物系统的设计与实现_基于javaweb的在线购物系统的设计与实现...

    基于javaweb的在线购物系统的设计与实现 所属分类:WEB开发 开发工具:Java 文件大小:8708KB 下载次数:1 上传日期:2021-01-21 23:35:49 上 传 者:for Ma ...

  3. springboot基于web的摩托车销售系统的设计与实现毕业设计源码031706

    基于web的摩托车销售系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难 ...

  4. 基于Java的网上手机销售系统的设计与实现(附:源码 论文 sql文件 部署视频)

    摘要 本文所讲述的是网上手机销售系统的设计与实现. 本系统实现了会员注册.登录.资料修改,浏览和检索商品.发布留言.看公告,管理员具有修改个人密码.添加手机品牌.增加手机信息.管理会员信息.管理订单信 ...

  5. 线上宠物销售系统的设计与实现

    摘要 计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量.优秀的线上宠物销售系统能够更有效管理宠物销售业务规范,帮助管理者更加有效管理宠物销售,可以帮助提高克服人工管理带来的错 ...

  6. springboot水产品销售系统的设计与实现毕业设计源码041700

    摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台.水产品公司每天都有大量的信息需要通过网络发布,为此,本人开发了一个基于B/S(浏览器/服务器)模式的水产品销售系统. 该系统以Java编 ...

  7. 洋酒销售系统的设计与实现

    源码及论文下载: 源码及论文下载:http://www.byamd.xyz/tag/java/ 摘 要 随着洋酒与中国市场的相互适应以及电子商务和网上商店的普及,洋酒类商品的网上展示与订购逐渐成为主流 ...

  8. C++入门编程实战(二)商品销售系统

    开发语言:C++ 开发环境:VS2017 程序说明:商品销售系统程主要分为三部分: commodity类的声明与实现(commodity.h.commodity.cpp). trade类的声明与实现( ...

  9. C++项目实战(一)——简单商品销售系统实现

    本项目通过使用win32控制台应用程序实现一个非常简单的商品销售系统,主要涉及的知识点包含有:类的设计与使用.文件流操作.标准模板库的使用. 简单商品销售系统: 需求分析: 我们需要实现一个 能进货. ...

最新文章

  1. vivado使用自带IP核和创建自己定义的IP核
  2. android高德天气api接口,天气查询-API文档-开发指南-Web服务 API | 高德地图API
  3. 前端笔记-vue cli为web添加底纹
  4. React从入门到精通系列之(14)refs和DOM元素
  5. Output path is shared between the same module error
  6. linux内核不识别分区,ubuntu14.04无法识别树莓派SD卡问题
  7. 2021微信大数据挑战赛总结(微信视频号推荐)
  8. 《追寻生命的意义》--后记
  9. TensorBoard引起的AttributeError: ‘Sequential‘ object has no attribute ‘run_eagerly‘问题
  10. 关于阿里云业务数据分析
  11. 从零开始学统计 07 | 标准误差
  12. 这 7 门 编程语言最适合新手学习
  13. ABF平台设计(二)-流水线的配置器
  14. DataGrip创建数据库和导入sql文件
  15. 基于Web窗体的Web应用程序的优势
  16. android 消息推送开发 锁屏显示_MIUI 第452周发布公告及更新日志(MIUI开发版公测)...
  17. python各符号@、%、#、[:]等用法,字符串前加字符urbf的用法
  18. 计算机学院学院简介PPT,山东大学计算机学院.ppt
  19. Openstack九大组件
  20. 行车记录仪里面的移动侦测(运动检测、Motion Detection )什么

热门文章

  1. 【自动化接口测试】FitNesse使用启蒙篇
  2. Xcode IOS开发错误汇总
  3. 企业上云,就上...
  4. Android 获取手机设备信息(厂商,型号等)
  5. html5 video 实现浅析,HTML5 Video 实现浅析
  6. 设置接口超时的时间,接口超时的排查方法
  7. 给swagger的接口添加描述
  8. 国内知名的数据分析软件平台
  9. sysstat工具简介
  10. myRIO FPGA 实现高频率等精度频率计