Каковы правила для идентификатора JSF?

Кажется, что я смогу найти это через полчаса поиска в Интернете, но поскольку я не могу:

Каковы правила для действительных идентификаторов JSF?

Я прочитал искаженное сообщение электронной почты, в котором указывалось, что существуют ограничения на - и _, но я получаю IllegalArgumentExceptions, и я думаю, что это связано с идентификаторами.

ИЗМЕНИТЬ

java.lang.IllegalArgumentException: 6a945017207d46fd82b3d3bb7d2795f1
at javax.faces.component.UIComponentBase.validateId(UIComponentBase.java:549)
at javax.faces.component.UIComponentBase.setId(UIComponentBase.java:351)
at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:151)

Ответы

Ответ 1

Он должен быть действительным CSS-идентификатором (identздесь), и не должно быть дубликатов.

В CSS идентификаторы (включая имена элементов, классы и идентификаторы в селекторы) могут содержать только символы [a-zA-Z0-9] и ISO 10646 символы U+00A1 и выше, плюс дефис (-) и подчеркивание (_); они не могут начинаться с цифры или дефиса, за которым следует цифра. Идентификаторы также могут содержать экранированные символы и любой символ ISO 10646 в виде числового кода (см. Следующий элемент). Например, идентификатор "B&W?" может быть записан как "B\&W\?" или "B\26 W\3F".

См. также:


Обновить: для интересующего вас случая, здесь исходный код валидатора, предоставленный UIComponentBase#validateId():

private static void validateId(String id) {
    if (id == null) {
        return;
    }
    int n = id.length();
    if (n < 1) {
        throw new IllegalArgumentException("Empty id attribute is not allowed");
    }
    for (int i = 0; i < n; i++) {
        char c = id.charAt(i);
        if (i == 0) {
            if (!Character.isLetter(c) && (c != '_')) {
                throw new IllegalArgumentException(id);
            }
        } else {
            if (!Character.isLetter(c) &&
                    !Character.isDigit(c) &&
                    (c != '-') && (c != '_')) {
                throw new IllegalArgumentException(id);
            }
        }
    }
}

Однако он немного более строгий, чем правила CSS. Они также не могут начинаться с дефиса.