Usar variável do servlet na página JSP [Resolvido]

Olá.

Sou novo em servlet e criei um que realiza conexão com o banco de dados.
Bom, até aqui tudo ok. Mas o problem acontece quando eu tento retorna, por exemplo o nome do banco em uma página já existente.

Resumindo, não consigo retornar nenhum nome de variável do servlet em minha JSP já existente.

Como devo reusar o servlet na JSP?

Obrigado.

cara, eu nao intendi direito tua pergunta…

tem como especificar? ou mostrar o codigo que tentaste fazer?

Sim é claro.

Aqui está o serblet conect.java

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package schema;

import java.sql.*;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*

  • @author Filth
    */
    public class conect extends HttpServlet {

    /**

    • Processes requests for both HTTP GET and POST methods.
    • @param request servlet request
    • @param response servlet response
      */
      protected void processRequest(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    Connection conn = null;
    ResultSet rs = null;

    String server001 = “localhost”;
    String dbase001 = “otavio”;
    String user001 = “root”;
    String pass001 = “2017”;

if (conn == null) {

response.setContentType(“text/html;charset=UTF-8”);
PrintWriter out = response.getWriter();

    try {
          String driver001 = "org.gjt.mm.mysql.Driver";

Class.forName(driver001);
    
conn = DriverManager.getConnection(
        "jdbc:mysql://" +server001+ "/" +dbase001 , user001 , pass001);

        /* TODO output your page here */
 // valor de dbase001 
        out.println("Conexão com o banco de dados "+dbase001+" estabelecida com sucesso!"); 
       
       /* out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet conect</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet conect at " + request.getContextPath () + "</h1>");
        out.println("</body>");
        out.println("</html>");
        */
        conn.close();

} catch(ClassNotFoundException cnfex) {
out.println(“Driver não encontrado!”);
} catch(SQLException sqlex) {
out.println(“Não foi possível realizar a conexão com o banco de dados!\n”+sqlex);
} catch(Exception ex) {
out.println(“Erro inesperado!”);
} finally {
out.close();
}

} // fim do if
}

// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal de + à esquerda para editar o código.">
/** 
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
} 

/** 
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

/** 
* Returns a short description of the servlet.
*/
public String getServletInfo() {
    return "Short description";
}// </editor-fold>

}
[/code]

e minha página JSP resumida:

<%@page import="schema.conect;"%> <%new conect();%> <%=out %>

estou tentando retornar o nome do banco nesta página.

depois que seu servlet for executado, redirecione para um jsp usando dipacher
Mas antes set uma variavel de request para que assim vc pegue do outro lado
request.setAttribute(“chave”, “valor”)

RequestDispatcher rd = request.getRequestDispatcher("/teste.jsp");
rd.forward(request, response);

e no seu jsp pegue o request

<%
String valor = (String) request.getAttribute(“chave”);
// trate o resto
%>

acho q e isto q vc quer;…
abs

ai vc apaga estes

[code]

