Struts - ActionForm e Date

Boa tarde,

Procurei mas não encontrei solução para o seguinte caso : Submeter um dado do tipo data para meu ActionForm, o mesmo não consegue ser convertido de String para Data. Vi que o Struts utiliza o BeanUtills para conversão dos tipos. Preciso adicionar alguma coisa para que possa haver essa conversão ?

Desde já, Obrigado

:thumbup:

Para resolver este problema, utilizei POG … mas acho q tem um jeito melhor.

Lah vai a gambi:

no seu action form vc trabalha com 2 conjunto de set’s e get’s p/ um mesmo atributo data

ActionForm

public Date getData() {
	Date data = null;
	try {
		data = sdf.parse(this.data);
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return data;
}

public void setData(Date data) {
	this.data = sdf.format(data);		
}

public String getData_html() {
	return data;
}

public void setData_html(String data) {
	this.data = data;
}

Neste caso vc usaria data no bean e data_html no jsp

Mas use isso como ultimo recurso, acho tosco

Valeu Marcelo, vou dar uma olhada no link.

Pois é hover, realmente é tosco, mas se eu fizer dessa forma do jeito que eu estou pensando em implementar meu ActionForm ficará mais tosco ainda. Pois eu queria instanciar meu objeto dentro do actionForm e depois pega-lo na minha action.

Exemplo :

ActionForm :


public class TesteForm extends ActionForm
{
   	private Teste teste = new Teste();
	
	public Teste getTeste() 
	{return teste;}

	public void setTeste(Teste teste) 
	{this.teste = teste;}
}

Bean :


public class Teste 
{
        private Date data;

	public Date getData() 
	{return data;}

	public void setData(Date data) 
	{this.data = data;}
}

HTML:


<input type="text" name="teste.data">

Dessa maneira eu já iria popular meu objeto sem ter que ficar repetindo todos os atributos do bean para o actionForm. Com isso, a gambiarra da data seria ainda maior ehhehehe

Então, do jeito q vc estava pensando não iria funcionar pois vc iria estar setando uma String em um objeto Date.

O ideal eh usar o que o marcelo falou.

Isso mesmo, o problema é onde eu vou implementar isso. Pode me corrigir se eu estiver errado, mas quando eu realizar um submit, primeiro será chamado o actionForm e depois será chamada a action. Então acho que não tenha como converter a data, pois antes de chegar a action já será lançada a exceção.

Bem, vou tentar alguma maneira de implementar isso.

Muito obrigado pela ajuda de vcs.

Você não precisa fazer este monte de POG`s…

Implemente um conversor para objetos Date e registre-o no BeanUtils. Veja o link que eu passei. Não tem segredo.

Fica muito mais bonito e resolve o problema de uma vez só.

É a minha oponião.

Bom dia,

Gostaria de compartilhar a solução que consegui com a ajuda do Marcelo.

Utilizando de exemplo o que ele me passou, eu criei a classe de conversão utilizando o BeanUtils.


public class DateBeanConvert implements Converter 
{
        public Object convert(Class arg0, Object arg1) 
	{
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		
		Date data = null;
		
		try 
		{
                        data = format.parse((String)arg1);
                } 
		catch (ParseException e) 
		{
			e.printStackTrace();
		}
		
		return data;
	}

}

e após isso, no meu ActionForm, registrei o conversor no construtor da classe.


public class TesteForm extends ActionForm  
{  
        private Teste teste = new Teste();  

        
        // No construtor eu realizo a conversão 
        public TesteForm()
        {
             // Registrando o conversor para data . . .
             ConvertUtils.register(new DateBeanConvert(), Date.class);
        }
          
        public Teste getTeste()   
        {return teste;}  
      
        public void setTeste(Teste teste)   
        {this.teste = teste;}  
}  

E pronto ! Aparentemente está tudo em ordem :smiley:

Valeu !

Legal…

apenas uma dica…

Dessa forma, você está registrando o conversor quando carregar um determinado Form. Se você utilizar algum form antes deste, ele não usará o conversor.

O melhor é criar um listener de contexto para registrar os conversores.

Realmente, estava pensando em uma maneira de registrar somente uma vez e me esqueci do listener :XD:

Valeu :thumbup:

Só toma cuidado porque uma vez registrado o conversor ele vai valer para todos os forms.

Esses conversores são válidos globalmente a partir do primeiro registro.

pessoal, só uma dúvida referente a esse conversor, caso aconteça algum erro a action vai retornar o usuário para o formulário, mas no campo da data aparece

java.util.GregorianCalendar[time=1040176800000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=“America/Sao_Paulo”,offset=-10800000,dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTimeZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=10,startDay=1,startDayOfWeek=1,startTime=0,startTimeMode=0,endMode=2,endMonth=1,endDay=-1,endDayOfWeek=1,endTime=0,endTimeMode=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2002,MONTH=11,WEEK_OF_YEAR=51,WEEK_OF_MONTH=4,DAY_OF_MONTH=18,DAY_OF_YEAR=352,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=-10800000,DST_OFFSET=3600000]

ou seja, ele pegar o valor da classe calendar, como fazer para aparecer a data do jeito que o usuário tinha digitado anteriormente?

valeu!!!