Spring MVC Formatter(数据格式化)详解

news2024/11/23 17:23:22

Spring MVC 框架的 Formatter 与 Converter 一样,也是一个可以将一种数据类型转换成另一种数据类型的接口。不同的是,Formatter 的源数据类型必须是 String 类型,而 Converter 的源数据类型是任意数据类型。

在 Web 应用中由 HTTP 发送的请求数据到控制器中都是以 String 类型获取,因此在 Web 应用中选择 Formatter 比选择 Converter 更加合理。

内置的格式化转换器

Spring MVC 提供了几个内置的格式化转换器,具体如下。

  • NumberFormatter:实现 Number 与 String 之间的解析与格式化。
  • CurrencyFormatter:实现 Number 与 String 之间的解析与格式化(带货币符号)。
  • PercentFormatter:实现 Number 与 String 之间的解析与格式化(带百分数符号)。
  • DateFormatter:实现 Date 与 String 之间的解析与格式化。

自定义格式化转换器

自定义格式化转换器就是编写一个实现 org.springframework.format.Formatter 接口的 Java 类。该接口声明如下:

  1. public interface Formatter<T>

这里的 T 表示由字符串转换的目标数据类型。该接口有 parse 和 print 两个接口方法,自定义格式化转换器类必须覆盖它们。

  1. public T parse(String s,java.util.Locale locale)
  2. public String print(T object,java.util.Locale locale)

parse 方法的功能是利用指定的 Locale 将一个 String 类型转换成目标类型,print 方法与之相反,用于返回目标对象的字符串表示。

下面通过具体应用 springMVCDemo04 讲解自定义格式化转换器的用法,springMVCDemo04 应用与 springMVCDemo03 应用具有相同的 JAR 包、web.xml。

应用的具体要求如下:

1)用户在页面表单中输入信息来创建商品,输入页面效果如图 1 所示。


图 1 信息输入页面

2)控制器使用实体 bean 类 GoodsModelb 接收页面提交的请求参数,GoodsModelb 类的属性如下。

  1. private String goodsname;
  2. private double goodsprice;
  3. private int goodsnumber;
  4. private Date goodsdate;

3)GoodsModelb 实体类接收请求参数时,商品名称、价格和数量使用内置的类型转换器完成转换;商品日期需要用自定义的格式化转换器完成。

4)用格式化转换器转换之后的数据显示在 showGoodsb.jsp 页面,效果如图 2 所示。


图 2 格式化后信息的显示页面

由图 2 可以看出,日期由字符串值“2018-02-22”格式化成 Date 类型。

如果想实现上述 springMVCDemo04 应用的需求,需要做以下 5 件事:

  • 创建实体类;
  • 创建控制器类;
  • 创建自定义格式化转换器类;
  • 注册格式化转换器;
  • 创建相关视图。

按照上述步骤采用自定义格式化转换器完成需求。

1)创建实体类

在 springMVCDemo04 的 src 目录下创建 pojo 包,并在该包中创建名为 GoodsModelb 的实体类,代码如下:

  1. package pojo;
  2. import java.util.Date;
  3. public class GoodsModel {
  4. private String goodsname;
  5. private double goodsprice;
  6. private int goodsnumber;
  7. private Date goodsdate;
  8. //省略setter和getter方法
  9. }

2)创建控制器类

在 springMVCDemo04 的 src 目录下创建 controller 包,并在该包中创建名为 FormatterController 的控制器类,代码如下:

  1. package controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import pojo.GoodsModelb;
  6. @Controller
  7. public class FormatterController {
  8. @RequestMapping("/formatter")
  9. public String myConverter(GoodsModelb gm, Model model) {
  10. model.addAttribute("goods", gm);
  11. return "showGoodsb";
  12. }
  13. }

3)创建自定义格式化转换器类

在 springMVCDemo04 的 src 目录下创建 formatter 包,并在该包中创建名为 MyFormatter 的自定义格式化转换器类,代码如下:

  1. package controller;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Locale;
  6. import org.springframework.format.Formatter;
  7. public class MyFormatter implements Formatter<Date> {
  8. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  9. public String print(Date object, Locale arg1) {
  10. return dateFormat.format(object);
  11. }
  12. public Date parse(String source, Locale arg1) throws ParseException {
  13. return dateFormat.parse(source); // Formatter只能对字符串转换
  14. }
  15. }

4)注册格式化转换器

