MVC概述

MVC即 Model-View-Controller 的缩写,是按照职责划分模块一种设计模式,其中Model是核心。

  • Model:模型。负责执行实际的业务,包含数据操作,可以向视图推送数据
  • view:视图。向用户展示数据或效果并接收用户的请求
  • Controller:控制器。接收视图的请求、控制流程、选择视图展示数据

MVC适用范围

MVC适合大型应用的开发。清晰的职责划分,有利于复杂项目的开发,并提高代码健壮性和可重用性。


MVC设计模式开发Web

运作流程

快速了解Web MVC设计模式-LMLPHP

  • 前端页面接收用户输入并向服务器发送请求
  • 服务器接收请求和请求的数据并选择适当的控制器执行服务
  • 控制根据需要调用模型完成业务
  • 控制器选择视图展示结果

模仿Spring MVC框架搭建一个简单的模型

后端有四个重要的部件:

  • DispatcherServlet:仅作为接收前端请求的入口,不控制业务流程,具体流程交给专门的控制器完成。

  • Controller:控制流程调用模型,得到结果后选择相应的视图展示给用户

  • JavaBean/EJB:模型,实现具体业务,例如CRUD...

  • RequestMapping:DispatcherServlet作为请求的统一入口,是如何选择适当Controller执行业务流程呢?这就要建立URL请求和Controller之间的映射关系,使用Java注解和反射来建这个映射。

伪代码

DispatcherServlet

@WebServlet(urlPatterns = "*",loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        初始化RequestMapping中的映射信息;
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的uri
        String uri = req.getRequestURI();
        Object o = 调用RequestMapping的方法将uri映射到Controller ;
        Methon m = ... ;
        其他 others = ...;
        //调用Controller
        try {
            Object result = method.invoke(object, req, resp);
            switch (根据映射中的信息选择) {
                case 视图: 从result中获取视图地址;
                case 数据: 维持请求使用的视图,仅返回数据;
                ... ...
            }
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }

    private void responseView(HttpServletRequest req, HttpServletResponse resp, String result) throws IOException {
        resp.sendRedirect(result);
    }

    private void responseText(HttpServletRequest req, HttpServletResponse resp, String result) throws IOException {
        PrintWriter writer = resp.getWriter();
        writer.println(result);
    }
}

RequestMapping

public class RequestMapping {
    //存储映射的集合
    private static Map map = new HashMap<>();

    //获取映射服务
    public static MVCMapping get(String uri) {
        return map.get(uri);
    }

    //加载映射
    public static void load() {
        读取配置文件;
        类加载器加载获取配置文件中Controller对象的实例;
        for (循环条件) {
            if (Controller的方法包含的信息) {
                放入map集合建立映射关系;
            }
        }
    }
}

Controller

public class DemoController {
    @注解(信息:方法对应的url)
    public T methonName(HttpServletRequest req, HttpServletResponse resp) {
        控制业务流程,调用模型;
        return T;
    }

    @注解(信息:方法对应的url)
    其他方法{

    }
}


文章参考书籍

  • 《Tomcat与Java Web开发技术详解》孙卫琴
04-10 00:17