SpringMVC中数据转换

SpringMVC中接收到的数据都是String形式,然后再根据反射机制将String转换成对应的类型。如果此时想接收一个Date类型,那么我们可以定义一个转换器来完成。

例如,我们有下面的Emp类:

package org.lyk.vo;

import java.util.Date;

public class Emp
{
    private Integer empno;
    private String ename;
    private Double sal;
    private Date hiredate;

    public Date getHiredate()
    {
        return hiredate;
    }
    public void setHiredate(Date hiredate)
    {
        this.hiredate = hiredate;
    }
    public Integer getEmpno()
    {
        return empno;
    }
    public void setEmpno(Integer empno)
    {
        this.empno = empno;
    }
    public String getEname()
    {
        return ename;
    }
    public void setEname(String ename)
    {
        this.ename = ename;
    }
    public Double getSal()
    {
        return sal;
    }
    public void setSal(Double sal)
    {
        this.sal = sal;
    }

    @Override
    public String toString()
    {
        return "Emp [empno=" + empno + ", ename=" + ename + ", sal=" + sal + ", hiredate=" + hiredate + "]";
    }

}

其中hiredate是日期类型。

下面是前端页面代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":"
            + request.getServerPort() + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP ‘insert.jsp‘ starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

</head>

<body>
    <form action="pages/emp/echo.action" method="post">
        员工编号:<input name="empno" value="192"><br>
        姓名:<input name="ename" value="刘远奎"><br>
        薪水:<input name="sal" value="66.9"><br>
        雇佣日期:<input name="hiredate" value="2015-10-12"/>
        <input type="submit" value="提交">
    </form>
</body>
</html>

下面是Spring的Action代码:

package org.lyk.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.lyk.vo.Dept;
import org.lyk.vo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/pages/emp/*")
public class EmpServlet
{
    @RequestMapping
    public ModelAndView echo(Emp emp,HttpServletRequest request,HttpServletResponse response)
    {
        System.out.println(request.getSession().getId());
        request.getServletContext();

        ModelAndView mav = new ModelAndView("/pages/emp/show.jsp");
        System.out.println("*********Emp:" + emp);
        mav.addObject("msg", emp.toString());
        return mav;
    }
}

上面的代码可以在设置Emp的empno、ename、sal的时候都没有问题,但是通过后台输出发现hiredate的值为null。如果想要SpringMVC给我们做转换,则主要专门写一个String到Date的转换代码。

package org.lyk.convertor;
//org.lyk.convertor.StringToDateConvertor
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;

public class StringToDateConvertor implements Converter<String,Date>
{
    private static final Logger logger = LoggerFactory.getLogger(StringToDateConvertor.class);
    @Override
    public Date convert(String dateInString)
    {
        logger.info("dateInString:" + dateInString);
        SimpleDateFormat sdf = null;
        if(dateInString != null && !"".equals(dateInString))
        {
            if(dateInString.matches("\\d{4}-\\d{2}-\\d{2}"))
            {
                sdf = new SimpleDateFormat("yyyy-MM-dd");
            }else if(dateInString.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"))
            {
                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            }else if(dateInString.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}"))
            {
                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            }
            else
            {
                logger.info("传入的日期参数格式有误!!!");
                return null;
            }
        }

        logger.info("sdf:" + sdf);

        try
        {
            return sdf.parse(dateInString);
        } catch (ParseException e)
        {
            e.printStackTrace();
            return null;
        }

    }

}

然后配置上Sping的applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

    <context:annotation-config/>
    <context:component-scan base-package="org.lyk"/>

    <!-- 第三步: 将conversionService配置到SpringMVC中 -->
    <mvc:annotation-driven conversion-service="conversionService"/>
    <mvc:default-servlet-handler/>

    <!-- 第一步: 给Spring容器注入String到Date的转换器 -->
    <bean name="dateConvert" class="org.lyk.convertor.StringToDateConvertor"/>

    <!-- 第二部: 将该转换器注入到conversionService里 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="dateConvert"/>
            </set>
        </property>
    </bean>
</beans>

运行程序,后台输出结果.

时间: 2024-08-02 12:40:32

SpringMVC中数据转换的相关文章

SpringMVC中controller接收Json数据

SpringMVC中controller接收Json数据 1.jsp页面发送ajax的post请求: function postJson(){ var json = {"username" : "imp", "password" : "123456"}; $.ajax({ type : "post", url : "<%=basePath %>ajaxRequest", co

SpringMVC中文件上传的客户端验证

SpringMVC中文件上传的客户端验证 客户端验证主要思想:在jsp页面中利用javascript进行对文件的判断,完成验证后允许上传 验证步骤:1.文件名称 2.获取文件的后缀名称 3.判断哪些文件类型允许上传 4.判断文件大小 5.满足条件后跳转后台实现上传 前台界面(验证上传文件是否格式满足要求): <body> <h2>文件上传</h2> <form action="upload01" method="post" 

springmvc 中 Instantiation of bean failed实例化Bean失败错误

配置springMVC 项目时,启动tomcat服务器报错: 错误: 信息: Initializing Spring FrameworkServlet 'springmvc' 2015-8-19 9:57:35 org.apache.catalina.core.ApplicationContext log 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanCreationException: Error cre

关于Springmvc中include与Sitemesh装饰器的基本使用

关于Springmvc中include与Sitemesh装饰器的使用 !!!转载请注明出处=>http://www.cnblogs.com/funnyzpc/p/7283443.html 静态包含:example:<%@include file="xxx.jsp"%> 文件的包含是发生在 jsp向servlet转换时期 ,相当于将jsp编译成html静态文件,由于对包含的文件不再编译(直接拷贝到父页面),则只产生一个class文件. 动态包含:example<j

详解SpringMVC中Controller的方法中参数的工作原理

前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html SpringMVC中Controller的方法参数可以是Integer,Double,自定义对象,ServletRequest,ServletResponse,ModelAndView等等,非常灵活.本文将分析SpringMVC是如何对这些参数进行处理的,

在SpringMVC中 /* 和 / 的区别

<url-pattern> / </url-pattern>:会匹配到 /springmvc 这样的路径型url,而不会匹配到像 .jsp 这样的后缀型的url. <url-pattern> /* </url-pattern>:会匹配到所有的url:路径型url 和后缀型的url (包括/springmvc,.jsp,.js,和.html等). 在SpringMVC中需要添加这个标签:<mvc:default-servlet-handler />

springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/0309/19/834950_359080244.shtml

springMVC中Dispatcher中的/和/*的区别

1. 首先 / 这个是表示默认的路径,及表示:当没有找到可以匹配的URL就用这个URL去匹配.2. 在springmvc中可以配置多个DispatcherServlet,比如: 配置多个DispatcherServlet有/和/*,先匹配的是/*这个 3. 当配置相同的情况下,DispathcherServlet配置成/和/*的区别< 一 > / :使用/配置路径,直接访问到jsp,不经springDispatcherServlet< 二 > /*:配置/*路径,不能访问到多视图的

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用 常用HandlerMethodArgumentResolver介绍 常用HandlerMethodReturnValueHandler介绍 本文开头现象解释以及解决方案 编写自定义的HandlerMet