Struts 2, преобразование типов дат в список, формат не по умолчанию

У меня есть действие, действие имеет свойство List of Dates. Параметры запроса будут отображаться в формате "yyyy.MM.dd". В файле "-coversion.properties" (я не хочу использовать глобальный конвертер типов для этой цели).

Я не использую аннотации.

Если бы это была всего одна дата, а не коллекция, преобразование, специфичное для свойства, было бы простым. Можно ли применить преобразование типа конкретного свойства к элементам списка?

Ответ 1

Я написал образец кода, который отлично работает. Структура такая же, как и выше. enter image description here

Сначала я написал конвертер в /util/MyDateConverter.java, как показано ниже:

package util;

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

import com.opensymphony.xwork2.conversion.TypeConversionException;

import ognl.DefaultTypeConverter;

public class MyDateConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object object, Class type) {
    if (type == Date.class) {
        String datePattern = "yyyy.MM.dd";
        DateFormat format = new SimpleDateFormat(datePattern);
        format.setLenient(false);
        try {
            String[] dateString = (String[]) object;
            return format.parse(dateString[0]);
        } catch (Exception e) {
            throw new TypeConversionException("Given Date is Invalid");
        }
    }
    return null;
}
}

Затем, чтобы использовать поддержку преобразования коллекции struts2, я написал /util/MyDate.java, как показано ниже:

package util;
import java.io.Serializable;
import java.util.Date;

public class MyDate implements Serializable {

    public MyDate(int myId, Date value) {
        super();
        this.myId = myId;
        this.value = value;
    }

    int myId;
    Date value;

    public Date getValue() {
        return value;
    }

    public void setValue(Date value) {
        this.value = value;
    }

    public int getMyId() {
        return myId;
    }

    public void setMyId(int myId) {
        this.myId = myId;
    }

    @Override
    public String toString() {
        return value.toString();
    }
}

Затем я сказал struts2, как поддерживать сбор, написав /action/Action1-conversion.properties, как показано ниже:

KeyProperty_dates=myId
Element_dates=util.MyDate
CreateIfNull_dates=true

Затем рассказал ему, как преобразовать MyDate.value, написав /util/MyDate-conversion.properties, как показано ниже:

value=util.MyDateConverter

Затем я подготовил /index.jsp, как показано ниже:

<%@ taglib uri="/struts-tags" prefix="s"%>

<s:form>
    <s:date name="dates(1).value" format="yyyy.MM.dd" id="dateSD1" />
    <s:textfield name="dates(1).value" value="%{dateSD1}" label="New Date 1" />

    <s:date name="dates(2).value" format="yyyy.MM.dd" id="dateSD2" />
    <s:textfield name="dates(2).value" value="%{dateSD2}" label="New Date 2"/>

    <s:submit value="Update" />
    <pre>
    Current Date 1: <s:date name="dates(1).value" />
    Current Date 2: <s:date name="dates(2).value" />
    </pre>
</s:form>

и /action/Action1.java, как показано ниже:

package action;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import util.MyDate;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport {

    public Action1() {
        super();
        dates.add(new MyDate(1, new Date()));
        dates.add(new MyDate(2, new Date()));
    }

    public String execute() {
        return SUCCESS;
    }

    List<MyDate> dates = new ArrayList<MyDate>();

    public void setDates(List<MyDate> dates) {
        this.dates = dates;
    }

    public List<MyDate> getDates() {
        return dates;
    }
}

После запуска приложения кнопка Update работает хорошо, как ожидалось, что показывает, что конверсии работают хорошо.

Я надеюсь, что этот примерный код поможет вам.

Ссылка: Преобразование типа Apache Struts2