`

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来绑定要显示的值。

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

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

代码下载:http://pan.baidu.com/s/1qWM3Zf2

 

http://www.cnblogs.com/liukemng/p/3748137.html

分享到:
评论

相关推荐

    springMvc学习相关jar包

    9. **转换器(Converter)和格式化器(Formatter)**:处理数据类型的转换,如将字符串转换为日期或自定义对象。 10. **Validator**:用于数据验证,确保用户输入符合业务规则。 11. **消息源(MessageSource)**...

    SSM笔记-SpringMVC的数据格式化 、数据校验、错误提示、错误信息国际化、返回json

    本笔记主要关注SpringMVC中的几个关键特性:数据格式化、数据校验、错误提示、错误信息国际化以及如何返回JSON数据。 1. 数据格式化: 在SpringMVC中,数据格式化是将用户输入的数据转换为业务对象的过程。这通常...

    SpringMVC:生成Excel和PDF

    开发者需要理解这两个库的基本API,学习如何在Java中创建和格式化表格和文档,以及如何在SpringMVC环境中将这些文件作为HTTP响应的一部分进行处理和发送。这个技能对于构建功能丰富的Web应用,特别是那些需要数据...

    springMVC国际化登陆整合

    SpringMVC是一个强大的Java web开发框架,用于构建高效、可维护和...通过以上分析,我们可以看到"springMVC国际化登陆整合"项目涉及了SpringMVC的核心特性和实际开发中的常见需求,是学习和实践JavaEE开发的好案例。

    springmvc学习之文件上传和国际化文件的读取

    在Spring MVC框架中,文件上传和国际化文件读取是两个重要的功能模块,它们极大地扩展了Web应用程序的功能。本文将深入探讨这两个主题,并提供详细的实现步骤和技术要点。 首先,让我们来看看文件上传。在Web应用中...

    一个简单的springMVC入门项目

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

    springmvc3+extjs4.2案例

    - **JsonView**:在SpringMVC中,可以使用JsonView视图来返回JSON格式的数据,供ExtJS的Store加载和显示。 - **Controller通信**:ExtJS的Controller通过Ajax调用SpringMVC的Controller,实现前后端数据交换。 - ...

    springmvc.7z

    5. `.settings`:这个目录包含了 Eclipse 项目的特定设置,例如编译器设置、代码格式化规则等。 6. `src`:源代码目录,通常分为 `src/main/java`(存放 Java 代码)和 `src/main/resources`(存放非 Java 资源文件...

    day01-SpringMVC入门.doc

    类型转换与格式化:** SpringMVC 自动处理基本类型的转换,如字符串到整数的转换。如果需要自定义转换规则,可以通过实现`Converter`或`Formatter`接口注册到Spring容器。 **6. SpringMVC 异常处理:** 可以定义...

    SpringMVC4教程-超权威--超详细

    - **日期格式化**:可以通过配置日期格式化规则来适应不同地区的日期显示习惯。 #### 十二、文件的上传 - **文件上传**:SpringMVC通过MultipartResolver接口支持文件上传功能,常见的实现有...

    AngularJS+SpringMVC小项目

    7. **JSON序列化与反序列化**:SpringMVC可以自动处理JSON格式的数据,`@RequestBody`和`@ResponseBody`注解用于将HTTP请求体和响应体转换为Java对象。 8. **安全控制**:Spring Security可以集成到SpringMVC项目中...

    springmvc+extjs4实例树

    标题中的“springmvc+extjs4实例树”指的是一个结合了SpringMVC和ExtJS4技术的实战项目,主要用于创建一个具有树形结构的用户界面。...开发者可以学习如何在SpringMVC中处理数据,并使用ExtJS4构建交互式的前端界面。

    springmvc开发文档

    - **数据格式化**:对数据进行格式化处理。 - **数据验证**:对传入的数据进行验证,确保其有效性。 #### 八、SpringMVC 3.1 新特性 - **生产者、消费者请求限定**:增强了对 RESTful API 的支持,允许开发者更...

    springMVC简单demo

    11. **转换器和格式化器**: 这些组件负责将HTTP请求参数转换为应用程序所需的类型,以及将模型数据格式化为适合HTTP响应的格式。 12. **测试**: SpringMVC提供了JUnit支持,使得我们可以轻松地对控制器进行单元...

    跟我学SpringMVC

    - **类型转换与格式化**:说明如何通过SpringMVC提供的默认类型转换器和自定义类型转换器来处理不同类型的数据。 - **数据验证**:讲解了如何使用SpringMVC的校验框架来对输入数据进行验证。 #### 四、SpringMVC...

    SpringMVC代码示例

    通过配置,SpringMVC 可以轻松支持 RESTful 风格的接口,提供 JSON 或 XML 格式的响应,适用于构建现代 Web 服务。 **总结** SpringMVC 作为 Java Web 开发的重要工具,提供了强大的 MVC 支持和高度可配置性。通过...

    springMvc技术分享

    ### SpringMVC技术分享知识点概览 #### 一、SpringMVC框架概述 - **SpringMVC简介**:SpringMVC是Spring框架的一个模块,它实现了MVC设计模式,...无论是在学习还是实际项目开发中,掌握SpringMVC都是非常有价值的。

    springMVC需要的包.rar

    9. **Conversion and Formatting**:处理数据类型转换以及格式化。 10. **Validation**:数据验证,确保输入的有效性。 在标签“超市订单系统”中,我们可以推断这是一个与电商或零售相关的应用。在这样的系统中,...

    SpringMVC-BootStrap3

    在IT行业中,SpringMVC和Bootstrap3是两个非常重要的技术组件,它们分别专注于后端开发和前端美化。本文将深入探讨这两个技术以及如何将它们结合实现分页功能。 首先,让我们了解一下SpringMVC。SpringMVC是Spring...

    Spring MVC学习(七)-------SpringMVC数据类型转换

    - **格式化显示**:再次使用`PropertyEditor`的`getAsText()`方法将对象格式化为字符串。 ##### 2.2 局限性 - **类型转换限制**:`PropertyEditor`仅支持`String`到`Object`的转换,无法实现任意类型间的转换,...

Global site tag (gtag.js) - Google Analytics