Spring MVC框架

Spring MVC 简介

MVC 体系结构

三层架构

开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器;另一种是B/S架构,也就是浏览器/服务器。在JavaEE开发中,几乎全都是基于B/S架构的开发。那么在B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。

三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面:

  • 表现层

    也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web层,web层需要接收http请求,完成http响应。

    表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。

    表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。

    表现层的设计一般都使用MVC模型(MVC是表现层的设计模型,和其他层没有关系)。

  • 业务层

    也就是我们常说的service层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web层依赖业务层,不依赖表现层。

    业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性(也就是我们说的,事务应该放到业务层来控制)。

  • 持久层

    也就是我们常说的dao层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层就是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗地讲,持久层就是和数据库交互,对数据表进行增删改查的。

MVC设计模式

MVC全名是Model View Controller,是模型(model)- 视图(view)- 控制器(controller) 的缩写,是一种用于设计创建web应用程序表现层的模式。MVC中每个部分各司其职:

  • Model:模型包含业务模型和数据模型;数据,模型用于封装数据,业务模型用于处理业务。
  • View:通常指的就是我们的jsp或者html。作用一般就是展示数据的。通常视图是依据模型数据创建的。
  • Controller:是应用程序中处理用户交互的不符。作用一般是处理程序逻辑的。

MVC设计模式提倡:每一层只编写自己的东西,不编写其他层的代码;分层是为了解耦,解耦是为了维护方便和分工协作。

Spring MVC是什么?

Spring MVC全称:Spring Web MVC,是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFramework的后续产品

Spring架构:
spring的三层 springmvc三层 是哪三层_spring

SpringMVC已经成为目前最主流的MVC框架之一,并且随着Spring3.0的发布,全面超越Struts2,成为最优秀的MVC框架,它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无需实现任何接口,同时它还支持RESTful编程风格的请求。

总之,SpringMVC和Struts2一样,都是为了解决表现层问题的web框架,它们都是基于MVC设计模式的,主要职责就是处理前端HTTP请求。SpringMVC本质上可以认为是对servelet的封装,简化了我们servelet的开发。

接收请求 ==> 返回响应,转跳页面

spring的三层 springmvc三层 是哪三层_其他_02

Spring Web MVC工作流程

需求:前端浏览器请求url: http://localhost:8080/test/handler01 ,前端页面显示后台服务器的时间

开发流程:

  • 新建Maven web工程,导入依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    
        <!--  引入spring web mvc 依赖  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  • 在webapp/WEB-INF/web.xml配置DispatcherServlet前端控制器

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--
            方式一:带后缀,如*.action
            方式二:/ 不会拦截.jsp
            方式三:/* 拦截所有,包括.jsp
          -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  • 开发处理具体业务逻辑的Handler

    @Controller
    @RequestMapping("/test")
    public class TestController {
    
        /**
         * url: http://localhost:8080/test/handler01
         * @return
         */
        @RequestMapping("/handler01")
        public ModelAndView handler01(){
            Date date = new Date();
            // 封装了数据和页面信息 返回数据到前端页面
            ModelAndView modelAndView = new ModelAndView();
            // addObject 其实是向请求域中request.setAttribute("date",date);
            modelAndView.addObject(date);
            // 视图信息(封装跳转的页面信息),逻辑视图页面
            modelAndView.setViewName("success");
            return modelAndView;
        }
    }
    
    
  • 前端/WEB-INF/jsp/success.jsp页面

    <%@ page language="java" isELIgnored="false" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <html>
        <head>
            <title>Title</title>
        </head>
        <body>
            跳转成功,当前系统时间为:${date}
        </body>
    </html>
    
  • 配置springmvc.xml配置

    <?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
            https://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
    ">
    
    
    <!--  开启注解扫描  -->
        <context:component-scan base-package="org.example.controller"/>
        
        <!--  配置springMVC视图解析器  -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--    视图文件前缀    -->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--    视图文件后缀    -->
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--  自动注册最合适的处理器映射器,处理器设配器  -->
        <mvc:annotation-driven/>
    
    
    </beans>
    

启动程序,访问 http://localhost:8080/test/handler01
spring的三层 springmvc三层 是哪三层_其他_03

Spring Web MVC 工作流程

spring的三层 springmvc三层 是哪三层_其他_04
流程说明:

  1. 用户发送请求至前端控制器DispatcherServlet

  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器

  3. 处理器映射器根据请求Url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截器(如果有则生成)一并返回DispatchServlet

  4. DispatchServlet调用HandlerAdapter处理器适配器去调用Handler

  5. 处理器设配器执行Handler

  6. Handler执行完成给处理器适配器返回ModelAndView

  7. 处理器适配器向前端控制器返回ModelAndView,ModelAndView 是SpringMVC框架的一个底层对象,包括Model和View

  8. 前端控制器请求视图解析器去进行视图解析,根据逻辑视图名来解析真正的视图

  9. 视图解析器向前端控制器返回View

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

  11. 前端控制器向用户响应结果