Data no Webwork

8 respostas
volnei

Pessoal, existe alguma forma do Webwork recuperar uma data dd/MM/yyyy do meu textfield para o campo date do meu bean?

8 Respostas

smota

Nope … vc terá que fazer seu proprio type converter e registra-lo para o tipo Date … veja essa mensagem para entender melhor porque.

O grande problema é que os conversores atualmente simplesmente ignoram o locale …

maresp
Colher de chá:
/*
 * Created on 19/01/2005
 * by Marcelo Esperandio
 * project: erp
 * package: br.com.atmtec.converter
 * class..: DateConverter
 */
package br.com.atmtec.converter;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Map;

import br.com.atmtec.component.I18nSupport;

import com.opensymphony.xwork.ActionContext;

import ognl.DefaultTypeConverter;

/**
 * @author Marcelo Esperandio
 */
public class DateConverter extends DefaultTypeConverter {
	
	private static final String SLASH = "/";
	
	private static final int pt_BR = 1;
	private static final int en_US = 2;
	private static final int es_ES = 3;
	
	/* (non-Javadoc)
	 * @see ognl.DefaultTypeConverter#convertValue(java.util.Map, java.lang.Object, java.lang.Class)
	 */
	public Object convertValue(Map context, Object value, Class toType) {
		// futuramente um switch para determinar o i18n
		I18nSupport i18n = (I18nSupport)ActionContext.getContext().getSession().get("i18n");
		return ptBR(value, toType);
	}
	
	/**
	 * Converte strings para datas no padrão pt_BR (português-brasil).
	 * @param value
	 * @param toType
	 * @return
	 */
	private Object ptBR(Object value, Class toType) {
		int dd, mm, aaaa; 
		String[] d = (String[])value;
		int slash1 = d[0].indexOf(SLASH);
		int slash2 = d[0].lastIndexOf(SLASH);
		dd = Integer.parseInt(d[0].substring(0, slash1));
		mm = Integer.parseInt(d[0].substring(slash1+1, slash2));
		aaaa = Integer.parseInt(d[0].substring(slash2+1));
		Calendar cal = new GregorianCalendar(aaaa, mm-1, dd);
		return cal.getTime();
	}
	
	/**
	 * Converte strings para datas no padrão en_US (english-united states).
	 * @param value
	 * @param toType
	 * @return
	 */
	private Object enUS(Object value, Class toType) {
		return null;
	}
	
	/**
	 * Converte strings para datas no padrão es_ES (spanish-spain).
	 * @param value
	 * @param toType
	 * @return
	 */
	private Object esES(Object value, Class toType) {
		return null;
	}
}

Coloca um xwork-conversion.properties no CLASSPATH e pronto.

# xwork-conversion.properties
java.util.Date = br.com.atmtec.converter.DateConverter

Normalmente em um type converter vc verifica se a conversão é from ou to String. Neste caso específico da data o objeto volta como data mesmo para vc aplicar um SimpleDateFormat dependendo do i18n (ou l10n).

volnei

vou ficar mau acostumado… :oops:

Valeu pessoal… isso já é bem melhor que usar o req.get… e depois converter…

:wink:

_fs

Qur falta que isso fez 6 meses atras @.@ … valeu cara :smiley:

Que tal usar String.split ao invés do protocolo SPCSPL* na hora de separar os valores?

[size=9]* String Pra Cá, String Prá Lá - by cv[/size]

volnei

Minha sugestão fica em usar o próprio SimpleDateFormat

private static final String en_US = “MM/dd/yyyy”’;
private static final String pt_BR = “dd/MM/yyyy”’;

e converter a data a partir daí…
:wink:

volnei

Aproveitei a idéia e fiz assim Oó

package br.unopar.infra.util;

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

import ognl.DefaultTypeConverter;


public class DateConverter extends DefaultTypeConverter{
	public static final String pt_BR_simple = "dd/MM/yyyy";
	public static final String pt_BR_full = "dd/MM/yyyy HH:mm";
	
	public Object convertValue(Map context, Object value, Class toType){
		try{
			String v[] = (String[]) value;
			SimpleDateFormat format = null;
			if(v[0].length()==16){
				format = new SimpleDateFormat(pt_BR_full);
			}else{
				format = new SimpleDateFormat(pt_BR_simple);
			}
			return format.parse(v[0]);
		}catch(ParseException e){
			e.printStackTrace();
			return null;
		}
	}
}
cv1

Talvez voce queira colocar um trim() na data, pra evitar falhar a comparacao com “16” (de onde veio esse numero? ;))

volnei

“dd/MM/yyyy HH:mm”.length() :wink:

Tenho muitos campos nos meus cadastros que necessitam dessa mascara… Não preciso do trim() porque o tamanho do campo já é limitado.

Criado 20 de janeiro de 2005
Ultima resposta 21 de jan. de 2005
Respostas 8
Participantes 5