MVC模式,springMVC运行原理、mybatis运行原理
深入理解MVC模式
对于mvc的理解首先从MVC是什么开始:
- mvc是一种架构模式:它分离了表现和交互,它被分为三个核心组件:模型、视图和控制器。它将程序开发编程变得更加容易,将各种对象的耦合度降到最低。 —mvc模式适合web端开发
- 视图就是用户看到并且进行交互的界面,它从模型中获取数据,然后将数据展示给用户。–视图格式往往是jsp;
- 模型就是应用程序的数据和处理这些数据的规则(业务处理),模型把数据提供给视图,模型发生变化时,模型会通知视图,提供给视图查询模型相关状态的能力;
- 控制器从客户端接收用户的输入和请求,并将这些请求转化为某种行为,由模型进行处理这些行为,行为完成后,再选择一个视图去展示给用户。—控制器常用servlet来实现,通过servlet来获取经过javabean包装过的对象(已存入数据库中的数据),然后再发送数据传输到JSP界面。
MVC完整工作流程:客户端用户的请求发送给控制器,控制器选择对应模型,模型进行业务处理,然后将数据传递给对应的视图,视图将数据展示给客户端用户。
可以通过session缓存进行持久化数据传递
springMVC运行原理
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
DispatcherServlet(前端控制器)是整个SpringMVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。—作为统一访问点,进行全局的流程控制
其主要工作有以下三项:
- 截获符合特定格式的URL请求。
- 初始化DispatcherServlet上下文对应的WebApplicationContext(应用上下文配置),并将其与业务层、持久化层的WebApplicationContext建立关联。
- 初始化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运行原理
- 读取configuration配置文件,里面包括起别名,数据库连接,mapper映射
- 创建sqlSessionFactory,由SqlSessionFactoryBuilder类的bulid方法驱动,对包装好的XML文件进行解析
- 创建sqlsession对象,事务提交true状态
- 加载接口类进行执行
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();
}
}
}