欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-03 22:08:49
本文源码: "GitHub·点这里" || "GitEE·点这里" 一、SpringMvc框架简介 1、Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,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、流程图解

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

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

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