Как пронумеровать сообщения об ошибках JSF и число присоединения к недопустимому компоненту

Я хочу пронумеровать любые сообщения об ошибках JSF (например, проверка, сообщения преобразования), который появляется, если пользователь вводит недопустимый вход в несколько полей ввода. Например, как это, когда пользователь отправляет форму:


  1. Имя не может содержать числа
  2. Электронная почта является неправильной

-----Форма------

(1) Имя: самка John 13

Возраст: 30

(2) Электронная почта: myemail@domain


Как я могу сделать это?

С уважением

5
задан per_jansson 23 March 2010 в 21:56
поделиться

2 ответа

Что касается части сообщений, просто отобразите их все, используя обычным способом, который вы задаете как list-style-type: decimal; . Это будет отображать числа вместо пуль.

Следующим шагом будет нумерация этикеток. Для этого потребуется немного больше работы, поскольку JSF не предоставляет встроенных средств для этого. В основном вам нужно определить, связана ли данная метка с сообщением или нет, и в каком порядке сообщение было поставлено в очередь. Вы можете собрать эту информацию в Map следующим образом:

private Map<String, String> messageIndexes;

public Map<String, String> getMessageIndexes() {
    FacesContext context = FacesContext.getCurrentInstance();
    if (messageIndexes == null && context.getRenderResponse()) {
         messageIndexes = new HashMap<String, String>();
         Iterator<String> clientIds = context.getClientIdsWithMessages();
         for (int i = 1; clientIds.hasNext(); i++) {
             messageIndexes.put(clientIds.next(), String.format("(%d)", i));
         }
    }
    return messageIndexes;
}

, а затем использовать ее следующим образом:

<h:form id="form">
    <h:outputText value="#{bean.messageIndexes['form:input1']}" />
    <h:outputLabel for="input1">Label 1</h:outputLabel>
    <h:inputText id="input1" value="#{bean.input1}" required="true" />
    <br />
    <h:outputText value="#{bean.messageIndexes['form:input2']}" />
    <h:outputLabel for="input2">Label 2</h:outputLabel>
    <h:inputText id="input2" value="#{bean.input2}" required="true" />
    <br />
    ...
</h:form>

Если идентификатор клиента отсутствует на карте, то просто ничего не будет быть отрендеренным.

Чтобы переместить все задания из bean-компонента, вы можете рассмотреть либо PhaseListener (сделайте это в beforePhase () из RENDER_RESPONSE ), либо или компонент настраиваемой метки.

6
ответ дан 14 December 2019 в 08:47
поделиться

Большое спасибо. Я использовал ваше решение и внес небольшие изменения. Я решил это, используя PhaseListener для фазы RENDER_RESPONSE. Однако мне пришлось вызвать метод ниже из beforePhase () вместо afterPhase (). В противном случае мои изменения не повлияли.

public void addMessageIdentifier() {
    FacesContext context = FacesContext.getCurrentInstance();
    if (context.getRenderResponse()) {

        // Iterate over faces messages and add counter
        Iterator<FacesMessage> messages = context.getMessages();
        if (messages != null && messages.hasNext()) {
            int counter = 1;
            while (messages.hasNext()) {
                FacesMessage message = messages.next();
                if (message.getSeverity().equals(FacesMessage.SEVERITY_ERROR)) {
                    String indicator = "(" + new Integer(counter).toString() + ") ";
                    message.setDetail(indicator);
                    message.setSummary(indicator + message.getSummary());
                    counter++;
                }
            }
        }
    }
}
1
ответ дан 14 December 2019 в 08:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: