`
hyw520110
  • 浏览: 221268 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2的时间格式转换问题

    博客分类:
  • java
阅读更多

 struts2提供了一个时间标签:

Xml代码 复制代码
  1. <s:date name="todayDate" format="yyyy-MM-dd" />  
<s:date name="todayDate" format="yyyy-MM-dd" />

   但这个标签很只能在显示的时候用,但如果我想在输入框里显示时间,让用户直接修改时间,怎么弄?datepicker?选择太麻烦,我想让用户输入,并且兼容多种日期格式。还有,如果用时间标签的话,每个地方都需要指定format,如果我想修改一下格式,所有的时间显示都变,怎么弄?

 

翻了一下struts2的源码,和文档,找到一个办法。  com.opensymphony.xwork2.util.XWorkConverter

Java代码 复制代码
  1. * <p/> In some situations you may wish to apply a type converter globally.    
  2. *  This can be done by editing the file   
  3. * <b>xwork-conversion.properties</b> in the root of your class path    
  4. * (typically WEB-INF/classes) and providing a   
  5. * property in the form of the class name of the object you wish to convert    
  6. * on the left hand side and the class name of   
  7. * the type converter on the right hand side. For example, providing    
  8. * a type converter for all Point objects would mean   
  9. * adding the following entry:   
  10. *   
  11. * <p/><b>com.acme.Point = com.acme.PointConverter</b>  
 * <p/> In some situations you may wish to apply a type converter globally. 
 *  This can be done by editing the file
 * <b>xwork-conversion.properties</b> in the root of your class path 
 * (typically WEB-INF/classes) and providing a
 * property in the form of the class name of the object you wish to convert 
 * on the left hand side and the class name of
 * the type converter on the right hand side. For example, providing 
 * a type converter for all Point objects would mean
 * adding the following entry:
 *
 * <p/><b>com.acme.Point = com.acme.PointConverter</b>

 

XWorkConverter,先在classpath root下找xwork-conversion.properties文件,这个文件定义了全局转换。然后每遇到新的类需要转换,便查找是否有特殊的自定义转换配置。特殊自定义转换配置文件的路径是:

Java代码 复制代码
  1. className.replace('.''/') + "-conversion.properties";  
className.replace('.', '/') + "-conversion.properties";

 比方com.acme.Point的转换配置就是classpath 下的/com/acme/Point-coversion.properties文件。

 

ok,这个问题好解决了。

 

我的xwork-coversion.properties文件:

Xml代码 复制代码
  1. java.util.Date=cn.jolstar.struts.type.DateTypeConverter  
java.util.Date=cn.jolstar.struts.type.DateTypeConverter

 我的DateTypeConverter代码:

Java代码 复制代码
  1. /**  
  2.  *   
  3.  */  
  4. package cn.jolestar.struts.type;   
  5.   
  6. import java.text.DateFormat;   
  7. import java.text.ParseException;   
  8. import java.text.SimpleDateFormat;   
  9. import java.util.Date;   
  10. import java.util.Map;   
  11.   
  12. import org.apache.log4j.Logger;   
  13. import org.apache.struts2.util.StrutsTypeConverter;   
  14.   
  15.   
  16. /**  
  17.  * @author jolestar  
  18.  *   
  19.  */  
  20. public class DateTypeConverter extends StrutsTypeConverter {   
  21.   
  22.     private static final Logger log = Logger.getLogger(DateTypeConverter.class);   
  23.     public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";   
  24.        
  25.     //暂时只考虑这几种日期格式   
  26.     public static final DateFormat[] ACCEPT_DATE_FORMATS = {   
  27.             new SimpleDateFormat(DEFAULT_DATE_FROMAT),   
  28.             new SimpleDateFormat("yyyy年MM月dd日"),   
  29.             new SimpleDateFormat("yyyy/MM/dd") };   
  30.   
  31.     /**  
  32.      *   
  33.      */  
  34.     public DateTypeConverter() {   
  35.     }   
  36.   
  37.     /*  
  38.      * (non-Javadoc)  
  39.      *   
  40.      * @see org.apache.struts2.util.StrutsTypeConverter#convertFromString(java.util.Map,  
  41.      *      java.lang.String[], java.lang.Class)  
  42.      */  
  43.     @Override  
  44.     public Object convertFromString(Map context, String[] values, Class toClass) {   
  45.         if (values[0] == null || values[0].trim().equals(""))   
  46.             return null;   
  47.         for (DateFormat format : ACCEPT_DATE_FORMATS) {   
  48.             try {   
  49.                 return format.parse(values[0]);   
  50.             } catch (ParseException e) {   
  51.                 continue;   
  52.             } catch (RuntimeException e) {   
  53.                 continue;   
  54.             }   
  55.         }   
  56.         log.debug("can not format date string:" + values[0]);   
  57.         return null;   
  58.     }   
  59.   
  60.     /*  
  61.      * (non-Javadoc)  
  62.      *   
  63.      * @see org.apache.struts2.util.StrutsTypeConverter#convertToString(java.util.Map,  
  64.      *      java.lang.Object)  
  65.      */  
  66.     @Override  
  67.     public String convertToString(Map context, Object o) {   
  68.         if (o instanceof Date) {   
  69.             SimpleDateFormat format = new SimpleDateFormat(   
  70.                     DEFAULT_DATE_FORMAT);   
  71.             try {   
  72.                 return format.format((Date) o);   
  73.             } catch (RuntimeException e) {   
  74.                 return "";   
  75.             }   
  76.         }   
  77.         return "";   
  78.     }   
  79.   
  80. }  
/**
 * 
 */
package cn.jolestar.struts.type;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.struts2.util.StrutsTypeConverter;


/**
 * @author jolestar
 * 
 */
public class DateTypeConverter extends StrutsTypeConverter {

	private static final Logger log = Logger.getLogger(DateTypeConverter.class);
	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
	
	//暂时只考虑这几种日期格式
	public static final DateFormat[] ACCEPT_DATE_FORMATS = {
			new SimpleDateFormat(DEFAULT_DATE_FROMAT),
			new SimpleDateFormat("yyyy年MM月dd日"),
			new SimpleDateFormat("yyyy/MM/dd") };

	/**
	 * 
	 */
	public DateTypeConverter() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.struts2.util.StrutsTypeConverter#convertFromString(java.util.Map,
	 *      java.lang.String[], java.lang.Class)
	 */
	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		if (values[0] == null || values[0].trim().equals(""))
			return null;
		for (DateFormat format : ACCEPT_DATE_FORMATS) {
			try {
				return format.parse(values[0]);
			} catch (ParseException e) {
				continue;
			} catch (RuntimeException e) {
				continue;
			}
		}
		log.debug("can not format date string:" + values[0]);
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.apache.struts2.util.StrutsTypeConverter#convertToString(java.util.Map,
	 *      java.lang.Object)
	 */
	@Override
	public String convertToString(Map context, Object o) {
		if (o instanceof Date) {
			SimpleDateFormat format = new SimpleDateFormat(
					DEFAULT_DATE_FORMAT);
			try {
				return format.format((Date) o);
			} catch (RuntimeException e) {
				return "";
			}
		}
		return "";
	}

}

 

 

 

这样,从字符串转换为日期对象的时候,会尝试上面列出的多种日期格式,但输出的时候,则会统一按照DEFAULT—DATE—FORMAT转换。 需要修改格式,只需要修改DEFAULT—DATE—FORMAT。当然,你也可以把它方在配置文件里,便于修改。

 

了解了这一点,其实也就 明白了struts的类型转换模式。然后,无论是字符串id到持久化对象的转换,还是自定义的字符串到对象之间的转换,都容易了。

分享到:
评论

相关推荐

    struts2自定义类型转换器

    2. **配置转换器**:为了让Struts2知道何时使用自定义的转换器,我们需要在配置文件(通常是struts.xml)中进行声明。可以使用`&lt;conversion-property&gt;`标签来指定转换器应用于哪个字段,或者全局注册转换器。 ```...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在实际开发中,Struts2的类型转换有时会遇到一些问题,例如空值处理、格式错误等。对于空值,Struts2会提供默认值或允许字段为空;对于格式错误,Struts2会抛出`ConversionException`,开发者可以捕获并处理这个异常...

    struts2 类型转换器

    Struts2是一个非常流行的Java Web框架,它提供了一种优雅的方式来构建MVC(模型-视图-控制器...通过自定义类型转换器,我们可以解决框架默认转换机制无法满足的特殊需求,如复杂的对象序列化、自定义格式的日期处理等。

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    Struts处理类型转换错误,如时间转换

    例如,如果你有一个`java.util.Date`类型的属性,但用户输入了一个无效的日期字符串,Struts2在尝试将字符串转换为日期时会抛出异常。 2. **Struts2的类型转换机制** Struts2使用OGNL(Object-Graph Navigation ...

    struts2注册转换器

    在本案例中,我们将深入探讨“struts2注册转换器”,特别是如何将特定的日期格式如"20110202"转换为日期对象。 首先,了解Struts2中的类型转换器。Struts2框架提供了内置的转换器,可以处理基本类型和某些复杂类型...

    struts日期转换器

    这些资源可以帮助开发者理解并解决在处理日期字段时可能出现的格式问题,避免因为日期格式不匹配而导致的错误。 总的来说,Struts日期转换器是Struts框架中一个重要的功能,它使得用户界面和后端模型之间的日期数据...

    struts2类型转换和国际化

    在Struts2中,类型转换和国际化是两个重要的特性,用于处理数据类型之间的转换以及多语言环境下的内容显示。 **类型转换**是Struts2处理请求参数与Action类属性之间数据类型不匹配的过程。当用户通过表单提交请求时...

    struts2 转换器

    例如,如果你有一个日期字段,你可以创建一个DateConverter,将字符串格式的日期转换为java.util.Date对象。 除了自定义转换器,Struts2还提供了一系列内置的转换器,可以处理基本类型和常见的Java对象,如...

    struts2 Date转换问题

    8. **最佳实践**:为了避免日期转换问题,开发者可以考虑使用标准的ISO 8601日期时间格式,或者使用特定的日期选择控件以确保用户输入的格式一致。 9. **工具使用**:博文中的“工具”标签可能是指开发者可以使用的...

    STRUTS2类型转换

    Struts2的内建类型转换涵盖了大部分常见类型,包括但不限于String、boolean/Boolean、char/Character、整数类型(int/Integer、float/Float、long/Long、double/Double)、日期(使用当前时区的SHORT格式)以及数组...

    Struts2 格式化日期、时间和数字

    在Struts2框架中,处理日期、时间和数字的格式化是一项常见的任务,这涉及到前端展示和后端数据处理的一致性。Struts2提供了一系列工具和API,使得开发者能够轻松地进行格式化工作。以下是对Struts2中日期、时间和...

    struts2全局转换的问题

    Struts2提供了内置的转换器(Converters)来实现这一目标,例如将字符串转换为整数、日期等。 2. **全局转换器的注册**:要定义全局转换器,你需要在`struts.xml`配置文件中声明它。这通常是在`&lt;constant&gt;`标签内...

    struts2自定义数据类型转换练习

    在实际项目中,我们可能会遇到更复杂的数据转换情况,例如日期格式的转换、货币金额的转换等。此时,自定义类型转换器能提供灵活的解决方案,帮助我们更好地管理和控制数据转换的过程,提高代码的可维护性和健壮性。...

    Struts2实例 国际化 类型转换 struts标签

    这个实例项目展示了如何在实际应用中结合Struts2、国际化、类型转换以及Struts2自定义标签来实现用户管理功能,包括用户数据的增删改查。 首先,我们来看Struts2的核心概念。Struts2作为MVC框架,它负责处理HTTP...

    struts2(时间日期类型转换器)

    Struts2的时间日期转换器(`StrutsTypeConverter`实现)默认支持多种日期格式,例如"yyyy-MM-dd"、"MM/dd/yyyy"等。当用户在表单中输入日期数据时,Struts2会尝试根据配置的日期格式将这些数据转换为日期对象。如果...

    Struts2 自定类型转换器(三十四)

    在Struts2框架中,自定义类型转换器是开发者为了满足特定需求,对框架默认的类型转换机制进行扩展的一种方式。Struts2允许我们创建自己的转换器类来处理输入数据,确保模型对象的属性能够正确地被转换为预期的数据...

    struts2类型转换

    对于日期和时间类型,Struts2提供了`DateConverter`和`CalendarConverter`。可以使用`format`属性指定日期格式,以便正确解析用户的输入。 8. **集合和数组转换** 对于集合和数组,Struts2会尝试将每个元素转换为...

    struts2数据类型转换

    Struts2框架已经内置了一系列常见的类型转换器,例如对于基本数据类型(如int、float等)、日期类型、布尔类型等都有现成的支持。这些转换器通常能够满足大多数应用场景的需求。然而,对于一些自定义的数据类型或...

Global site tag (gtag.js) - Google Analytics