Ajuda com Servlet [Enfim Resolvido]

13 respostas
H

Depois de muito tempo corrigindo erros de sistemas já prontos ou adicionando novas funcionalidades, acabei perdendo a noção de como fazer coisas simples como um Servlet.
Dei uma pesquisada já no Google, rodei uns exemplos, mas estou com dificuldades na criação de um Servlet.

Já criei um servlet (construção padrão do Netbeans) e uma segunda JSP. Quando rodo o programa, meu index envia um parâmetro para esse Servlet que vai fazer os processos necessários e encaminhar para essa segunda JSP. Todo esse processo já está definido no web.xml.

Estou usando a versão 6.7.1 do Netbeans e estou com os seguintes problemas.
Tento pegar os parâmetros enviados pela index.jsp com request.getAttribute(“nome”).
Esse mesmo parâmetro que eu pego, tento enviar ( request.setAttribute(“nome”,objeto); ) para a segunda JSP (somente para fins de teste).
Pego o valor nessa JSP porém ele vem null. Nenhum erro é gerado, mas parece que o servlet não está fazendo nada a não ser encaminhar para a outra página.

Outra dúvida, li em alguns lugares que não é uma boa prática de programação ter inúmeros Servlets em uma única aplicação, porém, como fazer um Servlet ter controle sobre todos os encaminhamentos dele?

É que basicamente, meu Servlet receberá parâmetros de 2 páginas distintas, vai tratar e pode encaminhar para outras duas que poderão chamá-lo novamente e ele encaminhará para outras 2.
Ou seja, meu sistema consiste de 6 páginas e quero somente 1 servlet controlando isso.

Qualquer ajuda será bem vinda. Caso eu não tenha explicado direito, fiquem a vontade para perguntar.

13 Respostas

thiago.correa

Neste caso, o certo é usar request.getParameter(“parameterName”); e request.setParameter(“parameterName”, parameterValue);

A

Essa aqui é a resposta para seu problema.

Uso correto, isso é para colocar atributos para outra página ter acesso

Procura por servlet controller que você vai ter uma idéia, ou se você conhece o Struts é assim que os frameworks MVC trabalham, um servlet e várias actions.

H

Valew cara, problema resolvido… :wink:
Aproveitei e dei uma pesquisada sobre a diferença entre getAttribute e getParameter. É coisa simples e que por bobeira agente acaba errando.

Agora continuo com a dúvida sobre como usar um único Servlet para cuidar de várias JSPs.
Desde já obrigado!

H

Alberes:

Procura por servlet controller que você vai ter uma idéia, ou se você conhece o Struts é assim que os frameworks MVC trabalham, um servlet e várias actions.


Outra dúvida, li em alguns lugares que não é uma boa prática de programação ter inúmeros Servlets em uma única aplicação, porém, como fazer um Servlet ter controle sobre todos os encaminhamentos dele?

Obrigado Alberes!!
Então, com Struts eu já trabalhei e inclusive preferi usar Servlet agora pela simplicidade do sistema em si.

No Struts temos as Actions descritas no struts_config.xml e lá ele cuida de encaminhar para as outras páginas e etc.
Minha dúvida é de como fazer isso no Servlet.
Vou seguir teu conselho e ver sobre o Servlet controller.

Muito obrigado!

A

Segue um exemplo:

package br.com.exemplo;

public abstract class Command {  

    private ServletContext context;  

    private HttpServletRequest request;  

    private HttpServletResponse response;  

    //gets and sets  

    public void setServletContext(ServletContext context){  
       this.context = context;  
    }  

    public abstract void execute();  

    public void forward(String forward){  

       try{  
           RequestDispatch rd = getRequest().getRequestDispatcher(forward);  
           rd.forward(getRequest(), getResponse());  
       }catch(....){  

       }  

    }  

}
package br.com.exemplo;

public class CreateCommand extends Command{  
  
    public void execute(){  
       //sua lógica  
       forward("sua_pagina.jsp");  
    }      
    
 }
package br.com.exemplo;

public class DeleteCommand extends Command{  
  
    public void execute(){  
       //sua lógica  
       forward("sua_pagina.jsp");  
    }      
    
 }
