Как проверить дату ввода по нескольким шаблонам? - PullRequest
3 голосов
/ 10 мая 2011

В моем приложении jsf я знаю, как проверять ввод пользователя по одному шаблону в моем ice:selectInputDate с помощью конвертера jsf:

   <f:convertDateTime pattern="MM/dd/yyyy"  />

но как мне быть, если я хочу, чтобы пользователь мог вводить дату в формате: "ММ-дд-гггг" тоже?

Я думаю, что это можно сделать, расширяя DateConverter из jsf, но я уже пытался с этим, и у меня не получается. У вас есть действительный пример для проверки даты ввода по нескольким шаблонам?

Спасибо.

ОБНОВЛЕНИЕ : я использую jsf 1.2

1 Ответ

5 голосов
/ 10 мая 2011

Создайте пользовательский конвертер, который принимает несколько компонентов на <f:attribute> на компоненте.

Вот как бы вы хотели, чтобы вид был похож на:

<h:inputText id="input" value="#{bean.date}">
    <f:converter converterId="multiDateConverter" />
    <f:attribute name="pattern1" value="MM/dd/yyyy" />
    <f:attribute name="pattern2" value="MM-dd-yyyy" />
</h:inputText>

И воткак может выглядеть конвертер (для JSF 1.x зарегистрируйте его как

<converter-id>multiDateConverter</converter-id>

вместо faces-config.xml)

@FacesConverter(value="multiDateConverter")
public class MultiDateConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
        List<String> patterns = getPatterns(component);
        Date date = null;

        for (String pattern : patterns) {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            sdf.setLenient(false); // Don't parse dates like 33-33-3333.

            try {
                date = sdf.parse(value);
                break;
            } catch (ParseException ignore) {
                //
            }
        }

        if (date == null) {
            throw new ConverterException(new FacesMessage("Invalid date format, must match either of " + patterns));
        }

        return date;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
        return new SimpleDateFormat(getPatterns(component).get(0)).format((Date) value);
    }

    private static List<String> getPatterns(UIComponent component) {
        List<String> patterns = new ArrayList<String>();

        for (int i = 1; i < Integer.MAX_VALUE; i++) {
            String pattern = (String) component.getAttributes().get("pattern" + i);

            if (pattern != null) {
                patterns.add(pattern);
            } else {
                break;
            }
        }

        if (patterns.isEmpty()) {
            throw new IllegalArgumentException("Please provide <f:attribute name=\"patternX\"> where X is the order number");
        }

        return patterns;
    }

}

Обратите внимание, что он выбирает только первое (по умолчанию)шаблон для повторного отображения значения.Таким образом, в приведенном выше примере, если вы введете 05-10-2011, он будет отображаться как 05/10/2011.


Не связанный с конкретной проблемой, шаблон MM-dd-yyyy isn 'Т очень часто.Разве вы не хотели использовать dd-MM-yyyy?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...