Duvida jsf

11 respostas
G
To começando com jsf, no momento o cenario é o seguinte: tenho uma pagina login.jsp
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <f:view>
        <head>
            
            <link href="styles.css" rel="stylesheet" type="text/css"/>
            <title><h:outputText value="#{msgs.loginTitulo}"/></title>
        </head>
        <body>
            <h:form styleClass="login">            
                <h:outputText styleClass="cabecalho" value="Login"/>
                <table>
                    <tr>
                        <td><h:outputText value="Username"/></td>
                        <td><h:inputText  value="#{user.userName}" size="15"/></td>
                    </tr>
                    <tr>
                        <td><h:outputText value="Password"/></td>
                        <td><h:inputSecret value="#{user.password}"  size="15"/></td>
                    </tr>
                </table>
                <p><h:commandButton value="Entrar" action="#{login.verficar}"/></p>
            </h:form>   
        </body>
    </f:view>
</html>

um managed-bean :

package com.metaway.bean;

import com.metaway.bd.ConnectionFactory;


public class UserBean {
   
    private String userName;
    private String password;
    
    public String getPassword() {
        System.out.println("password="+password);
        return password;
    }
    
    public void setPassword(String password) {
        System.out.println("password="+password);
        this.password = password;
    }
    
    public String getUserName() {
        System.out.println("username= "+userName);
        return userName;
    }
    
    public void setUserName(String userName) {
        System.out.println("username= "+userName);
        this.userName = userName;
    }
    
}

uma classe que conecta ao banco ...

package com.metaway.bd;

import java.sql.*;


public class ConnectionFactory {
    private static String url="jdbc:postgresql://localhost:5432/login";
    private static String user="postgres";
    private static String pass="xxxx";
    
    public static Connection getConnection() throws SQLException {
        try {
            Class.forName("org.postgresql.Driver");
            return DriverManager.getConnection(url,user,pass);
        } catch (ClassNotFoundException e) {
            throw new SQLException(e.getMessage());
        }
    }
    
}
e uma classe UserDAO que deveria pegar a conexao (ConnectionFactory.java), os dados do managed-bean (UserBean.java) fazer um select no banco e comparar oq foi digitado no input com oq esta no banco, retornando "success" ou "failure".
<?xml version='1.0' encoding='UTF-8'?>


<!DOCTYPE faces-config PUBLIC
  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config>
    <!-- REGRA DE NAVEGAÇÃO -->
    <navigation-rule>
        <from-view-id>/login.jsp</from-view-id>
        <navigation-case>
            <from-outcome>succses</from-outcome>
            <to-view-id>/index.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>failure</from-outcome>
            <to-view-id>/login.jsp</to-view-id>
            <redirect/>
        </navigation-case>        
    </navigation-rule>
    
    <!-- MANAGED BEANS -->
    <managed-bean>
        <managed-bean-name>login</managed-bean-name>
        <managed-bean-class>com.metaway.dao.UserDAO</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    
    <managed-bean>
        <managed-bean-name>user</managed-bean-name>
        <managed-bean-class>com.metaway.bean.UserBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

  
</faces-config>

qnd executo ganho um null pointer bem bonito na tela :D

javax.servlet.ServletException: #{login.verficar}: javax.faces.el.EvaluationException: java.lang.NullPointerException

alguem me da alguma luz ?

11 Respostas

T

Tá, mas aonde? Neste ou em outro managed bean está o método verificar???

G

foi mal esqueci :stuck_out_tongue:

package com.metaway.dao;


import com.metaway.bd.ConnectionFactory;
import com.metaway.bean.UserBean;
import java.sql.*;


