☰
JSP+Access手机销售系统实战:从环境搭建到避坑指南
2026/10/8 6:12:42 网站建设 项目流程

简介:这份资源是面向Java Web初学者与课程设计学习者的完整项目资料包,围绕基于JSP与Access数据库的手机销售系统展开,覆盖从开题、需求分析到编码实现与测试验收的全流程,适合作为毕业设计、课程大作业或自学练手案例。压缩包为zip格式,整体约2.26MB,内含项目报告、详细设计说明书、需求说明书、数据库设计说明书、开题报告、测试计划及完整源代码,文档与代码相互对应,便于理解系统架构与实现细节。系统功能涵盖手机型号展示、库存管理、订单处理、用户注册登录等模块,通过JSP处理请求并与Access交互,可帮助读者掌握动态网页开发与数据库增删改查的基本方法。目前已有76人学习下载,对于想积累Java Web实战经验、了解项目文档规范与开发流程的读者,具有较好的参考与借鉴价值。

1. 从一份 JSP+Access 手机销售系统说起:它到底能解决什么问题

如果你手头正好有一份「基于 JSP+Access 的手机销售系统」的课程设计或毕设资料,打开后大概率会看到这几个东西:一堆.jsp页面、一个.mdb数据库文件、一份需求分析和开题报告。很多人第一反应是「这玩意儿太老了,能跑起来吗」。但换个角度看,它其实是一个非常适合拿来练手的完整闭环:有前台商品浏览、有购物车、有后台订单管理,数据库还是零配置的 Access,不用装 MySQL 就能跑。对于想快速理解「一个电商类 Web 系统最小可用形态」的人来说,这套组合反而比 Spring Boot 全家桶更直白。这篇笔记就围绕 JSP 页面、Access 数据库、手机销售业务这三条线,把环境搭建、表结构设计、核心页面实现、以及那些年踩过的坑,一条条讲清楚。适合正在做课程设计、需要交付一个能演示的系统、或者想搞明白 JSP 时代 Web 开发套路的同学。

2. 环境与数据库:把 JSP+Access 跑起来的第一道坎

2.1 为什么这套组合在今天还值得动手

先说选型理由。JSP 是 Java 服务端页面的老牌技术,本质是「HTML 里嵌 Java 代码」,编译后变成 Servlet。它的优势是学习曲线平缓,不需要理解复杂的框架分层,一个.jsp文件就能同时干展示和逻辑。Access 则是微软的桌面级数据库,单文件存储,用 JDBC-ODBC 桥或者 UCanAccess 驱动就能连。对于手机销售系统这种数据量小、并发低的场景,Access 完全够用,而且部署时不用单独装数据库服务,拷贝一个.mdb文件就完事。

但这里有个关键前提:JDK 版本不能太高。JDK 8 是这套组合的舒适区,因为 JDK 8 之后自带的jdbc-odbc桥被移除了,高版本 JDK 连 Access 会直接报错。我一般建议用 JDK 8 + Tomcat 8.5 或 9,这是经过大量课程设计验证过的稳定搭配。如果你非要用 JDK 11 以上,那就得换 UCanAccess 纯 Java 驱动,配置方式完全不同,后面会讲。

2.2 环境搭建的具体步骤与命令

先确认 JDK 版本,打开命令行:

java -version

如果输出是1.8.0_xxx,那就可以继续。如果是 11 或 17,建议装一个 JDK 8 并切换JAVA_HOME。Tomcat 下载解压后,把bin目录加到环境变量,启动命令:

# Windows 下启动 Tomcat cd /d D:\apache-tomcat-9.0.xx\bin startup.bat # Linux/Mac 下 cd /opt/tomcat/bin ./startup.sh

启动后浏览器访问http://localhost:8080,看到 Tomcat 默认页就说明容器 OK。接下来把项目里的webapp或WebContent目录整个拷到 Tomcat 的webapps下,重启 Tomcat,访问http://localhost:8080/你的项目名/就能看到首页。

数据库这边,Access 文件一般叫shop.mdb或db1.mdb。如果你用的是 64 位系统,注意 Access 驱动分 32 位和 64 位,必须和 JDK 位数一致。常见报错「请先安装 Access 数据库 64 位系统驱动程序」就是位数不匹配导致的。解决办法是去控制面板的 ODBC 数据源管理器里,确认「用户 DSN」和「系统 DSN」的位数,然后装对应的 AccessDatabaseEngine。

2.3 连接 Access 的两种方式与代码

第一种是 JDBC-ODBC 桥,适合 JDK 8:

// 前提:已在 ODBC 中配置好名为 shopDSN 的系统数据源 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:shopDSN"; Connection conn = DriverManager.getConnection(url, "", "");

第二种是 UCanAccess,适合高版本 JDK,不需要配 ODBC:

// 需要引入 ucaccess.jar 及依赖的 jackcess、commons-logging 等 Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); String url = "jdbc:ucanaccess://D:/data/shop.mdb"; Connection conn = DriverManager.getConnection(url);