在 springMVCDemo04 的 WEB-INF 目录下创建配置文件 springmvc-servlet.xml,并在配置文件中注册格式化转换器,具体代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <!-- 使用扫描机制扫描controller包 -->
  13. <context:component-scan base-package="controller" />
  14. <!--注册MyFormatter-->
  15. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  16. <property name="formatters">
  17. <list>
  18. <bean class="formatter.MyFormatter"/>
  19. </list>
  20. </property>
  21. </bean>
  22. <mvc:annotation-driven conversion-service="conversionService"/>
  23. <bean
  24. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  25. <property name="prefix" value="/WEB-INF/jsp/" />
  26. <property name="suffix" value=".jsp" />
  27. </bean>
  28. </beans>

5)创建相关视图

在 springMVCDemo04 应用的 WebContent 目录下创建信息输入页面 inputb.jsp,核心代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>添加商品信息</title>
  8. </head>
  9. <body>
  10. <form action="addGoods" method="post">
  11. <table border=1 bgcolor="lightblue" align="center">
  12. <tr>
  13. <td>商品名称:</td>
  14. <td><input class="textSize" type="text" name="goodsname" /></td>
  15. </tr>
  16. <tr>
  17. <td>商品价格:</td>
  18. <td><input class="textSize" type="text" name="goodsprice" /></td>
  19. </tr>
  20. <tr>
  21. <td>商品数量:</td>
  22. <td><input class="textSize" type="text" name="goodsnumber" /></td>
  23. </tr>
  24. <tr>
  25. <td>商品日期:</td>
  26. <td><input class="textSize" type="text" name="goodsdata" />(yyyy-MM-dd)</td>
  27. </tr>
  28. <tr>
  29. <td colspan="2" align="center">
  30. <input type="submit" value="提交" />
  31. </td>
  32. </tr>
  33. </tab1e>
  34. </form>
  35. </body>
  36. </html>

在 springMVCDemo04 应用的 /WEB-INF/jsp 目录下创建信息显示页面 showGoodsb.jsp,核心代码如下:

  1. <body>
  2. 您创建的商品信息如下:
  3. <!-- 使用EL表达式取出Action类的属性goods的值 -->
  4. 商品名称为:${goods.goodsname }<br/>
  5. 商品价格为:${goods.goodsprice }<br/>
  6. 商品名称为:${goods.goodsnumber }<br/>
  7. 商品日期为:${goods.goodsdate}
  8. </body>

最后通过地址“http://localhost:8080/springMVCDemo04/inputb.jsp”测试应用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

keychron矮轴无线机械键盘简直就是yyds

一、背景 日常生活中&#xff0c;我们都离不开键盘&#xff0c;游戏党打游戏要键盘&#xff0c; 工作人员无论使用台式电脑还是笔记本操作都离不开键盘&#xff0c;尤其程序员这一族&#xff0c;键盘简直就是敲代码的灵魂。随着经济和科技飞速发展&#xff0c;我们早已不在像从…

[附源码]Python计算机毕业设计Django电子相册管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

公共建筑节能大数据应用进展

3月26日&#xff5c;清华大学建筑节能学术周——公共建筑节能—工程实践助力实现双碳目标 【3月26日公开论坛】公共建筑节能 – 工程实践助力实现双碳目标 公共建筑节能大数据应用进展 建筑用能负荷受到气象条件、建筑围护结构、设备系统、人行为等多重因素耦合影响&#xff…

C语言 结构体

C语言 结构体一、结构体的声明和初始化1. 结构体声明2. 结构体初始化二、typedef 重定义结构体三、结构体成员的类型四、结构体成员的访问五、结构体传参六、结构体的自引用七、结构体的内存对齐对齐规则程序清单1程序清单2程序清单3程序清单4修改默认对齐数一、结构体的声明和…

nvcc编译器之设备和主机独立编译(chapter 6)

目录 6. CUDA中的独立编译 6.1 单独编译时的代码改动 6.2 nvcc独立编译选项 6.3 库 6.4 示例 6.5 分布编译优化 6.6 独立编译的潜在问题 6. CUDA中的独立编译 在5.0版本之前&#xff0c;CUDA不支持分开编译&#xff0c;因此CUDA代码不能访问跨文件&#xff08;编译单元&…

挂耳式耳机品牌排行榜,五款目前排行靠前的耳机分享

耳机传声的方式无非就是空气传播以及骨骼传播&#xff0c;而骨传导耳机就属后者&#xff0c;通过骨骼震动来完成声波的传递&#xff0c;在传递的过程无需经过外耳道和鼓膜&#xff0c;在一定程度上缓解了对耳道造成的损伤&#xff0c;减少对于耳道的负担&#xff0c;看到这里如…

OSI参考模型个人总结

附&#xff1a;参考模型 OSI参考模型 基于国际标准化组织ISO的建议&#xff0c;作为各种层上使用的协议国际标准化的第一步发展起来的&#xff0c;被称作ISO开放系统互联参考模型&#xff08;open system interconnection refertence model&#xff09;&#xff0c;简称为OSI模…

