面试之深入理解MVC模式,springMVC运行原理、mybatis运行原理

深入理解MVC模式

对于mvc的理解首先从MVC是什么开始:

  1. mvc是一种架构模式:它分离了表现和交互,它被分为三个核心组件:模型、视图和控制器。它将程序开发编程变得更加容易,将各种对象的耦合度降到最低。 —mvc模式适合web端开发
  2. 视图就是用户看到并且进行交互的界面,它从模型中获取数据,然后将数据展示给用户。–视图格式往往是jsp;
  3. 模型就是应用程序的数据和处理这些数据的规则(业务处理),模型把数据提供给视图,模型发生变化时,模型会通知视图,提供给视图查询模型相关状态的能力;
  4. 控制器从客户端接收用户的输入和请求,并将这些请求转化为某种行为,由模型进行处理这些行为,行为完成后,再选择一个视图去展示给用户。—控制器常用servlet来实现,通过servlet来获取经过javabean包装过的对象(已存入数据库中的数据),然后再发送数据传输到JSP界面。
    在这里插入图片描述
    MVC完整工作流程:客户端用户的请求发送给控制器,控制器选择对应模型,模型进行业务处理,然后将数据传递给对应的视图,视图将数据展示给客户端用户。
    可以通过session缓存进行持久化数据传递

springMVC运行原理

  1. 客户端请求提交到DispatcherServlet
  2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
  3. DispatcherServlet将请求提交到Controller
  4. Controller调用业务逻辑处理后,返回ModelAndView
  5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
  6. 视图负责将结果显示到客户端

在这里插入图片描述

DispatcherServlet(前端控制器)是整个SpringMVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。—作为统一访问点,进行全局的流程控制
其主要工作有以下三项:

  1. 截获符合特定格式的URL请求。
  2. 初始化DispatcherServlet上下文对应的WebApplicationContext(应用上下文配置),并将其与业务层、持久化层的WebApplicationContext建立关联。
  3. 初始化SpringMVC的各个组成组件,并装配到DispatcherServlet中。

配置web.XMl文件

<servlet>
		<servlet-name>springMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		//初始化前端控制器,加载springMVC文件
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		//初始化加载次数
		<load-on-startup>1</load-on-startup>
	</servlet>
	//映射路径拦截处理
	<servlet-mapping>
		<servlet-name>springMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
Servlet生命周期和DispatcherServlet生命周期对比

Servlet的生命周期分为三个阶段:

1,初始化阶段,调用init()方法;
2,响应客户请求阶段,调用service()方法;
3,终止阶段,调用destroy()方法;

DispatcherServlet的处理流程:
Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用它的 init() 方法进行初始化,在这个初始化过程中完成了,对 web.xml 中初始化参数的加载;建立 WebApplicationContext (SpringMVC的IOC容器);进行组件的初始化;
客户端发出请求,由 Tomcat 接收到这个请求,如果匹配 DispatcherServlet 在 web.xml 中配置的映射路径,Tomcat 就将请求转交给 DispatcherServlet 处理;
DispatcherServlet 从容器中取出所有 HandlerMapping 实例(每个实例对应一个 HandlerMapping 接口的实现类)并遍历,每个 HandlerMapping 会根据请求信息,通过自己实现类中的方式去找到处理该请求的 Handler (执行程序,如Controller中的方法),并且将这个 Handler 与一堆 HandlerInterceptor (拦截器) 封装成一个 HandlerExecutionChain 对象,一旦有一个 HandlerMapping 可以找到 Handler 则退出循环;
DispatcherServlet 取出 HandlerAdapter 组件,根据已经找到的 Handler,再从所有 HandlerAdapter 中找到可以处理该 Handler 的 HandlerAdapter 对象;
执行 HandlerExecutionChain 中所有拦截器的 preHandler() 方法,然后再利用 HandlerAdapter 执行 Handler ,执行完成得到 ModelAndView,再依次调用拦截器的 postHandler() 方法;
利用 ViewResolver 将 ModelAndView 或是 Exception(可解析成 ModelAndView)解析成 View,然后 View 会调用 render() 方法再根据 ModelAndView 中的数据渲染出页面;
最后再依次调用拦截器的 afterCompletion() 方法,这一次请求就结束了。

mybatis运行原理

  1. 读取configuration配置文件,里面包括起别名,数据库连接,mapper映射
  2. 创建sqlSessionFactory,由SqlSessionFactoryBuilder类的bulid方法驱动,对包装好的XML文件进行解析
  3. 创建sqlsession对象,事务提交true状态
  4. 加载接口类进行执行

myBatis基础运行流程

public class Mybatistest {

    public static void main(String[] args) {
        try {
            InputStream inputStream = Resources.getResourceAsStream("Mybatis-config.xml");
            //工厂类
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //必须加true,默认为false,不提交事务,否则进行事务回滚
            SqlSession sqlSession = sqlSessionFactory.openSession(true);

            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
           /* User user = new User();
            user.setId(5);
            user.setName("这啥");
            user.setPassword("258");
            user.setStatus("真好");*/

            userMapper.insert();
            int count = userMapper.count();
            System.out.println(count);
            
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值