赞
踩
目录
spring.jackson.date-format(推荐)
1、HTTP 协议是一个广泛应用的 Internet 协议,提供了8个不同的请求方法(常见的是前 4 个):
请求方式 | 描述 |
GET | 向特定资源发出请求(请求指定页面信息,并返回实体主体) |
POST | 向指定资源提交数据进行处理请求(提交表单、上传文件) |
PUT | 向指定资源位置上上传其最新内容 |
DELETE | 请求服务器删除指定的资源 |
HEAD | |
OPTIONS | |
TRACE | |
CONNECT |
2、REST 全称 Representational State Transfer ——(资源)表现层状态转化,是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便, 所以正得到越来越多网站的采用。
3、REST 风格就是通过 Http 请求方式的不同来标识不同的方法,即对于同一个请求路径,可以根据请求方式的不同来区分它们。
操作 | 普通CRUD(根据uri区分) | REST风格CRUD(根据请求方式区分) |
查询 | localhost:8080/tiger/findUsers | localhost:8080/tiger/user-----get方式请求 |
添加 | localhost:8080/tiger/saveUser | localhost:8080/tiger/user-----post方式请求 |
修改 | localhost:8080/tiger/updateUser | localhost:8080/tiger/user-----pup方式请求 |
删除 | localhost:8080/tiger/deleteUser | localhost:8080/tiger/user-----delete方式请求 |
4、@RequestMapping 需要结合 RequestMethod 指定请求的 Http 方式,有:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE,所以封装之后就得到了各种请求方式对应的注解。(不能完全一概而论谁优谁劣,有时候习惯就好)。
5、如 @GetMapping 内部就是 @RequestMapping(method = RequestMethod.GET),这些注解的属性和 @RequestMapping是一样的。
操作 | 举例 |
查询所有用户 | @GetMapping("user") public String findUsers(Model model) { |
根据 id 查询用户 | @GetMapping("user/{id}") public String findUserById(@PathVariable(name = "id") Integer id, Model model) { |
添加用户 | @PostMapping("user") public String saveUser(User user) { |
修改用户 | @PutMapping("user") public String updateUser(User user) { |
根据 id 删除用户 | @DeleteMapping("user/{id}") public String deleteUser(@PathVariable(name = "id") Integer id) { |
src/main/java/com/wmx/yuanyuan/controller/VisitsController.java · 汪少棠/yuanyuan - Gitee.com。
1、form 表单的 method 属性值只有 get 与 post 两种,所以 form 表单使用 put、delete 等其它请求方式时,需要特殊处理。
1)表单 method 属性值仍然指定为 post。 2)表单中创建一个隐藏的 input 项,name 属性值强制为 "_method",value 属性值指定此 form 请求的具体方式,如 put、delete 等 |
2、如果使用类似 JQuery 的 $.ajax 的方式,则可以使用它的 type 属性直接指定请求方式,如 type: put。
3、环境:Java jdk 1.8 +Spring boot 2.1.3 + Thymeleaf。
4、后台接口如下,主要用于模拟向页面传递数据与接收数据:
- /**
- * 修改提交时调用此接口, put 请求: http://localhost:8080/example/httpPut
- *
- * @param user
- * @return
- */
- @PutMapping("example/httpPut")
- @ResponseBody
- public String httpPut(User user) {
- //将数据返回给页面,不操作数据.
- String valueAsString = "{}";
- try {
- ObjectMapper objectMapper = new ObjectMapper();
- valueAsString = objectMapper.writeValueAsString(user);
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- }
- return valueAsString;
- }
5、前端修改页面如下,使用 Thymeleaf 处理数据,使用 form 表单发送 put 请求(其它 delete 请求方式也是同理):
- <div style="width: 500px;height:400px;border: #1b6d85 1px solid;margin: auto;padding: 20px">
- <form action="" method="post" th:action="@{/example/httpPut}">
- <!--form的method只有get与post两种,使用put方式时:-->
- <!--创建一个input隐藏项,name强制为 "_method",value值就指定此form请求的方式-->
- <!--th:if 表达式:条件满足时生成标签,否则不生成标签-->
- <input type="hidden" name="_method" value="put" th:if="${user!=null}">
- <!--主键id做成隐藏项,修改时根据id进行修改-->
- <input type="hidden" name="id" th:if="${user!=null}" th:value="${user.id}">
- <!--三元运算符,当user不等于null时,取User的属性值,否则为空-->
- 姓名:<input type="text" name="name" th:value="${user!=null}?${user.name}"><br><br>
- 薪水:<input type="text" name="salary" th:value="${user!=null}?${user.salary}"><br><br>
- 学历:
- <select name="education">
- <!--th:each 表达式用于遍历集合,如果当前学历项等于用户的学历,则让它默认选中-->
- <option th:each="education:${educationArr}"
- th:text="${education}"
- th:value="${education}"
- th:selected="${user.education!=null}?${user.education==education}"></option>
- </select><br><br>
- <!--#dates.format 是 thymeleaf 格式化日期的方式-->
- 生日:<input type="text" name="birthday"
- th:value="${user.birthday!=null}?${#dates.format(user.birthday, 'yyyy-MM-dd HH:mm:ss')}"><br><br>
- <button type="submit" class="btn btn-primary">修改</button>
- <br><br>
- </form>
- </div>
1、页面提交的日期参数,Spring MVC 会自动转换成 Date 类型,默认支持 "/" + ":" 分隔的方式,即年月日必须是 "/" 分割,时分秒必须是 ":" 分割,如 1993/08/25 08:12:22,否则报错: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'.
2、无论是哪种方式都需要注意:
1)假如指定格式为 yyyy-MM-dd ,则传入的日期字符串只能是 "-" 分割,如果传入 1993/08/25 则报错 4)日期对象默认不支持 java.time.LocalDateTime,否则格式化无效。 |
1、Spring boot 官方文档 默认配置如下,spring.mvc.date-format 默认使用 "/" 格式,如果需要使用其它格式,则在全局配置文件中覆盖即可,如:spring.mvc.date-format=yyyy-MM-dd HH:mm:ss
- # SPRING MVC (WebMvcProperties)
- spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.
- spring.mvc.contentnegotiation.favor-parameter=false # Whether a request parameter ("format" by default) should be used to determine the requested media type.
- spring.mvc.contentnegotiation.favor-path-extension=false # Whether the path extension in the URL path should be used to determine the requested media type.
- spring.mvc.contentnegotiation.media-types.*= # Map file extensions to media types for content negotiation. For instance, yml to text/yaml.
- spring.mvc.contentnegotiation.parameter-name= # Query parameter name to use when "favor-parameter" is enabled.
- spring.mvc.date-format= # Date format to use. For instance, `dd/MM/yyyy`.
- spring.mvc.dispatch-trace-request=false # Whether to dispatch TRACE requests to the FrameworkServlet doService method.
2、2.3.5 版本 Web properties 版本开始属性名称有些调整:
| 格式化日期, 如 `dd/MM/yyyy`. |
| 格式化日期加时间, 如 `yyyy-MM-dd HH:mm:ss`. |
src/main/resources/application.yml · 汪少棠/thymeleafapp - Gitee.com
1、除了在配置文件中指定,也可以使用 org.springframework.web.bind.WebDataBinder API 转换日期。
- /**
- * 自定义日期转换器
- * Spring3.0 之前是会自动转换的,但是 3.0 之后需要程序员自己转换
- * 直接将 @InitBinder... 注解的方法放置在 @Controller 中即可
- *
- * @param dataBinder
- */
- @InitBinder
- public void initBind(WebDataBinder dataBinder) {
- /**指定日期格式*/
- DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
- /**指定日期/时间解析是否不严格
- * lenient - 为 true 时,解析过程是不严格的
- */
- dateFormat.setLenient(true);
- /**Date.class:表示这是注册的是日期类型
- * new CustomDateEditor(dateFormat, true):true 表示允许为空
- */
- dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
- }
在线源码:src/main/java/com/wmx/thymeleafapp/controller/SystemController.java · 汪少棠/thymeleafapp - Gitee.com
src/main/resources/application.yml · 汪少棠/thymeleafapp - Gitee.com
1、Spring Boot 提供了三个 JSON 库的集成:Gson、Jackson、JSON-B, 默认使用 jackson (Spring boot 官网文档)。
2、Jackson 是 spring-boot-starter-json 的一部分,提供了 Jackson 的自动配置。Jackson 位于类路径上时,会自动配置 ObjectMapper 对象。提供了多个配置属性用于自定义 ObjectMapper 配置。如果是 Spring boot web 项目,则默认已经依赖了 jackjson,无需再导入(Spring boot 官网文档)。
3、既然请求和响应都需要经过 jackson 进行序列化和反序列化,所以设置日期格式最好的方式就行通过 jackson 属性进行指定(Spring boot 官网)。
4、如果不配置 spring.jackson.time-zone: GMT+8,则Java程序操作Oracle数据库时,入库时间正常,而程序查询的时间会自动少8小时。
- # JACKSON (JacksonProperties)
- spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.
- spring.jackson.default-property-inclusion= # Controls the inclusion of properties during serialization. Configured with one of the values in Jackson's JsonInclude.Include enumeration.
- spring.jackson.deserialization.*= # Jackson on/off features that affect the way Java objects are deserialized.
- spring.jackson.generator.*= # Jackson on/off features for generators.
- spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" is used as a fallback if it is configured with a format string.
- spring.jackson.locale= # Locale used for formatting.
- spring.jackson.mapper.*= # Jackson general purpose on/off features.
- spring.jackson.parser.*= # Jackson on/off features for parsers.
- spring.jackson.property-naming-strategy= # One of the constants on Jackson's PropertyNamingStrategy. Can also be a fully-qualified class name of a PropertyNamingStrategy subclass.
- spring.jackson.serialization.*= # Jackson on/off features that affect the way Java objects are serialized.
- spring.jackson.time-zone= # Time zone used when formatting dates. For instance, "America/Los_Angeles" or "GMT+10".
- spring.jackson.visibility.*= # Jackson visibility thresholds that can be used to limit which methods (and fields) are auto-detected.
Spring Boot 2.3.5 Reference Documentation
- spring:
- mvc:
- date-format: yyyy-MM-dd HH:mm:ss #指定 spring mvc 应用日期请求参数的格式(低版本).
- format:
- date-time: yyyy-MM-dd HH:mm:ss #指定 spring mvc 应用日期请求参数的格式(高版本).
- jackson:
- #指定日期类型序列化与反序列化时的解析格式。即请求和响应的日期格式。优先级高于 spring.mvc.date-format
- date-format: yyyy-MM-dd HH:mm:ss
- # 设置日期格式时使用的时区,不设置时可能会出现返回给前端的日期时间自动减少了8个小时。
- time-zone: GMT+8
1、程序返回的数据量越大,占用的网络带宽也就越大,响应的时间也就越长,此时对响应数据进行压缩是个不错的优化方式,亲测一个原本返回 1.35M 的接口,在压缩后返回的大小为 154.2KB,压缩率达 90% 左右。
2、浏览器默认是支持数据压缩的,会自动对 gzip 压缩的数据进行解压,F12 打开网络,可以看到请求头中会有:'Accept-Encoding: gzip, deflate, br'。
3、对响应数据开启压缩的最常见的方式有:1)使用 Nginx 配置,2)Spring boot 应用配置(本文介绍此种方式)。
4、Jetty、Tomcat 和 Undertow 都支持 HTTP 响应压缩,对于内嵌的 Servlet 容器而言,直接在 application.properties、application.yml 中配置即可(官网):
- server:
- #如果是微服务环境,所有请求需要通过网关转发和返回时,则以下配置需要配置在网关上,而不是目标微服务上
- compression:
- #是否对响应数据开启gzip压缩,默认false
- enabled: true
- #响应内容长度超过设置大小时进行压缩,默认值为2048(2KB,不带单位时默认为字节)
- min-response-size: 10KB
- #对指定的响应类型进行压缩,值是数组,用逗号隔开
- mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml
5、默认情况下,要执行压缩,响应的长度至少为 2048 字节,可以通过 server.compression.min-response-size 属性配置。
6、默认情况下,仅当响应的内容类型为以下内容之一时,才会对其进行压缩,可以通过 mime-types 属性配置:text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xm
l
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。