1
<h:form>
 <h:selectManyMenu id="carsList"
                   value="#{bean.carList}"
                   style="width:400px; height:100px" label="List">
                    <f:selectItems  value="#{bean.cars}" var="i"
                                    itemLabel="#{i.code}" itemValue="#{i.Name}" />
                    <f:selectItem  itemLabel="Other" itemValue="other"/>
                    <f:ajax event="change" execute="@this" render="othermodel"/>
        </h:selectManyMenu>
                    <br></br>
                    <h:panelGroup id="othermodel">
                            <h:outputText  value="Others:" style="margin-top:10px;color:red;font-weight:bold;"
                            rendered="#{bean.carList.contains('other')}" />
                            <h:inputText size="50" id="otherinput" required="true"
                            rendered="#{bean.carList.contains('other')}"/>
                            <h:message for="otherinput"></h:message>
                    </h:panelGroup>
                       <h:commandButton value="Next" action="#{bean.submitForm}"/>
    </h:form>

私のビーンはrequestScopedcarList値がある場合otherは表示できpanelGridますが、ユーザーが を使用してレンダリングされた入力フィールドに値を入力しない場合、AJAX指定してもrequired=true検証されません。また、入力テキスト ボックスの値はバックエンド コードで null です。

を使用してレンダリングされた入力フィールドの検証を行うにはどうすればよいAJAXですか? また、値が null になるのはなぜですか? 私はJSF 2.0を使用しています

4

2 に答える 2

1

属性は、フォーム送信のrenderedリクエスト中に再評価されます。Bean はリクエスト スコープであるため、すべてのプロパティがデフォルトに設定された状態で、すべてのリクエスト (また ajax リクエスト) で再作成されます。そのため、carListプロパティも空になり、モデル値の更新フェーズで が満たされる前にrendered属性が評価されます。そのため、JSF の場合、はレンダリングされないため、処理されません。falsecarList<h:inputText>

代わりに Bean をビュー スコープに入れます。(ajax) ポストバックで同じビューを操作している限り有効です。これは、条件付きレンダリングが多い動的な ajax ベースのフォームに適したスコープです。

以下も参照してください。

于 2013-02-06T01:41:21.247 に答える
0

でこれを試しました@ViewScopeSpring managed serviceトランジェントとして作成したときnull、逆シリアル化後に参照を取得していました。そこで、以下の方法で取得してみましたSpring Service

    @ManagedBean(name="bean")
    @ViewScoped
    public class Bean implements Serializable {


    @ManagedProperty(value="#{appService}")
    private transient AppService appService;

      // Getting AppService Object which is singleton in the application during deserialization 
     private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
              stream.defaultReadObject();
              FacesContext context = FacesContext.getCurrentInstance();
              appService = (AppService)context.getApplication()
                    .evaluateExpressionGet(context, "#{appService}", AppService.class);
                  stream.close();  // not sure i have to do this
           }
    }

これは問題なく機能しています。

于 2013-02-15T03:41:01.660 に答える