この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
属性もこのように扱われます。特定の目的のために、display: none
代わりに CSS を使用してください。
<h:inputText ... style="display:none" />
(注: これはキックオフの例です。style
属性を使用することは、HTML/CSS の観点からは悪い習慣ですstyleClass
。具体的な CSS ファイルを使用することをお勧めします)
この背後にある具体的な機能要件が気になりますが、これは UX にとって悪いことです。おそらく、 JSF ソース コードはもちろん、 JSF 仕様を最初に勉強することなく、手当たり次第に実験していたのではないでしょうか?