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
    评论
在刚刚步入“多层结构”Web应用程序开发的时候,我阅读过几篇关于“asp.net三层结构开发”的文章。但其多半都是对PetShop3.0和Duwamish7的局部剖析或者是学习笔记。对“三层结构”通体分析的学术文章几乎没有。 2005年2月11日,Bincess BBS彬月论坛开始试运行。不久之后,我写了一篇题目为《浅谈“三层结构”原理与用意》的文章。旧版文章以彬月论坛程序中的部分代码举例,通过全局视角阐述了什么是“三层结构”的开发模式?为什么要这样做?怎样做?……而在这篇文章的新作中,配合这篇文章我写了7个程序实例(TraceLWord1~TraceLWord7留言板)以帮助读者理解“三层结构”应用程序。这些程序示例可以在随带的CodePackage目录中找到——   对于那些有丰富经验的Web应用程序开发人员,他们认为文章写的通俗易懂,很值得一读。可是对于asp.net初学者,特别是没有任何开发经验的人,文章阅读起来就感到非常困难,不知文章所云。甚至有些读者对“三层结构”的认识更模糊了……   关于“多层结构”开发模式,存在这样一种争议:一部分学者认为“多层结构”与“面向对象的程序设计思想”有着非常紧密的联系。而另外一部分学者却认为二者之间并无直接联系。写作这篇文章并不是要终结这种争议,其行文目的是希望读者能够明白:在使用asp.net进行Web应用程序开发时,实现“多层结构”开发模式的方法、原理及用意。要顺利的阅读这篇文章,希望读者能对“面向对象的程序设计思想”有一定深度的认识,最好能懂一些“设计模式”的知识。如果你并不了解前面这些,那么这篇文章可能并不适合你现在阅读。不过,无论这篇文章面对的读者是谁,我都会尽量将文章写好。我希望这篇文章能成为学习“三层结构”设计思想的经典文章!
MVC(模型-视图-控制器)是一种软件设计模式,常用于Web应用程序开发。.NET平台上的MVC三层架构是一种基于MVC模式的系统结构设计方法。 MVC三层架构包括模型层(Model)、视图层(View)和控制器层(Controller)。 模型层(Model)是应用程序的核心,用于处理数据和业务逻辑。模型层负责对数据进行读取、写入和修改,同时也负责处理业务规则和数据验证等操作。它与数据库进行交互,并将数据传递给视图层和控制器层。 视图层(View)是用户界面的呈现层,负责将数据显示给用户。它负责从模型层中获取数据,并将其以可视化的形式展示给用户。视图层通常是一个HTML页面,使用HTML、CSS和JavaScript等技术实现页面的排版和样式。 控制器层(Controller)负责处理用户请求,并与模型层和视图层进行交互。控制器层接收用户请求,并根据请求调用相应的模型层方法进行数据处理。它还负责将模型层返回的数据传递给视图层,并控制视图的显示。控制器层充当了用户和系统之间的桥梁。 MVC三层架构具有良好的解耦性,各层之间的功能清晰划分,减少了模块之间的依赖,提高了代码的可维护性和可扩展性。模型层负责数据处理,易于进行单元测试和数据验证。视图层负责展示界面,可灵活定制和样式美化。控制器层负责处理请求逻辑,使得系统具有更好的灵活性和可重用性。 总而言之,MVC三层架构是一种有效的架构设计方法,能够使.NET平台上的应用程序更加灵活、高效且易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值