JavaWeb商品销售系统的设计与实现
前言
今天,博主接了一个小任务,开发一款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商品销售系统的设计与实现相关推荐
- 基于java的网上花店销售系统_基于web的花店销售系统的设计与实现
基于web的花店销售系统的设计与实现(论文13000字) 摘要:本系统是一个相对简单的基本应用系统,主要满足传统的花店运营需要,将自己的销售渠道扩展到网上,通过简单的管理,提供给最终消费者产品的展现. ...
- 基于java的线上购物系统的设计与实现_基于javaweb的在线购物系统的设计与实现...
基于javaweb的在线购物系统的设计与实现 所属分类:WEB开发 开发工具:Java 文件大小:8708KB 下载次数:1 上传日期:2021-01-21 23:35:49 上 传 者:for Ma ...
- springboot基于web的摩托车销售系统的设计与实现毕业设计源码031706
基于web的摩托车销售系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难 ...
- 基于Java的网上手机销售系统的设计与实现(附:源码 论文 sql文件 部署视频)
摘要 本文所讲述的是网上手机销售系统的设计与实现. 本系统实现了会员注册.登录.资料修改,浏览和检索商品.发布留言.看公告,管理员具有修改个人密码.添加手机品牌.增加手机信息.管理会员信息.管理订单信 ...
- 线上宠物销售系统的设计与实现
摘要 计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量.优秀的线上宠物销售系统能够更有效管理宠物销售业务规范,帮助管理者更加有效管理宠物销售,可以帮助提高克服人工管理带来的错 ...
- springboot水产品销售系统的设计与实现毕业设计源码041700
摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台.水产品公司每天都有大量的信息需要通过网络发布,为此,本人开发了一个基于B/S(浏览器/服务器)模式的水产品销售系统. 该系统以Java编 ...
- 洋酒销售系统的设计与实现
源码及论文下载: 源码及论文下载:http://www.byamd.xyz/tag/java/ 摘 要 随着洋酒与中国市场的相互适应以及电子商务和网上商店的普及,洋酒类商品的网上展示与订购逐渐成为主流 ...
- C++入门编程实战(二)商品销售系统
开发语言:C++ 开发环境:VS2017 程序说明:商品销售系统程主要分为三部分: commodity类的声明与实现(commodity.h.commodity.cpp). trade类的声明与实现( ...
- C++项目实战(一)——简单商品销售系统实现
本项目通过使用win32控制台应用程序实现一个非常简单的商品销售系统,主要涉及的知识点包含有:类的设计与使用.文件流操作.标准模板库的使用. 简单商品销售系统: 需求分析: 我们需要实现一个 能进货. ...
最新文章
- vivado使用自带IP核和创建自己定义的IP核
- android高德天气api接口,天气查询-API文档-开发指南-Web服务 API | 高德地图API
- 前端笔记-vue cli为web添加底纹
- React从入门到精通系列之(14)refs和DOM元素
- Output path is shared between the same module error
- linux内核不识别分区,ubuntu14.04无法识别树莓派SD卡问题
- 2021微信大数据挑战赛总结(微信视频号推荐)
- 《追寻生命的意义》--后记
- TensorBoard引起的AttributeError: ‘Sequential‘ object has no attribute ‘run_eagerly‘问题
- 关于阿里云业务数据分析
- 从零开始学统计 07 | 标准误差
- 这 7 门 编程语言最适合新手学习
- ABF平台设计(二)-流水线的配置器
- DataGrip创建数据库和导入sql文件
- 基于Web窗体的Web应用程序的优势
- android 消息推送开发 锁屏显示_MIUI 第452周发布公告及更新日志(MIUI开发版公测)...
- python各符号@、%、#、[:]等用法,字符串前加字符urbf的用法
- 计算机学院学院简介PPT,山东大学计算机学院.ppt
- Openstack九大组件
- 行车记录仪里面的移动侦测(运动检测、Motion Detection )什么