Dúvida URGENTE com Servlet e JSP!?

8 respostas
P

:slight_smile: Olá caros amigos da GUJ.
Bem, o meu problema eh relativamente simple.
Tenho uma jsp, q envia dados para o servlet. Este servlet ferifica qual o tipo de acao solicitada na page jsp, e chama uma classe q representa a minha Tabela “Autenticacao”. A consulta comeca com busca.jsp q enviar a acao para a servlet. Esta servlet invoca a uma classe representando a tabela “Autenticacao.class”. Se a consulta for realizada com sucesso, eu fiz a mesma servlet q invocou a class “Autenticacao.class”, redirecionar para consulta.jsp. AI Q VEM O PROBLEMA PESSOAL… Esta page consulta.jsp eu importei a servlet acima, a fim de obter os gets dela afim de exibir os dados. O q está ocorrendo eh q quando o servlet processa os dados efetuando a consulta, os dados no servlet são retornados, soh q quando ele redireciona o para a page consulta.jsp, após ter obtido com sucesso a consulta, esta page consulta.jsp, q chama os gets importados do servlet , retorna null… O q pode estar ocorrendo!? Alguém teria a paciência, e se possível me ajudar!? Obrigado desde já pela atenção de todos os amigos do GUJ!! Obrigado.

Abaixo está uma notacao gráfica do caso, e estou exibindo o codigo para ficar mais claro.

notacao:
busca.jsp —> servlet —> Autenticacao.class —> DB_Conexao.class
| |
| <---------------
|
-----------> consulta.jsp (importa o servlet e chama os gets) .

se a consulta for realizada com sucesso o servlet irá redirecionar para consulta.jsp, onde a mesma irá importa o servlet através da diretiva page para obter os dados retornados via metodos gets.

////////////////////////////////// (busca.jsp) ////////////////////////////////////

&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;Untitled&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;form action="http&#58;//localhost&#58;8080/Teste/servlet/SolicitaServlet" method="get"&gt;
&lt;input type="hidden" name="solicitacao" value="FindNome"&gt;
&lt;input type="hidden" name="solicitarNome" value="sori"&gt;
&lt;input type="submit" value="Enviar"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;

/////////////////////// SolicitaServlet /////////////////////////////////////////

import teste.db.Autenticacao;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class SolicitaServlet extends HttpServlet implements Serializable &#123;
	private String solicitacao;
	private String solicitarNome;
	private String login;
	private String senha;
	
	public void doGet&#40;HttpServletRequest req, HttpServletResponse resp&#41; 
		throws ServletException, IOException &#123;
			processaSolicitacao&#40;req,resp&#41;;
	&#125;
	
	public void processaSolicitacao&#40;HttpServletRequest req, HttpServletResponse resp&#41; 
		throws ServletException, IOException &#123;
		
		solicitacao = req.getParameter&#40;"solicitacao"&#41;;
		solicitarNome = req.getParameter&#40;"solicitarNome"&#41;;
		
		PrintWriter saida = resp.getWriter&#40;&#41;;
		
		if&#40;solicitacao.equals&#40;"FindNome"&#41; &amp;&amp; solicitarNome.equals&#40;"sori"&#41;&#41; &#123;
			solicitarNome&#40;solicitarNome&#41;;
			resp.sendRedirect&#40;"http&#58;//localhost&#58;8080/Teste/jsp/consulta.jsp"&#41;;
			//saida.print&#40;"&lt;h1&gt;"+ this.getLogin&#40;&#41; +", "+ senha +"&lt;/h1&gt;"&#41;;
		&#125;else &#123;
			saida.print&#40;"&lt;h1&gt;Nada encontrado&lt;/h1&gt;"&#41;;	
		&#125;
	
	&#125;
	
	private void solicitarNome&#40;String newVal&#41; &#123;
		Autenticacao oAut = new Autenticacao&#40;&#41;;
		try &#123;
			oAut.FindNome&#40;newVal&#41;;
			login = oAut.getLogin&#40;&#41;;
			senha = oAut.getSenha&#40;&#41;;
			
		&#125;
		catch&#40;Exception e&#41; &#123;
			System.out.println&#40;"Erro - "+ e&#41;;
		&#125;
	&#125;
	
	public String getLogin&#40;&#41; &#123;
		return login;
	&#125;
	
	
&#125;

///////////////////////// Autenticacao.class ////////////////////////////////////

package teste.db;

import teste.db.DB_Conexao;
import java.sql.*;
import java.util.*;

public class Autenticacao extends DB_Conexao&#123;
	private Connection con;
	private String login;
	private String senha;
	private String login2;
	private Vector v;
	
	public Autenticacao&#40;&#41; &#123;
		con = super.getConexao&#40;&#41;;
	&#125;
	
	public String getLogin&#40;&#41; &#123;
		System.out.print&#40;login+"
