6
respostas

tags JSF

Caros,

Estou implementando algumas tags do JSF e quando abro a página no navegador esses novos campos não são renderizados. Tenho uma "fieldset" com os dados do livro, mas ao fazer uma com os dados do autor a mesma não aparece. Alguém já passou por isso ou conseguiria me ajudar?

Segue meu arquivo 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:ui="http://xmlns.jcp.org/jsf/facelets"
                         xmlns:f="http://java.sun.com/jsf/core">

    <h:body>
        <h1>Novo Livro</h1>
        <h:form>
            <fieldset>
                <legend>Dados do Livro</legend>
                    <h:panelGrid columns="2">

                        <h:outputLabel value="Titulo:" for="titulo" />
                            <h:inputText  id="titulo" value="#{livroBean.livro.titulo}"/>
                        <h:outputLabel value="ISBN:" for="isbn"/>
                            <h:inputText id="isbn" value="#{livroBean.livro.isbn}"/>
                        <h:outputLabel value="Preco:" for="preco" />
                            <h:inputText id="preco" value="#{livroBean.livro.preco}"/>
                        <h:outputLabel value="DataLancamento:" for="dataLancamento"/>
                            <h:inputText id="dataLancamento" value="#{livroBean.livro.dataLancamento}"/>
                        <h:commandButton value="gravar" action="#{livroBean.gravar}" />
                    </h:panelGrid>
            </fieldset>
        </h:form>

        <h:form>    
            <fieldset>
                <legend>Dados do Autor</legend>

                    <h:outputLabel value="Selecione Autor" for="autor"/>
                        <h:selectOneMenu value="#{livroBean.autorId}" id="autor"/>
                            <f:selectItem value="#{livroBean.autores}" var="autor" itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>
                                <h:commandButton value="gravar" action="#{livroBean.gravarAutor}"/>

                                    <h:dataTable value="#{livroBean.autoresDoLivro}" var="autor">
                                        <h:column>
                                            <h:outputText value="#{autor.nome}"/>
                                        </h:column>
                                    </h:dataTable>

            </fieldset>
        </h:form>            
    </h:body>
</html>
6 respostas

Matheus não sei se faz sentido mais no seu html tem um erro no selectOneMenu, acredito que não faz diferença alguma, mais só testa para ver.

O jeito que você ta fazendo está invalido.

 <h:selectOneMenu value="#{livroBean.autorId}" id="autor"/>
                            <f:selectItem value="#{livroBean.autores}" var="autor" itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>
                                <h:commandButton value="gravar" action="#{livroBean.gravarAutor}"/>

Faz assim

 <h:selectOneMenu value="#{livroBean.autorId}" id="autor"> // Aqui não fecha tira  a /
                            <f:selectItem value="#{livroBean.autores}" var="autor" itemLabel="#{autor.nome}" itemValue="#{autor.id}"/>
</h:selectOneMenu> // fecha aqui
                                <h:commandButton value="gravar" action="#{livroBean.gravarAutor}"/>

Alisson, Obrigado pela dica, mas ainda não resolveu. Notei aqui que a renderização não é apenas nos novos campos, fiz pequenas alterações nos campos anteriores e também não estão sendo renderizados.

Matheus, se você colocar aqui também as classes referentes ao #{livroBean} e #{autor} talvez isso ajude a identificar o problema.

Uma dica.. se há algum problema nas classes bem provável que estes erros estejam aparecendo no console.

Matheus posta a sua classe bean e a modelo

Alisson, as classes abaixo estão conforme o primeiro curso de JSF da Carreira JavaEE.

LivroBean:

package br.com.caelum.livraria.bean;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;
import br.com.caelum.livraria.modelo.Livro;

@ViewScoped
@ManagedBean
public class LivroBean {

    private Livro livro = new Livro();

    public Livro getLivro() {
        return livro;
    }

    public List<Autor> getAutoresDoLivro(){
        return this.livro.getAutores();
    }

    public void gravar() {
        System.out.println("Gravando livro " + this.livro.getTitulo());

        if (livro.getAutores().isEmpty()) {
            throw new RuntimeException("Livro deve ter pelo menos um Autor.");
        }

        new DAO<Livro>(Livro.class).adiciona(this.livro);
    }

}

AutorBean:

package br.com.caelum.livraria.bean;

import javax.faces.bean.ManagedBean;

import br.com.caelum.livraria.dao.DAO;
import br.com.caelum.livraria.modelo.Autor;

@ManagedBean
public class AutorBean {

    private Autor autor = new Autor();

    public Autor getAutor() {
        return autor;
    }

    public void gravar() {
        System.out.println("Gravando autor " + this.autor.getNome());

        new DAO<Autor>(Autor.class).adiciona(this.autor);
    }
}

Model Livro:

package br.com.caelum.livraria.modelo;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Livro {

    @Id
    @GeneratedValue
    private Integer id;

    private String titulo;
    private String isbn;
    private double preco;
    private String dataLancamento;

    @ManyToMany
    private List<Autor> autores = new ArrayList<Autor>();

    public List<Autor> getAutores() {
        return autores;
    }

    public void adicionaAutor(Autor autor) {
        this.autores.add(autor);
    }

    public Livro() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public double getPreco() {
        return preco;
    }

    public void setPreco(double preco) {
        this.preco = preco;
    }

    public String getDataLancamento() {
        return dataLancamento;
    }

    public void setDataLancamento(String dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

}

Model Autor:

package br.com.caelum.livraria.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Autor {

    @Id
    @GeneratedValue
    private Integer id;
    private String nome;

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

Se você pretende renderizar uma lista de opções no seu SelectOneMenu deverá utilizar a tag selectItems (no plural) ao invés de selectItem.

Veja esse exemplo que eu copiei de um projeto meu (no caso, estou utilizando do primefaces):

<p:selectOneMenu id="restaurante" value="#{votacaoController.voto.restaurante}" converter="#{restauranteConverter}" required="true" filter="true" filterMatchMode="contains" style="width: 165px">
    <f:selectItem itemLabel="(Selecione)" itemValue="#{null}" noSelectionOption="true" />
    <f:selectItems value="#{votacaoController.restaurantes}" var="r" itemLabel="#{r.nome}" itemValue="#{r}"/>
</p:selectOneMenu>

Ignore o converter no meu exemplo, ele foi preciso pois eu estou selecionando o próprio objeto, e não o seu id.

Outro ponto importante: o seu SelectOneMenu está configurado para armazenar o valor na variável "#{livroBean.autorId}", porém a classe LivroBean não possui os métodos getAutorId e setAutorId.