如何使用JSP结合三层架构将MySQL数据库内容输出到网站
三层架构下商品数据传递到JSP的实现方案
首先明确三层架构的核心边界:表示层(JSP/Servlet)仅处理请求响应和视图渲染,业务逻辑层(Service)处理业务规则,数据访问层(DAO)仅负责数据库交互,三层严格单向调用,禁止跨层直接访问数据库。
1. 先定义各层基础组件
- 实体层(可选但推荐):新建
entity.Goods类,封装商品ID、名称、价格、描述等字段,添加对应getter、setter方法,作为各层之间数据传递的载体。 - 数据访问层(DAO):
新建dao.GoodsDao接口,定义查询商品的抽象方法:List<Goods> listAllValidGoods();
新建dao.impl.GoodsDaoImpl实现类,在该类中调用你已实现的database.ConnectionDB获取数据库连接,执行JDBC查询语句,将结果集封装为List<Goods>返回,操作完成后手动关闭数据库连接、语句、结果集资源。
注意:DAO层只做数据库读写,不要掺杂任何业务过滤、排序逻辑 - 业务逻辑层(Service):
新建service.GoodsService接口,定义供表示层调用的方法:List<Goods> getFrontShowGoods();
新建service.impl.GoodsServiceImpl实现类,内部持有GoodsDao实例,调用DAO层的查询方法获取原始商品数据,在该层处理业务逻辑:比如过滤已下架商品、按销量排序、控制返回条数等,最终返回处理后的商品列表。 - 表示层控制器(Servlet):
新建GoodsListServlet,重写doGet方法:
在web.xml或者用注解配置该Servlet的访问路径,用户访问该路径即可触发数据查询流程。protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 仅调用Service层获取数据,不接触任何数据库操作 GoodsService goodsService = new GoodsServiceImpl(); List<Goods> goodsList = goodsService.getFrontShowGoods(); // 将数据存入request域 request.setAttribute("goodsList", goodsList); // 转发到JSP页面,不要用重定向避免数据丢失 request.getRequestDispatcher("/goodsList.jsp").forward(request, response); }
2. JSP页面渲染数据
JSP仅做视图渲染,不要写任何Java脚本、不要出现任何数据库相关代码,推荐用EL表达式+JSTL标签取值展示:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>商品列表</title> </head> <body> <div class="goods-list"> <c:forEach items="${goodsList}" var="goods"> <div class="goods-card"> <h3>${goods.goodsName}</h3> <p class="price">售价:¥${goods.price}</p> <p class="desc">${goods.description}</p> </div> </c:forEach> <!-- 如果商品列表为空展示提示 --> <c:if test="${empty goodsList}"> <p>暂无在售商品</p> </c:if> </div> </body> </html>
3. 规范校验
你可以通过以下几点确认符合三层架构要求:
- 表示层(Servlet、JSP)没有导入任何JDBC相关包、没有直接调用
ConnectionDB类 - 没有跨层调用:表示层只调用Service层,Service层只调用DAO层,DAO层仅和数据库交互
- 业务逻辑全部在Service层处理,DAO层仅做通用的数据库读写操作
内容的提问来源于stack exchange,提问作者Amon
相关产品推荐
相关产品推荐

