SpringMVC学习笔记-基础入门

三层架构与MVC模式

三层架构

MVC

SpringMVC

简介

 优点

SpringMVC入门案例

项目结构

详细代码 

执行流程分析

SpringMVC工作流程(超重点!!!)

组件介绍&架构图

详细流程


三层架构与MVC模式

可以看看我之前写的文章!!!

浅谈三层架构、MVC之间的关系_面向鸿蒙编程的博客-CSDN博客_mvc三层架构icon-default.png?t=M276https://blog.csdn.net/weixin_43715214/article/details/123321253

(1)MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的表现层 ,也就是说, MVC把三层架构中 的表现层再度进行了分化,分成了控制器、视图、实体三个部分,

(2)MVC可以是三层中的一个表现层框架,属于表现层。三层和mvc可以共存

(3)三层是基于业务逻辑来分的,而MVC是基于页面来分的。

(4)三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的,而是相互协作关系

三层架构

  • 表现层:负责数据展示

  • 业务层:负责业务处理

  • 数据层:负责数据操作

MVC

MVC(Model View Controller),一种用于设计创建Web应用程序表现层的模式

Model(模型):数据模型,用于封装数据

View(视图):页面视图,用于展示数据

  • jsp

  • html

Controller(控制器):处理用户交互的调度器,用于根据用户需求处理程序逻辑

  • Servlet

  • SpringMVC

浏览器发出一个请求request,浏览器最后希望的是得到一个页面。我们需要将Model中的数据放到View的页面中,两者组合起来的工作由Controller来做!所以三者是相互协调的。Model、View、Controller三者协同可以生成用户想要看到的页面,再由response相应回给浏览器。

SpringMVC

简介

SpringMVC在三层架构中属于表现层,是一种基于Java实现的MVC模型的轻量级Web框架。

 优点

  • 使用简单
  • 性能突出
  • 灵活性强

SpringMVC入门案例

项目结构

详细代码 

从我们开始学习SSM框架的时候,我们一般都使用Maven进行对项目的管理。

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.Harmony</groupId>
    <artifactId>SpringMVC_demo01</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- servlet API -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--jsp坐标-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

        <!--spring web的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <!--spring mvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

    </dependencies>

    <!--构建-->
    <build>
        <!--设置插件-->
        <plugins>
            <!--具体的插件配置-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>80</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

由于是有用到web,所以我们设置打包的方式是war包。导入servlet,jsp,spring,springweb、springwebmvc的架包,最后我们之后项目是在maven的tomcat插件下跑的所以在<build>中配置一下。

UserController

//设置当前类为Spring的控制器类
@Controller
public class UserController {

    //设定当前方法的访问映射地址
    @RequestMapping("/save")
    //设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
    public String save(){
        System.out.println("user mvc controller is running ...");
        //设定具体跳转的页面
        return "success.jsp";
    }
}

我们将Controller层下的UserController配置成一个bean

然后使用@RequestMapping() 进行页面跳转(后续的文章我们会介绍该注解...)

spirng-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--扫描加载所有的控制类类-->
    <context:component-scan base-package="com.Harmony"/>

</beans>

我们最好将Spring与SpringMVC区分开,即在SpringMVC中使用的bean就写在spirng-mvc.xml中。

success.jsp

<%@page pageEncoding="UTF-8" language="java" contentType="text/html;UTF-8" %>
<html>
<body>
<h1>第一个spring-mvc页面</h1>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <!--要配置servlet,在SpringMVC中叫 DispatcherServlet-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载配置文件 spring-mvc.xml -->
        <init-param>
            <!--表示加载的是配置文件-->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--表示拦截所有的请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

在web.xml中我们的配置和之前学习Servlet的配置类似!只不过之前是使用Serlvet类,现在使用DispatcherServlet前端控制器(详细内容我们在之后叙述!)

注意我们需要加上<init-param>标签,即初始化参数,只有这样子我们才能将spring-mvc.xml加载进去!

运行如下:

执行流程分析

服务器启动的时候,项目首先加载web.xml,加载了一个Servlet,但是这里的Servlet是SpringMVC专门提供的!DispatcherServlet是SpringMVC的核心控制器,在<init-param>要求加载spring-mvc.xml核心配置文件,该文件中加载了所有SpringMVC所需要的bean

项目跑起来后,我们在浏览器输入localhost/save发了一个请求),由<servlet-mapping>中得知要过滤所有的请求,然后到spring-mvc.xmlbean,看看哪一个bean有对应的操作名“/save”,找到后就运行对应的方法,并且按照return的内容找页面,最后将页面的内容作为响应,返回给浏览器。

SpringMVC工作流程(超重点!!!)

组件介绍&架构图

  • DispatcherServlet:前端控制器, 是整体流程控制的中心,由其调用其它组件处理用户的请求, 有效的降低了组件间的耦合性

  • HandlerMapping:处理器映射器, 负责根据用户请求找到对应具体的Handler处理器

  • Handler:处理器,业务处理的核心类,通常由开发者编写,描述具体的业务

  • HandlAdapter:处理器适配器,通过它对处理器进行执行

  • View Resolver:视图解析器, 将处理结果生成View视图

  • View:视图,最终产出结果, 常用视图如jsp、 html

 

上述这些组件需要我们开发者自己写的只有HandlerMappingHandler。

详细流程

(1)浏览器发起请求到前端控制器DispatcherServlet),该控制器会过滤出哪些请求可以访问Servlet、哪些不能访问。并且会加载springmvc.xml配置文件。

(2)前端控制器会找到处理器映射器(HandlerMapping),通过HandlerMapping完成url到controller映射的组件,简单来说,就是将在springmvc.xml中配置的或者注解的url与对应的处理类找到并进行存储,用map<url,handler>这样的方式来存储。

(3)HandlerMapping有了映射关系,并且找到url对应的处理器,HandlerMapping就会将其处理器(Handler)返回,在返回前,会加上很多拦截器

(4)DispatcherServlet拿到Handler后,找到HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。

(5)执行处理器Handler

(6)处理器会返回一个ModelAndView对象HandlerAdapter

(7)通过HandlerAdapter将ModelAndView对象返回给前端控制器(DispatcherServlet)

(8)前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(jsp),其实就是将ModelAndView对象中存放视图的名称进行查找,找到对应的页面形成视图对象

(9)返回视图对象到前端控制器。

(10)视图渲染,就是将ModelAndView对象中的数据放到响应request域中,用来让页面加载数据的。

通过第8步,通过名称找到了对应的页面,通过第10步,request域中有了所需要的数据,那么就能够进行视图渲染了。最后将其返回即可。

posted @ 2022-03-22 03:56  金鳞踏雨  阅读(37)  评论(0)    收藏  举报  来源