目录
效果展示
左图data日期格式为竖立排列,右图则为优化效果。
实现意义
提高可读性:横向排列可以让用户在浏览数据时视线移动更自然,尤其是在表格形式的数据展示中,横向布局可以使得每条记录的信息更加紧凑和连续,减少上下滚动的需要。
优化空间利用:对于包含多个日期字段的复杂数据结构,横向排列可以帮助更好地利用屏幕宽度,尤其在宽屏显示器上,避免了纵向空间的浪费,并且可以在不增加页面长度的情况下显示更多信息。
适应响应式设计:现代网页设计趋向于响应式,即能够在不同的设备上提供良好的用户体验。横向排列的日期字段更容易适配不同尺寸的屏幕,尤其是移动设备上的横向滚动比纵向滚动更为友好。
支持数据分析:如果前端应用涉及到数据分析功能,横向排列的数据格式更易于集成图表、趋势线等可视化元素,方便用户进行深入分析。
实现思路(代码)
方案一
使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
注解来格式化Java对象中的日期字段,在序列化为JSON格式时,可以指定日期时间的显示格式。
在通过直接在实体类的字段或getter方法或传递对应日期格式的字段上添加注解。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
private static final long serialVersionUID = 1L; // 序列化ID
private Integer studentId; // 学生ID
private String name; // 学生姓名
private Integer gender; // 性别
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthDate; // 出生日期
private String major; // 专业
private String grade; // 年级
private String className;// 班级
}
例如:以上在出生日期加入注解,可以实现指定日期的显示格式(自定义)。
方案二
扩展Spring MVC框架的消息转换器来处理前端回显日期的问题,将日期字段从竖向排列改为横向排列的需求,主要涉及自定义消息转换逻辑以满足特定的数据格式化要求。
步骤一:在WebMvcConfiguration配置类中重写extendMessageConverters这个方法,扩展一个消息转换器。
步骤二:为消息转换器提供对应的对象转换器。
步骤一实现如下:
/**
* 扩展Spring MVC框架的消息转化器 解决问题:前端回显日期 (竖立 → 横向)
* @param converters
*/
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("扩展消息转换器...");
//创建一个消息转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
//需要为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
converter.setObjectMapper(new JacksonObjectMapper());
//将自己的消息转化器加入容器中
converters.add(0,converter);
}
步骤二实现如下:
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {
//定义默认的日期时间格式
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public JacksonObjectMapper() {
//调用父类 ObjectMapper 的构造函数
super();
//收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
//反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
//创建一个 SimpleModule 实例,用于注册自定义的序列化器和反序列化器
SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//注册功能模块 例如,可以添加自定义序列化器和反序列化器
//将 simpleModule 注册到当前的 ObjectMapper 实例中,使其生效
this.registerModule(simpleModule);
}
}
上述代码都提供了相应的注释,你可以通过注释去分析以上代码。
方案比较
方案一优点与缺点
优点:
简化代码:通过直接在实体类的字段或getter方法上添加注解,可以非常简洁地定义日期格式,无需编写额外的序列化/反序列化逻辑。
增强可读性:明确指定了日期时间的输出格式,使得生成的JSON数据更加易读,对于前后端交互来说尤其有用,前端可以直接使用这种格式而不需要额外处理。
灵活性:可以根据需要轻松更改日期格式,只需修改pattern参数即可,方便应对不同的业务需求或国际化场景。
统一管理:在一个地方(即实体类中)集中定义日期格式,有助于在整个项目中保持一致的日期时间表示形式,便于维护和更新。
缺点:
仅限于Jackson框架:此注解是Jackson库的一部分,如果你的项目使用的是其他JSON处理库(如Gson),则需要寻找相应的解决方案或者转换成兼容的形式。
可能影响性能:虽然通常情况下影响不大,但在处理大量日期对象时,频繁的日期格式化操作可能会对性能产生一定影响。
反序列化问题:虽然@JsonFormat
主要用于控制序列化输出的格式,但它也可以影响反序列化的行为。如果输入的JSON数据格式与指定的格式不匹配,则可能导致解析错误。因此,确保前后端使用的日期格式一致非常重要。
局部适用性:该注解只能应用于被标记的字段或方法,如果希望在整个应用程序范围内统一日期格式,则需要在每个相关的字段或方法上都加上这个注解,或者配置全局的日期格式化策略。
方案二优点与缺点
优点:
统一管理:通过全局配置日期格式,可以在整个应用中保持一致的日期表示形式,简化了代码维护工作。
灵活性:可以根据项目需求灵活调整日期格式,不仅限于一种固定的模式,还可以根据不同API接口的要求进行定制。
增强兼容性:确保前后端使用的日期格式一致,减少了因格式不匹配导致的问题,提高了系统的稳定性。
性能优化:相比在每个实体类上都使用注解的方式,全局配置可能带来更高效的性能表现,尤其是在处理大量数据时。
支持复杂场景:能够更好地适应复杂的业务逻辑,如国际化、不同的时间区域等。
缺点:
复杂度增加:虽然提供了更多的控制,但也增加了项目的复杂度,特别是对于新手开发者来说,理解和维护这些配置可能会有一定难度。
潜在的副作用:全局修改日期格式可能会影响到未预期的部分,特别是在大型项目中,任何全局性的改变都需要谨慎评估其影响范围。
限制灵活性:尽管全局配置提供了统一性,但它也可能限制了个别情况下对特定日期格式的需求。如果某些API需要特殊的日期格式,则可能还需要额外的处理逻辑。
前端适配:虽然后端提供了合适的数据结构,但真正实现从竖向到横向的转变仍需前端配合,这可能涉及到前端代码的调整或重构。
项目推荐应用方案
@JsonFormat
提供了一种简便的方式来格式化Java对象中的日期时间字段,非常适合快速开发和小规模应用。
通过扩展Spring MVC的消息转换器来解决前端回显日期的问题是一种有效的方法,它能够在保证系统一致性的同时提供足够的灵活性。对于大型企业级应用而言,这种做法则非常有价值。
综上所述:
小型项目:推荐使用@JsonFormat
注解来简化日期格式化的工作,因为这种方式简单易用,能够快速满足项目需求,同时保持较低的学习曲线和维护成本。
大型项目:建议采用自定义消息转换器或全局配置ObjectMapper
的方法,这样可以更好地管理和优化日期格式化过程,适应更大规模的应用需求,并为未来的扩展留出空间。