Erros JSF 2.0 - dúvidas de inciante

11 respostas
J

Pessoal,

Estou começando a aprender JSF 2.0, mas não estou achando muito material.
Fiz um Bean pra controlar e um XHTML para listar tudo, ficou assim:

index.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">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Teste<br />
        <h:commandLink action="#{controleUsuario.usuarios}" value="Usuários" />
    </h:body>
</html>
UsuarioControle(Managed Bean)
package catalogo.controle;

import java.util.List;
import org.hibernate.Session;
import catalogo.dao.GenericDAO;
import catalogo.dao.UsuarioDAO;
import catalogo.util.HibernateUtil;
import catalogo.modelo.Usuario;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="controleUsuario")  
@RequestScoped
public class UsuarioControle {

    private Usuario usuario = new Usuario();
    private List<String> suggest;
    private int codigo;
    private Session session = HibernateUtil.getSession();
    GenericDAO<Usuario> dao = new GenericDAO<Usuario>(session, Usuario.class);

    public UsuarioControle() {
        if(this.usuario == null) {
		this.usuario = new Usuario();
        }
    }

    public String Salvar() {
        dao.Salvar(this.usuario);
        this.usuario = new Usuario();
        return "CadastradoSucesso";
    }

    public String Atualizar() {
        dao.Atualizar(usuario);
        this.usuario = new Usuario();
        return "AtualizadoSucesso";
    }

    public String Excluir() {
        usuario.setCodigo(codigo);
        dao.Excluir(usuario);
        this.usuario = new Usuario();
        return "RemovidoSucesso";
    }

   public String Carregar() {
        UsuarioDAO usuarioDAO = new UsuarioDAO(session, Usuario.class);

        this.usuario = usuarioDAO.PesquisarUsuarioPeloCodigo(this.codigo);
        return "PesquisaSucesso";
    }

    public List<Usuario> getUsuarios() {
        return dao.Listar();
    }

    public List<String> suggest(String busca) {
        UsuarioDAO usuarioDAO = new UsuarioDAO(session, Usuario.class);

        return usuarioDAO.findByNameSuggest(busca);
    }

    public Usuario getUsuario() {
            return usuario;
    }

    public void setUsuario(Usuario usuario) {
            this.usuario = usuario;
    }

    public int getCodigo() {
            return codigo;
    }

    public void setCodigo(int codigo) {
            this.codigo = codigo;
    }
}

Quando vou rodar esse teste simples, aparece a seguinte mensagem:

Usuários: Este link está desativado, pois não está aninhado em um formulário JSF.

Alguem pode me ajudar?
Não sei se esta faltando alguma coisa, pelo que vi no JSF 2.0 nao precisa configurar o web.xml e nao precisa ter o faces-config.xml, eu ja fiz minha classe Usuario (modelo), UsuarioDAO tambem.

11 Respostas

H

Eu ainda não usei e também não sei como está o JSF 2.0.
Tenta colocar o teu commandLink dentro de um form.

J

Falta de atenção total.
Agora o link está funcionando (ativo), tinha que colocar dentro de um form mesmo. porém quando eu clico no meu link me aparedce o seguinte erro:

javax.el.MethodNotFoundException: /index.xhtml @11,84 action="#{controleUsuario.usuarios}": Method not found: [email removido]()

J

Pessoal, meu arquivo xhtml de teste, ficou assim:

<h:body>
        <h:form>
            <h:commandLink action="#{controleUsuario.Carregar}" value="Usuários" />
            <br />
            <h:inputText value="#{controleUsuario.usuario}" />
        </h:form>
    </h:body>

Quando eu clico no link criado, aparece a seguinte mensagem:

?Erro de conversão ao definir o valor ‘catalogo.modelo.Usuario[codigo=null]’ para ‘null Converter’.

E o campo texto fica assim:

atalogo.modelo.Usuario[codigo=null]

H

Deixa eu ver se eu entendi.

Você clica no link Usuários, carrega um Usuario buscando pelo código.
Onde você vai exibir esse usuário?
Que valor você passa na linha 50 da classe UsuarioControle?

Coloca printStackTrace() do erro.

J

Como estou testando e aprendendo, vou listar os usuários nessa página mesmo. Mas porque? Tenho que listar em outra página? Estou perdido, primeira vez que mexo com, JSF 2.0.
Ainda nao entendi tambem como vou passar esse codigo para carregar o Usuario, faço isso por essa pagina xhtml? Tem como me exemplificar como posso carregar e depois listar.
A única mensagem que aparece é essa que mostrei, como posso mostrar a mensagem do StackTrace?

H
public class Usuario {
	
	private Long codigo;
	private String nome;
	private String login;
	
	// colocar as anotacoes do hibernate
	
	// gerar getters e setters
}

Aqui você tem que alterar de acordo com as suas necessidades

public class UsuarioControle {

	private Usuario usuario = new Usuario();
	private List&lt;Usuario&gt; lusuarios;
	
	private Session session = HibernateUtil.getSession();
	GenericDAO&lt;Usuario&gt; dao = new GenericDAO&lt;Usuario&gt;(session, Usuario.class);

