SpringMVC之概述及入门案例(一)

您所在的位置:网站首页 mvc模式的工作流程 SpringMVC之概述及入门案例(一)

SpringMVC之概述及入门案例(一)

2023-11-25 01:03| 来源: 网络整理| 查看: 265

文章目录

(一)三层架构介绍和MVC设计模型介绍 (二)SpringMVC框架的介绍 (三)入门案例:需求分析 (四)入门案例:搭建开发环境 (五)入门程序:入门代码编写 (六)入门案例:流程总结 (七)入门案例:使用的组件介绍 (八)RequestMapping注解的作用 (九)RequestMapping注解的属性

(一)三层架构介绍和MVC设计模型介绍 三层架构 我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器 在JavaEE开发中,几乎全都是基于B/S架构的开发。那么在B/S架构中,系统标准的三层架构包括:表现层、业务层、持久层 三层架构在我们的实际开发中使用的非常多,所以我们课程中的案例也都是基于三层架构设计的 三层架构中,每一层各司其职,接下来我们就说说每层都负责哪些方面: 表现层: 也就是我们常说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应 表现层包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端 表现层的设计一般都使用MVC模型。(MVC是表现层的设计模型,和其他层没有关系) 业务层: 也就是我们常说的service层。它负责业务逻辑处理,和我们开发项目的需求息息相关。 web层依赖业务层,但是业务层不依赖web层 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制) 持久层: 也就是我们是常说的dao层。负责数据持久化,包括数据层即数据库和数据访问层 数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中 通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的

注意:其实Spring框架不止体现在业务层,它在三层均有体现,在后面SSM整合案例中会介绍

MVC 模型 MVC全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建Web应用程序表现层的模式,MVC中每个部分各司其职: Model(模型): 通常指的就是我们的数据模型,作用一般情况下用于封装数据 View(视图): 通常指的就是我们的jsp或者html,作用一般就是展示数据的 通常视图是依据模型数据创建的。 Controller(控制器): 是应用程序中处理用户交互的部分,作用一般就是处理程序逻辑的 它相对于前两个不是很好理解,这里举个例子: 例如: 我们要保存一个用户的信息,该用户信息中包含了姓名,性别,年龄等等 这时候表单输入要求年龄必须是1~100之间的整数、姓名和性别不能为空,并且把数据填充到模型之中 此时除了js的校验之外,服务器端也应该有数据准确性的校验,那么校验就是控制器的该做的 当校验失败后,由控制器负责把错误页面展示给使用者 如果校验成功,也是控制器负责把数据填充到模型,并且调用业务层实现完整的业务需求 (二)SpringMVC框架的介绍

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编写更容易 ………………还有比如RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等 SpringMVC 和 Struts2 的优略分析 共同点: 它们都是表现层框架,都是基于MVC模型编写的 它们的底层都离不开原始ServletAPI 它们处理请求的机制都是一个核心控制器(比如:Servlet或Filter) 区别: Spring MVC的入口是Servlet, 而Struts2是Filter Spring MVC是基于方法设计的,而Struts2是基于类,Struts2每次执行都会创建一个动作类,所以Spring MVC会稍微比Struts2快些 Spring MVC使用更加简洁,同时还支持JSR303, 处理ajax的请求更方便 (JSR303是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了) Struts2的OGNL表达式使页面的开发效率相比Spring MVC更高些,但执行效率并没有比JSTL提升,尤其是struts2的表单标签,远没有html执行效率高

注意:

Structs2的对象是多例的,浏览器每发一个请求,都会创建一个Structs2的框架,然后执行方法以处理请求MVC的对象是单例的,只会创建一个实例对象,浏览器每发来一个请求,就调用方法进行处理 (三)入门案例:需求分析

在这里插入图片描述

(四)入门案例:搭建开发环境

首先创建一个javaweb的maven项目,如下: 在这里插入图片描述 直接创建的话,会从网上下载组件,速度会很慢的,我们可以添加以下键值对解决该问题,如下: (键:archetypeCatalog,值:internal) 在这里插入图片描述 补全目录结构,如下: 在这里插入图片描述 然后修改pom.xml的编译版本,把1.7改成1.8,如下: 在这里插入图片描述 进行版本锁定,便于后期更换版本,如下: 在这里插入图片描述 依赖如下:

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 junit junit 4.11 test

要想使用SpringMVC就必须要配置一个前端的控制器,而SpringMVC的控制器在之前也介绍过了,是Servlet,而Servlet之前也学习过了,下面在web.xml使用xml配置Servlet,如下:

dispatcherServlet org.springframework.web.servlet.DispatcherServlet dispatcherServlet /

注意:其中的路径配置为/,意思是把所有的请求都拦截下来

SpringMVC还需要一个配置文件,创建过程如下: 在这里插入图片描述 在这里插入图片描述 然后配置tomcat服务器,如下 在这里插入图片描述 尝试运行一下服务器,如下: 在这里插入图片描述

(五)入门程序:入门代码编写

先写一个JSP,请求路径先留空,如下:

Title 入门程序 入门程序

需求是当JSP访问控制器类时,会执行类中的方法,如下: 在这里插入图片描述 我们想要执行类中的方法,要先把类实例化成对象,这时候可以利用Spring的容器,我们可以在刚才创建的spirngmvc的配置文件里导入名称空间(或者叫做约束),如下: 在这里插入图片描述

