• Spring 框架基础(06):Mvc架构模式简介,执行流程详解


    本文源码:GitHub·点这里 || GitEE·点这里

    一、SpringMvc框架简介

    1、Mvc设计理念

    MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,MVC分层有助于管理和架构复杂的应用程序

    • M:代表模型Model

    模型就是数据,应用程序的核心。

    • V:代表视图View

    回显数据的界面,例如JSP就是用来展示模型中的数据。

    • C:代表控制器Controller

    控制器的作用就是根据入参,把不同的响应数据(Model),显示在不同的视图(View)上。

    2、SpringMvc简介

    • 框架描述

    SpringMVC是一种基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,出自Spring框架全家桶,与Spring框架无缝整合,使用了MVC架构模式的思想,将Web层进行职责解耦。

    • 框架优点

    结构松散,几乎可以在SpringMVC中使用各类视图,各个模块分离而且耦合度非常低,且易于扩展。与Spring无缝集成,且简单,灵活,容易上手。

    二、SpringMvc执行流程

    1、流程图解

    2、步骤描述

    (1)、发起请求到前端控制器DispatcherServlet;

    (2)、前端控制器请求HandlerMapping查找,Handler可以根据xml配置、注解进行查找;

    (3)、处理器映射器HandlerMapping向前端控制器返回Handler;

    (4)、前端控制器调用处理器适配器去执行Handler;

    (5)、处理器适配器去执行Handler ;

    (6)、Handler执行完成给适配器返回ModelAndView ;

    (7)、处理器适配器向前端控制器返回ModelAndView,ModelAndViewspringmvc框架的一个底层对象,包括Modelview ;

    (8)、前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图 ;

    (9)、视图解析器向前端控制器返回View ;

    (10)、前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域中;

    (11)、前端控制器向用户响应结果 ;

    3、核心组件

    • 前端控制器

    DispatcherServlet:请求离开浏览器后,最先到达的就是DispatcherServlet,是整个流程控制的中心,作用接收请求,响应结果,相当于转发器,中央处理器。减少各个组件之间的耦合度。

    • 处理器映射器

    HandlerMapping:根据请求的url路由到指定接口,用户请求找到Handler处理器,springmvc提供不同类型映射器,例如:Xml配置方式,注解方式等。

    • 处理器适配器

    HandlerAdapter:按照特定规则去执行Handler,SpringMvc支持多种处理器,各种处理器中的处理方法各不相同,为了解决适应多种处理器,就出现了处理器适配器。

    • 处理器

    Handler:处理用户请求,涉及具体业务逻辑,需要程序员根据业务需求开发。编写Handler时按照HandlerAdapter的规则开发,这样适配器才可以正确执行Handler。

    • 视图解析器

    ViewResolver:负责将请求的响应结果生成View,根据逻辑视图名解析成物理视图名,就是具体页面地址,生成View视图对象,对View进行渲染,通过页面展示给用户。

    • 视图

    View:SpringMvc框架提供很多的View视图类型的支持,包括:jsp、freemarker、pdf等。通过页面标签或页面模版解析模型数据回显到页面,需要根据业务开发具体页面。

    三、整合Spring框架配置

    1、spring-mvc配置

    <!-- 扫描文件 -->
    <context:component-scan base-package="com.spring.mvc.controller" />
    <!-- MVC默认的注解映射的方式 -->
    <mvc:annotation-driven />
    <mvc:default-servlet-handler/>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/" />
        <property name="suffix" value=".jsp" />
    </bean>
    

    2、Web.xml配置

    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <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>spring-mvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    3、测试接口

    @Controller
    public class HelloController {
        @RequestMapping("/getInfo")
        public @ResponseBody String getInfo (String name){
            return name ;
        }
    }
    

    4、常用注解说明

    • @Controller

    标记一个类是Handler,也就是开发的Controller,然后使用@RequestMapping或其他相关注解(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping),用来关联请求和Controller方法之间的映射关系,这样的Controller 就可以被请求访问。

    • @RequestMapping

    处理请求地址映射的注解,可作用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以类上标注地址作为父路径。

    • @requestParam

    主要用于在SpringMvc框架的控制层获取参数,三个常用参数:defaultValue表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value值表示传入的参数名称。

    • @RequestBody

    接收请求体中传递给后端的Json字符串数据的,GET方式无请求体,所以使用@RequestBody接收数据时,不能使用GET方式提交数据,需要用POST方式进行提交。

    • @ResponseBody

    该注解用于方法的返回对象,可以通过配置转换器为指定数据响应格式,如果希望返回的数据不是View试图页面,而是指定数据格式的时候使用,例如:Json、Xml等。

    • @Autowired

    按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。

    • @Resource

    按照ByName自动注入,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

    • @PathVariable

    用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。

    四、常见参数映射

    1、普通映射

    @RequestMapping("/getSum")
    public Integer getSum (int a,int b){
        return a+b ;
    }
    

    测试:

    http://localhost:6003/getSum?a=1&b=2

    传参名称和方法参数保持一致。

    2、指定参数名

    @RequestMapping("/getInfo")
    public String getInfo (@RequestParam("name") String var1,
                           @RequestParam("say") String var2){
        return var1+":"+var2 ;
    }
    

    测试:

    http://localhost:6003/getInfo?name=cica&say=hello

    传参名和 @RequestParam 指定的参数名要对应。

    3、数组参数

    @GetMapping("/getArray")
    public String getArray (String[] ids){
        return ids[0]+"-"+ids[1] ;
    }
    

    测试:

    http://localhost:6003/getArray?ids=2&ids=3

    传递并解析数组类型的参数格式。

    4、Map参数

    @RequestMapping("/getMap")
    public String getMap (@RequestParam Map<String,String> paramMap){
        return paramMap.get("name") ;
    }
    

    测试:

    http://localhost:6003/getCityEntity?province=浙江&name=杭州

    这里以Post方式将相关参数传递CityEntity实体对象中。

    5、包装参数

    @PostMapping("/getCityEntity")
    public CityEntity getCityEntity (CityEntity cityEntity){
        return cityEntity ;
    }
    

    测试:

    http://localhost:6003/getCityEntity?province=浙江&name=杭州

    这里以Post方式将相关参数传递CityEntity实体对象中。

    6、Rest风格参数

    @GetMapping("/getId/{id}")
    public String getId (@PathVariable("id") Integer id){
        return "id="+id ;
    }
    

    测试:

    http://localhost:6003/getId/1

    RestFul 风格参数映射。

    五、源代码地址

    GitHub·地址
    https://github.com/cicadasmile/spring-mvc-parent
    GitEE·地址
    https://gitee.com/cicadasmile/spring-mvc-parent
    

  • 相关阅读:
    文本属性和字体属性
    BZOJ 2724: [Violet 6]蒲公英
    BZOJ4010: [HNOI2015]菜肴制作
    BZOJ 2160: 拉拉队排练
    HDU-5157Harry and magic string
    HDU-5421Victor and String
    BZOJ2565: 最长双回文串(回文树)
    BZOJ3676: [Apio2014]回文串(回文树)
    BZOJ 3195: [Jxoi2012]奇怪的道路(状压dp)
    BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/11993119.html
Copyright © 2020-2023  润新知