精选文章 SpringMVC框架的入门学习01

SpringMVC框架的入门学习01

作者:NJUPT_zhaoyp 时间: 2020-08-05 08:53:25
NJUPT_zhaoyp 2020-08-05 08:53:25

SpringMVC的基本概念

关于三层架构和MVC

三层架构

我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,几乎全都是基于 B/S架构的开发。那么在 B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使用的非常多,所以很多案例也都是基于三层架构设计的。

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

表现层:

             也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web 层,web 需要接收 http 请求,完成 http 响应。
             表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。
             表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。
             表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系

业务层:

             也就是我们常说的 service 层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业务层,但是业务层不依赖 web 层。
             业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)

持久层:

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

MVC 模型

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:
Model (模型) :
             通常指的就是我们的数据模型。作用一般情况下用于封装数据。
View (视图) :
             通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据模型数据创建的。

Controller (控制器) :
             是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。它相对于前两个不是很好理解,这里举个例子:
例如:
我们要保存一个用户的信息,该用户信息中包含了姓名,性别,年龄等等。这时候表单输入要求年龄必须是 1~100 之间的整数。姓名和性别不能为空。并且把数据填充到模型之中。
此时除了 js 的校验之外,服务器端也应该有数据准确性的校验,那么校验就是控制器的该做的。
当校验失败后,由控制器负责把错误页面展示给使用者。如果校验成功,也是控制器负责把数据填充到模型,并且调用业务层实现完整的业务需求。

SpringMVC 概述

SpringMVC 是什么

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。
SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。
它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。

SpringMVC在三层架构的位置

SpringMVC框架的入门学习011

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 编写更容易。

SpringMVC的入门

入门案例的实现

导入坐标



5.0.2.RELEASE



org.springframework
spring-context
${spring.version}


org.springframework
spring-web
${spring.version}


org.springframework
spring-webmvc
${spring.version}


javax.servlet
servlet-api
2.5
provided


javax.servlet.jsp
jsp-api
2.0
provided

配置核心的控制器(配置DispatcherServlet)

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



dispatcherServlet
org.springframework.web.servlet.DispatcherServlet


3. 编写springmvc.xml的配置文件
4. 编写index.jsp和HelloController控制器类
1. index.jsp
contextConfigLocation
classpath:springmvc.xml


1


dispatcherServlet
/

配置SpringMVC组件











编写index.jsp和HelloController控制器类

index.jsp


入门案例

SpringMVC入门案例

HelloController

package com.zyp.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 控制器
 * @author zyp
 */
@Controller
public class HelloController {
    /**
     * 接收请求
     * @return
     */
    @RequestMapping(path="/hello")
    public String sayHello() {
        System.out.println("Hello SpringMVC!!");
        return "success";
    }
}

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


入门案例成功!!

入门案例的执行过程分析

SpringMVC框架的入门学习012
入门案例流程图

 1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
2. 开启了注解扫描,那么HelloController对象就会被创建
3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
5. Tomcat服务器渲染页面,做出响应

 

SpringMVC框架的入门学习013
SpringMVC的请求响应流程

 入门案例中涉及的组件

DispatcherServlet :前端控制器

用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。

HandlerMapping:处理器映射器

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

Handler :处理器

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。

HandlAdapter :处理器适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行

View Resolver:视图解析器

View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

View :视图

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

说明

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。

使 用 自 动加载 RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用替代注解处理器和适配器的配置。

 RequestMapping 注解

出现位置:
类上:
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理:
例如账户模块:
/account/add
/account/update
/account/delete
...
订单模块:
/order/add
/order/update
/order/delete
红色的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。
方法上:
请求 URL 的第二级访问目录。

属性: 

value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
例如:
           params = {"accountName"},表示请求参数必须有 accountName
           params = {"moeny!100"},表示请求参数中 money 不能是 100。
headers:用于指定限制请求消息头的条件。
注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。

请求参数的绑定

绑定的机制

我们都知道,表单中请求参数都是基于 key=value 的。
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

支持的数据类型

基本类型参数 :
           包括基本类型和 String 类型
POJO 类型参数 :
           包括实体类,以及关联的实体类
数组和集合类型参数 :
           包括 List 结构和 Map 结构的集合(包括数组)
SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求

使用要求

如果是基本类型或者 String 类型:
           要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
如果是 POJO 类型 ,或者 它的关联对象 :
           要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型, 有两种方式 :

第一种:
           要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
           给 List 集合中的元素赋值,使用下标。
           给 Map 集合中的元素赋值,使用键值对。
第二种:
           接收的请求参数是 json 格式数据。需要借助一个注解实现。

使用 ServletAPI 对象作为方法参数

SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
HttpServletRequest
HttpServletResponse
HttpSession

java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
我们可以把上述对象,直接写在控制的方法参数中使用。

常用注解

RequestParam

作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

RequestBody

作用:
用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。

PathVaribale

作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。

RequestHeader

作用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头
注:在实际开发中一般不怎么用。

CookieValue

作用:
用于把指定 cookie 名称的值传入控制器方法参数。
属性:
value:指定 cookie 的名称。
required:是否必须有此 cookie。

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:HIDL详解-Android10.0 HwBinder通信原理(二)

下一篇:6.手写LcMybatis(6),使用动态代理,只写mapper接口,不写实现类

您可能感兴趣

  • GitHub上的今年第一本《Java异步编程实战》美团T9亲荐,太赞了

    异步编程是可以让程序并行运行的一种手段,可以让程序中的一个工作单元与主应用程序线程分开独立运行,进而提高应用程序的性能和响应能力等。 虽然Java为不同技术域提供了相应的异步编程技术,但是这些异步编程技术被散落到不同技术域的技术文档中,没有一个统一的文档对其进行梳理归纳。另外这些技术之间是什么关系,各自的出现都是为了解决什么问题,我们也很难找到相关资料来解释。 特色 本书涵盖了Java中常见...

  • 2020年最新web全栈精英课程

    目录: ┣━━阶段01 复习准备:核心技术复习、ES5、ES6、TypeScript、PHP+MySQL开发 ┃ ┣━━01-01 核心技术复习:CSS3矩阵、CSS3实用技巧、ES5核心复习、jQuery源码 ┃ ┣━━01-02 Linux:虚拟机系列安装、常用命令、Cygwin、服务器原理 ┃ ┣━━01-03 复习ES5.1:严格模式、JSON、对象、js作用域和闭包、参数传递 ┃ ...

  • 如何评价1700亿参数的GPT-3?

    作者:李如 链接:https://www.zhihu.com/question/398114261/answer/1253942032 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 GPT-3依旧延续自己的单向语言模型训练方式,只不过这次把模型尺寸增大到了1750亿,并且使用45TB数据进行训练。同时,GPT-3主要聚焦于更通用的NLP模型,解决当前BER...

  • 用OpenCV和深度学习进行年龄识别

    在本教程中,您将学习如何使用OpenCV,深度学习和Python执行年龄的自动识别/预测。 学完本教程后,您将能够以相当高的精确度去自动预测静态图像文件和实时视频中的人物年龄。 要了解如何使用OpenCV和深度学习进行年龄识别,请继续阅读! 用OpenCV和深度学习进行年龄识别 在本教程的第一部分中,您将学习年龄识别,这包括从图片或视频中自动预测人的年龄需要的步骤(以及为什么应该将年龄识别当...

  • 天天在用 Stream,那你知道如此强大的 Stream 的实现原理吗?

    点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发...

  • 2个月面了鹅厂的5个部门,心态差点奔溃了......

    从去年到今年先后面试了好几次腾讯,面试了好几个部门、总结下来,今年和两年前相比,面试题难度增加了不少,主要从以下几个方面问的更加深入了。比如: 那我这边先给大家总结一些出现频次较多的问题吧: JVM 参数配置、常用调试工具、分区、类加载,还会问你有需要线上的调试问题吗?遇到死循环 CPU 飙升怎么解决? Java 并发包常用工具用法和原理、会配合集合类一起考,对了还会有 volatile、C...

  • 屠杀机器人和无处不在的监控:AI是我们最大的生存威胁?

    导读:几十年来,人工智能(artificial intelligence,AI)一直是学术界的白日梦。计算机可以像人类一样学习的想法似乎是不可能的。 随着处理能力成本的大幅下降,科学家们终于发现了如何编写和实现人工智能程序,这些程序可以教计算机学习如何使用类似人的逻辑来解决问题。到目前为止取得的阶段性成功,令人印象深刻。 计算能力的进步,再加上人工智能,意味着我们作为一个社会所面临的许多重大...

  • 本周AI热点回顾:你家的猫也能来段东北话了:三种方言随意换、算法战争:美国国家AI安全委员会要建立AI大学...

    01 你家的猫也能来段东北话了:三种方言随意换,还能配出《舌尖》风 日常想给家里的蠢猫拍个视频配个音,需要几步? 不不不,现在有了AI的加持,只需打开App,输入文本,秒秒钟就能搞定。 不只是四川话配音,东北老妹音也可以整起来: 文字转语音,其实并不是什么新鲜事。 不过,在此之前,此类语音合成技术主要面向B端用户,应用场景主要是资讯播报、订单播报、朗读听书等。 而对于C端用户,特别是有视频配...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。