参数说明:jdbc:ucanaccess://后面跟.mdb文件的绝对路径,路径里不要有中文和空格,否则容易报「文件找不到」。连接池方面,课程设计级别直接用DriverManager每次新建连接就行,不用上连接池,但记得在finally里close(),不然 Access 文件会被锁住,改表结构时提示「文件正在使用」。

提示:Access 单文件数据库不支持高并发写入,多个用户同时下单时可能出现「操作必须使用一个可更新的查询」错误。演示场景下问题不大,但要知道这个边界。

3. 手机销售系统的表结构与核心页面实现

3.1 数据库表设计:五张表撑起一个商城

手机销售系统的数据模型不复杂,核心就五张表。下面用表格把字段和用途列清楚,方便你对照项目里的.mdb检查。

表名关键字段用途
usersid, username, password, phone, address存用户注册信息和收货地址
productsid, name, brand, price, stock, image, description手机商品主表
cartid, user_id, product_id, quantity购物车,关联用户和商品
ordersid, user_id, total, status, create_time订单主表
order_itemsid, order_id, product_id, price, quantity订单明细,记录每笔买了什么

建表时有个细节:Access 里字段类型用「文本」对应VARCHAR,「数字」对应INTEGER或DOUBLE,「日期/时间」对应DATETIME。主键用「自动编号」类型,这样插入时不用手动给 id。外键关系 Access 支持,但 JSP 里一般靠代码维护,不强制建约束,否则删除商品时容易报关联错误。

3.2 商品列表页:从数据库查到页面渲染

商品列表是用户进来看的第一个页面,逻辑是「查 products 表 → 遍历结果集 → 输出 HTML」。核心代码:

// list.jsp 片段 Connection conn = DriverManager.getConnection("jdbc:ucanaccess://D:/data/shop.mdb"); String sql = "SELECT id, name, brand, price, image FROM products ORDER BY id DESC"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while (rs.next()) { // 用 EL 表达式或 out.print 输出 out.print("<div class='phone-card'>"); out.print("<img src='images/" + rs.getString("image") + "'/>"); out.print("<h3>" + rs.getString("name") + "</h3>"); out.print("<p>品牌:" + rs.getString("brand") + "</p>"); out.print("<p>价格:¥" + rs.getDouble("price") + "</p>"); out.print("<a href='detail.jsp?id=" + rs.getInt("id") + "'>查看详情</a>"); out.print("</div>"); } rs.close(); ps.close(); conn.close();

逻辑说明:ORDER BY id DESC让最新上架的手机排前面。rs.getString("image")取的是图片文件名,图片实际放在webapp/images/目录下。参数方面,如果要做分页,加LIMIT不行,Access 不支持LIMIT语法,得用SELECT TOP n或者ResultSet的absolute()方法。这是 Access 和 MySQL 的一个明显差异,很多人第一次写分页会在这里翻车。

3.3 购物车与下单:Session 还是数据库

购物车有两种实现思路。简单版用HttpSession存一个List,用户不登录也能加购,下单时再写库。稳妥版直接写cart表,登录后从数据库读。课程设计里我一般推荐 Session 版,代码少、演示流畅。核心逻辑:

// addToCart.jsp List<Map<String, Object>> cart = (List<Map<String, Object>>) session.getAttribute("cart"); if (cart == null) { cart = new ArrayList<>(); session.setAttribute("cart", cart); } int productId = Integer.parseInt(request.getParameter("id")); // 检查是否已在购物车,是则数量+1,否则新增 boolean found = false; for (Map<String, Object> item : cart) { if ((int) item.get("productId") == productId) { item.put("quantity", (int) item.get("quantity") + 1); found = true; break; } } if (!found) { Map<String, Object> item = new HashMap<>(); item.put("productId", productId); item.put("quantity", 1); cart.add(item); } response.sendRedirect("cart.jsp");

下单时遍历cart,往orders和order_items各插一条记录,然后清空 Session 里的购物车。注意事务:Access 对事务支持有限,建议先插orders拿到自增 id,再插order_items,中间出错就手动删掉已插的数据,别指望rollback能完美回滚。

3.4 后台管理:商品增删改查的最小实现

后台页面通常放在/admin/目录下,用一个简单的登录过滤器拦住未登录访问。商品添加页addProduct.jsp提交到doAddProduct.jsp:

String name = request.getParameter("name"); String brand = request.getParameter("brand"); double price = Double.parseDouble(request.getParameter("price")); int stock = Integer.parseInt(request.getParameter("stock")); String sql = "INSERT INTO products(name, brand, price, stock, image, description) VALUES(?,?,?,?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, name); ps.setString(2, brand); ps.setDouble(3, price); ps.setInt(4, stock); ps.setString(5, request.getParameter("image")); ps.setString(6, request.getParameter("description")); ps.executeUpdate();

