JSF ajuda!

19 respostas
Deluxe

Fala galera
me ajudem por favor

não estou conseguindo fazer meu método alterar e excluir..
ai vai

Conexão

package br.com.intacto;

import java.sql.*;

public class Conexao {
	public static String status="";
	public static Connection obterConexao() throws InstantiationException, IllegalAccessException{
	Connection con = null;
	
	try {
	Class.forName("com.mysql.jdbc.Driver").newInstance();
	String url = "jdbc:mysql:///jsf?user=root&password=1234";
	con = DriverManager.getConnection(url);
	status = "Conexao Aberta";

	} 
	catch (ClassNotFoundException e) {
	e.printStackTrace();
	} 

	catch (SQLException e) {
	e.printStackTrace();
	}
	
	return con;
	}
}

Método Incluir

public void incluir () throws InstantiationException, IllegalAccessException{
		
		Connection cn = Conexao.obterConexao();
		PreparedStatement pst = null;
		try{
			pst = cn.prepareStatement("insert into usuarios(login,nome,senha) values(?,?,?)");
			pst.setString(1, nome);
			pst.setString(2, login);
			pst.setString(3, senha);
			pst.executeUpdate();
			status = nome + " Incluido com Sucesso ";
			}
		catch (SQLException e ){
			status = " Falha na inclusão: " + e.getMessage();
		}
		
	}

O método incluir funciona perfeitamente.. to usando chave primaria chamada (idusuario)
Como ficaria meu método excluir e alterar??
Obrigado

19 Respostas

e-cowboy

Cara, os atributos nome, login e senha são atributos de classe? bom se for, dá pra usar a mesma idéia que você usou para fazer os próximos:

public void excluir() throws InstantiationException, IllegalAccessException{   
           
        Connection cn = Conexao.obterConexao();   
        PreparedStatement pst = null;   
        try{   
            pst = cn.prepareStatement("delete from usuarios where login=?");   
            pst.setString(1, login);   
            pst.executeUpdate();   
            status = login + " Excluído com Sucesso ";   
            }   
        catch (SQLException e ){   
            status = " Falha na exclusão: " + e.getMessage();   
        }   
           
    }

Bom,nesta sugestão eu utilizei o campo login pois presumo que seja um campo unique em sua tabela, mas o ideal seria utilizar a chave primária (idusuario). Também recomendaria criar uma classe especializada em transações separada do modelo, pelo que parece você utiliza uma classe para as duas coisas!
Bem, são só sugestões ok!
Até!

TeiTei

O que isso tem relacionado com JSF?

Deluxe

Entao velho

é melhor ter a classe bean e uma classe com os métodos em geral (incluir, excluir, alterar) ??

ta tudo em uma classe vo fazer isso q vc falo…
vlw

Deluxe

so uma coisa
esse método excluir não teria que ter parametro? pq a pessoa digitaria na pagina jsp e chamaria o método..
olha minha pagina excluir e ve se é assim mesmo..

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> 
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> 
<html> 
    <head>
        <title>JSF</title>
        <link href="estilo.css" type="text/css" rel="stylesheet">
    </head>
    <body> 
        <f:view> 
            <h:form>
                <center><h2> Excluir Usuario </h2></center>
                <table align="center">
                    <tr>
                      
			
			 <tr>
                        <td>ID</td>
                        <td><h:inputText value="#{usuarios.login}"/></td>
                    </tr>
			  <tr>
                    <tr><td colspan="2" align="center">
                            <h:commandButton value="Excluir" action="#{usuarios.excluir}"/>
                            
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2">
                            <h:outputText id="resultado" value="#{usuarios.status}" />
                        </td>
                    </tr>
                </table>
            </h:form>
 
            
        </f:view> 
    </body> 
</html>
Deluxe

ele da esse erro..
oq poderia ser??

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: #{usuarios.excluir}: javax.faces.el.MethodNotFoundException: excluir: br.com.intacto.Usuarios.excluir()
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

root cause

javax.faces.FacesException: #{usuarios.excluir}: javax.faces.el.MethodNotFoundException: excluir: br.com.intacto.Usuarios.excluir()
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)
	javax.faces.component.UICommand.broadcast(UICommand.java:312)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

root cause

javax.faces.el.MethodNotFoundException: excluir: br.com.intacto.Usuarios.excluir()
	com.sun.faces.el.MethodBindingImpl.method(MethodBindingImpl.java:206)
	com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:124)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:72)
	javax.faces.component.UICommand.broadcast(UICommand.java:312)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.
Apache Tomcat/6.0.16
e-cowboy

