2

facelet での html タグの解析について疑問があります。以下を含む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

4

1 に答える 1

3

この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')}" />

注: コンポーネントreadonlydisabled属性もこのように扱われます。特定の目的のために、display: none代わりに CSS を使用してください。

<h:inputText ... style="display:none" />

(注: これはキックオフの例です。style属性を使用することは、HTML/CSS の観点からは悪い習慣ですstyleClass。具体的な CSS ファイルを使用することをお勧めします)

この背後にある具体的な機能要件が気になりますが、これは UX にとって悪いことです。おそらく、 JSF ソース コードはもちろん、 JSF 仕様を最初に勉強することなく、手当たり次第に実験していたのではないでしょうか?

于 2013-11-18T03:49:45.267 に答える