20201127 王维

学习总结

1 SpringMVC 的基本概念

1.1 关于三层架构和 MVC

1.1.1 三层架构

开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架 构,也就是浏览器/服务器。

在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发。那么在 B/S 架构中, 系统标准的三层架构包括:表现层、业务层、持久层。

表现层:

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

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

表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)

业务层:

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

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

持久层:

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

1.1.2 MVC 模型

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种 用于设计创建 Web 应用程序表现层的模式。

Model(模型):

用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。Model有对数据直接访问的权力,例如对数据库的访问。Model不依赖View和Controller也就是说, Model 不关心它会被如何显示或是如何被操作,被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

View(视图):

通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据模型数据创建的。

Controller(控制器):

接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。他起到不同层面间的组织作用,用于控制应用程序的流程。

1.1.3 三层架构和MVC的区别

MVC(模型Model-视图View-控制器Controller)是一种架构模式,可以用它来创建在域对象和UI表示层对象之间的区分。

三层建构同样是架构级别的,相同的地方在于他们都有一个表现层,但是他们不同的地方在于其他的两个层。

在三层架构中没有定义Controller的概念。这是最不同的地方。而MVC也没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然了。在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,MVC中典型的Model层是由业务逻辑与访问数据组成的。而三层架构里,则是以实体类构成的。

实际开发中,一般都是三层架构和MVC混合使用,三层架构中的表现层划变化为视图View和控制器Controller,或者说MVC中的模型Model将数据和业务逻辑进行了分离,Model只表示数据,由实体类构成,业务逻辑变为对数据进行处理的业务层service和对数据进行持久化的持久层dao。

1.2 SpringMVC 概述

1.2.1 SpringMVC 是什么

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动(基于请求驱动指的就是使用请求-响应模型)类型的轻量级 Web 框架,即使用了MVC架构模式的思想,将web层进行职责解耦,属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面。

1.2.2 SpringMVC 在三层架构的位置

SpringMVC作为View层的实现者,完成用户的请求接收功能。SpringMVC的Controller作为整个应用的控制器,完成用户请求的转发及对用户的响应。

MyBatis作为Dao层的实现者,完成对数据库的增删改查。

Spring以大管家的身份出现,管理所有Bean的生命周期,即整个应用中所有对象的创建、初始化、销毁,以及对象间关联关系的维护均由Spring管理。

SSM即Spring+SpringMVC+MyBatis框架

1.2.3 SpringMVC 的优势

  1. 清晰的角色划分
    • 前端控制器( DispatcherServlet )
    • 请求到处理器映射( HandlerMapping )
    • 处理器适配器( HandlerAdapter )
    • 视图解析器( ViewResolver )
    • 处理器或页面控制器( Controller )
    • 验证器( Validator )
    • 命令对象( Command 请求参数绑定到的对象就叫命令对象)
    • 表单对象( Form Object 提供给表单展示和提交到的对象就叫表单对象)。
  2. 分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要。
  3. 由于命令对象就是一个 POJO,无需继承框架特定 API,可以使用命令对象直接作为业务对象。
  4. 和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的。
  5. 可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。
  6. 可定制性,HandlerMapping、ViewResolver 等能够非常简单的定制。
  7. 功能强大的数据验证、格式化、绑定机制。
  8. 利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试。
  9. 本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
  10. 强大的 JSP 标签库,使 JSP 编写更容易。

2 SpringMVC 的入门

2.1 SpringMVC 的使用步骤

2.1.1 前期准备

创建一个 maven web 工程

创建一个 jsp 用于发送请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC 入门案例</title>
</head>
<body>
    <a href="${pageContext.request.contextPath}/hello">SpringMVC 入门案例</a>
    <br/>
    <a href="hello">SpringMVC 入门案例</a>
</body>
</html>

2.1.2 导入依赖

<dependencies>
    <!-- springMVC -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- 编译器servlet支持 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.10</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

2.1.3 配置核心控制器(一个 Servlet)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 配置 spring mvc 的核心控制器 -->
    <servlet>
        <servlet-name>SpringMVCDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置初始化参数,用于读取 SpringMVC 的配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </init-param>
        <!-- 配置 servlet 的对象的创建时间点:应用加载时创建。
        取值只能是非 0 正整数,表示启动顺序 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>SpringMVCDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>

在 web.xml 配置文件中核心控制器 DispatcherServlet

2.1.4 创建 spring mvc 的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.itlaobing.springmvc" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 视图前缀 -->
        <property name="prefix" value="/WEB-INF/pages/" />
        <!-- 视图后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

2.1.5 编写控制器并使用注解配置

package com.itlaobing.springmvc.controller;

import com.itlaobing.springmvc.model.Account;
import com.itlaobing.springmvc.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("HelloController 的 sayHello 方法执行了。。。。");
        return "success";
    }

}

在WEB-INF目录下创建pages文件夹,编写 success.jsp 的成功页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
    <h3>成功!!!</h3>
</body>
</html>

2.1.6 测试

2.2 SpringMVC项目的执行过程及原理分析

2.2.1 SpringMVC执行流程

image-20201128091516729

  1. 服务器启动,应用被加载。读取到 web.xml 中的配置创建servlet实例并进行初始化,再加载springmvc.xml创建spring容器并根据配置初始化容器。
  2. 浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转 发的路径是根据请求 URL,匹配@RequestMapping 中的内容
  3. 匹配到了后,执行对应方法。
  4. 根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
  5. 渲染结果视图,响应浏览器。

心得体会

对于ssm混合框架开发,终于开始补上了最后一块拼图,表现层的springmvc框架。关于mvc架构,人们众说纷坛,今天对这个进行了一定的了解。

早期使用Servlet + JSP + Java Bean开发, MVC中的model模型代表用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

后面发生了变化,三层架构和MVC混合使用,三层架构中的表现层划变化为视图View和控制器Controller,或者说MVC中的模型Model将数据和业务逻辑进行了分离,Model只表示数据,由实体类构成,业务逻辑变为对数据进行处理的业务层service和对数据进行持久化的持久层dao。

标签

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1