/* out.println("");

out.println("");

out.println(“Servlet conect”);

out.println("");

out.println("");

out.println("

Servlet conect at " + request.getContextPath () + “

”);

out.println("");

out.println("");

/code]

e usa uma jsp para colocar o html.

Perfeito lelodois, você está de parabéns.

Mas pra realizar isso eu teria que executar o servlet via browser antes.

Bom, minha página JSP seria a inicial, o servlet só me serveria pra eu reusar os
códigos em outras JSP’s, então eu não queria executá-los via browser como
páginas iniciais, entende?"

[quote=dark123]Perfeito lelodois, você está de parabéns.

Mas pra realizar isso eu teria que executar o servlet via browser antes.

Bom, minha página JSP seria a inicial, o servlet só me serveria pra eu reusar os
códigos em outras JSP’s, então eu não queria executá-los via browser como
páginas iniciais, entende?"[/quote]

Entao não seria um servlet e sim uma classe java normal.

O servlet é para tratar suas requisições e nao para receber parametros e retornar um objeto qualquer.
Crie uma classe java normal sem ser servlet com o metodo que vc quer e chame ele no seu jsp (nao é nada padronizado), mas a gente ve isto depois.
abs

Eu já havia tentado com uma classe JAVA.

Executei a classe no NetBeans e ocorreu tudo normal mas eu não soube chamar na JSP.

Conexao.java

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package schema;

import java.sql.*;

public class Conexao {

Connection conn = null;
ResultSet rs = null;

//public Conexao() {
//public static void main(String[] args) {

public Conexao() {

if (conn == null) {
try {
String driver001= “org.gjt.mm.mysql.Driver”;

String server001 = "localhost";
String dbase001 = "otavio";
String user001 = "root";
String pass001 = "2017";

Class.forName(driver001);
    
conn = DriverManager.getConnection(
        "jdbc:mysql://" +server001+ "/" +dbase001 , user001 , pass001);

System.out.println("Conexão ao banco de dados "+dbase001+" estabelecida com sucesso!");
 
conn.close();

} catch(ClassNotFoundException cnfex) {
System.err.println(“Driver não encontrado!”);
} catch(SQLException sqlex) {
System.out.println(“Não foi possível realizar a conexão com o banco de dados!\n”+sqlex);
} catch(Exception ex) {
System.out.println(“Erro inesperado!”);
}
} // fim do if

}

public static void main(String[] args) {
new Conexao();
}

}
[/code]

Bom, se fosse para Desktop, eu faria assim , mas não sei quanto à WEB. :?:

faça um metodo que retorne o que vc quer.

no jsp vc deve importar, deve ter faltado isto pois sua classe esta em package.
la em cima na declaracao fica assim.
<% language=“java”… import=“schema” %>
<%
Conexao c = new Conexao();
MeuObjeto m = c.retornaOqueEuQuero();
%>

o main nao vai ter utilidade, somente para testes…
abs

[quote=lelodois]faça um metodo que retorne o que vc quer.

no jsp vc deve importar, deve ter faltado isto pois sua classe esta em package.
la em cima na declaracao fica assim.
<% language=“java”… import=“schema” %>
[/quote]

Acho que você quiz dizer assim:

<%@page language="java" import="schema.Conexao"%>

[quote]<%
Conexao c = new Conexao();
MeuObjeto m = c.retornaOqueEuQuero();
%>[/quote]

Também acho que a outra parte seja asi:

<% Conexao c = new Conexao(); MeuObjeto m = c.retornaOqueEuQuero(); // coloco o quê? %>

Estou certo?

isto ai

Não repare, sou novato em usabilidade com JAVA e JSP.

Não entendi a linha:

MeuObjeto m = c.retornaOqueEuQuero(); // coloco o quê?

Bom, pelo que pude entender, o trecho c.retornaOqueEuQuero() é para retornar algum método.
Mas e o trecho MeuObjeto m ?

Vou postar minha página JSP após as alterações, é melhor pra você entender.

[code]%
Conexao c = new Conexao();
MeuObjeto m = c.conectar();

try {
//PreparedStatement ps = conn.prepareStatement(“UPDATE…”);

  Statement stmt = null;
  
  stmt = conn.createStatement();
  
  rs = stmt.executeQuery("SELECT introd, background_banner FROM banner;");
  
  rs.next();

%>

<%=rs.getString("introd")%>

<% } catch(SQLException sqlex2) { out.println("Não foi possível se conectar ao banco de dados!" +sqlex2); } %>[/code]

Desta maneira, as variáveis da classe JAVA não são
reutilizadas, pois mostra erro por parte do NetBeans, então acho que
vou precisar resolver o trecho MeuObjeto também.

na sua classe Conexao:

    public Connection getConnection(){
            // retorna a conexao  
    }

no seu jsp:

  < %  
   Conexao conection = new Conexao();  
   ResultSet rs = null;
   Statement stmt = null;
   try {  
        stmt = conection.getConection();  
        rs = stmt.executeQuery("SELECT introd, background_banner FROM banner;");  
        rs.next();  
  %>  
    <h1><%=rs.getString("introd")%></h1>  
  <%   
    } catch(SQLException sqlex2) {  
          out.println("Não foi possível se conectar ao banco de dados!" +sqlex2);  
    }  
  %>  

neste trecho

public Connection getConnection(){ // retorna a conexao }

Eu insiro String driver(“org.gjt…”); ?

Quando você disse pra criar uma classe java eu
criei o método conectar() mas agora tenho que adaptá-lo para esta maneira que você postou.

pode ser, o nome do metodo é indiferente.
o que vc tem q ver é o objeto do tipo de retorno, que neste caso é de Connection.
este metodo vc faz todo a criação da sua conection e retorna ela…

A linha a seguir contém erros na chamada do método:

[code]<%
Conexao c = new Conexao();
ResultSet rs = null;
Statement stmt = null;

try {
stmt = c.getConectar(); // quando coloquei a variável “stmt = c.” não reconheceu o método

    rs = stmt.executeQuery("SELECT introd, background_banner FROM banner;");  
    rs.next();  

%>

<%=rs.getString(“introd”)%>

[/code]

Desculpa a pergunta boba mas não estou acostumado a programar assim ainda.

Após criar o método, no meu caso foi Connection getConectar(), eu não sei utilizar o return.

[code]package schema;

import java.sql.*;

public class Conexao {

public Connection getConectar() {
Connection conn = null;
ResultSet rs = null;
if (conn == null) {
try {
String driver001= “org.gjt.mm.mysql.Driver”;

    String server001 = "localhost";
    String dbase001 = "otavio";
    String user001 = "root";
    String pass001 = "2017";

    Class.forName(driver001);
    
    conn = DriverManager.getConnection(
            "jdbc:mysql://" +server001+ "/" +dbase001 , user001 , pass001);

    System.out.println("Conexão ao banco de dados "+dbase001+" estabelecida com sucesso!");
 
    conn.close();

   } catch(ClassNotFoundException cnfex) {
       System.err.println("Driver não encontrado!");
   } catch(SQLException sqlex) {
       System.out.println("Não foi possível realizar a conexão com o banco de dados!\n"+sqlex);
   } catch(Exception ex) {
       System.out.println("Erro inesperado!");
   }
  } // fim do if
// teria que ter algum return bem aqui, mas quando adiciono mostra erro.

} // fim do método “conectar”

public static void main(String[] args) {
Conexao c = new Conexao();
c.getConectar();
}
}[/code]

utilize o return para retornar a conexao.
pois na assinatura do método vc esta prometendo devolver uma Conexao

 public Connection getConectar() {  

utilize o return desta forma

return conn;
// tem que ter o return null em todos os catch
        } catch(ClassNotFoundException cnfex) {  
            System.err.println("Driver não encontrado!");  
            return null;
        } catch(SQLException sqlex) {  
            System.out.println("Não foi possível realizar a conexão com o banco de dados!\n"+sqlex);  
            return null;
        } catch(Exception ex) {  
            System.out.println("Erro inesperado!");  
            return null;
        }  

Ah agora sim, muito obrigado.

Mas ainda restou este pequeno problema na página JSP

stmt = c.getConectar();  // mudei de  getConnection() pra getConectar()

mostra erro pela pop.up ao passar o mouse:

[quote]Incompatible types
found: java.sql.Connection
required: java.sql.Statement[/quote]

Mas eu já adicionei no topo da página o import do java.sql.* :shock:

[quote=dark123]Ah agora sim, muito obrigado.

Mas ainda restou este pequeno problema na página JSP

stmt = c.getConectar();  // mudei de  getConnection() pra getConectar()

mostra erro pela pop.up ao passar o mouse:

[quote]Incompatible types
found: java.sql.Connection
required: java.sql.Statement[/quote]

Mas eu já adicionei no topo da página o import do java.sql.* :shock: [/quote]

Esta falando que os objetos nao sao compativeis

o erro esta nesta linha: stmt = c.getConectar();

c.getConectar(); devolve um Connection e nao um Statement.
Voce esta atribuindo um Conection a um Statement.

o certo seria
conn = c.getConectar;

e depois vc cria o statement.

stmt = conn.createStatement…

Mas aí a variável conn não é reconhecida.

E olha que eu atribui este nome à ela na classe de conexão.

[code] try {
conn = c.getConection(); // variavel “conn” não encontrada
stmt = conn.createStatement();

    rs = stmt.executeQuery("SELECT introd, background_banner FROM banner;");  
    rs.next();

…[/code]