1 查询所有商品流程分析

01引导页与商品列表查询页的流程分析.png

2 删除所选商品流程分析

02根据pid删除商品信息的流程分析.png

3 修改所选商品流程分析

03根据pid修改商品信息的流程分析.png

4 添加商品流程分析

04商品添加功能流程分析.png

(插播:反射与工具类抽取)

反射
反射方法的简单回顾.png
工具类抽取
工具类抽取的流程分析.png
工具类抽取举例:
MyBaseSerlvet.java

  1. import java.io.IOException;
  2. import java.lang.reflect.Method;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. /*
  8. * 这个类就是我们要抽取的工具类,专门用于反射子类中的方法,并执行子类中的方法;
  9. */
  10. public class MyBaseSerlvet extends HttpServlet{
  11. //tocmat会调用子类的service方法,如果子类中没有service,自动会找到这个类中的service方法,并执行
  12. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //1:获取浏览器传递过来的方法名
  14. String methodName = req.getParameter("m");
  15. //2:获取子类的字节码文件对象
  16. //System.out.println(this);
  17. Class c = this.getClass();
  18. //3:从c中获取methodName方法
  19. try {
  20. Method m=c.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
  21. //4:让m执行起来
  22. String s=(String) m.invoke(this,req,resp);
  23. //5:判断子类是否返回了一个要转发的路径,如果有路径,帮子类转发,否则什么也不做
  24. if(s!=null){
  25. req.getRequestDispatcher(s).forward(req, resp);
  26. }
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. throw new RuntimeException("工具类运行错误,请检查是否传递了方法名!!!或其他异常!");
  30. }
  31. }
  32. }

AServlet.java

  1. import java.io.IOException;
  2. import java.util.Arrays;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. /**
  8. * Servlet implementation class AServlet
  9. */
  10. public class AServlet extends MyBaseSerlvet {
  11. public void a(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. System.out.println("子类的a方法执行了...");
  13. }
  14. public void b(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. System.out.println("子类的b方法执行了...");
  16. }
  17. public void c(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. System.out.println("子类的c方法执行了...");
  19. }
  20. }

BServlet.java

  1. import java.io.IOException;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. *
  8. */
  9. public class BServlet extends MyBaseSerlvet {
  10. public String abc(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11. System.out.println("bservlet的abc方法执行了...");
  12. //转发的index.jsp
  13. return "/index.jsp";
  14. }
  15. }

6 批量删除流程分析

01.批量删除的流程分析.png

7 多条件查询流程分析

02.多条件查询的流程分析.png

多条件查询dao层的固定套路:

  1. //7:多条件查询商品的方法
  2. public List<Product> findProductByTiaoJian(String pn, String pdesc) throws SQLException {
  3. //1:创建sql执行者
  4. QueryRunner q = new QueryRunner(MyC3P0Utils.getDataSource());
  5. //2:编写sql语句
  6. String sql = "select * from product where 1=1 ";
  7. //3:准备参数与结果集;
  8. List<String> params = new ArrayList<>();
  9. if(pn!=null&&pn.trim().length()>0){
  10. sql+=" and pname like ?";
  11. params.add("%"+pn+"%");
  12. }
  13. if(pdesc!=null&&pdesc.trim().length()>0){
  14. sql+=" and pdesc like ?";
  15. params.add("%"+pdesc+"%");
  16. }
  17. BeanListHandler rsh = new BeanListHandler(Product.class);
  18. //4:执行sql处理结果
  19. return q.query(sql, rsh, params.toArray());
  20. }

8 分页查询

8.1 分页PageBean工具类:类的抽取与分页关键字介绍

MySQL方言:limit关键字

  1. #举例:每页显示5条,显示第3页;
  2. SELECT * FROM product LIMIT 10,5;
  3. #说明:5表示每页显示5条,10表示第3页的第一条数据的索引为10(第一页索引从0开始)

自己写一个分页工具类MyPageBean.java

import java.util.List;

/*
 * 分页工具类,可以进行任意数据的分页查询时,使用
 */
public class MyPageBean<T>{
    private int pageNumber;// 当前页码值,需要用户在浏览器传递;默认1;
    private int pageSize;// 每页显示条数,可以让用户在浏览器传递;也可以程序员直接写死,开发中常用的是浏览器传递;

    private int totalCount;//数据库中数据的总数量;从数据库查询;
    private int totalPage;//总页数,直接使用总数量和每页显示数量,计算即可得到;
    private int startIndex;//数据库中数据的起始索引,根据当前页和每页显示数量,计算得到;
    //当前页中的数据
    private List<T> list;
    public List<T> getList() {
        return list;
    }
    public void setList(List<T> list) {
        this.list = list;
    }
    public int getPageNumber() {
        return pageNumber;
    }
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getTotalCount() {
        return this.totalCount;
    }
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
    //计算总页数
    public int getTotalPage() {
        return totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;
    }
    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }
    public int getStartIndex() {
        return (pageNumber-1)*pageSize;
    }
    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }
    public MyPageBean(int pageNumber, int pageSize) {
        super();
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
    }
    public MyPageBean() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "MyPageBean [pageNumber=" + pageNumber + ", pageSize=" + pageSize + ", totalCount=" + totalCount
                + ", totalPage=" + totalPage + ", startIndex=" + startIndex + ", list=" + list + "]";
    }
}

8.2 分页查询流程分析

03.分页查询流程分析.png