0

これは、ケースを示す簡単な例です。

パネルと2つのコマンドボタンを持つフォームがあり、1つはAJAXで、もう1つはそうではありません。それらのいずれかをクリックすると、バッキング Bean に InputText が作成され、パネルに追加されます。

私のマネージドBean:

@ManagedBean

public class DynamicPanel {

private Panel dynmaic;



public Panel getDynmaic() {
    return dynmaic;
}

public void setDynmaic(Panel dynmaic) {
    this.dynmaic = dynmaic;
}

public String adddynamic(){

    InputText text = new InputText();        
    dynmaic.getChildren().add(text);
    text.setValue(text.getId()+" Size= "+ dynmaic.getChildren().size());
    return null;
}

public String removeall(){
    this.dynmaic.getChildren().clear();
    return null;
}
}

私の XHTML ページ

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>
    <h:form>
        <p:panel id="dynamic" binding="#{dynamicPanel.dynmaic}">

        </p:panel>

        <h:commandButton value="Add with AJAX" id="ajaxBtn" >
        <f:ajax onevent="onClick" execute="#{dynamicPanel.adddynamic()}" render="dynamic" />
         </h:commandButton>

        <h:commandButton value="Add" action="#{dynamicPanel.adddynamic}" />
        <h:commandButton value="remove all" action="#{dynamicPanel.removeall}" />   
    </h:form>


</h:body>
</html>

私のfaces-config.xmlは空です。

さて、上記のコードには 3 つの問題があります。誰かが私にそれを明確にしてもらえますか、私はJSF2が初めてです。

1 つ目は、なぜ両方のコマンド ボタンが同じように動作するのかということです。エーテル 1 をクリックすると、ページ全体が更新されます。

2 番目の問題は、AJAX 以外の commandButton をクリックすると、一度に 2 つの Inputfied が追加されるのはなぜですか?

3 つ目は、マネージド Bean のスコープを @SessionScoped に変更すると、ページをロードするとエラーが発生するのはなぜですか? (どういうわけかページをロードするだけで、コマンドボタンをクリックせずにフォームがajaxリクエストを発行します。なぜですか?

4

1 に答える 1

0

以下を試してみてください。うまくいくはずです。

<h:commandButton value="Add with AJAX" id="ajaxBtn" >
    <f:ajax onevent="click" execute="ajaxBtn"
                            render="dynamic"
                            listener="#{dynamicPanel.adddynamic()}"
     </h:commandButton>

私の知る限り、実行属性にはコンポーネントのIDを指定する必要があり、リスナー属性f:ajaxなどでメソッドを呼び出す必要があります。addDynamic()

非ajaxボタンをクリックすると、ajaxコマンドも含むフォーム全体が投稿されます。したがって、基本的にaddDynamic()関数は2回呼び出されます.1つはajaxコマンドを介して、もう1つは非ajaxコマンドを介して呼び出されます..

于 2012-12-24T09:14:48.490 に答える