public class UserDAO {
    Connection c;
    UserBean userbean;
    public String verficar() throws SQLException{
        
        System.out.println("UserDAO_password= "+userbean.getPassword());
        System.out.println("UserDAO_username= "+userbean.getUserName());
        try {
            System.out.println("criando conexao......");
            c = ConnectionFactory.getConnection();
            System.out.println("conectado!!!");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        System.out.println("preparando query....");
        System.out.println("nome de usuario: "+userbean.getUserName());
        PreparedStatement stmt = this.c.prepareStatement("select username from user where" +
                "username ='"+userbean.getUserName()+"'");
        
        //executando query
        System.out.println("executando query...");
        ResultSet rs = stmt.executeQuery();
        System.out.println("querry executada: "+rs.next());
        
        
        //Comparando dados
        if((!rs.getString("username").isEmpty())&(rs.getString("username").equals(userbean.getUserName()))){
            return "success";
        }else return "failure";
        
    }
}
T

ah vc ta fazendo referência de um MB par ao outro… O que vai garantir qual instância de qual MB vc vai recevber em userDao.userBean?

G

pois eh, é justamente ai que eu estou me perdendo. Como eu falei, a intenção é pegar o conteudo do mb UserBean e comparar com oq vem do banco com o UserDAO.

talvez c eu pegasse o contexto da aplicação?

1. FacesContext fc = FacesContext.getCurrentInstance();
Luiz_Gustavo

Olá guimoz,

userbean não está instanciado dentro do método verificar, por isso o nullPointer.
Experimente passar o userbean como parâmetro para o método verificar.

Abraços!

T

Faça um POJO com os dados do usuário e coloque dentro do loginMb. Faça a referência da página JSF via EL assim: “#{loginMb.usuario.atributo}”.

Luiz_Gustavo

Humm… me desculpe.
Agora que olhei melhor o trecho que você enviou. O método verificar é chamado através da ação do componente.
Neste caso o melhor seria pegar a isntância do MB da sessão (uma vez que esse é o escopo dele):

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
session.getAttribute("user");

Creio que é isto.

Eu, particularmente, criaria um pojo para armazenar os dados vindos da página. Chamaria, a partir da ação da página um método no MB pra popular esse pojo, e apartir do MB chamaria o método de validação, passando o pojo como parâmetro. Mas como disse isso é o que eu faria :wink:

Boa sorte!

G

Humm… me desculpe.
Agora que olhei melhor o trecho que você enviou. O método verificar é chamado através da ação do componente.
Neste caso o melhor seria pegar a isntância do MB da sessão (uma vez que esse é o escopo dele):

view plaincopy to clipboardprint?

  1. FacesContext facesContext = FacesContext.getCurrentInstance();
  2. HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
  3. session.getAttribute(“user”);

FacesContext facesContext = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); session.getAttribute(“user”);

Creio que é isto.

Eu, particularmente, criaria um pojo para armazenar os dados vindos da página. Chamaria, a partir da ação da página um método no MB pra popular esse pojo, e apartir do MB chamaria o método de validação, passando o pojo como parâmetro. Mas como disse isso é o que eu faria

Boa sorte!

hmm essa ideia me parece mais … “correta” …
ao meu ver chamar o contexto da app fica mto … gambi :stuck_out_tongue:

vo testar e qql coisa posto aki

vlw ^^

Luiz_Gustavo

hehehhe…
pode estar certo de que chamar o contexto na aplicação é bem comum, mas não para casos como este.
Fica frio! Como você mesmo disse, está começando com JSF agora. É comum se deparar com situações assim.
Eu não sou nenhum expert (eu nunca me atreveria a dizer isso, mesmo que soubesse muito), mas trabalho bastante com JSF, com várias implementações (Myfaces, Richfaces, o “falecido” Woodstock).
Sempre procuro trabalhar neste esquema (simplificado):

Página -> ManagedBean -> POJO <- Persistência

Ou seja, a página sempre referencia,em suas ações e eventos, os métodos dos MB. Esses, por sua vez, manipulam os POJOs. Depois de manipulados os POJOs os MB chamam métodos da camada de persistência para gravar esses dados.
Essa camada de persistência poderia ser uma API como a JPA, ou DAOs mesmo.

Entre os MB e a camada de persistência ainda poderia haver outras camadas, caso fosse necessário.

Bem, mais uma vez espero ter ajudado.

Grande abraço, e precisando é só postar.

