Duvida POST

25/03/2008

0

Galera é o seguinte estou montando um midlet que acessa um servlet, ele funciona corretamente, o problema surge no momento em que mudo a forma de transmissão de GET para POST, segue abaixo os codigos.

MIDLET

Método utilizado GET ´FUNCIONA CORRETAMENTE´

private void verifica_Login() throws IOException {   
        String url = "http://localhost:8084/RKAM_ServLet/ServLet?";   
        url =  url + "login=" + loginScreen.getUsername() + "&senha=" + loginScreen.getPassword() + "&metodo=LOGIN";   
        //String url = "http://localhost:8084/RKAM_ServLet/ServLet";   
        HttpConnection http = null;   
        //OutputStream out = http.openOutputStream();//enviar dados   
        InputStream in = null;   
        try {   
            http = (HttpConnection) Connector.open(url);   
            http.setRequestMethod(HttpConnection.GET);   
            /*http.setRequestMethod(HttpConnection.POST);  
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  
            //http.setRequestProperty("Conexão", "close");  
            String teste;  
            byte dados[] = ("login=" + loginScreen.getUsername()).getBytes();  
            teste=new String(dados);  
            out.write(dados);  
            dados = ("&senha=" + loginScreen.getPassword()).getBytes();  
            teste=teste+new String(dados);  
            out.write(dados);  
            dados = ("&metodo=LOGIN").getBytes();  
            teste=teste+new String(dados);  
            out.write(dados);  
            out.flush();*/   
            //--------------TRATAR RESPOSTA DO SERVLET----------------------   
            in =http.openInputStream();//pegar resposta   
            if (http.getResponseCode() == HttpConnection.HTTP_OK) {   
                int length = (int) http.getLength();   
                String str;   
                if (length != -1) {//tamanho da resposta conhecido   
                    byte data[] = new byte[length];   
                    in.read(data);   
                    str =   
                    new String(data);   
                } else {//tamanho não conhecido, deve ser pegar bit por bit até chegar ao final   
                    ByteArrayOutputStream aux = new ByteArrayOutputStream();   
                    int ch;   
                    while ((ch = in.read()) != -1) {   
                        aux.write(ch);   
                    }   
                    str = new String(aux.toByteArray());   
                    aux.close();   
                }   
                if (str.equals("TRUE")) {   
                    set_boo(true);   
                } else {   
                    set_boo(false);   
                }   
            } else {   
                System.out.println(http.getResponseMessage());   
            }   
            in.close();   
            http.close();   
        } catch (IOException e) {   
        }   
    }  
private void verifica_Login() throws IOException {
        String url = "http://localhost:8084/RKAM_ServLet/ServLet?";
        url =  url + "login=" + loginScreen.getUsername() + "&senha=" + loginScreen.getPassword() + "&metodo=LOGIN";
        //String url = "http://localhost:8084/RKAM_ServLet/ServLet";
        HttpConnection http = null;
        //OutputStream out = http.openOutputStream();//enviar dados
        InputStream in = null;
        try {
            http = (HttpConnection) Connector.open(url);
            http.setRequestMethod(HttpConnection.GET);
            /*http.setRequestMethod(HttpConnection.POST);
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //http.setRequestProperty("Conexão", "close");
            String teste;
            byte dados[] = ("login=" + loginScreen.getUsername()).getBytes();
            teste=new String(dados);
            out.write(dados);
            dados = ("&senha=" + loginScreen.getPassword()).getBytes();
            teste=teste+new String(dados);
            out.write(dados);
            dados = ("&metodo=LOGIN").getBytes();
            teste=teste+new String(dados);
            out.write(dados);
            out.flush();*/
            //--------------TRATAR RESPOSTA DO SERVLET----------------------
            in =http.openInputStream();//pegar resposta
            if (http.getResponseCode() == HttpConnection.HTTP_OK) {
                int length = (int) http.getLength();
                String str;
                if (length != -1) {//tamanho da resposta conhecido
                    byte data[] = new byte[length];
                    in.read(data);
                    str =
                    new String(data);
                } else {//tamanho não conhecido, deve ser pegar bit por bit até chegar ao final
                    ByteArrayOutputStream aux = new ByteArrayOutputStream();
                    int ch;
                    while ((ch = in.read()) != -1) {
                        aux.write(ch);
                    }
                    str = new String(aux.toByteArray());
                    aux.close();
                }
                if (str.equals("TRUE")) {
                    set_boo(true);
                } else {
                    set_boo(false);
                }
            } else {
                System.out.println(http.getResponseMessage());
            }
            in.close();
            http.close();
        } catch (IOException e) {
        }
    } 

