起因

现在再写 Servlet + JSP,好像有点复古。

前端早就 React、Vue 满天飞,后端也基本都是 Spring Boot 起步。但我还是觉得,亲手用 Servlet 和 JSP 写一个电商 demo,很适合补 Web 基本功。

因为它没有那么多框架帮你藏细节。请求怎么进来,Session 怎么存,页面怎么跳,DAO 怎么查数据库,都得自己写。

项目在这里:yfgug/project

功能大概长这样

这个电商平台不是玩具页面,基本购物流程是完整的:

  • 用户模块:注册、登录、注销、改密、修改收货地址。
  • 商品模块:分类浏览、分页查询、关键词搜索、商品详情。
  • 推荐模块:滚动横幅、热门推荐、新品推荐。
  • 购物车:基于 Session 保存购物车,异步加入商品。
  • 订单模块:购物车结算、订单生成、支付方式选择。

技术上用的是传统 Java Web:Servlet、JSP、JSTL、Filter、DAO、Service。数据库访问用了 Apache DBUtils,连接池配置里实际使用的是 Druid,也保留了传统依赖说明。

Session 购物车

购物车这块挺能体现传统 Web 项目的味道。

用户点”加入购物车”时,前端请求 goods_buy。后端从 Session 里拿 Order 对象,如果没有就新建一个,再根据商品 id 查库存,库存足够就加入购物车。

这段逻辑不复杂,但它把几个基础点串起来了:

  • Session 不是抽象概念,它真的可以存当前用户的临时状态。
  • Servlet 处理的是一次请求,但购物车需要跨请求保留。
  • 后端不能相信前端,加入购物车前还是要查库存。

以前我只知道 Session 是会话。写完之后才更具体地理解,它就是很多传统 Web 应用维持状态的关键。

DAO 层也有坑

不用 ORM 的时候,SQL 会离你很近。

DBUtils 的 QueryRunner 能少写很多样板代码,BeanHandlerMapListHandler 也能把结果集处理得舒服一点。但 SQL 本身还是要自己负责。

比如分页查询,不能只想着页面显示几条,还要算:

  • 当前第几页。
  • 每页多少条。
  • 总记录数。
  • 总页数。
  • limit 从哪里开始。

这些东西看着琐碎,但电商列表页离不开。

为什么这种项目还有意义

这个项目写完之后,我更能理解 Spring Boot 为什么舒服。

不是因为 Servlet/JSP 不能用,而是因为传统 Java Web 里太多事情需要你亲自管理:

  • 编码过滤器。
  • 路由映射。
  • Session 状态。
  • JSP 页面跳转。
  • DAO 手写 SQL。
  • 依赖包手动放到 WEB-INF/lib

写一遍之后,再去用 Spring MVC、Spring Boot,就不会觉得那些自动配置是魔法。它们只是把这些老活儿包装好了。

最后

这个电商平台不算现代,但很适合练手。

它让我知道一个 Web 应用不是只有页面,也不是只有数据库。真正的项目是一条完整链路:用户点按钮,请求进入后端,后端处理状态和数据,再把结果返回到页面。

这条链路走通了,后面学什么框架都轻松一点。