[附源码]Python计算机毕业设计Django高校后勤保障系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【解决问题】413错误 413 Request Entity Too Large 接口返回413 报413nginx

文章目录问题排查解决方案1、修改nginx配置文件nginx.conf2、更新完成后需要重启nginx3、其他可能性博客背景&#xff1a;JAVA项目&#xff0c;前端想弄个便捷富文本&#xff0c;直接很多图片转base64编码直接存库了。字段为longtext类型。这种问题通常是在使用http请求对象太大…

python实现中缀表达式转后缀表达式

前缀、中缀、后缀表达式&#xff08;逆波兰表达式&#xff09; 前缀表达式称为波兰表达式&#xff0c;前缀表达式的运算符位于操作符之前 举例说明&#xff1a;&#xff08;34&#xff09;x 5 – 6 对应的前缀表达式就是- X 3 4 5 6 中缀表达式转为后缀表达式&#xff1a; …

概率论与数理统计——事件间的关系

包含 事件A发生必然导致事件B发生。 代数中经常用这种方法证明两个事件相等。 事件的并&#xff08;和&#xff09; A与B至少有一个发生 事件的交&#xff08;积&#xff09; A与B同时发生 无限可列个&#xff1a;能按某种规律能把他排成一个序列&#xff08;实变函数…

Typora导出Word

1.Typora导出Word配置 1.访问GitHub&#xff1a; https://github.com/jgm/pandoc/releases/tag/2.11.3.2https://github.com/jgm/pandoc/releases/tag/2.11.3.2 2.下载对应的文件 3.到本地安装Typora目录下解压 4.配置环境变量 我的电脑–属性–高级系统设置–高级–环境变量…

Python数据分析案例12——网飞影视剧数据分析及其可视化

背景介绍 Netflix是最受欢迎的媒体和视频流平台之一。他们的平台上有超过 8000 部电影或电视节目。截至 2021 年年中&#xff0c;他们在全球拥有超过 2 亿订阅者。 博主看美剧也较为多&#xff0c;像《怪奇物语》、《性爱自修室》等高分美剧都是网飞的。 对于网飞的影视剧&a…

【Docker学习系列】Docker学习1-docker安装

从本篇开始&#xff0c;凯哥将和大家一起学学docker。本篇是docker学习系列第一篇&#xff1a;安装docker。 docker安装前提条件&#xff1a;目前,centos发行版中的内核支持Docker.Docker运行在Centos7 64位上&#xff0c;要求系统为64位、linux系统内核版本为3.8以上的。凯哥所…

mybatis实战:三、mybatis多表查询的映射

依照上一期的继续 1.UserMapper.xml 除了直接对应基本数据类类型、表的实体类&#xff0c;还可能用到多表查询。 <select id"selectRolesByUserId" resultType"tk.mybatis.simple.model.SysRole">select r.id, r.role_name roleName, r.enabled, r…

一篇个人陈述应该包括这三个内容

大家好呀&#xff0c;申请季正如火如荼地进行着&#xff0c;不知道大家都忙碌得怎么样了呢&#xff1f;今天我们来聊聊个人陈述Personal statement,的撰写&#xff0c;包括一篇个人陈述应该包括哪些部分。 申请时&#xff0c;除了学习成绩等“硬背景”&#xff0c;个人陈述(PS…

五款朴实无华却又能极大提升办公效率的软件

最近后台收到好多小伙伴的私信&#xff0c;今天继续推荐五款小工具&#xff0c;都是免费使用的&#xff0c;大家可以去试试看。 1.光追动画制作——Luxion KeyShot Luxion KeyShot是一款互动性的光线追踪与全域光渲染3D渲染与动画制作软件&#xff0c;内置丰富多样的材质&…

Redis使用基础教程

本篇文章转载自&#xff1a;通俗易懂的Redis数据结构基础教程_Java程序员-张凯的博客-CSDN博客 Redis有5个基本数据结构&#xff0c;string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构&#xff0c;把这5个数据结构都吃透了&#xff0c;你…

Spring Security-全面详解(学习总结---从入门到深化)

目录 Spring Security介绍 Spring Security认证_项目搭建 Spring Security认证_内存认证 Spring Security认证_UserDetailsService Spring Security认证_数据库认证 Spring Security认证_PasswordEncoder Spring Security认证_自定义登录页面 Spring Security认证_会…

package-info.java

package-info.java 文件估计大家见过但是自己却很少去创建和使用它、因为对于一般应用来说可能真的太少见了。 它的作用主要是三个 描述包使用注解修饰包、达到修饰该包下的类声明包中使用的类和常量(这个比较少用) 描述包 package-info.java 文件 /*** 我是描述信息*/ pa…