Атрибутът 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