em seu Usuarios não existe o método excluir!
Cara como você fez o incluir funcionar? o excluir funciona do mesmo modo! De onde você obtêm os dados para incluir?

Deluxe

ta dando o mesmo erro..
e existe o método excluir normalmente na classe Usuarios igual o método Incluir

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: #{usuarios.excluir}: javax.faces.el.MethodNotFoundException: excluir: br.com.intacto.Usuarios.excluir()
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

root cause

javax.faces.FacesException: #{usuarios.excluir}: javax.faces.el.MethodNotFoundException: excluir: br.com.intacto.Usuarios.excluir()
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:74)
	javax.faces.component.UICommand.broadcast(UICommand.java:312)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

root cause

javax.faces.el.MethodNotFoundException: excluir: br.com.intacto.Usuarios.excluir()
	com.sun.faces.el.MethodBindingImpl.method(MethodBindingImpl.java:206)
	com.sun.faces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:124)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:72)
	javax.faces.component.UICommand.broadcast(UICommand.java:312)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:267)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:381)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:75)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:90)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.
Apache Tomcat/6.0.16

Método Excluir

public void excluir() throws InstantiationException, IllegalAccessException{     
	                
	            Connection cn = Conexao.obterConexao();     
	            PreparedStatement pst = null;     
	            try{     
	                pst = cn.prepareStatement("delete from usuarios where login=?");     
	             pst.setString(1, login);     
	             pst.executeUpdate();     
	              status = login + " Excluído com Sucesso ";     
	              }     
	           catch (SQLException e ){     
	               status = " Falha na exclusão: " + e.getMessage();     
	           }     
	            

}
e-cowboy

experimenta fazer o seguinte muda o retorno do excluir de void para String!!! a assinatura para métodos action chamados do jsp deve ter o retorno uma String!

Deluxe

sim sim…
se não o método incluir dava problema e está funcionando perfeitamente
não descobrir a solução ainda desse problema

Deluxe

e cowboy

assim??
public String excluir() throws InstantiationException, IllegalAccessException{     
	                
	            Connection cn = Conexao.obterConexao();     
	            PreparedStatement pst = null;     
	            try{     
	                pst = cn.prepareStatement("delete from usuarios where login=?");     
	             pst.setString(1, login);     
	             pst.executeUpdate();     
	              status = login + " Excluído com Sucesso ";     
	              }     
	           catch (SQLException e ){     
	               status = " Falha na exclusão: " + e.getMessage();     
	           }
				return login;     
	            

}

deu o mesmo erro!

e-cowboy

Então, você pode postar o código do br.com.intacto.Usuarios?
Só pra gente dar uma conferida! tá meio vago, tem algumas variáveis fantasmas ai que eu não entendi direito!

Deluxe
package br.com.intacto;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;


public class Usuarios {

    private int idUsuario = 0;
    private String nome = "";
    private String login = "";
    private String senha = "";
    private String status = "";

 
	public int getIdUsuario() {
		return idUsuario;
	}
	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public void setNome(String nome){
        this.nome = nome;
    }
    public String getNome(){
        return this.nome;
    }
    public void setLogin(String login){
        this.login = login;
    }
    public String getLogin(){
        return this.login;
    }

    public void setSenha(String senha){
        this.senha = senha;
    }
    public String getSenha(){
        return this.senha;
    }
    public String getStatus(){
        return this.status;
    }

	public void incluir () throws InstantiationException, IllegalAccessException{
		
		Connection cn = Conexao.obterConexao();
		PreparedStatement pst = null;
		try{
			pst = cn.prepareStatement("insert into usuarios(login,nome,senha) values(?,?,?)");
			pst.setString(1, nome);
			pst.setString(2, login);
			pst.setString(3, senha);
			pst.executeUpdate();
			status = nome + " Incluido com Sucesso ";
			}
		catch (SQLException e ){
			status = " Falha na inclusão: " + e.getMessage();
		}
		
	}

   public String verificarUsuario() throws InstantiationException, IllegalAccessException{
   
        Connection cn = Conexao.obterConexao();
        
        try {
            String q = "";
            q = " select idusuario, nome from usuarios where login = ? and senha = ? ";
            PreparedStatement pst  = cn.prepareStatement(q);
			pst.setString(1, login);
            pst.setString(2, senha);

            ResultSet rs = pst.executeQuery();
			if(rs.next()){
				idUsuario = rs.getInt("idusuario");
				nome = rs.getString("nome");
				status = nome + " localizado!";
            	return "cadastrado";
			}
			else{
				status = "Login incorreto!";
				return "naocadastrado";
			}
        } catch (SQLException e) {
            status = " Falha: " + e.getMessage();
            return "falha";
        }
   }
        
