用JSP开发一个简易购物网站,核心在于掌握JSP、Servlet、JavaBean和数据库的协作方式。本文基于Eclipse IDE和Tomcat 9.0,结合MySQL 8.0,描述一个可运行的真实项目,功能包括用户注册登录、商品展示、购物车管理和订单提交。
项目采用经典的三层结构:JSP负责页面展示,Servlet负责请求转发和控制逻辑,JavaBean封装数据访问和业务规则。数据库设计四张表:user表存放用户信息,字段有id、username、password、email;product表存储商品,包含id、name、price、stock、image;cart_item表用于持久化购物车条目,关联用户和商品;orders表保存订单,字段为id、user_id、total_amount、order_time。实际项目中购物车也可以用Session实现,但为了数据不丢失,建议使用数据库表。
开发环境配置完成后,先创建数据库和数据表。在MySQL中执行以下核心语句创建用户表:create table user(id int primary key auto_increment, username varchar(50) unique not null, password varchar(64) not null, email varchar(100));商品表需要插入测试数据,例如name列的值为“无线鼠标”、“机械键盘”,price分别取79.0和199.0。注意密码不能明文存储,使用SHA-256散列,在Java中通过MessageDigest完成。
项目结构中的web.xml部署描述符需要配置Servlet映射。登录注册页面使用login.jsp和register.jsp,表单提交到LoginServlet和RegisterServlet。RegisterServlet获取请求参数后,调用UserDao的register方法,该方法使用JDBC的PreparedStatement执行insert语句。为了避免SQL注入,禁止字符串拼接SQL。UserDao连接数据库时,利用c3p0连接池获取Connection对象,比每次新建连接效率高十倍以上。
商品展示页index.jsp是最核心的界面。在页面顶部使用jsp:include引入导航栏,导航栏显示用户登录状态和购物车链接。正文部分用JSTL的c:forEach循环遍历request作用域中的productList。该列表由ProductServlet在doGet方法中调用ProductDao查询所有商品后放入请求属性。每件商品显示图片、名称、价格和“加入购物车”按钮。点击按钮时通过GET方式请求CartServlet,参数为productId。注意使用URL重写传递会话标识,避免禁用Cookie导致Session失效。

购物车功能设计采用Session保存临时数据,也可以把cart_item表作为持久化方案。简易项目中推荐缓存方案:用户添加商品时,CartServlet读取当前Session中的HashMap对象,键为商品ID,值为购买数量,再调用CartService计算小计。购物车页面cart.jsp同样用c:forEach渲染表格,每一行有商品名称、单价、数量输入框和删除链接。修改数量时,通过JavaScript发送AJAX请求到UpdateCartServlet,服务端更新HashMap后重新计算总价并返回JSON格式的响应。该做法减少整页刷新,提升操作流畅度。
结算流程涉及订单生成和库存扣减。当用户在cart.jsp点击“去结算”时,请求到达OrderServlet。OrderServlet先检查用户是否登录,若未登录则重定向到login.jsp。已登录用户执行事务操作:获取Connection对象后设置autoCommit为false,然后插入orders表记录,再逐条取出Session中的购物车条目,插入订单明细表order_item,同时更新product表的stock字段。任何一步失败则调用rollback回滚,保证数据一致性。事务成功后清空购物车,跳转到success.jsp页面,显示订单号和应付金额。
需要注意页面编码统一为UTF-8。在JSP顶部添加pageEncoding="UTF-8"指令,同时设置filter过滤器将所有请求的characterEncoding设置为UTF-8。通过web.xml注册CharacterEncodingFilter,映射到所有URL。否则中文商品名会在提交后变成乱码。
前端样式可以引入Bootstrap 5的CDN文件,无需下载到本地。在head标签内写link和script引用,即可快速生成响应式布局的商品网格。简易购物网站不需要过于复杂的JavaScript,只需为一个数量输入框添加onchange事件来触发AJAX更新。
项目开发中遇到最多的坑是ClassNotFoundException。原因通常是忘记将mysql-connector-java.jar和c3p0的jar复制到WEB-INF/lib目录。解决方法是右键项目选择Build Path然后Add External JARs,或者直接拷贝到lib文件夹后重新发布到Tomcat。另一个常见问题是端口被占用,修改Tomcat的server.xml中Connector端口为8088即可。
整个项目代码量约为2000行,其中JSP页面占五分之一,Servlet占三分之一,JavaBean占其余部分。完成后的网站可支持并发20个用户同时浏览和下单,数据库单表数据量在万级时响应时间不超过200毫秒。如果想提升性能,可以把商品列表页面用Redis缓存,或引入Elasticsearch,但简易阶段不需要这些复杂技术。
最后,部署时直接将项目导出为war文件放入Tomcat的webapps目录。启动Tomcat后,在浏览器输入http://localhost:8080/shop/即可访问首页。通过实际运行验证,从零搭建的简易购物网站在两天内可以交付,适合课程设计或初级开发人员练习使用。