• SpingMvc概念理解及原理


    一:mvc是什么

    • MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范
    • MVC主要作用是降低了视图与业务逻辑间的双向偶合(如jsp中逻辑代码和视图代码混在一起)。

    Model(模型):数据模型,数据Dao 和 服务层Service。包括数据和业务

    • 取得表单数据
    • 调用业务逻辑
    • 转向指定的页面

    View(视图):负责进行模型的展示,一般就是我们见到的页面。

    • 业务逻辑
    • 保存数据的状态

    Controller(控制器):接收用户请求,调度相关模型进行处理,处理完毕后控制器模型返回的模型数据返回给视图,由视图负责展示。 控制器起到调度员的作用

    • 显示页面

    二:SpringMVC

    Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架

    Spring MVC的特点:

    • 与Spring兼容性好,无缝结合
    • 约定优于配置
    • 功能强大:RESTful、数据验证、格式化、本地化、主题等

    1.中心控制器(前端控制器)-DispatcherServlet

    Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。DispatcherServlet的作用是将请求分发到不同的处理器。Spring MVC以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
    在这里插入图片描述

    2.url处理映射器-BeanNameUrlHandlerMapping

    中心控制器(DispatcherServlet)调用url处理映射器(BeanNameUrlHandlerMapping)根据请求路径去查找处理器(可理解为对应开发中的Controller)

    3.url处理器适配器-SimpleControllerHandlerAdapter

    处理器适配器 安照特定的规则去执行处理器(可理解为就执行了开发中的Controller)

    4.视图解析器-ViewResolver

    视图解析器将Controller返回的视图和数据进行解析后渲染到视图

    三:SpringMVC执行原理

    导入依赖

    
                org.springframework</groupId>
                spring-webmvc</artifactId>
                5.3.22</version>
            </dependency>
            
                javax.servlet.jsp</groupId>
                jsp-api</artifactId>
                2.2</version>
            </dependency>
            
                javax.servlet</groupId>
                jstl</artifactId>
                1.2</version>
            </dependency>
            
                javax.servlet</groupId>
                servlet-api</artifactId>
                2.5</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    web.xml

    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        
         <servlet>
             <servlet-name>springmvcservlet-name>
             <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
             
             <init-param>
                 <param-name>contextConfigLocationparam-name>
                 <param-value>classpath:springmvc-servlet.xmlparam-value>
             init-param>
             
             <load-on-startup>1load-on-startup>
         servlet>
        
        
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    springMVC配置文件

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">bean>
        
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">bean>
        
    
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/">property>
            
            <property name="suffix" value=".jsp">property>
        bean>
    
        
        <bean id="/hello" class="com.lmy.HelloController">bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    controller

    package com.lmy;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    /**
     * 编写一个Controller
     * 要么实现Controller接口,要么增加注解 @Controller
     */
    public class HelloController implements Controller {
        public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws Exception {
            ModelAndView view = new ModelAndView();
            view.addObject("smg","你好");
            view.setViewName("hello");
            return view;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>hellotitle>
    head>
    <body>
    ${smg}
    body>
    html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    SpringMVC的原理如下:
    在这里插入图片描述
    详细流程图
    在这里插入图片描述
    开发中,我们只需要实现虚线部分

    DispatcherServlet是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

    上诉案例中请求路径为:
    http://localhost:8080/SpringMVC/hello
    http://服务器ip地址或域名:端口 web项目 控制器

    流程图说明:

    1. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
    2. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
    3. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
    4. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
    5. Handler让具体的Controller执行。
    6. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
    7. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
    8. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
    9. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
    10. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
    11. 最终视图呈现给用户。

    四:注解开发

    Maven配置:

        
        <build>
            <resources>
                <resource>
                    <directory>src/main/javadirectory>
                    <includes>
                        <include>**/*.propertiesinclude>
                        <include>**/*.xmlinclude>
                    includes>
                    <filtering>falsefiltering>
                resource>
                <resource>
                    <directory>src/main/resourcesdirectory>
                    <includes>
                        <include>**/*.propertiesinclude>
                        <include>**/*.xmlinclude>
                    includes>
                    <filtering>falsefiltering>
                resource>
            resources>
        build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    web.xml配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!--注册servlet-->
        <servlet>
            <servlet-name>annotation</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
            </init-param>
            <!-- 启动顺序,数字越小,启动越早 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <!--所有请求都会被springmvc拦截 -->
        <!--//* 的区别:
            < url-pattern > /  不会匹配到.jsp, 只针对我们编写的请求;
            即:.jsp 不会进入spring的 DispatcherServlet类 。
            < url-pattern > /*  会匹配 .jsp,
            会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。-->
        
            annotation
            /
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    Spring MVC配置:

    <?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"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           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
            http://www.springframework.org/schema/mvc
            https://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
        <context:component-scan base-package="com.lmy.controller"/>
        <!--Spring MVC不处理静态资源 -->
        <mvc:default-servlet-handler/>
        <!--
        支持mvc注解驱动
            在spring中一般采用@RequestMapping注解来完成映射关系
            要想使@RequestMapping注解生效
            必须向上下文中注册DefaultAnnotationHandlerMapping
            和一个AnnotationMethodHandlerAdapter实例
            这两个实例分别在类级别和方法级别处理。
            而annotation-driven配置帮助我们自动完成上述两个实例的注入。
         -->
        <mvc:annotation-driven/>
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!-- 前缀 -->
            <!--在视图解析器中把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问-->
           <property name="prefix" value="/WEB-INF/jsp/"/>
            <!-- 后缀 -->
           <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    Controller:

    package com.lmy.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 区别
     * @RestController相当于@Controller和@ResponseBody合在一起的作用
     * 如果使用@RestController注解Controller层的话,则返回的是return里面的内容,无法返回到指定的页面,配置的视图解析器InternalResourceViewResolver也就自然没有作用了
     * 如果要返回到指定的页面,则需要用@Controller配合视图解析器InternalResourceViewResolver
     * @Controller如果需要返回JSON、XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解
     */
    @Controller
    //@ResponseBody
    public class AnnotationController {
    
        @RequestMapping("/annotationController")
        public String annotationController(Model model) {
            model.addAttribute("msg","您好");
            // web-inf/jsp/annotation.jsp
            return "annotation";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    使用springMVC必须配置的三大件:
    处理器映射器、处理器适配器、视图解析器

    通常,只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置

  • 相关阅读:
    【Redis】redis基本数据类型详解(String、List、Hash、Set、ZSet)
    《算法通关村第二关——指定区间反转问题解析》
    汽车智能制造中的RFID技术在供应链生产管理中的应用
    uboot启动流程-board_init_r函数执行过程
    国庆看坚如磐石
    Flink的状态持久化和状态后端
    Python:range、np.arange和np.linspace的区别与联系
    PMP每日一练 | 考试不迷路-11.30(包含敏捷+多选)
    【每日一题】Day 39 选择题
    AVL双旋转思路分析与图解
  • 原文地址:https://blog.csdn.net/qq_41863697/article/details/127481168