"&#41;;
		return login;
	&#125;
	
	public String getSenha&#40;&#41; &#123;
		System.out.print&#40;senha+"
"&#41;;
		return senha;
	&#125;
	
	
	public void FindNome&#40;String newVal&#41; throws Exception &#123;
		login2 = newVal;
		ResultSet rs = null;
		PreparedStatement pstmt = con.prepareStatement&#40;"select login,senha from Autenticacao "+
			"where login = ?"&#41;;
		
		pstmt.setString&#40;1,login2&#41;; 
		
		rs = pstmt.executeQuery&#40;&#41;;
		
		if&#40;rs.next&#40;&#41;&#41; &#123;
			login = rs.getString&#40;"login"&#41;;
			senha = rs.getString&#40;"senha"&#41;;
		&#125;
		else
			System.out.println&#40;"Nada encontrado"&#41;;
		
	&#125;
	
		
&#125;

OBS. Ateh ai se a consulta for realizada com sucesso, a servlet redireciona resp.sendRedirect(“http://localhost:8080/Teste/jsp/consulta.jsp”); para consulta.jsp q abaixo esta a sua implementação.

/////////////////////////// consulta.jsp //////////////////////////////////////

&lt;html&gt;&lt;head&gt;	&lt;title&gt;Untitled&lt;/title&gt;&lt;/head&gt;

&lt;body&gt;
&lt;%@ page import="teste.db.Autenticacao"%&gt;
&lt;%@ page import="SolicitaServlet"%&gt;

&lt;%
SolicitaServlet oServ = new SolicitaServlet&#40;&#41;;
%&gt;

&lt;table border="1" cellpadding="1" cellspacing="0"&gt;
&lt;tr&gt;
	&lt;td&gt;&lt;%= oServ.getLogin&#40;&#41; %&gt;&lt;/td&gt;
	&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;

8 Respostas

Rafael_Steil

Bom, o correto seria vc nao instanciar o servlet dentro do jsp… mude um pouco o esquema de classes. Por exemplo, ao inves de instanciar o serlvet no jsp so pra pegar o login, passe essa parte para uma classe auxiliar, ou para dentro da Autenticacao mesmo, algo assim…

Rafael

P

:slight_smile: Ok, Rafael. OBrigado pela ajuda. Mas seria possível vc dar um exemplo na prática como faze-lo?
Obrigado!

Rafael_Steil

ok, vamos la.

  1. O arquivo busca.jsp pode ficar como esta.

  2. Retire as linhas

private String login;
private String senha;

do arquivo SolicitaServlet.java. Neste mesmo arquivo, altere o codigo

if&#40;solicitacao.equals&#40;"FindNome"&#41; &amp;&amp; solicitarNome.equals&#40;"sori"&#41;&#41; &#123;
         solicitarNome&#40;solicitarNome&#41;;
         resp.sendRedirect&#40;"http&#58;//localhost&#58;8080/Teste/jsp/consulta.jsp"&#41;;
         //saida.print&#40;"&lt;h1&gt;"+ this.getLogin&#40;&#41; +", "+ senha +"&lt;/h1&gt;"&#41;;
      &#125;

para

if&#40;solicitacao.equals&#40;"FindNome"&#41; &amp;&amp; solicitarNome.equals&#40;"sori"&#41;&#41; &#123;
    Autenticacao auth = new Autenticacao&#40;&#41;;
    auth.FindNome&#40;solicitarNome&#41;;
    
    // Coloca os dados na sessao do usuario
    HttpSession session = request.getSession&#40;true&#41;;
    session.setAttribute&#40;"login", auth.getLogin&#40;&#41;&#41;;
    session.setAttribue&#40;"senha", auth.getSenha&#40;&#41;&#41;;

    resp.sendRedirect&#40;"http&#58;//localhost&#58;8080/Teste/jsp/consulta.jsp"&#41;;
&#125;

Ainda neste arquivo, tire o metodo private solicitarNome(), ja que nao nao eh mais necessario.

  1. Do arquivo consulta.jsp, retire as linhas
&lt;%@ page import="teste.db.Autenticacao"%&gt;
&lt;%@ page import="SolicitaServlet"%&gt;

&lt;%
SolicitaServlet oServ = new SolicitaServlet&#40;&#41;;
%&gt;

e troque a linha

&lt;%= oServ.getLogin&#40;&#41; %&gt;

para

Login&#58; &lt;%= session.getAttribute&#40;"login"&#41;%&gt;&lt;br&gt;
Senha&#58; &lt;%= session.getAttribute&#40;"senha"&#41;%&gt;&lt;br&gt;

Pronto, isso deve funcionar.
Porem, lembre-se que ainda nao eh um codigo bom, pois contem alguns problemas de logica de implementacao. Mas como voce deve estar aprendendo o funcionamento de servlets e jsp ainda, nao se preocupe mto com isso agora, pois com o tempo os conceitos corretos aparecem naturalmente.

[]'s
Rafael Steil

P

Obrigado Rafael!!
Como vc comentou, eu estou aprendendo a utilizacao de servlets e jsp’s.
Eu analizei o código e reparei d um detalhe q vc implementou… Ah utilização de secoes. Bem…Irei testar neste domingo, pois estou checando a sua resposta as 4:14 da manha…
Novamente obrigado pela dica e pela ajuda!!

PJ.

P

:smiley: Olá Rafael.
Rafael eu modifiquei o codigo e implementei o q vc me passou. Executou sem problema. Obrigado pela ajuda.
Agora, eu gostaria se possível vc desse uma dica sobre o seguinte, utilizando o mesmo codigo e a mema plataforma java q estou utilizando (J2SE) + (Tomcat3.3a):

  1. duvida - Como vc jah comentou esta implementacao q estou utilizando, nao eh ha mais adequada. Tipo, não seria necessario eu criar uma camada q pegasse os dados da sessao e esta classe especificamente ser instanciada no jsp(consulta.jsp). O codigo ficaria mais estruturado desta forma? Vc teria uma ideia e poderia me passar um exemplo de codigo mais adequado possivel, utilizando as mesmas estrutura (jsp,servlet,class,db) q estou utilizando?

  2. duvida - Se o servlet redirecionar para a class (Autenticacao.java) q representa a consistencia e, eu quiser q ela retorne não apenas os dados de login e senha, mas sim uma porção de dados referente ao usuario, tipo: Nome, endereco, CEP? Eu teria q utilizar um metodo do tipo de retorno vector para ser retornado pela class (Autenticacao.java), e o mesmo retornar para o servlet onde seria armazenado em um array de string e ai no jsp (consulta.jsp) eu usaria um laço for para obter todos dos dados da sessao?

obs: Eu utilizo a J2SE 1.2, Tomcat3.3a.

Obrigado pela atenção!

PJ.

Rafael_Steil
  1. Pra pegar somente os dados da sessao nao eh necessario implementar uma outra camada somente para isso. Bom, como voce esta utilizando jsp poderia ser feito um esquema de taglibs, mas isso ja eh um topico mais avancado de entender, e de qq forma eu pessoalmente nao manjo mto de jsp. Explicar aqui como arquiteturar corretamente a tua aplicacao nao eh algo, digamos assim, simples, ja que tudo depende do que voce quer fazer, quais as necessidades do sistema tomo um todo etc… ou seja, ja puxa bem mais pro lado de analise do sistema.
    Se voce quer mesmo entender como funciona isso tudo, aconselho a ler sobre design patterns ( http://java.sun.com/blueprints/ ). Tem um livro mto bom chamado “Core J2EE Patterns”. Voce pode fazer download da versao em ingles no site da sun, ou pode comprar em alguma livraria… custa 80 reais.

  2. Bom, antes de mais nada, nao utilize Vector, ja que eh do java 1 ainda. Eh recomendavel, para substituir Vector, que voce utilize ArrayList. De uma lida no documento http://developer.java.sun.com/developer/onlineTraining/collections/Collection.html.
    Em relacao ao retorno, o mais correto seria voce retornar uma instancia de uma classe “Usuario”, a qual se encarregaria de manipular os dados dos usuarios ( porem isso, como foi dito antes, envolve o design do sistema ).

Uma ultima coisa: J2SE 1.2 e Tomcat3.3a ja sao defasados, pq vc esta utilizando? o tomcat ja esta quase chegando a versao 5 ( atualmetne esta na 4.1 ), e o J2SE esta na 1.4.1.

[]'s
Rafael Steil

P

:smiley: Bem. Eu utilizo esta versao devido o fato de seguir alguns tutorias da web. Eu nao tenho acesso a banda larga, p/ baixar a versao do jdk1.3 ou 1.4 vai muito tempo, e corre o risco de a conexao cair.

Agora Rafael, vc teria uma dica de como e onde poderia entao utilizar nesta minha aplicacao os elementos jsp’s (<jsp:setProperty name="" property=""/> e <jsp:getProperty name="" property=""/>)?
Esta duvida apareceu devido o fato de, se os dados sao retornados e armazenados em uma secao, entao eu terei q usar em minhas jsp’s apenas os elementos (<%= session.getAttribute(“login”)%>) para obter os dados do servlet?
Sei q nao eh recomendave instanciar os servlet em jsp’s para recuperar os gets(se tiver no servlet) para retornar p/ as jsp’s? O q seria necessario p/ eu utilizar em minhas jsp’s os elementos (<jsp:setProperty name="" property=""/> e <jsp:getProperty name="" property=""/>)??

Como vc deve ter percebido esta minha aplicacao eh apenas para fim didatico e de aprendizado…

Obrigado!

Rafael_Steil

Nao manjo de jsp :frowning:

Rafael

Criado 16 de novembro de 2002
Ultima resposta 22 de nov. de 2002
Respostas 8
Participantes 2