实现显示所有商品信息的功能
2.1 确定需求
商品要有类型信息,扩展图片,扩展详细。
2.2 数据库原型
SELECT * FROM goods LEFT JOIN types ON goods_type_id = type_id
2.3 时序图
2.4 类图
1 GoodsService提供一个查询所有商品的方法
public List<Goods> search();
2 GoodsDAO提供一个查询所有商品的方法
public List<Goods> select();
2.5 编写实体类
public class Types { // type_id int private Integer typeId; // type_name varchar private String typeName; // set和get方法 |
public class Goods { // goods_id int private Integer goodsId; // goods_name varchar private String goodsName; // goods_price double private double goodsPrice; // goods_num int private int goodsNum; // goods_img varchar private String goodsImg; // goods_type_id int private Types goodsType; // goods_details varchar private String goodsDetails; |
2.6 编写工具类
将JDBC操作中不变的部分单独进行封装。编写操作数据库连接对象的工具类。
package cn.edu.sut.util; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class ConnUtil { private static String FILE_NAME = "mysql5.properties"; private static ThreadLocal<Connection> LOCAL = new ThreadLocal<>(); private static DataSource DS; static { try { Properties prop = new Properties(); InputStream is = ConnUtil.class.getResourceAsStream("/" + FILE_NAME); prop.load(is); DS = BasicDataSourceFactory.createDataSource(prop); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConn() throws SQLException { Connection conn = LOCAL.get(); if (conn == null || conn.isClosed()) { conn = DS.getConnection(); LOCAL.set(conn); } return conn; } public static void closeConn() { Connection conn = LOCAL.get(); try { if(conn!=null && ! conn.isClosed()){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } finally{ LOCAL.set(null); } } } |
2.7 编写DAO层
DAO : Data Access Object 数据访问对象
封装JDBC操作中,变化的部分。
public interface GoodsDAO { public List<Goods> select() throws SQLException; } |
public class GoodsDAOImpl implements GoodsDAO { @Override public List<Goods> select() throws SQLException { List<Goods> goodsList = new ArrayList<Goods>(); String sql = "SELECT * FROM goods LEFT JOIN types ON goods_type_id = type_id"; Connection conn = ConnUtil.getConn(); PreparedStatement pstat = conn.prepareStatement(sql); ResultSet rs = pstat.executeQuery(); while (rs.next()) { Goods goods = new Goods(); goods.setGoodsDetails(rs.getString("goods_details")); goods.setGoodsId(rs.getInt("goods_id")); goods.setGoodsImg(rs.getString("goods_img")); goods.setGoodsName(rs.getString("goods_name")); goods.setGoodsNum(rs.getInt("goods_num")); goods.setGoodsPrice(rs.getDouble("goods_price"));
Types goodsType = new Types(); goodsType.setTypeId(rs.getInt("goods_type_id")); goodsType.setTypeName(rs.getString("type_name"));
goods.setGoodsType(goodsType); goodsList.add(goods); } return goodsList; } } |
2.8 编写Service层
业务层中需要处理:
- 异常
- 关闭连接
- 事务处理
public interface GoodsService { public List<Goods> search(); } |
public class GoodsServiceImpl implements GoodsService { private GoodsDAO goodsDAO = new GoodsDAOImpl(); @Override public List<Goods> search() { try { return goodsDAO.select(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } finally { ConnUtil.closeConn(); } } } |
2.9 编写Controller层
@WebServlet("/goods/search.do") public class GoodsSearchController extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1 接收用户请求:获取用户提交的请求参数 //2 调用业务逻辑:获取业务结果 GoodsService goodsService = new GoodsServiceImpl(); List<Goods> goodsList = goodsService.search(); //3 页面导航:数据传递 request.setAttribute("goodsList", goodsList); request.getRequestDispatcher("/goods/show.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); doGet(request, response); } } |
2.10 编写View层
View ---> jsp
JSP : JSTL+EL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
<table width="80%" border="1px" cellpadding="1" cellspacing="0"> <tr> <th>序号</th><th>商品编号</th><th>商品名称</th><th>商品价格</th><th>商品类型</th> </tr> <c:forEach items="${requestScope.goodsList }" var="goods" varStatus="status"> <tr> <td>${status.count }</td> <td>${goods.goodsId}</td> <td>${goods.goodsName}</td> <td><fmt:formatNumber value="${goods.goodsPrice}" pattern=".00" />元</td> <td>${goods.goodsType.typeName}</td> </tr> </c:forEach> </table> |