SpringMVC(三)Restful风格及实例、参数的转换
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
一、Restful风格
1、Restful风格的介绍
Restful 一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。
原则条件
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 协议,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。
干货(简单明了):
Restful是一种设计风格。对于我们Web开发人员来说。就是使用一个url地址表示一个唯一的资源。然后把原来的请求参数加入到请求资源地址中。然后原来请求的增,删,改,查操作。改为使用HTTP协议中请求方式GET、POST、PUT、DELETE表示。
- 把请求参数加入到请求的资源地址中
- 原来的增,删,改,查。使用HTTP请求方式,POST、DELETE、PUT、GET分别一一对应。
二、如何学习restful风格,这里需要明确两点:
1、就是把传统的请求参数加入到请求地址是什么样子?
传统的方式是:
比如:http://ip:port/工程名/资源名?请求参数
举例:http://127.0.0.1:8080/springmvc/book?action=delete&id=1
restful风格是:
请求的动作删除由请求方式delete决定
2、restful风格中请求方式GET、POST、PUT、DELETE分别表示查、增、改、删。
3、SpringMVC中如何发送GET请求、POST请求、PUT请求、DELETE请求
我们知道发起GET请求和POST请求,只需要在表单的form标签中,设置method=”get” 就是GET请求。
设置form标签的method=”post”。就会发起POST请求。而PUT请求和DELETE请求。要如何发起呢。
- 要有post请求的form标签
- 在form表单中,添加一个额外的隐藏域_method=”PUT”或_method=”DELETE”
- 在web.xml中配置一个Filter过滤器org.springframework.web.filter.HiddenHttpMethodFilter(注意,这个Filter一定要在处理乱码的Filter后面)
三、Restful风格的Controller如何实现
1、Controller实现代码
2、restful风格的jsp页面
四、Restful风格在高版本Tomcat中无法转发到jsp页面
在Tomcat8之后的一些高版本,使用restful风格访问然后转发到jsp页面。就会有如下的错误提示:
解决有两个方法:
1、在需要跳转去的页面中设置当前是错误页面isErrorPage="true"
2、在put或delete方法中,使用重定向返回
五、@PathVariable 路径参数获取
前面我们已经知道如何编写和配置restful风格的请求和控制器。
那么 现在的问题是。如何接收restful风格请求的参数。比如前面的id值。
第一种情况,一个path参数:
第二种情况,多个path参数:
六、Restful风格实现的CRUD图书
把前面的传统请求方式的图书的CRUD换成刚刚讲的Restful风格的图书模块的CRUD。只需要修改页面端的请求方式和地址,以及服务器端Controller的接收。
1、Restful风格的crud工程的搭建
2、列表功能实现
Controller中的代码:
请求方式:
<a href="${ pageContext.request.contextPath }/book">图书管理</a>
3、删除功能实现
Controller中的代码:
到web.xml中去配置 支持restful风格的Filter过滤器
bookList.jsp中,需要修改提交的方式:
4、添加功能实现
bookEdit.jsp页面请求方式需要调整:
5、更新功能实现
更新图书分为两个步骤:
- 查询需要更新的图书,填充到更新页面
- 提交请求,发送数据给服务器更新保存修改。
5.1、查询需要更新的图书,填充到更新页面
5.2、提交请求,发送数据给服务器更新保存修改。
bookEdit.jsp页面的修改
6、字符集的Filter一定要在Restful的Filter前面
七、SpringMVC标签库
1、搭建SpringMVC开发环境
2、创建对象模型Person对象
PersonController控制器代码:
addPerson.jsp页面
八、自定义参数转换器
1、WebDataBinder类介绍
在SpringMVC中有WebDataBinder类。这个类专门用来负责将请求参数类型转换。以及请求参数数据验证,错误信息绑定等功能。
WebDataBinder会调用各种类型转换器,得到属性相对应类型的值。然后再注入到属性中(调用setXxxx方法)
在WebDataBinder类中有三个组件分别处理三种不同的功能。
conversionService 负责处理参数类型转换。把请求的参数转换成为Controller中的方法参数值。
converters 在ConversionService组件中需要各种类型转换器,在conversionService组件中需要依赖于各种转换器类去实现转换工作。
validators 负责验证传入的参数值是否合法。
bindingResult 负责接收验证后的错误信息。
下图展示了WebDataBinder、ConversionService、Converter的关系。
如果我们要自定义请求参数的类型转换器。需要实现
org.springframework.core.convert.converter.Converter<S,T>接口。
然后注入到ConversionService组件中。最后再将ConversionService注入到WebDataBinder中。
创建ConversionService组件,需要配置
org.springframework.format.support.FormattingConversionServiceFactoryBean对象。
2、自定义String到java.util.Date类型转换器
到ApplicationContext.xml中去配置,并使用
3、@DateTimeFormat注解类型转换器
我们也可以像上面。在类的Date类型的属性上标上注解。就可以自动将String类型转换成为Date数据
pattern属性表示 日期的格式。最完成的格式是:yyyy-MM-dd hh:mm:ss
九、较验器----参数的有效性验证Validate----Hibernate
在JavaEE6.0中,定义了很多的验证规范。这些规范统称为:JSR303验证规范。
而这些规范的实现。我们使用现在业内比较认可的Hibernate-Validate验证
@AssertTrue |
用于boolean字段,该字段只能为true |
@AssertFalse |
该字段的值只能为false |
@CreditCardNumber |
对信用卡号进行一个大致的验证 |
@DecimalMax |
只能小于或等于该值 |
@DecimalMin |
只能大于或等于该值 |
@Digits(integer=,fraction=) |
检查是否是一种数字的整数、分数,小数位数的数字 |
|
检查是否是一个有效的email地址 |
@Future |
检查该字段的日期是否是属于将来的日期 |
@Length(min=,max=) |
检查所属的字段的长度是否在min和max之间,只能用于字符串 |
@Max |
该字段的值只能小于或等于该值 |
@Min |
该字段的值只能大于或等于该值 |
@NotNull |
不能为null |
@NotBlank |
不能为空,检查时会将空格忽略 |
@NotEmpty |
不能为空,这里的空是指空字符串 |
@Null |
检查该字段为空 |
@Past |
检查该字段的日期是在过去 |
@Pattern(regex=,flag=) |
被注释的元素必须符合指定的正则表达式 |
@Range(min=,max=,message=) |
被注释的元素必须在合适的范围内 |
@Size(min=, max=) |
检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 |
@URL(protocol=,host,port) |
检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 |
使用Hiberante的验证器较验数据分以下步骤:
- 入Hibernate验证的jar包
hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
classmate-0.8.0.jar
jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar
2. 在实体bean对象的属性上使用校验的注解
3. 在Controller的方法参数上,给需要验证的bean对象。添加验证注解@Valid,以及在验证对象后跟一个BindingResult 对象用于接收验证的错误信息
4. 在SpringMVC的form表单字段后,使用<form:errors path="字段名" />输出对应字段的错误信息
十、自定义错误信息的回显
1、错误消息规则:
这是校验错误的key规则:
参数转换失败的key规则:
2、在源码目录下配置错误信息的属性配置文件
3、在application.xml中配置属性信息
使用占位符{数字}
对于SpringMvc模型来说,传值是框架做的工作。我们只需要写好数字即可。
第一个参数Spring传入的是验证的属性名
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步