这是一个演示案例的简单示例。
您有一个带有面板和两个命令按钮的表单,一个是 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。这是为什么呢?