这个基于Servlet技术的网上书店项目,是Java Web开发领域的经典练手案例。我十年前刚入行时做的第一个电商类项目就是类似架构,现在回头看虽然技术栈略显传统,但其中蕴含的MVC设计思想和数据库交互模式,至今仍是Java后端开发的基石。
项目采用经典的Servlet+JSP+JDBC技术组合,完整实现了图书展示、购物车、订单管理等电商核心功能模块。特别值得一提的是附带的94044行源码,这个规模已经达到了中小型商业项目的代码量级,非常适合学习者从宏观架构到微观实现进行全方位研习。
选择Servlet作为核心框架主要基于以下考量:
数据库选用MySQL 5.7版本(项目开发时的稳定版),主要特性包括:
项目采用典型的三层架构:
code复制表示层(JSP)
↓
业务逻辑层(Servlet)
↓
数据访问层(DAO)
↓
数据库(MySQL)
关键设计要点:
xml复制<servlet-mapping>
<servlet-name>BookServlet</servlet-name>
<url-pattern>/book/*</url-pattern>
</servlet-mapping>
java复制HttpSession session = request.getSession();
Cart cart = (Cart)session.getAttribute("cart");
if(cart == null){
cart = new Cart();
session.setAttribute("cart", cart);
}
properties复制maxActive=50
maxWait=10000
validationQuery=SELECT 1
采用分页查询优化性能,SQL语句示例:
sql复制SELECT * FROM books
ORDER BY create_time DESC
LIMIT ?, ?;
前端页面使用JSTL标签库循环展示:
jsp复制<c:forEach items="${bookList}" var="book">
<div class="book-item">
<h3>${book.name}</h3>
<p>价格:¥${book.price}</p>
</div>
</c:forEach>
购物车数据结构设计:
java复制public class Cart {
private Map<Integer, CartItem> items = new HashMap<>();
public void addItem(Book book, int quantity){
// 实现逻辑
}
public BigDecimal getTotalPrice(){
// 计算总价
}
}
并发控制方案:
java复制UPDATE books SET stock=stock-1
WHERE id=? AND stock>=1;
订单状态机设计:
code复制待支付 → 已支付 → 已发货 → 已完成
↓
已取消
事务处理示例:
java复制try {
conn.setAutoCommit(false);
// 扣减库存
// 生成订单
// 清空购物车
conn.commit();
} catch(Exception e){
conn.rollback();
}
建立关键索引:
sql复制CREATE INDEX idx_book_category ON books(category_id);
CREATE INDEX idx_order_user ON orders(user_id);
慢查询优化案例:
sql复制-- 优化前
SELECT * FROM orders WHERE DATE(create_time) = '2020-01-01';
-- 优化后
SELECT * FROM orders
WHERE create_time >= '2020-01-01 00:00:00'
AND create_time < '2020-01-02 00:00:00';
实现二级缓存方案:
xml复制<defaultCache
maxElementsInMemory="1000"
timeToLiveSeconds="3600"/>
静态资源处理:
xml复制<Connector
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/css,application/javascript"/>
防XSS攻击处理:
java复制String safeContent = HtmlUtils.htmlEscape(userInput);
SQL注入防护:
关键配置:
xml复制<session-config>
<cookie-config>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
<timeout>30</timeout>
</session-config>
基于Filter的权限检查:
java复制public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain){
HttpServletRequest request = (HttpServletRequest)req;
if(request.getSession().getAttribute("user") == null){
response.sendRedirect("/login");
return;
}
chain.doFilter(req, res);
}
服务器最低配置:
软件版本要求:
bash复制mysql -u root -p < init_schema.sql
mysql -u root -p < init_data.sql
bash复制cp bookstore.war $TOMCAT_HOME/webapps/
bash复制export JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MaxPermSize=512m"
统一编码方案:
properties复制jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=UTF-8
java复制request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
购物车并发控制方案:
java复制public synchronized void addItem(CartItem item){
// 线程安全操作
}
使用VisualVM监控工具:
典型优化案例:
现代化改造方向:
商业级功能补充:
集群化部署方案:
在电商系统开发领域,这个项目虽然采用了传统技术栈,但其中蕴含的设计思想和问题解决方案仍然具有很高的参考价值。我在实际教学中发现,通过这样的基础项目打好根基的学生,在后续学习现代框架时往往能更快理解其设计初衷和工作原理。