`
jaesonchen
  • 浏览: 311233 次
  • 来自: ...
社区版块
存档分类
最新评论

SpringMVC学习系列(7) 之 格式化显示

 
阅读更多

在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来。保存的数据会用于以后的展示,这才是保存的价值。那么在展示的时候如何按照要求显示?(比如:小数保留一定的位数,日期按指定的格式等)。这就是本篇要说的内容—>格式化显示。

从Spring3.X开始,Spring提供了Converter SPI类型转换和Formatter SPI字段解析/格式化服务,其中Converter SPI实现对象与对象之间的相互转换,Formatter SPI实现String与对象之间的转换,Formatter SPI是对Converter SPI的封装并添加了对国际化的支持,其内部转换还是由Converter SPI完成。

下面是一个简单的请求与模型对象的转换流程:

1

Spring提供了FormattingConversionService和DefaultFormattingConversionService来完成对象的解析和格式化。Spring内置的几种Formatter SPI如下:

名称 功能
NumberFormatter 实现Number与String之间的解析与格式化
CurrencyFormatter 实现Number与String之间的解析与格式化(带货币符号)
PercentFormatter 实现Number与String之间的解析与格式化(带百分数符号)
DateFormatter 实现Date与String之间的解析与格式化
NumberFormatAnnotationFormatterFactory @NumberFormat注解,实现Number与String之间的解析与格式化,可以通过指定style来指示要转换的格式(Style.Number/Style.Currency/Style.Percent),当然也可以指定pattern(如pattern=“#.##”(保留2位小数) ),这样pattern指定的格式会覆盖掉Style指定的格式
JodaDateTimeFormatAnnotationFormatterFactory @DateTimeFormat注解,实现日期类型与String之间的解析与格式化这里的日期类型包括Date、Calendar、Long以及Joda的日期类型。必须在项目中添加Joda-Time包

下面就开始演示:

首先把Joda-Time包添加到之前的项目中,这里用的是joda-time-2.3.jar,在views文件夹下添加一个formattest.jsp视图,内容如下:

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    money:<br/>${contentModel.money}<br/>
    date:<br/>${contentModel.date}<br/>
    
</body>
</html>
复制代码

1.首先我们直接用Formatter来做演示,在com.demo.web.models包中添加FormatModel.java内容如下:

复制代码
package com.demo.web.models;

public class FormatModel{
    
    private String money;
    private String date;
    
    public String getMoney(){
        return money;
    }
    public String getDate(){
        return date;
    }
    
    public void setMoney(String money){
        this.money=money;
    }
    public void setDate(String date){
        this.date=date;
    }
        
}
复制代码

在com.demo.web.controllers包中添加FormatController.java内容如下:

复制代码
package com.demo.web.controllers;

import java.math.RoundingMode;
import java.util.Date;
import java.util.Locale;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.number.CurrencyFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.demo.web.models.FormatModel;

@Controller
@RequestMapping(value = "/format")
public class FormatController {
    
    @RequestMapping(value="/test", method = {RequestMethod.GET})
    public String test(Model model) throws NoSuchFieldException, SecurityException{

        if(!model.containsAttribute("contentModel")){
            
            FormatModel formatModel=new FormatModel();

            CurrencyFormatter currencyFormatter = new CurrencyFormatter();  
            currencyFormatter.setFractionDigits(2);//保留2位小数
            currencyFormatter.setRoundingMode(RoundingMode.HALF_UP);//向(距离)最近的一边舍入,如果两边(的距离)是相等的则向上舍入(四舍五入)
            
            DateFormatter dateFormatter=new DateFormatter();
            dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss");
            
            Locale locale=LocaleContextHolder.getLocale();
            
            formatModel.setMoney(currencyFormatter.print(12345.678, locale));
            formatModel.setDate(dateFormatter.print(new Date(), locale));        
            
            model.addAttribute("contentModel", formatModel);
        }
        return "formattest";
    }
    
}
复制代码

运行测试:

2

更改浏览器首选语言:

3

刷新页面:

4

2.这次用DefaultFormattingConversionService来做演示,把FormatController.java改为如下内容:

复制代码
package com.demo.web.controllers;

import java.math.RoundingMode;
import java.util.Date;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.number.CurrencyFormatter;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.demo.web.models.FormatModel;

@Controller
@RequestMapping(value = "/format")
public class FormatController {
    
    @RequestMapping(value="/test", method = {RequestMethod.GET})
    public String test(Model model) throws NoSuchFieldException, SecurityException{

        if(!model.containsAttribute("contentModel")){
            
            FormatModel formatModel=new FormatModel();

            CurrencyFormatter currencyFormatter = new CurrencyFormatter();  
            currencyFormatter.setFractionDigits(2);//保留2位小数
            currencyFormatter.setRoundingMode(RoundingMode.HALF_UP);//向(距离)最近的一边舍入,如果两边(的距离)是相等的则向上舍入(四舍五入)
            
            DateFormatter dateFormatter=new DateFormatter();
            dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss");
            
            DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();  
            conversionService.addFormatter(currencyFormatter); 
            conversionService.addFormatter(dateFormatter); 
            
            formatModel.setMoney(conversionService.convert(12345.678, String.class));
            formatModel.setDate(conversionService.convert(new Date(), String.class));    
            
            model.addAttribute("contentModel", formatModel);
        }
        return "formattest";
    }
    
}
复制代码

这次没有了Locale locale=LocaleContextHolder.getLocale();再次运行测试并更改语言后刷新,可以看到与第一种方法截图同样的效果,说明DefaultFormattingConversionService会自动根据浏览器请求的信息返回相应的格式。

3.估计有人会觉得,啊…我只是想要格式化显示而已,还要这么麻烦,写代码一个字段一个字段的转换???别急,上面只是对内置的格式化转换器做一下演示,实际项目中肯定不会这么用的,下面就介绍一下基于注解的格式化。首先把FormatModel.java改为如下内容:

复制代码
package com.demo.web.models;

import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.format.annotation.NumberFormat.Style;

public class FormatModel{
    
    @NumberFormat(style=Style.CURRENCY)
   private double money;
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date date;
    
    public double getMoney(){
        return money;
    }
    public Date getDate(){
        return date;
    }
    
    public void setMoney(double money){
        this.money=money;
    }
    public void setDate(Date date){
        this.date=date;
    }
        
}
复制代码

注意:这里的money和date不再是String类型,而是它们自己本来的类型。

把FormatController.java改为如下内容:

复制代码
package com.demo.web.controllers;

import java.util.Date;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.demo.web.models.FormatModel;

@Controller
@RequestMapping(value = "/format")
public class FormatController {
    
    @RequestMapping(value="/test", method = {RequestMethod.GET})
    public String test(Model model) throws NoSuchFieldException, SecurityException{
        if(!model.containsAttribute("contentModel")){
            
            FormatModel formatModel=new FormatModel();

            formatModel.setMoney(12345.678);
            formatModel.setDate(new Date());
            
            model.addAttribute("contentModel", formatModel);
        }
        return "formattest";
    }
    
}
复制代码

注意:这里代码里面只有赋值已经没有格式化的内容了。

更改视图formattest.jsp的内容如下:

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    
    money:<br/>
    <spring:eval expression="contentModel.money"></spring:eval><br/>
    date:<br/>
    <spring:eval expression="contentModel.date"></spring:eval><br/>
    
</body>
</html>
复制代码

注意:这里需要添加引用<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>并用spring:eval来绑定要显示的值。

运行测试更改浏览器语言然后刷新页面依然可以看到以第一种方法截图相同的效果,证明注解有效。

 

格式化显示的内容到此结束。

分享到:
评论

相关推荐

    springMvc学习相关jar包

    在这个"springMvc学习相关jar包"中,包含了一系列与 Spring MVC 开发相关的 jar 包,这些 jar 包是构建和运行 Spring MVC 应用的基础。下面我们将详细探讨 Spring MVC 的核心概念和关键组件。 1. **...

    一个简单的springMVC入门项目

    6. **转换器和格式化器**:SpringMVC允许自定义转换器和格式化器,用于处理不同类型的数据格式,如日期、货币等。 7. **数据绑定**:SpringMVC自动将HTTP请求参数绑定到Controller方法的参数上,反之亦然,将...

    SpringMVC代码示例

    **SpringMVC 框架详解** SpringMVC 是 Spring 框架...提供的 "spring-mvc-study" 压缩包可能包含了一系列的 SpringMVC 示例代码,可以帮助进一步理解这些概念和用法。通过深入学习和实践,你可以掌握这个强大的框架。

    SpringMVC整合AngularJS简单Demo.zip

    6. **数据传输**:通常使用JSON作为数据交换格式,因为它是轻量级的,易于序列化和反序列化,且跨平台兼容性好。 7. **安全考虑**:整合过程中,需要注意安全性问题,比如防止XSS和CSRF攻击,使用Spring Security...

    springmvc+mybatis

    6. 使用JSTL标签:在JSP页面上,利用c标签遍历ModelAndView传递的数据,使用fmt标签进行格式化显示。 7. 运行和测试:启动服务器,通过浏览器访问对应的URL,查看DEMO运行效果。 这个DEMO展示了Spring MVC、...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_5_常用注解 共22页.pptx

    ### Java实训教程知识点详解 #### 一、SpringMVC概述与环境搭建 ...以上是关于SpringMVC系列教程的主要知识点概述,通过学习这些内容,开发者可以更好地掌握SpringMVC框架的使用技巧,从而高效地进行Web应用开发。

    spring mvc demo下载地址

    7. **.settings目录**:IDE特定的配置文件,存储项目的特定设置,如编译器选项、代码格式化规则等。 8. **build目录**:编译后的类文件和资源文件通常会存放在这里,这是Java项目的标准结构。 在学习这个Spring ...

    Spring MVC Demo 和 JSTL demo

    例如,`&lt;c:forEach&gt;`遍历集合,`&lt;c:if&gt;`进行条件判断,`&lt;fmt:formatDate&gt;`格式化日期等。 在描述中提到了一个博客链接,虽然没有具体内容,但通常博主会在博客中详细解释如何设置和运行这个Demo,可能包括以下步骤...

    java常用框架学习笔记

    - **format_sql配置**:如果设置了`format_sql`为`true`,那么控制台上显示的SQL语句将被格式化,使得SQL语句更易读。 **示例配置文件**: ```xml &lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/...

    J2EE项目-在线求助系统

    它集成了许多实用的功能,如代码提示、自动格式化、项目管理、服务器配置等,极大地提高了开发效率。使用MyEclipse创建和管理J2EE项目,可以让开发者专注于业务逻辑的实现,而不是环境配置。 SpringMVC是Spring框架...

    个人网站建设及实现

    富文本编辑器如CKEditor或TinyMCE,为用户提供了一个可视化的文本编辑环境,可以方便地插入图片、链接、格式化文本等。在个人网站中,这样的编辑器常常用于创建和编辑博客文章,确保用户能方便地创作和发布内容。 ...

    基于微信小程序体育资讯软件实现+ssm后端源码案例设计.zip

    7. **前端与后端通信**:通过wx.request方法,了解小程序如何与服务器进行数据交换,包括JSON格式的数据传递。 8. **性能优化**:分析代码,理解如何优化数据库查询、减少网络请求、提高应用响应速度。 9. **版本...

    Windows进程管理工具设计与实现

    在前端部分,富文本编辑器用于创建和编辑进程的描述或备注,它提供了丰富的格式化选项,让用户可以方便地输入文本内容。文件上传功能则允许用户上传相关文档或日志,增强了工具的实用性。附件上传可能涉及到文件类型...

    FreeMaker模板

    本教程将深入讲解FreeMarker的用法以及如何在SpringMVC项目中与之集成。 一、FreeMarker基本概念 FreeMarker是一个基于模板的语言,其核心思想是分离应用逻辑和展示逻辑。开发者编写模板文件,模板中包含可替换的...

    235JSP基于SSM旅游景点酒店预订网站设计.rar.rar

    标题中的“235JSP基于SSM旅游景点酒店预订网站设计”表明这是一个关于使用JavaServer Pages(JSP)技术,结合Spring、SpringMVC和MyBatis(SSM)框架构建的在线旅游预订系统。这个系统允许用户浏览并预订各种旅游...

    Beetl2.9 中文文档.pdf

    Beetl还支持自定义方法、格式化函数、虚拟属性、标签和HTML标签等扩展功能,并允许用户定义占位符和控制语句起始符号,从而打造个性化的工具包。在安全方面,Beetl提供了强大的安全输出功能,可以防止模板中的安全...

    miniuiDemo

    MiniUI的数据单元格可以设置样式、格式化数据,还支持各种验证规则,确保输入数据的有效性。 4. **数据网格(Datagrid)**:数据网格是一种强大的组件,用于展示大量结构化的数据。它通常包含可排序、过滤、分页的...

    easyui.zip

    7. **API 和方法**:每个组件都有一套完整的 API,包括初始化、设置属性、获取属性、操作方法等,使得开发者可以灵活控制组件的行为。 8. **文档和示例**:EasyUI 提供了详尽的文档和丰富的示例代码,帮助开发者...

    开源scadamango使用手册

    在数据库结构方面,Mango将数据存储在一系列表格中,为了方便开发和维护,这些表格在文档中被可视化展示。而数据访问层则为这些表格提供了访问接口,包括读取、写入、修改和删除操作。 除了上述内容,Mango文档还...

Global site tag (gtag.js) - Google Analytics