Защо се изисква = вярно не се задейства при изобразяване = фалшиво

Имам някои съмнения относно анализирането на 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.


person Community    schedule 18.11.2013    source източник
comment
Коя JSF версия и impl използвате?   -  person Luiggi Mendoza    schedule 18.11.2013
comment
@Luiggi: поведението е според спецификацията на JSF, поради което е малко вероятно специфичен проблем за impl/версия.   -  person BalusC    schedule 18.11.2013
comment
@BalusC Прочетох погрешно не съм от имам, като по този начин намирам това поведение за наистина странно.   -  person Luiggi Mendoza    schedule 18.11.2013
comment
@Luiggi: ах, определено мога да си представя това, също трябваше да прочета въпроса два пъти.   -  person BalusC    schedule 18.11.2013


Отговори (1)


Атрибутът 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 изходен код?

person BalusC    schedule 18.11.2013