0

这是一个演示案例的简单示例。

您有一个带有面板和两个命令按钮的表单,一个是 AJAX,另一个不是。通过单击其中任何一个,将在支持 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 是空的。

现在,我对上面的代码有三个问题。有人可以向我澄清一下吗,我是 JSF2 的新手。

首先是,为什么两个命令按钮的行为相同?单击 ether one 将刷新整个页面。

第二个问题是,为什么点击非 AJAX 命令按钮一次会添加两个 Inputfied?

第三,为什么将托管bean的范围更改为@SessionScoped会在加载页面后报错?(不知何故只是加载页面,表单发出一个ajax请求而我没有点击commandButton。这是为什么呢?

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>

据我所知,对于f:ajaxexecute属性,应该给出组件的id,并且应该调用诸如addDynamic()在listener属性中的方法。

当您单击非 ajax 按钮时,它会发布整个表单,其中还包括您的 ajax 命令。所以基本上你的addDynamic()函数被调用了两次,一次通过 ajax 命令,第二次通过非 ajax 命令。

于 2012-12-24T09:14:48.490 回答