我已经检查了commandButton/commandLink/ajax action/listener method not invoked or input value not updated上的BalusC建议,但是每当我添加selectOneMenu下拉列表时,我都无法触发我的commandButton
这是我的表格:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/template/template.xhtml">
<ui:define name="content">
<h:form>
<h:messages />
<h:panelGrid columns="2">
<h:outputLabel value="Cin" />
<h:inputText value="#{addEmployeeBean.cin}" />
<h:outputLabel value="Nom" />
<h:inputText value="#{addEmployeeBean.nom}" />
<h:outputLabel value="Prenom" />
<h:inputText value="#{addEmployeeBean.prenom}" />
<h:outputLabel value="Login" />
<h:inputText value="#{addEmployeeBean.login}" />
<h:outputLabel value="Password" />
<h:inputSecret value="#{addEmployeeBean.password}" />
<h:outputLabel value="Id_Contrat" />
<h:inputText value="#{addEmployeeBean.idContrat}" />
<h:outputLabel value="Salaire" />
<h:inputText value="#{addEmployeeBean.salaire}" />
<h:outputLabel value="laboratoire:" />
<h:selectOneMenu value="#{addEmployeeBean.laboSelectionne}">
<f:selectItems value="#{addEmployeeBean.labos}" var="lab"
itemLabel="#{lab.nom}" itemValue="lab">
</f:selectItems>
</h:selectOneMenu>
<h:commandButton action="#{addEmployeeBean.ajouterEmploye()}"
value="Ajouter" />
</h:panelGrid>
</h:form>
</ui:define>
</ui:composition>
这是我的托管bean:
@ManagedBean
@RequestScoped
public class AddEmployeeBean {
private String cin;
private String nom;
private String prenom;
private String login;
private String password;
private int idContrat;
private float salaire;
private List<Labo> labos;
private Labo laboSelectionne;
@EJB
GererLaboServiceLabo gererLaboServiceLocal;
@EJB
GererEmployeeServiceLocal employeeServiceLocal;
@PostConstruct
public void init(){
labos= gererLaboServiceLocal.listLabo();
laboSelectionne = new Labo();
}
public String ajouterEmploye() {
Employe employe = new Employe();
Contrat contrat = new Contrat();
contrat.setId(idContrat);
contrat.setSalaire(salaire);
employe.setCin(cin);
employe.setContrat(contrat);
employe.setLogin(login);
employe.setNom(nom);
employe.setPassword(password);
employe.setPrenom(prenom);
System.out.println(laboSelectionne.getNom());
employe.setLabo(laboSelectionne);
employeeServiceLocal.creerEmployee(employe);
return null;
}
答案 0 :(得分:0)
由于转换错误,您的应用程序未使其超过“应用请求值”阶段。您需要将字符串#{lab}
转换回Labo
实例。 JSF只能对原始,原始包装器,BigDecimal和BigInteger进行隐式转换。对于其他一切,您必须创建自定义转换器(或使用jsf提供的<f:convert.../>
标记之一)。
通常在这些情况下,我会将所有可选对象放在由其数据库ID键入的HashMap
中。因此,private List<Labo> labos;
代替private HashMap<String, Labo> labos;
,其中String是唯一ID。现在,您的getLabos
将
public Collection<Labo> getLabos(){
return labos.values();
}
假设Labo
主键有id
字段,<f:selectItems...
变为
<f:selectItems value="#{addEmployeeBean.labos}" var="lab" itemLabel="#{lab.nom}"
itemValue="#{lab.id}"/>
现在,您可以创建一个转换器,将使用表单提交的String
值映射到Labo
实例。对于这个例子,我刚刚创建了一个公共方法,它返回一个Converter
的匿名实例;这将放在你的ManagedBean
。
public Converter getConverter(){
return new Converter(){
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return labos.get(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if(value instanceof Labo){
return ((Labo)value).getKey();
}
return value == null ? null : value.toString();
}
};
}
最后,您可以在selectOneMenu
代码
<h:selectOneMenu value="#{addEmployeeBean.laboSelectionne}"
converter="#{addEmployeeBean.getConverter()">
尽管如此,在selectOneMenu
中使用字符串也可以更简单,然后当您设置实验室时,只需在HashMap
employe.setLabo(labos.get(laboSelectionne));