package br.com.exemplo;

public class UpdateCommand extends Command{  
  
    public void execute(){  
       //sua lógica  
       forward("sua_pagina.jsp");  
    }      
    
 }
package br.com.exemplo;

public class ReadCommand extends Command{  
  
    public void execute(){  
       //sua lógica  
       forward("sua_pagina.jsp");  
    }      
    
 }
package br.com.exemplo;

   public class ControllerPrinciapl extends HttpServlets{  
      
        //Substitua pelo um Properties e leia uma arquivo *.properties pra facilitar  
        private Map mappings = null;  
      
        public void init(ServletConfig config) throws ServletException{  
            mappings = new HashMap();  
      
            //Adicione  
           mappings.put("Create", "br.com.exemplo.CreateCommand");  
           mappings.put("Read", "br.com.exemplo.ReadCommand");  
           mappings.put("Update", "br.com.exemplo.UpdateCommand");  
           mappings.put("Delete", "br.com.exemplo.DeleteCommand");  
             
       }  
     
       public void doPost(...){  
     
           //Vem da web, poder ser via queryString ou campo oculto  
           String cmd = request.getParameter("cmd");  // Vem dá página, é ele quem sabe qual é a action
           String actionClass = mappings.get("cmd");  
     
           try{  
               Action action = Class.forName(actionClass).newStance();  
           }catch(ClassNotFound cnf){  
     
           }//Digite as outras exceções  
         
           action.setRequest(request);  
           acttion.setResponse(response);  
           action.setServletContext(getServletContext());  
           action.execute();  
     
       }  
     
     
  }
H

Valew Alberes,

Era isso mesmo que eu precisava.
Vi vários exemplos onde esse controle estava sendo feito usando “ifs”, switches, mas achei essa solução que vc deu excelente.
Inclusive me lembrei que onde eu trabalhei tinha um Servlet Controller feito a base de ifs.

Muito obrigado mesmo.

A

Opá, compartilhar conhecimento!

H
Bom, a medida que comecei a fazer aqui, me deparei com dois problemas.
package br.com.exemplo;  
  
   public class ControllerPrinciapl extends HttpServlets{    
        
        //Substitua pelo um Properties e leia uma arquivo *.properties pra facilitar    
        private Map mappings = null;    
        
        public void init(ServletConfig config) throws ServletException{    
            mappings = new HashMap();    
        
            //Adicione    
           mappings.put("Create", "br.com.exemplo.CreateCommand");    
           mappings.put("Read", "br.com.exemplo.ReadCommand");    
           mappings.put("Update", "br.com.exemplo.UpdateCommand");    
           mappings.put("Delete", "br.com.exemplo.DeleteCommand");    
               
       }    
       
       public void doPost(...){    
       
           //Vem da web, poder ser via queryString ou campo oculto    
           String cmd = request.getParameter("cmd");  // Vem dá página, é ele quem sabe qual é a action  
           String actionClass = mappings.get("cmd");    
       
           try{    
               Action action = Class.forName(actionClass).newStance();    
           }catch(ClassNotFound cnf){    
       
           }//Digite as outras exceções    
           
           action.setRequest(request);    
           action.setResponse(response);    
           action.setServletContext(getServletContext());    
           action.execute();    
       
       }    
       
       
  }

Nesse caso, precisamente dentro do try catch a Action recebe um objeto da classe que foi recuperada de dentro do Hash.
Eu utilizei o import do Struts para essa Action, é esse o correto?

Segundo, mesmo colocando os blocos try catch, as linhas onde eu tento acessar os métodos dessa Action ficam acusando erro. Esse erro ocorre pq a IDE, o compilador, não encontra os métodos mesmo, pois no momento da compilação, não se sabe a qual classe recuperada do Hash o objeto Action faz referência.
Como fazer isso direito??

Outra coisa, estou fazendo o Servlet no Netbeans e ele pede qual a classe ou página JSP que esse Servlet vai chamar, porém se tratando de um Servlet Controller e como o amigo Alberes mostrou, as classes de comando vão cuidar desse encaminhamento.
Como fazer isso no Netbeans? Pq já removi do web.xml as chamadas do Servlet, mas o encaminhamento não é feito. (Pra testar isso, eu fiz testes criando as classes com if e else, devido ao modo com Action não ter dado certo).

