java程序设计与j2ee中间件技术/软件开发技术(III)-大作业-采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟,实现简单菜单操作和分页显示(一)

简介: java程序设计与j2ee中间件技术/软件开发技术(III)-大作业-采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟,实现简单菜单操作和分页显示

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() {
  }
}


目录
相关文章
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
614 7
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
251 8
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
498 3
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
417 2
|
存储 前端开发 测试技术
MVC、MVP、MVVM 模式
MVC、MVP 和 MVVM 是三种常见的软件架构模式,用于分离用户界面和业务逻辑。MVC(Model-View-Controller)通过模型、视图和控制器分离数据、界面和控制逻辑;MVP(Model-View-Presenter)将控制逻辑移到 Presenter 中,减少视图的负担;MVVM(Model-View-ViewModel)通过数据绑定机制进一步解耦视图和模型,提高代码的可维护性和测试性。
|
Java 测试技术 开发者
💡Java 零基础:彻底掌握 for 循环,打造高效程序设计
【10月更文挑战第15天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
503 63
|
前端开发 Java
【案例+源码】详解MVC框架模式及其应用
【案例+源码】详解MVC框架模式及其应用
1339 0
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
1456 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
183 1

热门文章

最新文章