参数说明:image字段存的是文件名,上传图片需要额外用commons-fileupload组件,课程设计里为了简化,通常让管理员手动把图片拷到images目录,表单里只填文件名。删除商品时注意先检查order_items里有没有引用,有的话要么禁止删除,要么做逻辑删除(加is_deleted字段)。

4. 避坑与排查:JSP+Access 最常见的五个翻车现场

4.1 中文乱码:从请求到响应全链路排查

现象:页面显示「?????」或者「手机」。原因:JSP 默认用 ISO-8859-1 解码,Access 里如果存的是 GBK 而页面用 UTF-8 读,就会乱。解决:三处统一。第一,JSP 文件头部加<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>;第二,请求参数用new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8")转码,或者直接在 Tomcat 的server.xml里给 Connector 加URIEncoding="UTF-8";第三,Access 建表时字段排序规则选「中文简体拼音」,别用默认的「通用」。

4.2 Access 文件被锁:改表结构时提示「文件正在使用」

现象:想用 Access 打开.mdb改字段,提示被占用。原因:Tomcat 里的 JDBC 连接没关闭,Access 会生成一个.ldb锁文件。解决:停掉 Tomcat,删除同目录下的.ldb文件,再打开。代码层面确保每个Connection都在finally里close(),或者用 try-with-resources。另外,开发时可以把.mdb放在 Tomcat 的webapps外面,避免热部署时反复锁文件。

4.3 驱动报错「64 位引擎不支持 DBC 数据」

现象:连接 Access 时报「请先安装 Access 数据库 64 位系统驱动程序」或「64 位引擎不支持 DBC 数据,只支持 Access 数据」。原因:JDK 是 64 位,但装的 Access 驱动是 32 位,或者反过来。解决:统一位数。查看 JDK 位数用java -d64 -version,能跑就是 64 位。然后去微软官网下AccessDatabaseEngine_X64.exe或_X86.exe,装对应版本。如果还不行,换 UCanAccess 驱动,纯 Java 实现,不依赖系统 ODBC。

4.4 SQL 语法差异:Access 不支持 LIMIT 和某些函数

现象:从 MySQL 抄来的分页 SQLSELECT * FROM products LIMIT 0,10在 Access 里报语法错误。原因:Access 用TOP关键字,且不支持LIMIT offset, size。解决:分页改成SELECT TOP 10 * FROM products WHERE id NOT IN (SELECT TOP 20 id FROM products ORDER BY id) ORDER BY id,或者干脆在 Java 里用ResultSet的absolute()跳行。另外 Access 的字符串拼接用&而不是+,日期函数是Now()不是NOW(),这些细节不注意就会报「标准表达式中数据类型不匹配」。

4.5 部署后 404:路径和大小写问题

现象:本地跑得好好的,拷到别人电脑上访问 404。原因:JSP 里引用的路径用了绝对路径,或者文件名大小写不一致。Windows 不区分大小写,Linux 服务器区分。解决:所有资源引用用相对路径,比如images/phone1.jpg而不是D:/project/images/phone1.jpg。表单提交的action用request.getContextPath()拼。另外 Tomcat 的webapps下项目文件夹名要和访问 URL 一致,别用中文名。

5. 进阶技巧:让这套老系统跑得更稳一点

如果你已经能把系统跑起来,接下来可以试试这几个提升点。第一,用 JSTL 和 EL 替换页面里的 Java 代码。现在很多.jsp里混着out.print和<% %>,可读性差。引入jstl.jar和standard.jar后,列表渲染可以写成<c:forEach items="${products}" var="p">,页面干净很多,也更容易维护。第二,给 Access 加个定时备份。Access 单文件最大的风险是损坏,写个批处理每天把.mdb拷到备份目录:

@echo off set date=%date:~0,4%%date:~5,2%%date:~8,2% copy D:\data\shop.mdb D:\backup\shop_%date%.mdb

第三,验证数据一致性。下单后检查orders.total是否等于order_items里price*quantity的累加和,写个简单的 SQL 对账:

SELECT o.id, o.total, SUM(oi.price * oi.quantity) AS calc FROM orders o JOIN order_items oi ON o.id = oi.order_id GROUP BY o.id, o.total HAVING o.total <> SUM(oi.price * oi.quantity);

查出来不一致的订单,就是代码里事务没处理好或者并发写入导致的问题。第四,把数据库换成 MySQL 练手。Access 的局限在并发和容量,如果你想让这个项目在简历上更有说服力,把 JDBC 连接串改成 MySQL、把TOP改成LIMIT、把自增主键换成AUTO_INCREMENT,整个迁移过程本身就是一次很好的数据库适配练习。

我自己的习惯是,每做完一个课程设计,都会把「能跑」和「跑得稳」分开看。能跑只是第一步,知道哪里会翻车、怎么提前拦住,才是真正长本事的地方。这套 JSP+Access 的手机销售系统虽然技术栈老,但把它的每个环节拆开吃透,再去看现代框架,你会发现很多设计思路是一脉相承的。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询