开启注解扫描,如下:

现在可以在控制类上加注解了,如下: 在这里插入图片描述 在这里插入图片描述 但是目前还不能实现请求该类就执行方法,我们还需要在方法上加一个注解,如下: 在这里插入图片描述 @RequestMapping注解的作用是把方法跟请求路径绑定在一起,形成映射关系 我们看回springmvc配置文件,发现了问题: 在这里插入图片描述 目前还有一个问题:配置文件没被加载 配置文件没被加载的话,也就无法获知要扫描的类的路径,自然也就无法得知类上的注解 那我们要怎么样才能使配置文件被加载呢?我们可以在web.xml的servlet标签中配置,如下: 在这里插入图片描述 使它在控制器初始化的同时,加载配置文件 我们现在可以继续编写控制器类了,让它返回信息,如下: 在这里插入图片描述 SpringMVC有一个默认的规则,比如return的是字符串"success",就会返回一个名字叫success.jsp的jsp页面,所以我们还要创建一个jsp页面,如下: 在这里插入图片描述 此时我们需要配置一个视图解析器,让springmvc能够去WEB-INF下的pages文件夹找到success.jap 在这里插入图片描述 注意:视图解析器的类是固定的,就这一个,类名是:InternalResourceViewResolver 接下来可以给视图解析器配参数了,如下: 在这里插入图片描述 最后再开启SpringMVC框架的注解支持,如下: 在这里插入图片描述 注意:只有开启了SpringMVC框架的注解支持,控制器类中方法的@RequestMapping注解才会生效

此时我们可以填写请求路径了,如下: 在这里插入图片描述 最后可以启动服务器测试一下了,如下: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

(六)入门案例:流程总结

先贴上完整的web.xml,如下:

Archetype Created Web Application dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 dispatcherServlet /

springmvc.xml的核心代码,如下:

控制器类的代码,如下:

/** * 控制器类 */ @Controller public class HelloController { @RequestMapping(path = "/hello") public String sayHello() { System.out.println("hello SpringMVC"); return "success"; } }

在这里插入图片描述

(七)入门案例:使用的组件介绍

下面这张图片比上面的更详细,如下: 在这里插入图片描述 个人理解:

用户发给前端控制器的应该都是一些路径,比如controller01/saveUser/和controller01/hello/这样子的处理器映射器负责把这些路径转换成哪个控制器类执行哪个方法,比如让Controller1执行hello()方法由于一个控制器类可能会通过重定向或者转发的方式调用另外一个控制器类,所以转换出来的结果可能是多个,所以被称为执行链处理器适配器得到执行链后就会去找到对应的处理器类并且执行,把返回的结果(如jsp页面、json数据流等等)传回给前端控制器,前端控制器再传给视图解析器

在这里插入图片描述 其中的处理器适配器是去找对应的类,从而找到对应的方法 比如说现在还有一个UserController类,里面有saveUser()方法:

当前端请求/hello时,适配器就会找到HelloController类中的sayHello()方法当前端请求/saveUser时,适配器就会找到UserController类中的saveUser()方法

而处理器(Handler或者叫Controller)就是控制器类,如下: 在这里插入图片描述 下面对各种组件进行详细介绍,如下:

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 配 置 文 件 中 使 用 替代注解处理器和适配器的配置。 它就相当于在 xml 中配置了: 注意: 一般开发中,我们都需要写上此标签(虽然从入门案例中看,我们不写也行,随着课程的入,该标签还有具体的使用场景) 明确: 我们只需要编写处理具体业务的控制器以及视图。

说明:我们配置了SpringMVC框架注解的支持就相当于实现了处理器映射器(HandlerMapping)和处理器适配器(HandlAdapter)的功能了 在这里插入图片描述

(八)RequestMapping注解的作用

作用:用于建立请求 URL 和处理请求方法之间的对应关系 我们看看它的源码,如下: 在这里插入图片描述

作用在类上的情况如下: 此时有一个请求URL为:/user/hello,其中/user为一级目录,可以写在类上,而/hello为二级目录,可以写在方法上,便于分模块开发,可以把跟user相关的方法全部写在一个类中

下面简单演示@RequestMapping注解作用在类上的情况,如下: 在这里插入图片描述

(九)RequestMapping注解的属性

仍然通过源码介绍RequestMapping注解的属性,如下:

首先name属性不常用,这里不做介绍 在这里插入图片描述

path属性与value属性互为别名,言下之意就是RequestMapping注解可以使用简化写法 在这里插入图片描述

method属性是指定可以接受的请求方式,比如上面案例的超链接默认是GET请求方式,如果我们使用method属性指定只能接受POST请求方式的话,超链接就失效了 在这里插入图片描述 method属性的取值如下(它的类型是枚举): 在这里插入图片描述 用法如下: 在这里插入图片描述 运行结果如下: 在这里插入图片描述

params属性用于指定限制请求参数的条件。 它支持简单的表达式 要求请求参数的 key 和 value 必须和配置的一模一样 在这里插入图片描述

例如: params = {"accountName"},表示请求参数必须有accountName params = {"moeny!100"},表示请求参数中money不能是100

用法如下: 在这里插入图片描述

headers属性用于指定限制请求消息头的条件 在这里插入图片描述 用法如下: 在这里插入图片描述

注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3