Form usando POST só é lido no ProcessRequest, no doPOST os valores chegam nulos. Por que? [RES]

Salve pessoal!

O problema é que passando valores em uma form usando o POST na servlet eu geralmente uso o doPost, porém para minha supresa descobri que o request.getParameter está com valor nulo. Ao mudar na servlet a lógica para o ProcessRequest observei que o valores estão sendo passados normalmente, por que?

Dúvidas relacionadas:
[list]Se tanto o GET e o POST podem usar o ProcessRequest, porque usar os métodos ‘do’? Vi muita gente recomendo usar ela diretamente.[/list]
[list]Se uso o out.println no final sempre tenho que fechar usando o out.close?[/list]

Acho que solucionando estas dúvidas conseguirei, caso contrário, irei postar meu código para sugestões. Obg!

[quote=kikokairos]Salve pessoal!

O problema é que passando valores em uma form usando o POST na servlet eu geralmente uso o doPost, porém para minha supresa descobri que o request.getParameter está com valor nulo. Ao mudar na servlet a lógica para o ProcessRequest observei que o valores estão sendo passados normalmente, por que?

Dúvidas relacionadas:
[list]Se tanto o GET e o POST podem usar o ProcessRequest, porque usar os métodos ‘do’? Vi muita gente recomendo usar ela diretamente.[/list]
[list]Se uso o out.println no final sempre tenho que fechar usando o out.close?[/list]

Acho que solucionando estas dúvidas conseguirei, caso contrário, irei postar meu código para sugestões. Obg!
[/quote]

Carinha, pelo que entendi, você está trabalhando com Servlets na unha, certo? Bom, o que eu entendi que você está fazendo é uma aplicação do design pattern “FrontController”. http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

O problema, carinha, é o seguinte: os métodos doGet e doPost são overrides necessários de HttpServlet se você quiser que sua servlet responda a métodos get e post.
http://docs.oracle.com/javaee/1.3/api/javax/servlet/http/HttpServlet.html

Então, esse “processRequest” é um handler genético que os métodos doGet e doPost usam para ter um processamento genérico do request, não importando o método, seja get ou post.

Sem usar os métodos “do” você não consegue redirecionar para o método “processRequest”.

Dá uma olhada aí se por um acaso você não está mandando dados do form por Get ao invés de post.

Quanto ao out.close: ele é necessário pelo seguinte: se você não der o close, o browser do outro lado da linha vai continuar achando que tem mais coisa pra mandar, e vai ficar goiaba.

Primeiro obrigado pelas dicas, bem respondendo as questões:

1-Sim, estou fazendo o servlet na unha pois é um projeto da faculdade. Então crio o servlet e coloco minha implementação para a lógica necessária.
Essa implementação está sempre no doPost pois como disse meus forms estão usando POST.

2-Ainda não paguei a cadeira de padrões porém estou usando páginas HTML para interface, beans (getter and setter), DAO (para tratar ações com o banco) e servlets (estes fazem minha lógica, validarLogin, cadastrarContas e etc).
Então em resumo é o seguinte o usuário acessa o html que tem um form que tem na ACTION que envia dados via POST para uma SERVLET.
Na Servlet eu armazeno os request.getParameter em um atributo, instâncio um bean e SET(o) passando o atributo anterior formando um objeto com todos os valores repassados pela página. Por fim instâncio o DAO passando o objeto (enviando assim os dados para persistência).

3-Sobre os “do” (doGET e doPOST), eu ja vi na Caelum F-21 que se usa post no form deve usar doPost, porém a questão é que posso jogar minha implementação diretamente dentro do processRequest é como já foi discutido ela funcionárá. Por isso me questionei, pra que passar no doPost pra ela redirecionar se posso passar direto entende?

4-Sobre out.close perfeito, muito obrigado!

Obs: meu form está correto com o POST

Carinha, vamo lá.

Se você está fazendo uma subclasse simples de HttpServlet, processRequest non ecziste. Veja que a especificação da HttpServlet é bem clara. O processRequest é algo que você cria para a classe. Mas o HttpServlet não vai encontrar o método processRequest sozinho. Percebeu o problema? Por isso você tem que ao menos dar um override no doGet e/ou doPost para redirecionar o código para o processRequest.

Isto se você estiver usando o pattern “FrontController”.

Em resumo, se você fizer uma Servlet só assim:

public class MyServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest 
        request, HttpServletResponse response)
    throws ServletException, java.io.IOException {

    /* Coloco aqui os processamentos do get e post */

  }

}

A servlet não vai fazer p. nenhuma. Porque a classe HttpServlet não chama automaticamente esse método. Ela chama os métodos doGet ou doPost dependendo do método utilizado.

Uma implementação mais simples, mas “mais confusa” que não precisaria usar o processRequest é redirecionar o doGet para o doPost:

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

E daí o “doPost” teria a implementação do que você quer fazer na servlet.

Corretíssimo!
A questão que eu queria dizer era outra coisa, tipo:

Se eu uso POST no form, devo implementar apenas na opção 3º ou na 1º (ordem está no comentário do código) já que é possível?

Exemplo

[code]public class AddContaServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
        
    /* 1º Pode implementar aqui qualquer tipo de requisição tanto GET quanto POST */
    
    }

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);

     /* 2º Como o nome do método sugere implementar requisições do tipo GET */       

    }

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
    PrintWriter out = response.getWriter();
           
     /* 3º Aqui por sua vez seria para requisições POST */    

    }    

}
[/code]

Porém já resolvi aqui, deixando apenas os três métodos acima, parece que havia colocado um “{” a mais ou a menos sendo assim ele parece que não entendia o método doPost.
E continuo usando o doPost, como aparente é indicado.

Obrigado abmpicoli.

Carinha, depende do que você quer fazer: se sua servlet só processa POST mesmo, ou seja, nem pra fins de depuração você quer usar um GET, você pode é implantar seu código todo dentro do doPost, e nem criar o método processRequest.

Porém, se pra você tanto faz a forma em que o parâmetro vem, se por GET ou se por POST, coloque tudo no processRequest e redirecione os métodos doGet e doPost para o processRequest.