一、什么是MVC
    MVC是模型、视图、控制器的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。
    MVC用于表现层,主要作用是降低了视图和业务逻辑之间的双向耦合
    MVC不是一种设计模式,是一种架构模式,不同的MVC存在差异

    Model(模型):
    数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao)和服务层(行为Service))。也就是模型提供了 模型数据查询和模型数据的状态更新等功能,包括数据和业务。
    View(视图):
    负责进行模型的展示,,一般就是我们见到的用户界面,客户想看到的东西。
    Controller(控制器):
    接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

    特点:

    • 轻量级,简单易学
    • 高效,基于请求响应的web框架
    • 与spring兼容性好,无缝结合
    • 约定优于配置
    • 功能强大:RESTful、数据验证、格式化、本地化、主题等
    • 简洁灵活

    二、springMVC如何配置:
    1.在web.xml中配置dispatcherServlet:mvc框架前端总调度器(会去完成web交互时的各种调度工作)

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <!--配置前端总调度器-->
    7. <servlet>
    8. <servlet-name>dispatcherServlet</servlet-name>
    9. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    10. <!--绑定spring配置文件-->
    11. <init-param>
    12. <param-name>contextConfigLocation</param-name>
    13. <!--配置文件的路径-->
    14. <param-value>classpath:xml/springmvc.xml</param-value>
    15. </init-param>
    16. <!--设置启动级别,需要在Tomcat服务器启动的时候就加载核心容器对象-->
    17. <load-on-startup>1</load-on-startup>
    18. </servlet>
    19. <servlet-mapping>
    20. <servlet-name>dispatcherServlet</servlet-name>
    21. <!--拦截所有客户端请求-->
    22. <url-pattern>/</url-pattern>
    23. </servlet-mapping>
    24. </web-app>

    2.由于mvc属于spring的功能模块,所以必须得有核心容器的支持,因此需要配置spring的配置文件springmvc.xml:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:mvc="http://www.springframework.org/schema/mvc"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="
    6. http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/mvc
    9. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    10. <!--注册controller组件-->
    11. <bean id="/controller" class="com.jy.controller.TestController"></bean>
    12. <!--注册一个处理映射器-->
    13. <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    14. <!--注册一个适配器-->
    15. <bean id="adapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    16. <!--注册视图解析器-->
    17. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    18. <!--设置视图的前缀-->
    19. <property name="prefix" value="/jsp/"></property>
    20. <!--设置视图的后缀-->
    21. <property name="suffix" value=".jsp"></property>
    22. </bean>
    23. </beans>

    其中的处理映射器和适配器可以不用配置,其他组件都需要配置
    三、重点:springmvc的整体调度流程
    1、客户端发送请求给服务端,springMVC框架会通过DispatcherServlet来做一个资源的拦截(比如http://localhost:8080/servlet/controller1)

    2、DispatcherServlet会调用处理映射器HandlerMapping来完成对地址的解析,然后把解析的信息告诉DispatcherServlet

    1. 3DispatcherServlet调用处理适配器HandlerAdapter从容器中找到对应的资源(会找到controller1对应的资源)

    4、HandlerAdapter找到对应资源之后,会去调用具体的Controller(然后回去封装数据,设置视图名称)

    1. 5、执行完逻辑之后,HandlerAdaptercontroller执行结果视图和模块(ModelAndView)返回给DispatcherServlet
    2. 6、继续调用ViewResolver视图解析器来解析ModelAndView里面视图名称,然后根据视图解析器内部的匹配规则来定位到具体的前端资源(jsp
    3. 7ViewResolver在解析完之后会将解析的信息告诉DispatcherServlet,然后回去做具体的页面跳转、数据渲染等工作!!<br />![](https://cdn.nlark.com/yuque/0/2022/png/21686270/1644241218890-9b45e248-ef36-444d-9cbf-2a2a9822a2ac.png#clientId=u58ce2c41-128f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u796b625a&margin=%5Bobject%20Object%5D&originHeight=567&originWidth=1091&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ue666fe62-7ff0-45c5-99e1-e762fbd35ee&title=)

    四、springMVC基于注解
    <mvc:default-servlet-handler/> :让springmvc不处理静态资源
    <mvc:annotation-driven>:支持mvc注解驱动
    InternalResourceViewResolver:视图解析器

    @Controller : 如果只是在spring框架中使用,就是将当前类的实例存放到容器中,如果在springmvc中,它不仅可以存实例到容器,还可以将该类下任意返回值是String的方法的返回值作为一份视图名称,用于视图跳转。
    @RequestMapping: 用于地址的映射 ,可以修饰类与方法
    @ResponseBody :让当前视图失效,像普通方法一样只返回数据

    1. @Controller
    2. @RequestMapping("user")
    3. public class UserController{
    4. @RequestMapping("test")
    5. public String getTest(){
    6. return "test";
    7. }
    8. @ResponseBody
    9. @RequestMapping("test02")
    10. public String getTest02(){
    11. return "test02";
    12. }
    13. }

    web.xml同上
    springmvc.xml:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:mvc="http://www.springframework.org/schema/mvc"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xmlns:context="http://www.springframework.org/schema/context"
    6. xsi:schemaLocation="
    7. http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/mvc
    10. http://www.springframework.org/schema/mvc/spring-mvc.xsd
    11. http://www.springframework.org/schema/context
    12. http://www.springframework.org/schema/context/spring-context.xsd">
    13. <!--开启扫描包-->
    14. <context:component-scan base-package="com.jy"></context:component-scan>
    15. <!--过滤静态资源-->
    16. <mvc:default-servlet-handler></mvc:default-servlet-handler>
    17. <!--支持mvc注解驱动-->
    18. <mvc:annotation-driven></mvc:annotation-driven>
    19. <!--配置视图解析器-->
    20. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    21. <!--设置前缀-->
    22. <property name="prefix" value="/WEB-INF/jsp/"></property>
    23. <!--设置后缀-->
    24. <property name="suffix" value=".jsp"></property>
    25. </bean>
    26. </beans>

    image.png
    五、springmvc如何接收前端传递的值

    • springmvc可以支持参数接值,在前端需要传递的数据,后端可以使用参数进行接收。

      1. @RequestMapping("test03")
      2. public String getTest03(String name,String password){
      3. System.out.println(name+" "+ password);
      4. return "test";
      5. }
    • spirngmvc在参数列表中,可以通过实体接值

    Mvc是自定义的一个类

    1. @RequestMapping("test04")
    2. public String getTest04(Mvc mvc){
    3. System.out.println(mvc);
    4. return "test";
    5. }

    六、springmvc如何将封装的数据存到Model中
    例如

    • 将接收到的数据响应到浏览器

      1. @RequestMapping("test05")
      2. public String getTest05(Mvc mvc, Model model){
      3. /**
      4. * 把实体存到Model中
      5. * model.addAttribute 底层封装的是request域
      6. */
      7. model.addAttribute(mvc);
      8. return "test02";
      9. }

      image.png
      七、转发与重定向
      转自:https://blog.csdn.net/liuhaiyang98/article/details/119767988
      当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
      注意,对于请求转发的页面,可以是 WEB-INF 中页面;而重定向的页面,是不能为 WEB-INF 中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资源的。 ```java @Controller public class MyController {

      /**

      • 控制器方法返回值是ModelAndView实现转发forward
      • 语法:mv.setViewName(“forward:视图完整路径”)
      • forward特点:不和视图解析器一同工作的,就当项目中没有视图解析器 / @RequestMapping(value = “/forward.do”) public ModelAndView doforward(){ ModelAndView mv=new ModelAndView();

        mv.addObject(“msg”,”在ModelAddView中处理了doforward.do的请求”); //请求转发 mv.setViewName(“forward:WEB-INF/view/show.jsp”);

        return mv; }

        /**

      • 当控制器方法返回modelAndview实现重定向 语法: mv.setViewName(“redirect:视图完整路径”)
      • redirect特点:不和视图解析器一同工作,相当于项目中没有视图解析器
      • 框架提供重定向的功能 (不能访问WEB-INF)
      • 1.框架可以实现两次请求之前的数据传递,把第一次请求中的model里面简单类型的数据转换中成为字符串
      • 附加到目标页面的后面,做get传递参数。也可以在目标页面中获取参数值使用
      • 2.在目标页面中,可以使用${param.参数名} 获取参数的值 */ @RequestMapping(“/redirect.do”) public ModelAndView doRedirect(String name,Integer age){ System.out.println(“在ModelAddView中处理了doRedirect.do的请求”);

        ModelAndView mv=new ModelAndView();

        mv.addObject(“name”,name); //请求重定向 mv.setViewName(“redirect:/other.jsp”);

        return mv; }

    } ```