springmvc关于jsp页面传递到controller层参数类型转换(格式化)的学习记录--2018年1月

作者:无名 - 其它综合 -


spring mvc jsp传递参数到controller涉及到日期类型数据,需要使用到类型转换器:
目前笔者找到两种类型转换器可以使用:
  类型一:实现convertlt;source,targetgt;接口的方式(source源数据,target目标数据类型),实现功能是一种数据类型到另一种数据类型:
数据转换类如下:在不添加datetimeformatter.ofpattern("yyyy/mm/dd")时(mm必须大写,小写表示时间分),默认需要输入的string样式“yyyy-mm-dd”
  public class stringtolocaldate implements converterlt;string,localdategt;  //string转换为localdate
  {
    @override
    public localdate convert(string s)
    {
      return localdate.parse(s,datetimeformatter.ofpattern("yyyy/mm/dd"));
    }
  }
spring-servlet.xml配置如下:在mvc:annoation-driven内部conversion-service默认装配的bean为formattingconversionservicefactorybean,所以在使用convert时需要显示的设置该conversion-service对应的bean为conversionservicefactorybean

  lt;mvc:annotation-driven conversion-service="conversionservice" /gt;
lt;!--注册自定义数据类型转换器工厂,并添加自定义的转换器bean--gt;
  lt;bean class="org.springframework.context.support.conversionservicefactorybean" id="conversionservice"gt;
    lt;property name="converters"gt;
      lt;setgt;
        lt;bean class="com.vastliu.dataconvert.stringtolocaldate"/gt; //stringtolocaldate是自定义的类型转换器
      lt;/setgt;
    lt;/propertygt;
  lt;/beangt;
到此借用convert实现自定义转换器,需要实现的接口以及需要配置的地方全部完成,可以将source类型转换成target类型了。此处笔者使用的是string转换成localdate作为示例;


  类型二:使用formattingconversionservicefactorybean格式化转换,此处可以使用注解简单的转换,也可以使用自定义类方法转换
  注解转换:
需要在pojo实体的属性上使用注解,笔者使用localdate做示例,故需要在数据类型为localdate的变量上添加注解如下:
  import org.springframework.format.annotation.datetimeformat;  //导入该注解对应的包
  @datetimeformat(pattern="yyyy-mm-dd")  //pattern是设置传入string的样式类型,非此样式类型的string不能转换成目标类型localdate
  private localdate releasedate;    //发布日期
由于mvc:annoation-driven内部默认就是formattingconversionservicefactorybean该工厂,所以无需显示的设置conversion-service,
  lt;mvc:annotation-driven /gt;
建议还是显示的设置一下
  lt;mvc:annotation-driven conversion-service="conversionservice2" /gt;
  lt;bean class="org.springframework.format.support.formattingconversionservicefactorybean" id="conversionservice2"/gt;
至此注解转换需要完成的配置等已完成;

  自定义类转换:
需要创建一个自定义转换类并实现formatterlt;tgt;接口,如下:
  public class localdateformatterfordash implements formatterlt;localdategt;
  {
    /*声明一个日期时间格式化的属性*/
    private datetimeformatter datetimeformatter;
    /*声明一个字符串作为格式化的样式*/
    private string datepattern;
    /*创建构造器用以初始化时获取需要转换的string样式datepattern,并根据该datepattern样式生成一个datetimeformatter对象*/
    public localdateformatterfordash(string datepattern)
    {
      this.datepattern=datepattern;
      datetimeformatter=datetimeformatter.ofpattern(datepattern);
    }
    /*重写接口提供的方法,将源字符串数据source转换成目标数据类型localdate,local是本地化*/
    @override
    public localdate parse(string source, locale locale) throws parseexception
    {
      /*将符合datepattern样式的string转化为localdate并返回*/
      localdate localdate=localdate.parse(source,datetimeformatter);
      return localdate;
    }
    /*将localdate转换成字符串*/
    @override
    public string print(localdate localdate, locale locale)
    {
      return localdate.format(datetimeformatter);
    }
  }

自定义转换器类以及声明并编辑完成,接下来需要让spring来让其发挥作用:
有两种方法:
一是将该类直接添加到formattingconversionservicefactorybean中如下:
  lt;mvc:annotation-driven conversion-service="conversionservice" /gt;
  lt;bean class="org.springframework.format.support.formattingconversionservicefactorybean" id="conversionservice"gt;
    lt;!--添加自定义formatter到formatter仓库中--gt;
    lt;property name="formatters"gt;
      lt;setgt;
        lt;bean class="com.vastliu.dataconvert.localdateformatterfordash"gt;
          lt;!--构造器注入string样式yyyy/mm/dd--gt;
          lt;constructor-arg name="datepattern" value="yyyy/mm/dd"/gt;
        lt;/beangt;
      lt;/setgt;

    lt;/propertygt;

  lt;/beangt;
