zoukankan      html  css  js  c++  java
  • 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
    

  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/11993119.html
Copyright © 2011-2022 走看看