これは、ケースを示す簡単な例です。
パネルと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リクエストを発行します。なぜですか?