Почему префикс идентификатора формы в выводе h: message? - PullRequest
4 голосов
/ 08 декабря 2010

В настоящее время я пытаюсь выполнить простую проверку с использованием required = "true"

    <h:form>
        <h:messages globalOnly="true"/>
        <h:panelGrid>
            <h:panelGrid columns="3">
                <f:facet name="header">
                    Login Application Sample
                </f:facet>

                <h:outputLabel for="UserId" value="User Id" />
                <h:inputText id="UserId" value="#{userBean.userId}" required="true" />
                <h:message for="UserId"/>

                <h:outputLabel for="Password" value="Password" />
                <h:inputSecret id="Password" value="#{userBean.password}" required="true" />
                <h:message for="Password" />

                <f:facet name="footer">
                    <h:commandButton value="Login" action="#{userBean.login}"/>
                    <h:commandButton type="reset" value="Reset"/>
                </f:facet>
            </h:panelGrid>
        </h:panelGrid>
    </h:form>

Оставив поля пустыми, а затем нажав кнопку входа, эти сообщения об ошибках будут отображаться в правой части каждого поля:

j_idt7: UserId: Ошибка проверки: необходимо указать значение.
j_idt7: Пароль: Ошибка проверки: необходимо указать значение.

Это то, что я ожидал,но я не хочу отображать префикс идентификатора формы 'j_idt7:'.Я читаю примеры книг, они не выводят префикс идентификатора формы.То, что я хочу:

UserId: Ошибка проверки: значение требуется.
Пароль: Ошибка проверки: Требуется значение.

Что мне нужно сделать, чтобы пропуститьотображать префикс идентификатора формы в сообщениях, специфичных для компонента?

В настоящее время я тестирую JSF 2 в glassfish v3.

Ответы [ 5 ]

13 голосов
/ 08 декабря 2010

В качестве метки сообщения по умолчанию используется идентификатор клиента компонента, именно тот, который вы видите в сгенерированном выводе HTML с помощью щелчка правой кнопкой мыши, Просмотр источника . В данном конкретном случае j_id7 является идентификатором клиента родительского элемента <form>. Если вы дадите компоненту JSF фиксированный идентификатор, например <h:form id="login">, тогда метки станут login:UserId и login:Password соответственно.

Однако вы можете использовать атрибут label компонента ввода, чтобы полностью переопределить его, чтобы метка сообщения отображалась именно так, как вы намеревались.

<h:inputText ... label="User ID" />
<h:inputSecret ... label="Password" />

Если присутствует атрибут label компонента ввода, то он будет использоваться вместо идентификатора клиента. Использование prependId="false", как предлагают другие ответы, имеет недостатки . Не делай этого.

Совершенно другая альтернатива - использовать для этого атрибут requiredMessage (или converterMessage или validatorMessage), но это не позволяет параметризовать сообщения, и, следовательно, вам придется жестко кодировать метки и тому подобное.

<h:inputText ... label="User ID is required." />
<h:inputSecret ... label="Password is required." />

Смотри также:


Следует отметить, что действительно неудобно дублировать метки, например:

<h:outputLabel for="userId" value="User ID" ... />
<h:inputText id="userId" ... label="User ID" />

<h:outputLabel for="password" value="Password" ... />
<h:inputSecret id="password" ... label="Password" />

Если вы используете библиотеку утилит JSF OmniFaces , то вы можете использовать <o:outputLabel>, чтобы JSF прозрачно установил атрибут label соответствующего компонента:

<o:outputLabel for="userId" value="User ID" ... />
<h:inputText id="userId" ... />

<o:outputLabel for="password" value="Password" ... />
<h:inputSecret id="password" ... />
5 голосов
/ 27 октября 2011

Если вы используете MyFaces и инфраструктуру проверки бина (JSR303), попробуйте определить MessageBundle с ключом javax.faces.validator.BeanValidator.MESSAGE

лица-config.xml

<application>
    <message-bundle>ApplicationMessages</message-bundle>
</application>

ApplicationMessages.properties

#javax.faces.validator.BeanValidator.MESSAGE={1}: {0}
javax.faces.validator.BeanValidator.MESSAGE={0}

Подробнее

2 голосов
/ 08 декабря 2010

Вам необходимо переопределить эти сообщения от JSF.

Вы можете иметь файл messages.properties в вашем classpath

Messages.properties

javax.faces.component.UIInput.REQUIRED=Field must be entered.  

Faces-config.xml

<application>
      <message-bundle>Messages</message-bundle>
      <locale-config>
          <default-locale>en</default-locale>

      </locale-config>
  </application>    

Посмотрите на эту статью

1 голос
/ 19 июля 2012

Там, где вы пишете required = true, вы можете определить requiredMessage = "My Message" для любого типа ввода.

например.

<h:inputText autocomplete="false" id = "CellNumber" label="Cell Number" required="true" requiredMessage="Cell Number Required" maxlength="10" value="#{userManagedBean.cellNumber}" >
1 голос
/ 08 декабря 2010

Если вы захотите просмотреть исходный HTML-код из своего браузера, вы обнаружите, что id вашего поля input равно <form-id>+":"+<input-field-id>, в вашем случае j_idt7:UserId:.Попытайтесь дать вашему <h:form> какое-то значимое id, чтобы получить от него какой-то смысл.Вы можете прочитать о идентификаторах JSF здесь .Если вам это не нравится, вы можете отключить его, изменив тег form на что-то вроде этого:

<h:form prependId = false> // its true by default.

Но это может оказаться проблематичным, как указывает BalusC здесь.

Более того, кажется, что вы никогда не настраивали никаких сообщений проверки самостоятельно.Который в свою очередь заканчивается этим сообщением.Следовательно, файл message.properties необходим, чтобы иметь возможность контролировать сообщение и показывать что-то более подходящее.Даже тогда имя поля не должно быть частью сообщения, чтобы сделать это сообщение проверки универсальным, чтобы избежать повторения.См. Ответ BalusC относительно использования атрибута label внутри <h:inputText>.

...