0

私はこのJSFコードを持っています

<f:view>
    <h:form>                    
        <h:commandButton value="Generate License File" type="button" action="#{agreement.generateLicenseFile}"/>                    
    </h:form>
</f:view>

そしてこれが豆です

@ManagedBean(name="agreement")
@RequestScoped
public class AgreementBean {

    private boolean generate=false; 

    public void generateLicenseFile(){
        generate=true;
    }
}

アプリを実行してボタンをクリックしても、まったく何も起こりません。実行にエラーはありません。それは単に何もしません。

何か案は?

- 編集 -

つまり、ブール値は変更されません。

4

1 に答える 1

1

アプリを実行してボタンをクリックしても、まったく何も起こりません

裏ではいろいろなことが起こっています!

  • POSTFacesサーブレットによって処理されるサーバーへのリクエストをトリガーします。
  • これによりJSF ライフサイクルが開始され、このチュートリアルに従ってデバッグできます。JSF ライフサイクルについては、最後の 2 つのフェーズについてのみ説明します (他のリンクは、他の 4 つのフェーズ、特に BalusC について非常によく説明しています)。
  • Invoke Application フェーズ (5 番目のフェーズ) では、サーバーgenerateLicenseFileは.<h:commandButton><h:form>
  • このフェーズからは何も返さないため、Render Response フェーズ (6 番目のフェーズ) では、ViewState が更新された現在のビューのみが取得されます。また、ビュー内のどのコンポーネントにも大きな更新を行わないため、何も表示されません

また、Bean は@RequestScopedフォームの送信ごとに作成されるように構成されているため、generateフィールドは常にfalseリクエスト時に作成されます (表示されている値を変更していないため、値はそのまま残りfalseます)。Bean の作成は、宣言されたスコープによって異なります。詳細: JSF 2 での通信: マネージド Bean スコープ

ビューに何かを表示したい場合は、コードを少し変更することをお勧めします。

JSF コード

<h:form>
    #{agreement.generate}
    <br />
    <h:commandButton value="Generate License File" type="button"
        action="#{agreement.generateLicenseFile}" />
</h:form>

マネージドBean

@ManagedBean(name="agreement")
@ViewScoped //removed RequestScoped, this WILL make the difference
public class AgreementBean {
    private boolean generate = false; 
    public void generateLicenseFile(){
        generate = !generate;
    }
    //getter and setter for generate field
}
于 2013-07-11T21:57:18.190 に答える