0

JSF 1.2 と Seam フレームワークを使用して、Java EE でアプリケーションを作成しています。次のようなラジオボタンから入力を受け取るフォームがあります。

<h:selectOneRadio value="#{testAction.selectedOptionId}"
                 id="selectedQuestionOption"
                 layout="pageDirection">
    <s:selectItems var="selectedOption" value="#{currentQuestion.options}"
                   label="#{selectedOption.optionString}"
                   itemValue="#{selectedOption.optionId}"/>
 </h:selectOneRadio>

 <h:commandButton id="goToNextQuestion" value="Submit"
                 action="#{testAction.postAnswer}"/>

ラジオボタンを選択せず​​にフォームを送信した場合でも結果を受け入れたいと思いますが、機能しません。検証フェーズでは、jsf が送信を拒否し、検証エラーが発生するためです。そのためのカスタムバリデータを作成しようとしましたが、残念ながらそれもうまくいきませんでした。

なにか提案を?

4

1 に答える 1

0

この場合、理想的な解決策となるカスタムバリデーターを作成しても、この問題の解決策は見つかりませんでした。しかし、私はこの状況を克服するための回避策を見つけました。immediate = "true"次のように送信ボタンを設定することで、バインディング値と検証フェーズをバイパスできます。

 <h:commandButton id="goToNextQuestion" value="Submit" immediate="true"
             action="#{testAction.postAnswer}"/>

後続のフェーズをスキップすることで、サーブレットはアプリケーション フェーズを呼び出し、アプリケーション ロジックが適用されます。処理フェーズをスキップすると、ポスト リクエストからのデータは Bean にバインドされません。したがって、これらの Bean を操作する前に、次のRequestParameterMapように値を読み取る必要があります (私の場合):

    Map<String, String> paramMap = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();

    for (String key : paramMap.keySet()) {
        //log.info("Param: " + key + " Value: " + paramMap.get(key));
        if (key.contains("selectedQuestionOption")) {
            //log.info("OptionParam: " + key + " Value: " + paramMap.get(key));
            selectedOptionId = Integer.parseInt(paramMap.get(key));
        }
    }

そして、実際のビジネス ロジックを適用しました。

于 2012-11-23T17:04:12.427 に答える