h:使用h:selectOneMenu时不触发commandButton

时间:2017-04-06 22:14:54

标签: java-ee jsf-2.2

我已经检查了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;
	}

1 个答案:

答案 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));