H

Hericksnake:

Outra coisa, estou fazendo o Servlet no Netbeans e ele pede qual a classe ou página JSP que esse Servlet vai chamar, porém se tratando de um Servlet Controller e como o amigo Alberes mostrou, as classes de comando vão cuidar desse encaminhamento.
Como fazer isso no Netbeans? Pq já removi do web.xml as chamadas do Servlet, mas o encaminhamento não é feito. (Pra testar isso, eu fiz testes criando as classes com if e else, devido ao modo com Action não ter dado certo).

Não sei se foi a maneira mais certa. Mas pelo jeito, o primeiro Servlet criado precisava impreterivelmente de ter um encaminhamento “<servlet_class>” ou JSP.
O que fiz, foi criar um segundo servlet e apontar o servlet_class do primeiro pra ele.
Agora consigo fazer esse tratamento utilizando as classes e cada uma encaminhando pra um local diferente.

Resta apenas saber como utilizar a Action que o Alberes mostrou posts acima.

A

Desculpa Hericksnake, essa linha está errada, corrige, coloquei errado, isso vai resolver todos os seu problemas

De

Action action = Class.forName(actionClass).newStance();

Para

Command action = Class.forName(actionClass).newStance();

Mas vai o comentário

É uma String com nome da completo da classe (pacote e classe br.com.exemplo.ReadCommand).
Isso é para criar a classe dinamicamente com Class.forName(“br.com.exemplo.ReadCommand”).newStance();

Coloquei o nome Action, o correto é Command, você não precisa do framework

Acho que isso é porque você extendeu as Action do Struts

Coloca um printscreen da tela, quem faz o forward é a classe base Command public void forward(String forward){

H

Blz cara, era isso mesmo alterei aqui e funcionou o esquema de pegar a classe certa pelo Hash. Também nem prestei atenção nisso… :oops:

Mas o problema que persiste é que esse Servlet tem que ter o servlet_classe ou o jsp setado no XML senão o Netbeans dá erro. Porém, se eu seto ele passa batido pelas classes que fazem o papel de action.

Tem diferença colocar o código dentro do método doPost ou do proccessRequest do Servlet??

Bom, tô saindo do trampo agora, amanhã ou hj mais tarde eu respondo.
Abraço e mais uma vez obrigado pela ajuda!!

A

Eu uso o eclipse ou workshop, conheço pouco o netbeans, envia o printscreen ou o código pra verificar, pois desconheço tal erro.

Você deve sobrescrever pelo menos um dos dois métodos doGet ou doPost, o método proccessRequest será chamado por doGet ou doPost, nesse caso não tem problemas.

H

Consegui resolver o problema.

Era o seguinte. Como eu havia dito, a descrição do Servlet no web.xml pede uma classe ou arquivo jsp pra onde o servlet deve apontar.
O meu erro foi pensar que por ser um servlet controller ele não precisaria ter um desses valores setados.
Sendo assim, estava dando erro na hora de subir o serviço, avisando que o servlet class ou name estava faltando.
A solução foi colocar o próprio servlet no servlet class e o problema foi resolvido.

Segue exemplo de como fica o servlet no web.xml:

<servlet> <servlet-name>NewServlet</servlet-name> <servlet-class>srvt.NewServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NewServlet</servlet-name> <url-pattern>/NewServlet</url-pattern> </servlet-mapping>

Meu erro era gerado na linha:

<servlet-class>srvt.NewServlet</servlet-class>

Porque eu a omitia ou apontava para outra jsp, sendo assim, mesmo o servlet estando funcionando perfeitamente a execução sempre terminava no arquivo jsp que estava descrito nessa linha e não respeitava o que minhas actions estavam mandando fazer.

Problema enfim resolvido!
Mais uma vez, obrigado Alberes!

Criado 12 de janeiro de 2010
Ultima resposta 13 de jan. de 2010
Respostas 13
Participantes 3