How to input Date to a Struts2 action from a jsp?

java, jsp, struts2

Solution

I know this post is a bit old but a solution may be useful to others.

The default converter of Struts does not seem to work properly. The field error even occurs with readonly fields populated from the action.

I resolved it by defining my own converter:

Create the converter class (using the date format you need):

public class StringToDateTimeConverter extends StrutsTypeConverter {
    // WARNING not safe in multi-threaded environments
    private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss");

    public Object convertFromString(Map context, String[] strings, Class toClass) {     
        if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) {
            return null;
        }

        try {
            return DATETIME_FORMAT.parse(strings[0]);
        } catch (ParseException e) {
            throw new TypeConversionException("Unable to convert given object to date: " + strings[0]);
        }
    }

    public String convertToString(Map context, Object date) {
        if (date != null && date instanceof Date) {         
            return DATETIME_FORMAT.format(date);
        } else {
            return null;
        }
    }
}

Put the conversion annotation on the property setter (or use a conversion.properties file)

@Conversion()
public class MyEditAction {
    // ...

    @TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter")
    public void setUploadedDate(Date uploadedDate) {
        this.uploadedDate = uploadedDate;
    }

In my case I did not need to edit it but wanted to specify the format in the jsp. I used an additional hidden field to keep the original value (another alternative would have been the use of Preparable interface):

<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/>
<s:hidden name="uploadedDate" />

Problem

I am facing a lot of problems here in my jsp page. What tag I should use to get a date (yyyy-MM-dd) from user and store it in a Date property of a Struts2 action ? The property in my action is declared to be of java.util.Date. I want the input from jsp page to land in this property. please help. I get Invalid field error (in JSP) if is use a s:textfield tag to manyally enter a date in the right format.

Original source