	public UsuarioControle() {
		if (this.usuario == null) {
			this.usuario = new Usuario();
		}
	}

	public void Carregar(ActionEvent event) {
		UsuarioDAO usuarioDAO = new UsuarioDAO(session, Usuario.class);
                //Aqui voce consulta pelo nome do usuario
                // o seu metodo tera que retornar uma lista de usuarios 
		lusuarios = usuarioDAO.PesquisarUsuarioPeloNome(usuario.getNome());		
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List&lt;Usuario&gt; getLusuarios() {
		return lusuarios;
	}

	public void setLusuarios(List&lt;Usuario&gt; lusuarios) {
		this.lusuarios = lusuarios;
	}	
}

Se você já usa richfaces não terá problema, e se não usa essa é uma boa hora para começar.
Dá uma pesquisada sobre richfaces.

&lt;h:form id="formUsuario"&gt;
&lt;rich:panel&gt;

&lt;h:inputText value="#{usuarioControle.usuario.nome}" id="nomeUsuario" style="width: 210px;"/&gt;
&lt;a4j:commandLink valeu="Consultar" actionListener="#{controleUsuario.Carregar}" reRender="lista"/&gt;

&lt;rich:dataTable value="#{controleUsuario.lusuarios}" var="usuario" border="1"
     align="center" id="lista" rows="10" width="900px"&gt;
																
	&lt;rich:column width="70px"&gt;
		&lt;f:facet name="header"&gt;
			&lt;h:outputText value="Codigo" /&gt;
		&lt;/f:facet&gt;
			&lt;h:outputText value="#{usuario.codigo}"  /&gt;
	&lt;/rich:column&gt;
					
	&lt;rich:column width="460px"&gt;
		&lt;f:facet name="header"&gt;
			&lt;h:outputText value="Nome" /&gt;
		&lt;/f:facet&gt;
			&lt;h:outputText value="#{usuario.nome}"  /&gt;
	&lt;/rich:column&gt;
															
	&lt;rich:column width="260px"&gt;
		&lt;f:facet name="header"&gt;
			&lt;h:outputText value="Login" /&gt;
		&lt;/f:facet&gt;
			&lt;h:outputText value="#{usuario.login}"  /&gt;					
	&lt;/rich:column&gt;
	
	&lt;f:facet name="footer"&gt;
		&lt;rich:datascroller for="lista" maxPages="5" /&gt;
	&lt;/f:facet&gt;
&lt;/rich:dataTable&gt;				
&lt;/rich:panel&gt;		
&lt;/h:form&gt;
J

Esta dando esse erro:

The prefix “rich” for element “rich:panel” is not bound

Tenho que declar a taglib como no jsf 1.2?

H

Olá. Você tem que dar uma pesquisada sobre richfaces.
Você tem que baixar os .jars aqui:
http://www.jboss.org/richfaces/download.html

Colocar os jars no classpath da tua aplicação e depois configurar o web.xml .
Ficará mais ou menos assim:

&lt;context-param&gt;
		&lt;param-name&gt;org.richfaces.SKIN&lt;/param-name&gt;		   	 
    	&lt;param-value&gt;classic&lt;/param-value&gt;   	
	&lt;/context-param&gt;
	&lt;context-param&gt;
		&lt;param-name&gt;org.richfaces.CONTROL_SKINNING&lt;/param-name&gt;
		&lt;param-value&gt;enable&lt;/param-value&gt;
	&lt;/context-param&gt;	
	&lt;context-param&gt;
		&lt;param-name&gt;org.ajax4jsf.VIEW_HANDLERS&lt;/param-name&gt;
		&lt;param-value&gt;com.sun.facelets.FaceletViewHandler&lt;/param-value&gt;
	&lt;/context-param&gt;
	&lt;filter&gt;
		&lt;display-name&gt;Ajax4jsf Filter&lt;/display-name&gt;
		&lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
		&lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
	&lt;/filter&gt;
	&lt;filter-mapping&gt;
		&lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
		&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
		&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
	&lt;/filter-mapping&gt;

Aqui tem quase tudo o que você precisa.
http://livedemo.exadel.com/richfaces-demo/index.jsp

Já que você está aprendendo jsf eu te aconselharia a usar também o richfaces.
Sua produtividade irá aumentar muito.

Qualquer dúvida é só perguntar.

J

Olá pessoal,

O Edson Gonçalves, famoso autor de livros sobre Java, tem um blog que iniciou uma série sobre JSF 2.0:
http://www.edsongoncalves.com.br/2010/01/18/javaserver-faces-2-0-na-pratica-parte-1/

Acho que isso já ajudará quem é iniciante e não está encontrando materiais mais didáticos sobre o assunto na Internet no nosso idioma.

J

Valeu
Vou dar uma olhada
Abraços.

M

acrescentando…
:slight_smile:
http://www.guj.com.br/posts/list/204341.java

Criado 4 de fevereiro de 2010
Ultima resposta 19 de mai. de 2010
Respostas 11
Participantes 4