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

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

1、SpringMvc框架简介

一、Mvc设计理念

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

  • M:表明模型Model

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

  • V:表明视图View

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

  • C:表明控制器Controller

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

二、SpringMvc简介

  • 框架描述

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

  • 框架优势

结构松散,几乎能够在SpringMVC中使用各种视图,各个模块分离并且耦合度很是低,且易于扩展。与Spring无缝集成,且简单,灵活,容易上手。spring

2、SpringMvc执行流程

一、流程图解

06-1.png

二、步骤描述

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

(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)、前端控制器向用户响应结果 ;

三、核心组件

  • 前端控制器

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

  • 处理器映射器

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

  • 处理器适配器

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

  • 处理器

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

  • 视图解析器

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

  • 视图

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

3、整合Spring框架配置

一、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>

二、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>

三、测试接口

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

四、经常使用注解说明

  • @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模板中的变量做为参数。

4、常见参数映射

一、普通映射

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

测试:

http://localhost:6003/getSum?a=1&b=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 指定的参数名要对应。

三、数组参数

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

测试:

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

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

四、Map参数

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

测试:

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

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

五、包装参数

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

测试:

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

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

六、Rest风格参数

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

测试:

http://localhost:6003/getId/1

RestFul 风格参数映射。

5、源代码地址

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

相关文章
相关标签/搜索