Como popular um SelectOneMenu através de um bean?

11 respostas
M

Olá, minha dúvida é a seguinte: como popular um SelectOneMenu através de um bean?
Alguém poderia dar um exemplo de como fazer isso?
Desde já agradeço a atenção. :wink:

11 Respostas

F

No Bean:

public List<SelectItem> getOpcoes() { List<SelectItem> lst = new ArrayList<SelectItem>(); lst.add(new SelectItem('S', "Sim")); lst.add(new SelectItem('N', "Não")); return lst; }

Na view:

<h:selectOneMenu id="id" value="#{bean.valor}"> <f:selectItems value="#{bean.opcoes}" /> </h:selectOneMenu>

A

Cara, eu uso conforme abaixo… Qualquer duvida poste novamente!

No JSP

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
  
         <h:selectOneMenu id="menu" value="#{mbean.campo}">
               <f:selectItems value="#{mbean.listaCombo}" />
         </h:selectOneMenu>

No MBean

import javax.faces.model.SelectItem;

         List<SelectItem> listaCombo = new ArrayList<SelectItem>();//Crie um ArrayList de SelectItem
         listaCombo.add(new SelectItem("codigo", "descricao"));//Cada add que for colocado será uma nova opção no menu

Grande abraço!

J

Crie no bean uma lista de SelectItem com os dados que tu quer no SelectOneMenu, e na pagina, dentro do SelectOneMenu coloque

<f:selectItems value="#{seuBean.suaLista}" />

Lembrando que a lista precisa do get respectivo.

R

jaziel.rc:
Crie no bean uma lista de SelectItem com os dados que tu quer no SelectOneMenu, e na pagina, dentro do SelectOneMenu coloque

<f:selectItems value="#{seuBean.suaLista}" />

Lembrando que a lista precisa do get respectivo.


meu mbean

@Model
@SessionScoped
public class ProjectMB implements Serializable  {
	@Inject
	private ProjectRepository projectRepository;

	private Project project = new Project();

	private List<Project> projects;

	public void save() {
		if (this.getProject().getId() == null) {
			this.projectRepository.add(this.getProject());
		} else {
			this.projectRepository.edit(this.getProject());
		}
		this.project = new Project();
		this.projects = null;
	}

	public void delete(Long id) {
		this.projectRepository.removeById(id);
		this.projects = null;
	}

	public void prepareEdit(Long id) {
		this.project = this.projectRepository.findById(id);
	}

//GETTERS e SETTERS

minha pagina:

<h1>Project List</h1>
	<h:dataTable value="#{projectMB.projects}" var="project"
		rendered="#{not empty projectMB.projects}" border="1">
		<h:column>
			<f:facet name="header">Id</f:facet>
 #{project.id}
 </h:column>

		<h:column>
			<f:facet name="header">Name</f:facet>
 #{project.name}
 </h:column>

		<h:column>
			<f:facet name="header">Description</f:facet>
 #{project.description}
 </h:column>

não consigo ver a listagem de projects.
alguma ideia, alguém?

V

você preencheu esta lista ?

R

pois é.
como faria?
estou usando um form para preencher mas salva no banco e não retorna na página.

R
Valeio Bezerra:
você preencheu esta lista ?
meu sessionbean:
package sessionbeans;

import java.util.List;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import entities.Bug;
import entities.Project;

@Stateless
public class ProjectRepository {

	@PersistenceContext
	private EntityManager manager;

	public void add(Project project) {
		this.manager.persist(project);
	}

	public void edit(Project project) {
		this.manager.merge(project);
	}

	public void removeById(Long id) {
		Project project = this.manager.find(Project.class, id);

		TypedQuery<Bug> query = this.manager.createQuery(
				"select x from Bug x where x.project_id = :project", Bug.class);
		query.setParameter("project", project);
		List<Bug> bugs = query.getResultList();
		for (Bug bug : bugs) {
			this.manager.remove(bug);
		}

		this.manager.remove(project);
	}

	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public List<Project> findAll() {
		TypedQuery<Project> query = this.manager.createQuery(
				"select x from Project x", Project.class);
		return query.getResultList();
	}

	@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
	public Project findById(Long id) {
		return this.manager.find(Project.class, id);
	}