Método utilizado POST ´C/ PROBLEMAS´

private void verifica_Login() throws IOException {   
        //String url = "http://localhost:8084/RKAM_ServLet/ServLet?";   
        //url =  url + "login=" + loginScreen.getUsername() + "&senha=" + loginScreen.getPassword() + "&metodo=LOGIN";   
        String url = "http://localhost:8084/RKAM_ServLet/ServLet";   
        HttpConnection http = null;   
        InputStream in = null;   
        try {   
            http = (HttpConnection) Connector.open(url);   
           // http.setRequestMethod(HttpConnection.GET);   
            http.setRequestMethod(HttpConnection.POST);   
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");   
            //http.setRequestProperty("Conexão", "close");   
            OutputStream out = http.openOutputStream();//enviar dados   
            String teste;   
            byte dados[] = ("login=" + loginScreen.getUsername()).getBytes();   
            teste=new String(dados);   
            out.write(dados);   
            dados = ("&senha=" + loginScreen.getPassword()).getBytes();   
            teste=teste+new String(dados);   
            out.write(dados);   
            dados = ("&metodo=LOGIN").getBytes();   
            teste=teste+new String(dados);   
            out.write(dados);   
            out.flush();   
            //--------------TRATAR RESPOSTA DO SERVLET----------------------   
            in =http.openInputStream();//pegar resposta   
            if (http.getResponseCode() == HttpConnection.HTTP_OK) {   
                int length = (int) http.getLength();   
                String str;   
                if (length != -1) {//tamanho da resposta conhecido   
                    byte data[] = new byte[length];   
                    in.read(data);   
                    str =   
                    new String(data);   
                } else {//tamanho não conhecido, deve ser pegar bit por bit até chegar ao final   
                    ByteArrayOutputStream aux = new ByteArrayOutputStream();   
                    int ch;   
                    while ((ch = in.read()) != -1) {   
                        aux.write(ch);   
                    }   
                    str = new String(aux.toByteArray());   
                    aux.close();   
                }   
                if (str.equals("TRUE")) {   
                    set_boo(true);   
                } else {   
                    set_boo(false);   
                }   
            } else {   
                System.out.println(http.getResponseMessage());   
            }   
            in.close();   
            http.close();   
        } catch (IOException e) {   
        }   
    }  
private void verifica_Login() throws IOException {
        //String url = "http://localhost:8084/RKAM_ServLet/ServLet?";
        //url =  url + "login=" + loginScreen.getUsername() + "&senha=" + loginScreen.getPassword() + "&metodo=LOGIN";
        String url = "http://localhost:8084/RKAM_ServLet/ServLet";
        HttpConnection http = null;
        InputStream in = null;
        try {
            http = (HttpConnection) Connector.open(url);
           // http.setRequestMethod(HttpConnection.GET);
            http.setRequestMethod(HttpConnection.POST);
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //http.setRequestProperty("Conexão", "close");
            OutputStream out = http.openOutputStream();//enviar dados
            String teste;
            byte dados[] = ("login=" + loginScreen.getUsername()).getBytes();
            teste=new String(dados);
            out.write(dados);
            dados = ("&senha=" + loginScreen.getPassword()).getBytes();
            teste=teste+new String(dados);
            out.write(dados);
            dados = ("&metodo=LOGIN").getBytes();
            teste=teste+new String(dados);
            out.write(dados);
            out.flush();
            //--------------TRATAR RESPOSTA DO SERVLET----------------------
            in =http.openInputStream();//pegar resposta
            if (http.getResponseCode() == HttpConnection.HTTP_OK) {
                int length = (int) http.getLength();
                String str;
                if (length != -1) {//tamanho da resposta conhecido
                    byte data[] = new byte[length];
                    in.read(data);
                    str =
                    new String(data);
                } else {//tamanho não conhecido, deve ser pegar bit por bit até chegar ao final
                    ByteArrayOutputStream aux = new ByteArrayOutputStream();
                    int ch;
                    while ((ch = in.read()) != -1) {
                        aux.write(ch);
                    }
                    str = new String(aux.toByteArray());
                    aux.close();
                }
                if (str.equals("TRUE")) {
                    set_boo(true);
                } else {
                    set_boo(false);
                }
            } else {
                System.out.println(http.getResponseMessage());
            }
            in.close();
            http.close();
        } catch (IOException e) {
        }
    } 

SERVLET

public class ServLet extends HttpServlet {   
  
    private Connection c;   
    String metodo;   
  
       
    public void init() {   
      conectar();   
    }   
  
    public void destroy() {   
      desconectar();   
    }   
  
