1、题目说明
1、采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟;
2、实现简单菜单操作和分页显示(每页显示20条)
3、选做:商品包括图片
要求:
1、可以使用基本的web开发技术,也可以使用框架
2、报告模板见附件,工程打包作为附件上传
2、实验设计
2.1 表设计
在数据库中,设计了一个商品表。在商品表中,使用了三个字段:id,表示商品的id编号,是主键且不能重复。gname,表示商品名称,添加了unique约束,也不能重复。Price,表示商品价格,类型为decimal数值,能有2位小数。
2.2 工程结构
整个工程使用的mvc模式,类模型model、用户视图前端view、后端控制controller分离。
在图3的webapp结构中,webapp用于显示前端与对后端发送请求。lib文件夹为本工程导入的外部jar包,包括apache服务器自带的数据库工具等。add.jsp页面实现添加商品的功能,head.jsp页面为网页顶部的简单的菜单项功能。list_page.jsp实现分页显示商品列表功能。list.jsp实现了商品的查询功能,支持模糊查询。logo.jpg为校徽,实现了简单的图片显示功能。main.jsp为首页,在启动时运行main.jsp。style.css为菜单功能实现时所需的前端样式。web.xml配置了servlet。
在图4的后端的工程结构中,可以看到除webapp外的其他文件结构。
bean包存放了类模型。Goods.java是商品的类型,含有属性、getter/setter方法,并自带构造函数。因为要实现一个分页显示的功能,所以引入了PageBean文件,含有属性、getter/setter等方法与构造函数。PageBean还是一个模板类,在本工程中,该模板类的参数就是Goods。
在工程中,其余的包用于对后端进行控制。
Dao包存放的是数据库访问对象。GoodsDao.java是接口,GoodsDaoImpl.Java是对GoodsDao接口的实现类。在GoodsDaoImpl中,调用了JDBCUtil,并使用apahce服务器提供的用于操纵数据库的相关库。使用了连接池的技术。GoodsDao用于访问数据库,所有服务service功能都会调用GoodsDao中的相关函数与方法对数据库进行操作,对数据库进行增、删、查等多种操作。
DBConn是数据库连接对象。
service包用于存放服务。GoodsService.java是接口,GoodsServiceImpl.java是GoodsService接口的实现类。在GoodsServiceImpl中,对于servlet所调用的的增、删、查功能,service负责调用GoodsDao对数据库进行操作。
servlet包用于存放前端的jsp文件所请求的servlet,接受并解析请求。并调用service包中的相关函数进行增、删、查。在对数据库进行增、删、查完毕后,servlet还负责将前端页面进行重定位。AddServlet用于处理添加商品请求,DeleteServlet用于删除请求,GoodsListServlet用于直接显示所有商品请求,GoodsListPageSerlet用于分页查询请求,SearchGoodsServlet用于模糊查询请求。
util包存放的是工具类。TextUtil是文本工具,用于判断文本是否为空。JDBCUtil是JDBC数据库连接工具,调用apache服务器的连接池。同时,需要修改本地apache服务器的相关配置。
3、运行界面截图与说明
点击”main.jsp”进入首页,首页实现了简单的菜单功能并显示了图片,图片为校徽。在菜单功能中,有两个选项,分别为“增加商品”和“显示商品”。当鼠标悬停在菜单某一位置时,该项底色变为灰色,字颜色变为红色。
在这一页面中也可以添加商品,添加商品,商品名“iPadPro 256”,价格18888.00。在稍后对“显示商品”的演示时,我们可以看到这一项商品被正确地添加了。
点击“显示商品”,则商品会正确地显示出来。实现了分页显示的功能,每一页显示20条记录。
此为第二页。虽然每页显示20条记录,但本页只有3条记录。可以看到,之前添加的记录正确地被显示了出来。
实现了删除功能。点击“删除”,JavaScript会跳出提示询问用户“是否确定删除?”。
若用户确定删除,则商品能被正确地删除。
实现了商品信息的模糊查询功能。在“按名称查询”输入框输入“iphone”后,正确地找到了所有商品名称中带“iphone”的所有商品。
同样的,也可以按价格查询。正确地查到了价格为100.00的商品。
4、小结
附录:源代码
src/main/java
src/main/java/bean
Goods.java
package bean; public class Goods { private int id; private String gname; private double price; public int getId() { return id; } public String getName() { return gname; } public double price() { return price; } public void setId(int id) { this.id=id; } public void setName(String gname) { this.gname=gname; } public void setPrice(double price) { this.price=price; } public Goods() { } public Goods(String gname,double price) { this.gname=gname; this.price=price; } public Goods(int id,String gname,double price) { this.id=id; this.gname=gname; this.price=price; } public String toString() { return "Goods [id=" + id + ", gname=" + gname + ", price=" + price + "]"; } }
PageBean.java
package bean; import java.util.List; public class PageBean<T> { private int currentPage; //当前页 private int totalPage;//总页数 private int pageSize;//每页的记录数 private int totalSize; //总的记录数 private List<T> list; //当前页的学生集合 public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalSize() { return totalSize; } public void setTotalSize(int totalSize) { this.totalSize = totalSize; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } }
src/main/java/dao
GoodsDao.java
package dao; import bean.Goods; import java.sql.SQLException; import java.util.List; /** * 这是针对商品表的数据访问 */ public interface GoodsDao { int PAGE_SIZE = 20; //一页显示多少条记录 /** * 查询当页的商品数据 */ List<Goods> findGoodsByPage(int currentPage) throws SQLException ; /** * 查询所有商品 */ List<Goods> findAll() throws SQLException ; /** * 根据ID查询单个商品对象 */ Goods findGoodsById(int id) throws SQLException ; List<Goods> searchGoods(String gname,double price) throws SQLException ; void insert(Goods goods) throws SQLException ; void delete(int id) throws SQLException ; int findCount()throws SQLException ; }
src/main/java/dao/impl
GoodsDaoImpl.java
package dao.impl; import dao.*; import bean.*; import java.sql.*; import java.util.ArrayList; import java.util.List; import util.*; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.apache.commons.dbutils.ResultSetHandler; import db.DBConn; public class GoodsDaoImpl implements GoodsDao{ public List<Goods> findAll() throws SQLException{ QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); return runner.query("select * from goods", new BeanListHandler<Goods>(Goods.class)); } public List<Goods> findGoodsByPage(int currentPage) throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); return runner.query("select * from goods limit 20 offset ?", new BeanListHandler<Goods>(Goods.class), (currentPage-1)*PAGE_SIZE); } public void delete(int id) throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); runner.update("delete from goods where id=?" ,id); } public void insert(Goods goods) throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); String sql="INSERT INTO `bigproject`.`goods`(`gname`, `price`) VALUES ('"+goods.getName()+"',"+ goods.getId()+")"; runner.update(sql); } @Override public int findCount() throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); //用于处理 平均值 、 总的个数。 Long result = (Long) runner.query("SELECT COUNT(*) FROM goods" , new ScalarHandler() ); return result.intValue(); } @Override public List<Goods> searchGoods(String gname, double price) throws SQLException { System.out.println("现在要执行模糊查询了,收到的name=="+gname + "price"+price); QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); String sql = "select * from goods where 1=1 "; List<String> list = new ArrayList<String> (); //判断有没有名称, 如果有,就组拼到sql语句里面 if(!TextUtil.isEmpty(gname)){ sql = sql + " and gname like ?"; list.add("'%"+gname+"%'"); } if(!TextUtil.isEmpty(String.valueOf(price))){ sql = sql + " and price = ?"; list.add(String.valueOf(price)); } return runner.query(sql , new BeanListHandler<Goods>(Goods.class) ,list.toArray() ); } public Goods findGoodsById(int id) throws SQLException { QueryRunner runner = new QueryRunner(JDBCUtil.getDataSource()); return runner.query("select * from goods where sid = ?", new BeanHandler<Goods>(Goods.class) ,id); } public GoodsDaoImpl() { } }