1. SpringMVC 的基本概念
1.1 三层架构和MVC
1.1.1 三层架构
开发服务器端程序,一般都基于两种形式,一种C/S(客户端/服务器)架构程序,一种B/S(浏览器/服务器)架构程序。
使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构 :
- 表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型
- 业务层:处理公司具体的业务逻辑的
- 持久层:用来操作数据库的
1.1.2 MVC模型
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:
Model:数据模型,JavaBean的类,用来进行数据封装。
View:指JSP、HTML用来展示数据给用户
Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。
1.2 SpringMVC 概述
1.2.1 SpringMVC 是什么
- 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建Web 应用程序的全功能 MVC 模块。
- 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的 SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。
1.2.2 SpringMVC 在三层架构的位置
1.2.3 SpringMVC 和 Struts2 的优略分析
共同点:
- 它们都是表现层框架,都是基于 MVC 模型编写的。
- 它们的底层都离不开原始 ServletAPI。
- 它们处理请求的机制都是一个核心控制器。
区别:
- 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 执行效率高。
2. SpringMVC 的入门
2.1 SpringMVC 的入门案例
2.1.1 创建WEB工程,引入jar包
1 | <groupId>com.wgy</groupId> |
2.1.2 配置核心的控制器
1 | <!-- 配置 spring mvc 的核心控制器 --> |
2.1.3 编写springmvc.xml的配置文件
1 |
|
2.1.4 编写index.jsp
1 | <body> |
2.1.5 编写HelloController控制器类
1 | /** |
2.1.6 编写success.jsp
1 | <body> |
2.1.7 测试
启动Tomcat服务器,进行测试
2.2 入门案例的执行过程及原理分析
2.2.1 案例的执行过程
- 服务器启动,应用被加载。读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象。
- 浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发的路径是根据请求 URL,匹配@RequestMapping 中的内容。
- 匹配到了后,执行对应方法。该方法有一个返回值。
- 根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
- 渲染结果视图,响应浏览器。
2.2.2 SpringMVC 的请求响应流程
2.3 入门案例中涉及的组件
2.3.1 前端控制器(DispatcherServlet)
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
2.3.2 处理器映射器(HandlerMapping)
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
2.3.3 处理器(Handler)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
2.3.4 处理器适配器(HandlAdapter)
通过 HandlerAdapter 对处理器进行执行
2.3.5 视图解析器(View Resolver)
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
2.3.6 视图(View)
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。
2.3.7 <mvc:annotation-driven>
说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使 用 <mvc:annotation-driven>
自 动加载 RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用<mvc:annotation-driven>
替代注解处理器和适配器的配置。
2.4 RequestMapping 注解
2.4.1 使用说明
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
RequestMapping注解可以作用在方法和类上
- 作用在类上:第一级的访问目录
- 作用在方法上:第二级的访问目录
RequestMapping的属性
path:指定请求路径的url
value:value属性和path属性是一样的
mthod:指定该方法的请求方式
params:指定限制请求参数的条件。例如:
params = {“accountName”},表示请求参数必须有 accountName
params = {“moeny!100”},表示请求参数中 money 不能是 100。
headers:发送的请求中必须包含的请求头
2.4.2 使用示例
2.4.2.1 出现位置的示例
控制器:
1 | /** |
JSP:
1 | <body> |
在 jsp 中第二种写法时,不要在访问 URL 前面加/ ,否则无法找到资源。
2.4.2.2 method 属性的示例
控制器:
1 | /** |
JSP:
1 | <!-- 请求方式的示例 --> |
当使用 get 请求时,提示错误信息是 405,信息是方法不支持 get 方式请求
2.4.2.3 params 属性的示例
控制器:
1 | /** |
JSP:
1 | <!-- 请求参数的示例 --> |
当我们点击第一个超链接时,可以访问成功。当我们点击第二个超链接时,无法访问。如下图:
3. 请求参数的绑定
3.1 绑定说明
3.1.1 绑定的机制
表单中请求参数都是基于 key=value 的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
JSP:
1 | <a href="account/findAccount?accountId=10">查询账户</a> |
控制器:
1 | /** |
3.1.2 支持的数据类型
1 | 基本类型参数 : |
3.1.3 使用要求
1 | 如果是基本类型或者 String 类型: |
3.1.4 使用示例
3.1.4.1 基本类型和 String 类型作为参数
JSP:
1 | <!-- 基本类型示例 --> |
控制器:
1 | /** |
运行结果:
3.1.4.2 POJO 类型作为参数
实体类:
1 | /** |
1 | /** |
JSP:
1 | <!-- pojo 类型演示 --> |
控制器:
1 | /** |
运行结果:
3.1.4.3 POJO 类中包含集合类型参数
实体类:
1 | /** |
JSP:
1 | <!-- POJO 类包含集合类型演示 --> |
控制器:
1 | /** |
运行结果:
3.1.4.4 请求参数乱码问题
post 请求方式:
1 | 在 web.xml 中配置一个过滤器 |
get 请求方式:
1 | tomacat对GET和POST请求处理方式是不同的,GET请求的编码问题,要改tomcat的server.xml配置文件,如下: |
3.2 特殊情况
3.2.1 自定义类型转换器
表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明 Spring框架内部会默认进行数据类型转换。
如果想自定义数据类型转换,可以实现Converter的接口
3.2.1.1 自定义类型转换器
1 | /** |
3.2.1.2 注册自定义类型转换器
1 | <!-- 配置类型转换器工厂 --> |
3.2.2 使用 ServletAPI 对象作为方法参数
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。
1 | /** |
4. 常用注解
4.1 RequestParam
4.1.1 使用说明
1 | 作用: |
4.1.2 使用示例
JSP:
1 | <!-- requestParams 注解的使用 --> |
控制器:
1 | /** |
运行结果:
4.2 RequestBody
4.2.1 使用说明
1 | 作用: |
4.2.2 使用示例
JSP:
1 | <!-- request body 注解 --> |
控制器:
1 | /** |
post 请求运行结果:
get 请求运行结果:
4.3 PathVaribale
4.3.1 使用说明
1 | 作用: |
4.3.2 使用示例
JSP:
1 | <!-- PathVariable 注解 --> |
控制器:
1 | /** |
运行结果:
4.3.3 REST 风格 URL
4.3.3.1 什么是 rest
REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
4.3.3.2 restful 的优点
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
请求路径一样,可以根据不同的请求方式去执行后台的不同方法
4.3.3.3 restful 的特性
资源( Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI (统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层( Representation):把资源具体呈现出来的形式,叫做它的表现层 ( Representation)。
比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
状态转化( State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生 “状态转化 ”( State Tran sfer)。而这种转化是建立在表现层之上的,所以就是 “表现层状态转化 ”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词: GET、 POST、 PUT、DELETE。它们分别对应四种基本操作: GET 用来获取资源, POST 用来新建资源, PUT 用来更新资源, DELETE 用来删除资源。
4.3.3.4 restful 的示例
1 | /account/1 HTTP GET : 得到 id = 1 的 account |
4.4 RequestHeader
4.4.1 使用说明
1 | 作用: |
4.4.2 使用示例
JSP:
1 | <!-- RequestHeader 注解 --> |
控制器:
1 | /** |
运行结果:
4.5 CookieValue
4.5.1 使用说明
1 | 作用: |
4.5.2 使用示例
JSP:
1 | <!-- CookieValue 注解 --> |
控制器:
1 | /** |
运行结果:
4.6 ModelAttribute
4.6.1 使用说明
1 | 作用: |
4.6.2 使用示例
4.6.2.1 基于 POJO 属性的基本使用
JSP:
1 | <!-- ModelAttribute 注解的基本使用 --> |
控制器:
1 | /** |
运行结果:
4.6.2.2 基于 Map 的应用场景1
ModelAttribute 修饰方法带返回值
修改用户信息,要求用户的密码不能修改
JSP:
1 | <!-- 修改用户信息 --> |
控制器:
1 | /** |
运行结果:
4.6.2.3 基于 Map 的应用场景2
ModelAttribute 修饰方法不带返回值
修改用户信息,要求用户的密码不能修改
JSP:
1 | <!-- 修改用户信息 --> |
控制器:
1 | /** |
运行结果:
4.7 SessionAttribute
4.7.1 使用说明
1 | 作用: |
4.7.2 使用示例
JSP:
1 | <!-- SessionAttribute 注解的使用 --> |
控制器:
1 | /** |
运行结果:
-------------本文结束感谢您的阅读-------------
本文标题: SpringMVC(一)
本文链接: https://wgy1993.gitee.io/archives/4560ea2b.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
