SpringMVC工作原理简介

首先了解什么是MVC设计模式

  • Cotroller:负责接收并处理请求,响应客户端
  • Model:模型数据,业务逻辑
  • View:呈现模型,与用户进行交互

 MVC实现流程:

        用户发起请求,会被控制层进行接收,然后控制层根据不同的请求去调用模型层不同的方法。不同的业务方法,会对数据库增删改查一个持久化操作,最终产生一个模型数据。然后封装模型数据,传递给视图层。视图层拿到数据会进行渲染,最终把结果响应给客户端,用户就可以看到最终的一个成果。接下来,用户进行下一步操作,又发了一次新的请求,然后重复上次过程。这就是MVC的流程。

那什么是Spring MVC呢? 

  • 目前最好的实现MVC设计模式的框架。会对整个MVC设计模式进行封装,将很多底层代码进行屏蔽,那么开发者就可以更加方便、快捷的去进行应用程序的开发。
  • SpringMVC是Spring框架的一个后续产品。
  • 利用spring容器的特性,简化自己的配置,相当于spring框架的一个子模块,二者可以很好的结合使用,不需要整合。

SpringMVC核心组件 

  • DispatcherServlet:前置控制器

       整个流程控制的核心,用来控制其它组件的执行,进行统一调度,降低各个组件之间的耦合性
相当于总指挥的位置

  • Handler:处理器,完成具体业务逻辑

        DispatcherServlet接收到请求的时候,需要将不同的请求分发到不同的Handler当中

  • HandlerMapping:将请求映射到Handler
  • HandlerInterceptor:处理器拦截器

      HandlerInterceptor是一个接口,完成需要进行拦截处理的功能

  • HandlerExceptionChain:处理器执行链
  •  HandlerAdapter:处理器适配器

      Handler执行业务方法之前,需要进行一系列的操作,包括对表单数据的验证,表单数据类型的转换以及将表单数据封装到java bean当中,这一系列操作则由HandlerAdapter完成

  • MoudelAndView:封装模型数据和视图信息

     视图信息指的是逻辑视图,作为Handler的处理结果,返回给DispatcherServlet

  • ViewResolver:视图解析器    

     DispatcherServlet拿到MoudelAndView之后,需要进行解析,ViewResolver将逻辑视图解析为物理视图,最终将这个结果渲染给客户端

 SpringMVC实现流程:

1、客户端请求被DispatcherServlet接收
2、DispatcherServlet将请求映射到Handler
3、生成Handler以及HandlerInterceptor
4、返回HandlerExceptionChain(Handler+HandlerInterceptor)
5、DispatcherServlet通过HandlerAdapter执行Handler
6、返回一个MoudelAndView(模式视图+逻辑数据)给DispatcherServlet
7、DispatcherServlet通过ViewResolver对MoudelAndView解析,将逻辑视图解析为物理视图
8、返回填充了模型数据的View,响应给客户端进行渲染。

 SpringMVC的使用:

1、大部分组件由框架提供,开发者只需要通过配置进行关联
2、开发者只需手动编写Handler,View

基于注解方式的使用(推荐)

1、SpringMVC基础配置
2、Controller,HandlerMapping通过注解进行映射
3、XML配置ViewResolver组件映射

创建AnnotationHandler

package com.lzy.handler;

import com.lzy.entity.Goods;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

@Controller
public class AnnotationHandler {

    /**
     * 业务方法:ModelAndView完成数据的传递,视图的解析
     */
    @RequestMapping("/modelAndViewTest")
    public ModelAndView modelAndViewTest(){
        //创建ModelAndView对象
        ModelAndView modelAndView =  new ModelAndView();
        //填充模型数据
        modelAndView.addObject("name","Tom");
        //设计逻辑视图
        modelAndView.setViewName("show");
        return modelAndView;
    }

    /**
     * 业务方法:Model传值,String进行视图渲染解析
     */
    @RequestMapping("/ModelTest")
    public String ModelTest(Model model){
        //填充模型数据
        model.addAttribute("name","Jerry");
        //设置逻辑视图
        return "show";
    }

    /**
     * 业务方法:Map传值,String进行视图解析
     */
    @RequestMapping("MapTest")
    public String MapTest(Map<String,String>map){
        //填充模型数据
        map.put("name","Cat");
        //设计逻辑视图
        return "show";
    }

}

配置springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

 <!--将AnnotationHandler自动扫描到IOC容器中-->
    <context:component-scan base-package="com.lzy.handler"></context:component-scan>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置前缀-->
        <property name="prefix" value="/"></property>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${name}
</body>
</html>

 

基于XML配置的使用

1、SpringMVC基础配置
2、XML配置Controller,HandlerMapping组件映射
3、XML配置ViewResolver组件映射

创建MyHandler

package com.lzy.handler;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class MyHandler implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        //装载模型数据和逻辑视图
        ModelAndView modelAndView = new ModelAndView();
        //添加模型数据
        modelAndView.addObject("name","Tom");
        //添加逻辑视图
        modelAndView.setViewName("show");
        //   /show.jsp
        return modelAndView;
    }
}

 配置springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--配置HandlerMapping,将url请求映射到Handler-->
    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

        <!--配置mapping-->
        <property name="mappings">
            <props>
                <!--配置test请求对应的handler-->
                <prop key="/test">testHandler</prop>
            </props>
        </property>
    </bean>

    <!--配置Handler-->
    <bean id="testHandler" class="com.lzy.handler.MyHandler"></bean>
<!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置前缀-->
        <property name="prefix" value="/"></property>
        <!--配置后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${name}
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_41937388/article/details/90293163