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

spring mvc jsp传递参数到controller涉及到日期类型数据,需要使用到类型转换器:
目前笔者找到两种类型转换器可以使用:
  类型一:实现Convert<Source,Target>接口的方式(Source源数据,Target目标数据类型),实现功能是一种数据类型到另一种数据类型:
数据转换类如下:在不添加DateTimeFormatter.ofPattern("yyyy/MM/dd")时(MM必须大写,小写表示时间分),默认需要输入的String样式“yyyy-MM-dd”
  public class StringToLocalDate implements Converter<String,LocalDate>  //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

  <mvc:annotation-driven conversion-service="conversionService" />
<!--注册自定义数据类型转换器工厂,并添加自定义的转换器bean-->
  <bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionService">
    <property name="converters">
      <set>
        <bean class="com.vastliu.DataConvert.StringToLocalDate"/>   //StringToLocalDate是自定义的类型转换器
      </set>
    </property>
  </bean>
到此借用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,
  <mvc:annotation-driven />
建议还是显示的设置一下
  <mvc:annotation-driven conversion-service="conversionService2" />
  <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService2"/>
至此注解转换需要完成的配置等已完成;

  自定义类转换:
需要创建一个自定义转换类并实现Formatter<T>接口,如下:
  public class LocalDateFormatterForDash implements Formatter<LocalDate>
  {
    /*声明一个日期时间格式化的属性*/
    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中如下:
  <mvc:annotation-driven conversion-service="conversionService" />
  <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
    <!--添加自定义formatter到formatter仓库中-->
    <property name="formatters">
      <set>
        <bean class="com.vastliu.DataConvert.LocalDateFormatterForDash">
          <!--构造器注入String样式yyyy/MM/dd-->
          <constructor-arg name="datePattern" value="yyyy/MM/dd"/>
        </bean>
      </set>

    </property>

  </bean>
到此直接添加方式已完成相关配置;
二是将该类添加到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配置:
  <mvc:annotation-driven conversion-service="conversionService" />
  <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionService">
    <!--将注册类添加到FormattingConversionServiceFactoryBean-->
    <property name="formatterRegistrars">
      <set>
        <!--初始化自定义注册类时,并传入String样式-->
        <bean class="com.vastliu.DataConvert.MyFormatterRegistrar">
          <constructor-arg name="dataPatternForDash" value="yyyy-MM-dd"/>
        </bean>
      </set>
    </property>
  </bean>
到此借助注册类的方式已经完成相关配置;想分享的数据类型转换的几种方式已经分享完毕,如有纰漏望指正;
ps:自定义转换器针对同一种目标数据类型(如:针对LocalDate自定义了多个转换器)spring默认会使用xml配置中的最后一个转换器执行转换操作。

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

时间: 2024-10-18 21:17:44

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

bug Spring Mvc中Jsp页面获取不到Controller中的变量

今天遇到了一个奇怪的问题: jsp代码如下: <h1>数据对比${name}</h1> 在controller里面,有赋值: @RequestMapping(value = "/index.do") public String index(ModelMap modelMap) { modelMap.put("name", "test"); return "/compare/index"; } 但是死活不

Spring MVC 中的基于注解的 Controller【转】

原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMetho

Spring MVC 中的基于注解的 Controller(转载)

  终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMethodNameResolver) 就已经可以在很大程度上帮助我们省去不少的 XML 配置,

Spring MVC基础知识整理?View与Controller数据交互

概述 Spring MVC是由View—Controller—Model组成,其中View和Controller的数据交互,成为了关注的核心点.MVC中,我们将View中的数据传递到Controller,可以采用POST或者Get,传递相应的参数.Controller通过绑定来,匹配前台传递的参数.后台Controller也可以将值传递到前台页面. View值传递Controller 绑定传值的常用方式有如下 @RequestParam,绑定单个请求数据,可以是URL中的数据,表单提交的数据或上

Spring MVC 基础注解之@RequestMapping、@Controller、(二)

我现在学的是spring4.2 今天主要学习了Spring MVC注解 引入注解可以减少我们的代码量,优化我们的代码. @Controller:用于标识是处理器类: @RequestMapping:请求到处理器功能方法的映射规则: 还是以示例来解释说明 1 创建springAnnotation02项目,导入jar包. 这里的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:x

spring mvc 整合jsp和thymeleaf两个模板引擎

代码地址 http://github.com/dingxiaobo/multi-view-resolver 分别用两个dispatcher分别解析jsp页面和thymeleaf页面 pom.xml ... <!--thymeleaf--> <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf --> <dependency> <groupId>org.thymeleaf</gro

JSP页面传递参数乱码问题整理

1.JSP页面之间传递中文参数乱码 (1).a.jsp中正常传递参数,b.jsp 中 <% String projectName = new String(request.getParameter("projectName").getBytes("ISO-8859-1"),"UTF-8"); %> <meta http-equiv="Content-Type" content="text/html;

Spring mvc UEditor jsp版本

此文章主要解决在spring mvc 框架模式下面使用UEditor 图片或者文件上传成功读取不到的bug说明(主要已官方文档为主). 1.项目中应用UEditor.(jsp版本) 1.1参考官方 http://fex-team.github.io/ueditor/  中jsp使用说明. 2.结合Spring mvc 使用. 错误回顾,下图表示UEditor 引用成功,选择图片,图片不能正常显示,提示本地保存成功. 错误分析,启用firefox 的firebug 能看到一下图片 通过Everyt

javascript通过url向jsp页面传递中文参数乱码解决方法

解决方法:在传递参数前将中文参数进行两次编码,jsp页面获取参数后对中文参数进行一次解码,中文参数就不会变为乱码了! 参考例子: <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page import="java.net.*" %><%String str0=&