   public ResultSet getLista() throws InstantiationException, IllegalAccessException  {
		ResultSet	rs = null;
		Connection cn = Conexao.obterConexao();
		PreparedStatement pst = null;
		try{
			pst =   cn.prepareStatement("select idusuario, nome from usuarios");
			rs =   pst.executeQuery();
			
		} catch (SQLException e) {
			// TODO: handle exception
		}
		return rs;
	}  
	     
	      
   public String excluir() throws InstantiationException, IllegalAccessException{     
	                
	            Connection cn = Conexao.obterConexao();     
	            PreparedStatement pst = null;     
	            try{     
	                pst = cn.prepareStatement("delete from usuarios where login=?");     
	             pst.setString(1, login);     
	             pst.executeUpdate();     
	              status = login + " Excluído com Sucesso ";     
	              }     
	           catch (SQLException e ){     
	               status = " Falha na exclusão: " + e.getMessage();     
	           }
				return login;     
	            

}
}
e-cowboy

Caramba, tá até com uma cara boa seu action, em seu faces-config.xml existe o mapeamento ?

<managed-bean>
  <managed-bean-name>usuarios</managed-bean-name>
  <managed-bean-class>br.com.intacto.Usuarios</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Eu tinha problemas deste tipo, que aparentemente estava tudo correto e não funcionava quando retirava projetos do CVS, o build-path do projeto não estava correto, dai eu alterava o .java e ele não criava o .class!
Se o mapeamento estiver correto, testa modificar o metodo incluir e testar para ver se está dando certo a compilação e tals!

Deluxe

nada
cara
so da nullnot la
=\

Deluxe

ai conseguir
como seria a url jdbc pra update??

e-cowboy

Acredito que deve ser a mesma para todas as operações, insert, update…
Cara, mata minha curiosidade, o que estava acontecendo de errado?

V

Cara, olha só, eu tive o mesmo problema (a mesma exceção):

javax.faces.el.MethodNotFoundException /principal.xhtml @33,107 action="#{PersonBean.geraEntidade}": Method not found: [email removido]() at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:71)

No meu caso, depois de olhar em um monte de lugares e perder quase uma tarde só com isso aqui, eu resolvi o problema com estas mudanças:

O Botão que eu estou usando tem o código abaixo:

<h:commandButton value="Cadastrar" action="#{PersonBean.geraEntidade}"/>

Ou seja, através do campo action, eu referencio o método geraEntidade que está no bean PersonBean. No entanto, o campo action é utilizado comumente para efetuar navegação. Então é de se esperar que o método que está sendo referenciado retorne um String e que este String represente uma regra de navegação presente em seu faces-config.xml. Assim, a primeira coisa que fiz foi mudar a assinatura do método para retornar uma String que represente uma regra de navegação.

Ainda assim, eu não havia conseguido resolver o problema. Mas isto foi apenas uma herança de uma tentativa frustrada de usar o actionListener. Eu havia colocado como argumento do meu método o trecho ‘javax.faces.event.ActionEvent e’ para sinalizar que o método estava recebendo um método para ser tratado. Ou seja, meu método estava recebendo um parâmetro o que fazia com que a assinatura não batesse com o método chamado pelo action. Quando se utiliza actionListener, é natural que as assinaturas dos métodos nos beans tenham parâmetros mas que os métodos não tenham argumentos quando são chamados no campo (ex.: <h:commandButton actionListener=“Bean.metodo”/> e o Bean ter um método public void metodo(javax.faces.event.ActionEvent e) {…}). Me parece que há até mais argumentos do que isso para usar ActionListener.

Em resumo:

  1. Se uso action, é aconselhável definir uma regra de navegação correspondente;
  2. Checar a assinatura do método. Do que eu vi de problemas aí nos fóruns, a maioria dos ‘javax.faces.el.MethodNotFoundException’ deve-se à assinatura do método no bean que não está condizente com o que é especificado na página JSF/XHTML ou mesmo a fazer uma chamada como action="#{Bean.metodo" (esquecendo de fechar a chave, por exemplo).

É isso aí! Flws!

Kamikaze

a string de conexão esta certa?

String url = "jdbc:mysql:///jsf?user=root&password=1234";

Kamikaze

Pra mim ela é nova…nunca vi uma igual heheheheh.

mas se funciona…

Criado 27 de maio de 2008
Ultima resposta 27 de mai. de 2008
Respostas 19
Participantes 5