Pessoal,
Por favor me ajudem. sou iniciante
estou com um problema:
tenho um TemaBean onde faço o crud do tema
tbm tenho ComentarioBean onde quero fazer o crud co comentario.
só que quando vou cadastrar comentário preciso selecionar um tema.
olha a tela:
<h:form>
<h:panelGrid columns=“2”>
<h:outputText value=“Tema:”/>
<h:selectOneMenu value="#{TemaBean.id}">
<f:selectItems value="#{TemaBean.selectTema}" var=“tema” itemValue="#{TemaBean.id}" itemLabel="#{TemaBean.descricao}"/>
</h:selectOneMenu>
<h:outputText value=“Comentário:”/>
<h:inputTextarea value="#{ComentarioBean.nome}" required=“true” requiredMessage=“Campo Obrigatório”/>
<h:commandButton value=“Salvar” action="#{ComentarioBean.CadastrarComentario}" type=“submit”/>
</h:panelGrid>
</h:form>
só que quando mandar Salvar tema sempre vai null.
não estou sabendo resolver isso.
Ajuda galera!
ta aqui o meu comentarioBean @ManagedBean(name = “ComentarioBean”) @RequestScoped
public class ComentarioBean {
private int cod;
private String nome;
private TemaBean tema;
/**
* @return the cod
*/
public int getCod() {
return cod;
}
/**
* @param cod the cod to set
*/
public void setCod(int cod) {
this.cod = cod;
}
/**
* @return the nome
*/
public String getNome() {
return nome;
}
/**
* @param nome the nome to set
*/
public void setNome(String nome) {
this.nome = nome;
}
public ComentarioBean() {
}
public ComentarioBean(int codComentario, String nomeComentario, TemaBean tema) {
this.cod = codComentario;
this.nome = nomeComentario;
this.tema = tema;
}
/**
* @return the tema
*/
public TemaBean getTema() {
return tema;
}
/**
* @param tema the tema to set
*/
public void setTema(TemaBean tema) {
this.tema = tema;
}
public void CadastrarComentario() throws IOException {
try {
ComentarioDAO comentariodao = new ComentarioDAO();
comentariodao.Cadastrar(this.nome);
int c = comentariodao.pegarCod(this.nome);
comentariodao.CadastrarTemaComentario(cod, c);
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
} catch (Exception e) {
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
}
}
Coloca o seu código entre as tags [ code ] e [ /code ] (sem os espaços) para que a gente consiga analizar melhor, desta forma fica horrível de se ler.
Posta também seu TemaBean
Primeiro, os nomes dos MB devem ser com a primeira letra em minúsculo, pois são objetos. Com relação ao problema, deve estar acontecendo algum erro na fase de validação. Coloca um <h:messages/> para ver se algum erro é exibido.
@ManagedBean(name = "TemaBean")
@SessionScoped
public class TemaBean {
/**
* Creates a new instance of TemaBean
*/
public TemaBean() {
}
private int id;
private String descricao;
private List<SelectItem> selectTema;
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the descricao
*/
public String getDescricao() {
return descricao;
}
/**
* @param descricao the descricao to set
*/
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public TemaBean(int id, String descricao) {
this.id = id;
this.descricao = descricao;
}
public void Cadastrar() throws IOException {
try {
TemaDAO dao = new TemaDAO();
dao.Cadastrar(this.descricao);
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
} catch (Exception e) {
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
}
}
/**
* @return the selectTema
*/
public List<SelectItem> getSelectTema() {
selectTema = new ArrayList<SelectItem>();
TemaDAO dao = new TemaDAO();
List<TemaBean> listaTema = dao.listar();
for (TemaBean temaBean : listaTema) {
selectTema.add( new SelectItem(temaBean.id, temaBean.descricao));
}
return selectTema;
}
/**
* @param selectTema the selectTema to set
*/
public void setSelectTema(List<SelectItem> selectTema) {
this.selectTema = selectTema;
}
}
ComentarioBean
@ManagedBean(name = "ComentarioBean")
@RequestScoped
public class ComentarioBean {
private int cod;
private String nome;
private TemaBean tema;
/**
* @return the cod
*/
public int getCod() {
return cod;
}
/**
* @param cod the cod to set
*/
public void setCod(int cod) {
this.cod = cod;
}
/**
* @return the nome
*/
public String getNome() {
return nome;
}
/**
* @param nome the nome to set
*/
public void setNome(String nome) {
this.nome = nome;
}
public ComentarioBean() {
}
public ComentarioBean(int codComentario, String nomeComentario, TemaBean tema) {
this.cod = codComentario;
this.nome = nomeComentario;
this.tema = tema;
}
/**
* @return the tema
*/
public TemaBean getTema() {
return tema;
}
/**
* @param tema the tema to set
*/
public void setTema(TemaBean tema) {
this.tema = tema;
}
public void CadastrarComentario() throws IOException {
try {
ComentarioDAO comentariodao = new ComentarioDAO();
// comentariodao.Cadastrar(this.nome);
int c = comentariodao.pegarCod(this.nome);
comentariodao.CadastrarTemaComentario(cod, c);
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
} catch (Exception e) {
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
}
}
public List<ComentarioBean> listarTemaComentario() {
List<ComentarioBean> temaComentario = new ArrayList<ComentarioBean>();
ComentarioDAO comentariodao = new ComentarioDAO();
temaComentario = comentariodao.listarTemaComentario();
return temaComentario;
}
}
sim benignoms,
antes de tudo obrigado pela ajuda.
eu tentei colocar o messages mas não mostrou nenhuma mensagem, pode me indicar onde posso colocar?
e sobre os métodos, eu coloquei os nomes dos metodos em maiúsculo, e chamar com minusculo da um erro dizendo que não encontrou.
será que é isso?
Método é uma coisa objeto é outra. Mas eu vi que você nomeia os objetos com letra maiúscula(@ManagedBean(name = “TemaBean”)). No console do Glassfish/Tomcat não aparece nenhum erro?
[quote=midanaf]sim benignoms,
antes de tudo obrigado pela ajuda.
eu tentei colocar o messages mas não mostrou nenhuma mensagem, pode me indicar onde posso colocar?
e sobre os métodos, eu coloquei os nomes dos metodos em maiúsculo, e chamar com minusculo da um erro dizendo que não encontrou.
será que é isso?[/quote]
pois é, como falei sou novo e eu sabia que objeto começa com minusculo, mas pra te dizer a verdade eu não sabia que este @managedBean(name) era criando objeto. obrigado pela informação.
olha no glash fish da um Advertência.
Advertência: JSF1063: AVISO! Definindo valor de atributo não serializável em HttpSession (chave: TemaBean, classe do valor: jv.TemaBean).
só que como estou chamando uma tela de erro, no meu browse, vai pra tela de erro.
quando vou debugando, vejo que o tema.id é null
fiz uma alteração no metodo cadastrar no comentárioBean
public void CadastrarComentario() throws IOException {
try {
ComentarioDAO comentariodao = new ComentarioDAO();
comentariodao.Cadastrar(this.nome);
int c = comentariodao.pegarCod(this.nome);
comentariodao.CadastrarTemaComentario(tema.getId(), c);
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
} catch (Exception e) {
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
}
coloquei tema.getId() no luggar de cod, pois cod era o codigo de comentário. mas mesmo assim o tema vem null. é como se ele não seleciona o tema. será é algum problema com selectedItem?
Se vc estiver utilizando o netbeans, marque a variável que vc quer ver o valor como “novo observador”, indique um ponto de interrupção na linha que vc quer interromper a execução, depois execute no modo depurador. Daí fica clicando no ícone “Passar por dentro (F7)”…vc conseguirá ver passo a passo e execução do seu código.
não sei marcar varia=ável como novo observador. favor pode me dizer como fazer?
mas também já debuguei, só que o objeto tema ja vem null. não estou sabendo pegar dado do tema.
que estou listando no combobox
É só selecionar com o botão direito do mouse e escolher "novo observador" no objeto que vc quer ver os valores. Daí vc poderá visualizar as variáveis no console de saída. :)
Tenta utilizar a classe Converter (tem muitos exemplos por aí), isso pq sua lista é do tipo SelectItem . Um item de sua lista será convertido para um objeto da sua classe.
public List<SelectItem> getObjetos() {
if (objetoItens == null) {
objetoItens = new ArrayList<SelectItem>();
for (Objeto obj : seuDao.pegaTodos()) {
SelectItem item = new SelectItem(obj.getCodigo(), obj.getDescricao());
objetoItens.add(item);
}
}
return objetoItens;
}
Para isso:
<h:selectOneMenu value="#{TemaBean.id}">
<f:selectItems value="#{TemaBean.selectTema}" var=“tema” itemValue="#{tema.id}" itemLabel="#{tema.descricao}"/>
</h:selectOneMenu>
Outra coisa, vendo o selectTema tu tá usando o teu Managed Bean dentro de um list para popular a combo e isso é uma coisa horrivel. Tu tem q criar uma classe com id e descricao, chama ela de Tema, ela pode até ser uma entidade. Feito isso vc popula a List com Tema e não com TemaBean. Mas até ser que funcione, só que isso é feio.
O que tá acontecendo é o seguinte, tu tem uma combo preenchida com valores do getSelectTema, eles aparecem? Ai quando tu seleciona ele pega a propriedade itemValue, que eh ="#{TemaBean.id}" e tenta setar no value do combo que tb eh ="#{TemaBean.id}". Ou seja ambos são nulo. O q tu quer setar la é ="#{tema.id}" que ta na combo. Acredito que com isso ja funciona. Mas q tem codigo tá feio tá.
Pessoal muito obrigado,
na verdade de forma que estava a estrutura do meu trabalho ficaria dificil resolver. então com ajuda do Raphael, tirei os atributos do tema e coloquei numa classe (model). depois ficou mais fácil listar e pegar o codigo.
segue o ComentarioBean depois das mudanças
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package controler;
import dao.ComentarioDAO;
import dao.TemaDAO;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import model.Comentario;
import model.Tema;
/**
*
* @author Midana
*/
@ManagedBean(name = "comentarioBean")
@RequestScoped
public class ComentarioBean implements Serializable {
private Comentario comentario;
private List<SelectItem> selectTema;
private List<SelectItem> selectComentario;
public ComentarioBean() {
comentario = new Comentario();
}
public void CadastrarComentario() throws IOException {
try {
ComentarioDAO comentariodao = new ComentarioDAO();
comentariodao.Cadastrar(getComentario().getNome());
int c = comentariodao.pegarCod(getComentario().getNome());
comentariodao.CadastrarTemaComentario(Integer.parseInt(getComentario().getTema()), c);
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarSucesso.xhtml");
} catch (Exception e) {
FacesContext.getCurrentInstance().getExternalContext().redirect("CadastrarErro.xhtml");
}
}
public List<Comentario> listarTemaComentario() {
List<Comentario> temaComentario = new ArrayList<Comentario>();
ComentarioDAO comentariodao = new ComentarioDAO();
temaComentario = comentariodao.listarTemaComentario();
return temaComentario;
}
/**
* @return the selectTema
*/
public List<SelectItem> getSelectTema() {
selectTema = new ArrayList<SelectItem>();
TemaDAO dao = new TemaDAO();
List<Tema> listaTema = dao.listar();
for (Tema tema : listaTema) {
selectTema.add(new SelectItem(tema.getId(), tema.getDescricao()));
}
return selectTema;
}
/**
* @return the comentario
*/
public Comentario getComentario() {
return comentario;
}
/**
* @param comentario the comentario to set
*/
public void setComentario(Comentario comentario) {
this.comentario = comentario;
}
public List<SelectItem> getSelectComentario() {
selectComentario = new ArrayList<SelectItem>();
ComentarioDAO dao = new ComentarioDAO();
List<Comentario> listaComenatario = dao.listarTemaComentario();
for (Comentario comentarios : listaComenatario) {
selectComentario.add(new SelectItem(comentarios.getNome(), comentarios.getTema()));
}
return selectComentario;
}
}