Day19JavaWeb【旅游项目】封装与设计***

设计PageBeanHelper

  • (1)有项目中,有两份及以上的代码相似度非常高。作一个封装与设计
  • (2)好处:代码更简洁,开发更高效
  • (3)类名.方法名A().方法名B()
  • (4)特点:方法内部返回当前对象

RouteService2.java

public class RouteService2 {
    
    
    //搜索功能
    public PageBean search(String keyword, int currentPage, int pageSize) {
    
    

        RouteDao routeDao = MySessionUtils2.getMapper(RouteDao.class);
        //'%长沙%'
        int totalCount = routeDao.findCountByName("%" + keyword + "%");
        //设置PageBean中的list集合
        int start = (currentPage - 1) * pageSize;
        List<Route> list = routeDao.findPageByName("%" + keyword + "%", start, pageSize);

        //对currentPage与pageSize赋值
        //完成对totalCount与totalPage的赋值
        //完成了对list的赋值
        PageBean pb = PageBeanHelper.start(currentPage, pageSize).count(totalCount).list(list);

        return pb;
    }

    public PageBean findPageByCid(int cid, int currentPage, int pageSize) {
    
    
        RouteDao routeDao = MySessionUtils2.getMapper(RouteDao.class);

        int totalCount = routeDao.findCountByCid(cid);

        int start = (currentPage - 1) * pageSize;

        List<Route> list = routeDao.findPageByCid(cid, start, pageSize);

        return PageBeanHelper.start(currentPage,pageSize).count(totalCount).list(list);
    }
}

PageBeanHelper.java ***

//快速创建pageBean
public class PageBeanHelper {
    
    
    public static PageBean start(int currentPage, int pageSize) {
    
    
        //创建分页数据对象  包含4个整数与一个集合
        PageBean pb = new PageBean();
        //设置当前页号
        pb.setCurrentPage(currentPage);//1*
        //设置每页记录数
        pb.setPageSize(pageSize);//2
        //为了支持链式调用
        return pb;
    }
}

PageBean.java

 public PageBean count(int totalCount) {
    
    
        //设置总记录数
        this.setTotalCount(totalCount);//3*

        //设置总页数  每页最多只能放20条   40  2  与 41  3
        //在java中,整数相除只保留整数部,丢失小数部  41/20  就是2
        int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
        this.setTotalPage(totalPage);//4*
        return this;
    }

    public PageBean list(List<Route> list) {
    
    
        this.list = list;
        return this;
    }

设计BaseServlet

在这里插入图片描述

使用路径匹配对应的方法

  • (1)为什么要减少Servlet的数量?
    现在是一个功能一个Servlet
    目标:数据库中一张表对应一个Servlet
  • (2)实现步骤
    在Servlet中提供不同的方法,完成用户的请求。
    》》路径匹配 /user/*
    》》根据请求路径选择执行对应的方法
    》》反射改写if语句
@WebServlet("/route/*")
public class Route3Servlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
            doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //可以根据不同的访问路径 /lvyou_war_exploded/route/search  /lvyou_war_exploded/route/findByCid
        String uri = req.getRequestURI();//访问路径
        //search  or  findByCid
        System.out.println(uri);
        int start = uri.lastIndexOf('/') + 1;
        String methodName = uri.substring(start);
        //根据名字调用当前类的其他方法
        System.out.println(methodName);
        if ("search".equals(methodName)) {
    
    
            search(req, resp);
        } else if ("findByCid".equals(methodName)) {
    
    
            findByCid(req, resp);
        }
    }

优化if 判断

 //根据一个类的方法名获取当前的方法对象
        try {
    
    
            Method method = Route3Servlet.class.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);//参1 方法名 参2 如果方法名一样,可以根据参数的不同来区别
            //调用invoke执行方法
            method.invoke(this, req, resp);//参1 对象 参2  方法的实参
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }

优化,使用父类BaseServlet

  • (1)项目中一般都有一个强大的基类,为什么?
  • (2)子类继承父类可以自动拥有父类的非私有成员
    在这里插入图片描述
    在这里插入图片描述
// public void xxx(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
public class BaseServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //可以根据不同的访问路径 /lvyou_war_exploded/route/search  /lvyou_war_exploded/route/findByCid
        String uri = req.getRequestURI();//访问路径
        //search  or  findByCid
        System.out.println(uri);
        int start = uri.lastIndexOf('/') + 1;
        String methodName = uri.substring(start);
        //根据名字调用当前类的其他方法
        //根据一个类的方法名获取当前的方法对象
        try {
    
    
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);//参1 方法名 参2 如果方法名一样,可以根据参数的不同来区别
            //调用invoke执行方法
            if(method!=null){
    
    
                method.invoke(this, req, resp);//参1 对象 参2  方法的实参
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
    //一行代码将对象转成json
    public String toJson(int code,Object data) {
    
    
        ResponseInfo info = new ResponseInfo();
        info.setCode(200);
        info.setData(data);
        String json = null;
        try {
    
    
            json = new ObjectMapper().writeValueAsString(info);
        } catch (JsonProcessingException e) {
    
    
            e.printStackTrace();
        }
        return json;
    }
}

猜你喜欢

转载自blog.csdn.net/u013621398/article/details/108938900