    protected void doGet(HttpServletRequest request, HttpServletResponse response)   
            throws ServletException, IOException {   
        this.doPost(request, response);   
    }   
  
    protected void doPost(HttpServletRequest request, HttpServletResponse response)   
            throws ServletException, IOException {   
        metodo = request.getParameter("metodo").toUpperCase();   
        if (metodo.equals("LOGIN"))//login   
        {   
            login(request, response);   
        }   
  
        if (metodo.equals("CONSULTA")) {   
            consulta(request, response);   
        }   
  
    }   
  
    private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
        try {   
            String senha = request.getParameter("senha").toUpperCase();   
            String login = request.getParameter("login").toUpperCase();   
            //conectar();   
            ResultSet res = consultar("select * from login where login=´" + login + "´ and senha=´" + senha + "´");   
            response.setContentType("text/plain");   
            PrintWriter out = response.getWriter();   
            boolean aux = true;   
            while (res.next()) {   
                out.print("TRUE");   
                aux = false;   
            }   
            if (aux) {   
                out.print("FALSE");   
            }   
            out.close();   
            //desconectar();   
        } catch (SQLException ex) {   
            Logger.getLogger(ServLet.class.getName()).log(Level.SEVERE, null, ex);   
        }   
    }  
public class ServLet extends HttpServlet {

    private Connection c;
    String metodo;

    
    public void init() {
      conectar();
    }

    public void destroy() {
      desconectar();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        metodo = request.getParameter("metodo").toUpperCase();
        if (metodo.equals("LOGIN"))//login
        {
            login(request, response);
        }

        if (metodo.equals("CONSULTA")) {
            consulta(request, response);
        }

    }

