MVC三层架构

一、逻辑介绍

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)

用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

控制器是核心

M(Model) 模型 JavaBean

V(View) 视图 html jsp Thymeleaf volicity freemaker

C(Control) 控制器 Servlet,Controller,Action

当控制器接受到用户的需求时,接受用户传输过来的数据,将处理此需求所需要的参数传递给service层处理,service层将处理好的数据传递给dao层,进行数据库的修改,最终由dao层返回出来的值传递给service层,处理好之后再传给controller层,最终由controller层传递给用户,从而实现此功能

  1. Controller:负责控制,拿到View传递过来的数据,封装之后交给Service处理,Service处理完了之后,Controller拿到结果之后,将结果交给界面。
  2. Service:业务逻辑(分页,为了完成分页就要调用两次DAO层)
  3. DAO:纯粹的JDBC的增删改查操作

二、实例讲解

分页功能的实现

首先封装一个PageInfo类,来存储分页所需数据

@Data
public class PageInfo<T> {
    private List<T> list;
    private Integer total;
    private Integer pageNo;
    private Integer pageSize;

    public PageInfo() {
    }

    public PageInfo(List<T> list, Integer total, Integer pageNo, Integer pageSize) {
        this.list = list;
        this.total = total;
        this.pageNo = pageNo;
        this.pageSize = pageSize;
    }
}

Controller层

UserController
@WebServlet("/user")
public class UserController extends HttpServlet {
    private IUserService userService = new UserServiceImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        处理post请求乱码问题
//        req.setCharacterEncoding("UTF-8");
        String method = req.getParameter("method");
        switch (method) {
            case "selectByPage":
                selectByPage(req, resp);
                break;
        }
    }

    private void selectByPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //第几页
        String pageNo = req.getParameter("pageNo");
        //一页有多少数据
        String pageSize = req.getParameter("pageSize");
        //处理空值问题
        if (pageNo == null || pageNo.equals("")) {
            pageNo = "1";
        }
        if (pageSize == null || pageSize.equals("")) {
            pageSize = "5";
        }
        //传递给service层处理并接受PageInfo类型的返回值
        PageInfo pageInfo = userService.selectByPage(Integer.parseInt(pageNo), Integer.parseInt(pageSize));
        //将接受的返回值返回给用户端
        req.setAttribute("pageInfo", pageInfo);
        req.getRequestDispatcher("user_list.jsp").forward(req, resp);
    }
}

Service层

IUserService
public interface IUserService  {
    PageInfo selectByPage(Integer pageNo, Integer pageSize);
}
UserServiceImpl
public class UserServiceImpl implements IUserService {
    //引入DAO层
    private IUserDao userDao = new UserDaoImpl();

    @Override
    public PageInfo selectByPage(Integer pageNo, Integer pageSize) {
        //Service业务层为了完成PageInfo的封装,需要调用两次dao操作
        //1.查找当前页数据
        int offset = (pageNo - 1) * pageSize;
        List<User> list = userDao.selectByPage(offset, pageSize);
        //2.总的页数  查总的数量  Math.ceil(总数量/pageSize)
        int totalCount = userDao.selectTotalCount();
        int totalPage = (int) Math.ceil((double)totalCount / pageSize);
        PageInfo<User> pageInfo = new PageInfo<>(list, totalPage, pageNo, pageSize);
        return pageInfo;
    }
}

DAO层

IUserDao
public interface IUserDao {
    //查找当前页的数据
    List<User> selectByPage(int offset, Integer pageSize);
    //查找一共有多少条数据
    int selectTotalCount();
}
UserDaoImpl
public class UserDaoImpl implements IUserDao {

    @Override
    public List<User> selectByPage(int offset, Integer pageSize) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<User> list = new ArrayList<>();
        try {
            connection = JDBCUtil.getConnection();
            String sql = "select id, name, password from user limit ?, ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, offset);
            preparedStatement.setInt(2, pageSize);
            resultSet = preparedStatement.executeQuery();
            System.out.println("selectByPage:" + resultSet);
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String password = resultSet.getString("password");
                User user = new User(id, name, password);
                list.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    @Override
    public int selectTotalCount() {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        int count = 0;
        try {
            connection = JDBCUtil.getConnection();
            String sql = "select count(*) from user";
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();
            //判断是否执行成功
            System.out.println("统计所有(user):" + resultSet);
            while (resultSet.next()) {
                count = resultSet.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(connection, preparedStatement, resultSet);
        }
        return count;
    }
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值