我正在尝试更改<f:ajax listener>
时调用<h:selectOneMenu>
方法。
这是观点:
<h:selectOneMenu label="verteilerlisten"
value="#{smsBean.verteilerliste}" id="verteilerlisten">
<f:ajax listener="#{smsBean.verteilerlistenChanged}"
render="verteilerlisten" />
<f:selectItems value="#{verteilerlisten.list}"
var="v" itemLabel="#{v.name}" itemValue="#{v.verteilerlistennummer}" />
</h:selectOneMenu>
这是#{smsBean}
:
public void verteilerlistenChanged(AjaxBehaviorEvent e) {
System.out.println("success!");
throw new RuntimeException("Success!");
}
项目显示正确,但在我更改选择框中的项目时没有任何反应。这是怎么造成的,我该如何解决?
编辑:
我使用以下代码创建了一个空白的xhtml文件(test.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:f="http://java.sun.com/jsf/core">
<h:head />
<h:body>
<h:form id="smsform">
<h:selectOneMenu label="verteilerlisten" value="#{smsBean.verteilerliste}"
id="verteilerlisten">
<f:selectItems value="#{verteilerlistenBean.list}" var="v"
itemLabel="#{v.name}" itemValue="#{v.verteilerlistennummer}"/>
<f:ajax listener="#{smsBean.verteilerlistenChanged}" render="smsform"/>
</h:selectOneMenu>
</h:form>
</h:body>
</html>
这是VerteilerlistenBean.java:
@ManagedBean(name= "verteilerlistenBean")
@ApplicationScoped
public class VerteilerlistenBean {
private Logger logger = Logger.getLogger(VerteilerlistenBean.class);
private List<Verteilerliste> list = new ArrayList<Verteilerliste>();
public VerteilerlistenBean() {
}
public List<Verteilerliste> getList() {
// return list;
logger.info("Getter invoked");
List<Verteilerliste> list = new ArrayList<Verteilerliste>();
list.add(new Verteilerliste(1, "Liste 1"));
list.add(new Verteilerliste(2, "Liste 2"));
list.add(new Verteilerliste(3, "Liste 3"));
list.add(new Verteilerliste(4, "Liste 4"));
list.add(new Verteilerliste(5, "Liste 5"));
return list;
}
public void setList(final List<Verteilerliste> parList) {
list = parList;
}
}
这是smsBean(SendSMSFormBean.java):
@ManagedBean (name="smsBean")
@ViewScoped
public class SendSMSFormBean implements Serializable {
private String absender;
private Verteilerliste verteilerliste;
private Textbaustein textbaustein;
public SendSMSFormBean() {
}
public String getAbsender() {
return absender;
}
public void setAbsender(final String parAbsender) {
absender = parAbsender;
}
public Verteilerliste getVerteilerliste() {
return verteilerliste;
}
public void setVerteilerliste(final Verteilerliste parVerteilerliste) {
verteilerliste = parVerteilerliste;
}
public Textbaustein getTextbaustein() {
return textbaustein;
}
public void setTextbaustein(final Textbaustein parTextbaustein) {
textbaustein = parTextbaustein;
}
public void verteilerlistenChanged(AjaxBehaviorEvent e) {
System.out.println("Success!");
}
}
这些是我使用的库:
(我无法上传图片-.-)
已编辑2
我清理了我的类路径lib,以便所有这些类不再存在于其中(它现在使用来自tomcat的库)。我还在一个简单的例子中添加了一个(我在主要例子中得到了一个)。但是每当我在控制台中更改selectBox中的值时,仍会显示:
2014-01-21 16:03:48 INFO VerteilerlistenBean:44 - Getter invoked
已编辑3
将f:ajax listener属性更改为“#{asdf.asdf}时。未显示错误!在此之前我尝试了#{smsBean.verteilerlistenChanged}和$ {smsBean.verteilerlistenChanged}
已编辑4 所以现在我认为我犯了错误:
<div class="ym-fbox">
<h:selectOneMenu label="verteilerlisten" id="verteilerlisten">
<f:selectItems value="#{testbean.list}" var="v" itemLabel="#{v.name}" itemValue="#{v.id}"/>
<f:selectItem itemLabel="Manuelle Eingabe" itemValue="man"/>
<f:ajax listener="#{testbean.beep}" render="smsform"/>
</h:selectOneMenu>
</div>
<div class="ym-fbox">
<h:selectOneMenu label="verteilerlisten1" id="verteilerlisten1" value="#{smsBean.verteilerliste}">
<f:selectItems value="#{verteilerlistenBean.verteilerlisten}" var="liste" itemLabel="#{liste.name}" itemValue="#{liste.verteilerlistennummer}" />
<f:selectItem itemLabel="Manuelle Eingabe" itemValue="man"/>
<f:ajax listener="#{testbean.beep}" render="smsform"/>
</h:selectOneMenu>
</div>
上面一个调用testbean.beep,当另一个调用时没有!如果您在selectOneMenu中删除属性“value”,它将起作用。我不知道为什么JSF这样做或为什么它没有向我显示任何错误..
但这并不能解决我的问题:我有2个豆子。一个是Bean,它保护表单中的输入(smsBean)。选择值应该保存在这个bean中。另一个bean类似于RessourceManager,它返回用户可以在框中选择的值。
我该怎么做?