	public EntityManager getManager() {
		return manager;
	}

	public void setManager(EntityManager manager) {
		this.manager = manager;
	}
	
}
R

consegui preencher a lista fazendo isso no meu bean:

public List<Project> getProjects() {
		if (this.projects == null) {
			this.projects = this.projectRepository.findAll();
		}
	
		return projects;
	}
R
Valeio Bezerra:
você preencheu esta lista ?

mas agora na hora de preencher/salvar um campo dá o seguinte erro:


javax.servlet.ServletException: javax.el.ELException: Cannot convert teste of type class java.lang.String to class sessionbeans.ProjectRepository
javax.faces.webapp.FacesServlet.service(FacesServlet.java:229)
root cause

org.apache.myfaces.view.facelets.el.ContextAwareELException: javax.el.ELException: Cannot convert teste of type class java.lang.String to class sessionbeans.ProjectRepository
org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.setValue(ContextAwareTagValueExpression.java:166)
javax.faces.component.UIInput.updateModel(UIInput.java:406)
javax.faces.component.UIInput.processUpdates(UIInput.java:328)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1477)
javax.faces.component.UIForm.processUpdates(UIForm.java:263)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1477)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1477)
javax.faces.component.UIViewRoot._processUpdatesDefault(UIViewRoot.java:1411)
javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:74)
javax.faces.component.UIViewRoot$UpdateModelPhaseProcessor.process(UIViewRoot.java:1549)
javax.faces.component.UIViewRoot._process(UIViewRoot.java:1372)
javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:806)
org.apache.myfaces.lifecycle.UpdateModelValuesExecutor.execute(UpdateModelValuesExecutor.java:38)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
root cause

javax.el.ELException: Cannot convert teste of type class java.lang.String to class sessionbeans.ProjectRepository
org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:420)
org.apache.el.parser.AstValue.setValue(AstValue.java:218)
org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:253)
org.apache.webbeans.el.WrappedValueExpression.setValue(WrappedValueExpression.java:93)
org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.setValue(ContextAwareTagValueExpression.java:153)
javax.faces.component.UIInput.updateModel(UIInput.java:406)
javax.faces.component.UIInput.processUpdates(UIInput.java:328)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1477)
javax.faces.component.UIForm.processUpdates(UIForm.java:263)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1477)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1477)
javax.faces.component.UIViewRoot._processUpdatesDefault(UIViewRoot.java:1411)
javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:74)
javax.faces.component.UIViewRoot$UpdateModelPhaseProcessor.process(UIViewRoot.java:1549)
javax.faces.component.UIViewRoot._process(UIViewRoot.java:1372)
javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:806)
org.apache.myfaces.lifecycle.UpdateModelValuesExecutor.execute(UpdateModelValuesExecutor.java:38)
org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

<h:panelGrid>
			<h:inputHidden value="#{bugMB.bug.id}" />

			<h:outputLabel value="Severity:" />
			<h:selectOneMenu value="#{bugMB.bug.severity}">
				<f:selectItem itemValue="LOW" />
				<f:selectItem itemValue="MEDIUM" />
				<f:selectItem itemValue="HIGH" />
			</h:selectOneMenu>


			<h:outputLabel for="description" value="Description:" />
			<h:inputTextarea id="description" value="#{bugMB.bug.description}" />

			<h:outputLabel for="selecaoProjeto" value="Project:" />
			
			<h:selectOneMenu id="selecaoProjeto" value="#{bugMB.projectRepository}">			
				<f:selectItems value="#{projectMB.projects}" var="project"
					itemLabel="#{project.description}" itemValue="#{project}"/>
			</h:selectOneMenu>

			<h:commandButton action="#{bugMB.save}" value="Save" />
		</h:panelGrid>
V

Nunca me deparei com isso, mas acredito que o problema está ao gerar a lista, gera esta lista manualmente para ver se o SelectOneMenu é preenchido.

R

A lista já gerei manualmente.
consigo mostrar no selectonemenu.
mas na hora de salvar essas informaçoes dá o erro de cast, como se meu mbean nao reconhecesse

Criado 2 de março de 2011
Ultima resposta 22 de mar. de 2013
Respostas 11
Participantes 6