G

deixa eu ver se entendi…

em teoria eu teria somente metodos no meu mb(verificaLogin(), deletaUsuario(), cadastraUsuario(),etc)sem getters e setters, e um pojo… entao minha pagina d login ficaria assim :

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <f:view>
        <head>
            
            <link href="styles.css" rel="stylesheet" type="text/css"/>
            <title><h:outputText value="#{msgs.loginTitulo}"/></title>
        </head>
        <body>
            <h:form styleClass="login">            
                <h:outputText styleClass="cabecalho" value="Login"/>
                <table>
                    <tr>
                        <td><h:outputText value="Username"/></td>
                        <td><h:inputText  value="#{pojo.userName}" size="15"/></td>
                    </tr>
                    <tr>
                        <td><h:outputText value="Password"/></td>
                        <td><h:inputSecret value="#{pojo.password}"  size="15"/></td>
                    </tr>
                </table>
                <p><h:commandButton value="Entrar" action="#{user.verficar}"/></p>
            </h:form>   
        </body>
    </f:view>
</html>
Luiz_Gustavo

Opa, beleza?
Então, quase isso. Uma opção seria fazer como o Tecnoage sugeriu, deixando o POJO acessível através do MB, e chamando as propriedades dele na página, assim:

<%@page contentType="text/html"%>  
<%@page pageEncoding="UTF-8"%>  
  
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>  
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>  
   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
"http://www.w3.org/TR/html4/loose.dtd">  
  
<html>  
    <f:view>  
        <head>  
              
            <link href="styles.css" rel="stylesheet" type="text/css"/>  
            <title><h:outputText value="#{msgs.loginTitulo}"/></title>  
       </head>  
        <body>  
           <h:form styleClass="login">              
                <h:outputText styleClass="cabecalho" value="Login"/>  
                <table>  
                   <tr>  
                      <td><h:outputText value="Username"/></td>  
                       <td><h:inputText  value="#{user.pojo.userName}" size="15"/></td>  
                    </tr>  
                    <tr>  
                       <td><h:outputText value="Password"/></td>  
                       <td><h:inputSecret value="#{user.pojo.password}"  size="15"/></td>  
                    </tr>  
                </table>  
                <p><h:commandButton value="Entrar" action="#{user.verficar}"/></p>  
           </h:form>     
        </body>  
    </f:view>  
</html>

Outra forma, que é a que eu geralmente uso, é colocar no MB uma propriedade para cada campo da página, e fazer referência a ela:

<%@page contentType="text/html"%>  
<%@page pageEncoding="UTF-8"%>  
  
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>  
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>  
   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
"http://www.w3.org/TR/html4/loose.dtd">  
  
<html>  
    <f:view>  
        <head>  
              
            <link href="styles.css" rel="stylesheet" type="text/css"/>  
            <title><h:outputText value="#{msgs.loginTitulo}"/></title>  
       </head>  
        <body>  
           <h:form styleClass="login">              
                <h:outputText styleClass="cabecalho" value="Login"/>  
                <table>  
                   <tr>  
                      <td><h:outputText value="Username"/></td>  
                       <td><h:inputText  value="#{user.userNamePojo}" size="15"/></td>  
                    </tr>  
                    <tr>  
                       <td><h:outputText value="Password"/></td>  
                       <td><h:inputSecret value="#{user.passwordPojo}"  size="15"/></td>  
                    </tr>  
                </table>  
                <p><h:commandButton value="Entrar" action="#{user.verficar}"/></p>  
           </h:form>     
        </body>  
    </f:view>  
</html>

Eu costumo fazer dessa forma pois deixo como responsabilidade do MB criar e popular o POJO com informações, para só depois enviar esse pojo para persistência ou alguma outra forma de processamento.
Faço isso pois antes de literalmente atribuir esses dados ao POJO, o MB pode fazer algum tipo de validação.

Qualquer dúvida é só postar!

[]'s

Criado 14 de janeiro de 2009
Ultima resposta 15 de jan. de 2009
Respostas 11
Participantes 3