Почему требуется = «true» не срабатывает при рендеринге = «false»
-
21-12-2019 - |
Вопрос
У меня есть некоторые сомнения по поводу анализа HTML-тегов в Facelet.Пусть у нас есть facelet, который содержит следующее
<h:inputText id="username"
title="My name is: "
value="#{hello.name}"
required="true"
requiredMessage="Error: A name is required."
rendered="false"
maxlength="25" />
<h:commandButton id="submit" value="Submit" action="response">
</h:commandButton>
После отправки нажмите «У меня нет» Error: A name is required
.Почему? username
просто не рендерится, и после submit
нажмите, там нет значения username
.
Решение
А rendered
Атрибут также оценивается на этапах проверки и обновления значений модели.Для доказательства проверьте javax.faces.component.UIInput
исходный код (номера строк соответствуют Mojarra 2.2.0):
696 public void processValidators(FacesContext context) {
697
698 if (context == null) {
699 throw new NullPointerException();
700 }
701
702 // Skip processing if our rendered flag is false
703 if (!isRendered()) {
704 return;
705 }
...
...
...
735 public void processUpdates(FacesContext context) {
736
737 if (context == null) {
738 throw new NullPointerException();
739 }
740
741 // Skip processing if our rendered flag is false
742 if (!isRendered()) {
743 return;
744 }
Объяснение простое:это защита от поддельных (поддельных/взломанных) HTTP-запросов, когда конечные пользователи целенаправленно манипулируют HTTP-запросами, пытаясь установить значения и/или вызвать действия скрытых входных данных/команд, которые им, скорее всего, просто не разрешено обновлять или вызывать, например как кнопка удаления, которая отображается только в том случае, если у пользователя есть роль администратора:
<h:commandButton value="Delete" ... rendered="#{request.isUserInRole('ADMIN')}" />
Примечание:компоненты readonly
и disabled
атрибуты также обрабатываются таким же образом.Для вашей конкретной цели используйте CSS display: none
вместо.
<h:inputText ... style="display:none" />
(примечание:это начальный пример с использованием style
атрибут является плохой практикой с точки зрения HTML/CSS, предпочитайте styleClass
с конкретным CSS-файлом)
Хотя мне интересно, какие именно функциональные требования стоят за этим, это плохо для UX.Возможно, вы просто случайно экспериментировали, не изучив предварительно Спецификация JSF не говоря уже о Исходный код JSF?