到此直接添加方式已完成相关配置;
二是将该类添加到myformatterregistrar注册类中,在该类中完成注册
myformatterregistrar注册类实现formatterregistrar该接口
  public class myformatterregistrar implements formatterregistrar
  {
    /*声明需要转换string的样式*/
    private string datapatternfordash;
    /*构造器*/
    public myformatterregistrar(string datapatternfordash)
    {
      this.datapatternfordash=datapatternfordash;
    }

    @override
    public void registerformatters(formatterregistry formatterregistry)
    {
      /*将创建的自定义类转换器注册(添加)到注册类中,完成注册(以注册类中的样式)*/
      formatterregistry.addformatter(new localdateformatterfordash(datapatternfordash));
    }
  }
xml配置:
  lt;mvc:annotation-driven conversion-service="conversionservice" /gt;
  lt;bean class="org.springframework.format.support.formattingconversionservicefactorybean" id="conversionservice"gt;
    lt;!--将注册类添加到formattingconversionservicefactorybean--gt;
    lt;property name="formatterregistrars"gt;
      lt;setgt;
        lt;!--初始化自定义注册类时,并传入string样式--gt;
        lt;bean class="com.vastliu.dataconvert.myformatterregistrar"gt;
          lt;constructor-arg name="datapatternfordash" value="yyyy-mm-dd"/gt;
        lt;/beangt;
      lt;/setgt;
    lt;/propertygt;
  lt;/beangt;
到此借助注册类的方式已经完成相关配置;想分享的数据类型转换的几种方式已经分享完毕,如有纰漏望指正;
ps:自定义转换器针对同一种目标数据类型(如:针对localdate自定义了多个转换器)spring默认会使用xml配置中的最后一个转换器执行转换操作。

spring mvc关于jsp页面传递到controller层参数类型转换(格式化)的学习记录--2018年1月

原文地址:https://www.cnblogs.com/vastliu-blogs-for-java/p/8205597.html

IT人知识库 原文地址:http://www.itpeo.net/9999/4527348.html





easyui表单提交注意项

easyui中提供的form表单提交为ajax方式提交 $(‘#ff‘).form(‘submit‘);   //页面 ...

python3的字符串常用方法

find()# 方法 find()# 范围查找子串,返回索引值,找不到返回-1 # 语法 s.find(substr ...

C++STL之vector向量容器

vector向量容器 vector向量容器不但能向数组一样对元素进行随机访问,还能在尾部插入元素 vector具有内存 ...

#Python文件的读写

#文件读写模式 模式 描述 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb ...

Python消息队列

消息中间件 ---gt;就是消息队列异步方式:不需要立马得到结果,需要排队同步方式:需要实时获得数据,坚决不能排队例子: ...

Maven项目出现couldnotcalculatebuildplan:plugin错误

刚刚创建maven项目的时候出现了一点问题,新建工程的时候出现错误对话框:could not calculate bui ...

写好的Java代码在命令窗口运行——总结

步骤: 1.快捷键 win+r,在窗口中输入cmd,enter键进入dos窗口。 2.假设写好的代码的目录为:d:\ac ...

88元辅助

№☆★〇█|2258239854---q---dc9b8609ebd22ecbb7875c4234d9a286*---2 ...

tp5.0清除缓冲

namespace app\admin\controller;use think\cache;class caches ...

NFS(expirtfs命令,NFS客户端创建新文件所属组和所属主都为nobody)

一、exportfs命令nfs进程不能随便从新启动,如果不得已要重启,必须把客户端的挂载目录卸载,然后在从新启动。这时候 ...

golang操作mysql,模糊查找like,%报错

前几天在操作sql语句的时候,发觉使用%会报错 例如 rows, err := db.query("select * ...

struts报错:Unabletoloadconfiguration.-action的解决

初学struts, 在idea里写struts项目, 其实还是挺好操作的,   从官网下载min 的jar包, 然 ...

POJ3686TheWindy's(最小费用流或最佳完全匹配)

题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单。每个车间完成不同订单的时间是不同的。不会出现两个车间完成同 ...

使用Feign访问接口的依赖配置

使用feign访问接口的配置,如果服务不在eureka上,可以不加eureka的依赖,用在feignclient上指定 ...

JS中every()和some()的用法

every()与some()方法都是js中数组的迭代方法。 every()是对数组中每一项运行给定函数,如果该函数对每一 ...

统计文件夹大小的函数

#统计文件夹大小的函数 import os #导入os模块 def getdirsize(dirpath): #定义一个 ...

线程与进程的初步学习

什么情况下使用多线程:   多线程一般被用来在后天执行耗时的任务。主线程保持运行,并且工作线程做他的后台工作   另一 ...

回归测试中只有功能测试用例-Bug总结系列笔记

一、定义:测试人员只执行了变更引起的相关功能的回归测试二、发生时间段always 三、陷阱表现1.只测试了系统或软件功能 ...

常见损失函数记录

常见损失函数记录,主要是自己记一下公式,没啥讲解 均方误差,绝对值损失,0-1损失 最简单的几种,没啥好说的 \[ l( ...

判断数据是否被序列化

function is_serialized( $data ) { $data = trim( $d ...