Почему требуется = «true» не срабатывает при рендеринге = «false»

StackOverflow https://stackoverflow.com//questions/20039698

Вопрос

У меня есть некоторые сомнения по поводу анализа 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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top