    private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String senha = request.getParameter("senha").toUpperCase();
            String login = request.getParameter("login").toUpperCase();
            //conectar();
            ResultSet res = consultar("select * from login where login=´" + login + "´ and senha=´" + senha + "´");
            response.setContentType("text/plain");
            PrintWriter out = response.getWriter();
            boolean aux = true;
            while (res.next()) {
                out.print("TRUE");
                aux = false;
            }
            if (aux) {
                out.print("FALSE");
            }
            out.close();
            //desconectar();
        } catch (SQLException ex) {
            Logger.getLogger(ServLet.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 


O erro ocorre na linha 22 do SERVLET, no momento em que a variavel metodo na servlet recebe o parametro ´metodo´ passado, caso ele for passado por GET esta variavel recebe o parametro sem problemas, mas se foi passado pelo metodo POST, no momento que a variavel recebe o parametro a servlet fecha e exibe uma mensagem de erro ´Internal servlet error´, assim nada é retornado para a midlet, creio que o problema esta na passagem dos dados pelo modo POST pela midlet caso seja isso como resolver?

Quando executo a servlet na saida tenho as seguintes mensagens

Using CATALINA_BASE:   C:\Documents and Settings\Administrador\.netbeans\6.0\apache-tomcat-6.0.14_base   
Using CATALINA_HOME:   C:\Arquivos de programas\Apache Software Foundation\Apache Tomcat 6.0.14   
Using CATALINA_TMPDIR: C:\Documents and Settings\Administrador\.netbeans\6.0\apache-tomcat-6.0.14_base\temp   
Using JRE_HOME:        C:\Arquivos de programas\Java\jdk1.6.0_02   
Listening for transport dt_shmem at address: tomcat_shared_memory_id   
19/03/2008 17:50:41 org.apache.catalina.core.AprLifecycleListener init   
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jdk1.6.0_02\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\oraclexe\app\oracle\product\10.2.0\server\bin;C:\ARQUIV~1\Borland\Delphi5\Projects\Bpl;C:\ARQUIV~1\Borland\vbroker\jre\Bin;C:\ARQUIV~1\Borland\vbroker\Bin;C:\ARQUIV~1\Borland\Delphi5\Bin;C:\ARQUIV~1\Borland\CBUILD~1\Projects\Bpl;C:\ARQUIV~1\Borland\CBUILD~1\Bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\Arquivos de programas\Microsoft SQL Server\90\Tools\binn\;C:\Arquivos de programas\SSH Communications Security\SSH Secure Shell;C:\Arquivos de programas\Arquivos comuns\Ahead\Lib\   
19/03/2008 17:50:41 org.apache.coyote.http11.Http11Protocol init   
INFO: Initializing Coyote HTTP/1.1 on http-8084   
19/03/2008 17:50:41 org.apache.catalina.startup.Catalina load   
INFO: Initialization processed in 653 ms   
19/03/2008 17:50:41 org.apache.catalina.core.StandardService start   
INFO: Starting service Catalina   
19/03/2008 17:50:41 org.apache.catalina.core.StandardEngine start   
INFO: Starting Servlet Engine: Apache Tomcat/6.0.14   
19/03/2008 17:50:42 com.sun.faces.config.ConfigureListener contextInitialized   
INFO: Initializing Sun´s JavaServer Faces implementation (1.2_04-b10-p01) for context ´/JJLocadora6´   
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext resourcesStart   
SEVERE: Error starting static Resources   
java.lang.IllegalArgumentException: Document base C:\Documents and Settings\Administrador\Meus documentos\NetBeansProjects\teste\build\web does not exist or is not a readable directory   
        at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:141)   
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:3944)   
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4113)   
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)   
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)   
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)   
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:626)   
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)   
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)   
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)   
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)   
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)   
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)   
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)   
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)   
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)   
        at org.apache.catalina.core.StandardService.start(StandardService.java:516)   
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)   
        at org.apache.catalina.startup.Catalina.start(Catalina.java:566)   
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)   
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)   
        at java.lang.reflect.Method.invoke(Method.java:597)   
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)   
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)   
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext start   
SEVERE: Error in resourceStart()   
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext start   
SEVERE: Error getConfigured   
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext start   
SEVERE: Context [/teste] startup failed due to previous errors   
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext stop   
INFO: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/teste] has not been started   
19/03/2008 17:50:43 org.apache.coyote.http11.Http11Protocol start   
INFO: Starting Coyote HTTP/1.1 on http-8084   
19/03/2008 17:50:43 org.apache.jk.common.ChannelSocket init   
INFO: JK: ajp13 listening on /0.0.0.0:8009   
19/03/2008 17:50:43 org.apache.jk.server.JkMain start   
INFO: Jk running ID=0 time=0/31  config=null   
19/03/2008 17:50:43 org.apache.catalina.startup.Catalina start   
INFO: Server startup in 2279 ms  
Using CATALINA_BASE:   C:\Documents and Settings\Administrador\.netbeans\6.0\apache-tomcat-6.0.14_base
Using CATALINA_HOME:   C:\Arquivos de programas\Apache Software Foundation\Apache Tomcat 6.0.14
Using CATALINA_TMPDIR: C:\Documents and Settings\Administrador\.netbeans\6.0\apache-tomcat-6.0.14_base\temp
Using JRE_HOME:        C:\Arquivos de programas\Java\jdk1.6.0_02
Listening for transport dt_shmem at address: tomcat_shared_memory_id
19/03/2008 17:50:41 org.apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Arquivos de programas\Java\jdk1.6.0_02\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\oraclexe\app\oracle\product\10.2.0\server\bin;C:\ARQUIV~1\Borland\Delphi5\Projects\Bpl;C:\ARQUIV~1\Borland\vbroker\jre\Bin;C:\ARQUIV~1\Borland\vbroker\Bin;C:\ARQUIV~1\Borland\Delphi5\Bin;C:\ARQUIV~1\Borland\CBUILD~1\Projects\Bpl;C:\ARQUIV~1\Borland\CBUILD~1\Bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\Arquivos de programas\Microsoft SQL Server\90\Tools\binn\;C:\Arquivos de programas\SSH Communications Security\SSH Secure Shell;C:\Arquivos de programas\Arquivos comuns\Ahead\Lib\
19/03/2008 17:50:41 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8084
19/03/2008 17:50:41 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 653 ms
19/03/2008 17:50:41 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
19/03/2008 17:50:41 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.14
19/03/2008 17:50:42 com.sun.faces.config.ConfigureListener contextInitialized
INFO: Initializing Sun´s JavaServer Faces implementation (1.2_04-b10-p01) for context ´/JJLocadora6´
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext resourcesStart
SEVERE: Error starting static Resources
java.lang.IllegalArgumentException: Document base C:\Documents and Settings\Administrador\Meus documentos\NetBeansProjects\teste\build\web does not exist or is not a readable directory
        at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:141)
        at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:3944)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4113)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
        at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:626)
        at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:516)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext start
SEVERE: Error in resourceStart()
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext start
SEVERE: Error getConfigured
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext start
SEVERE: Context [/teste] startup failed due to previous errors
19/03/2008 17:50:43 org.apache.catalina.core.StandardContext stop
INFO: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/teste] has not been started
19/03/2008 17:50:43 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8084
19/03/2008 17:50:43 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
19/03/2008 17:50:43 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/31  config=null
19/03/2008 17:50:43 org.apache.catalina.startup.Catalina start
INFO: Server startup in 2279 ms
 


Alguem pode me confirma o código e me dar uma dica? Obrigado!!!!


Shakall

Shakall

Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar