[Resolvido] Ajuda com Servlet

7 respostas
C

Olá Gujeiros, tenho o seguinte Servlet:

package br.bmweb.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.bmweb.pojo.*;
import br.bmweb.util.*;
import br.bmweb.dao.*;

/**
 * Servlet implementation class Venda
 */
public class ServletVenda extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private final Connection conn;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		try {
			Venda venda = new Venda();
			Data data = new Data();
			HttpSession session = request.getSession(true);
			venda.setData_fechamento(new Data().formata(request.getParameter("data_fechamento")));
			venda.setData_venda(new Data().formata(request.getParameter("data_venda")));
			venda.setStatus_venda(request.getParameter("status_venda"));
			venda.setTipo_pagamento(request.getParameter("tipo_pagamento"));
			venda.setTipo_venda(request.getParameter("tipo_venda"));
			venda.setValor_desconto(Double.parseDouble(request.getParameter("valor_desconto")));
			venda.setValor_total(Double.parseDouble(request.getParameter("valor_total")));
			venda.setValor_unitario(Double.parseDouble(request.getParameter("valor_unitario")));
			VendaDao vendadao = new VendaDao();
			if(vendadao.grava()){
				request.getRequestDispatcher("Venda.jsp").forward(
						request, response);
				writer
				.print("<SCRIPT language='JavaScript'> alert('Dados enviados com sucesso, obrigado!!'); </SCRIPT>");
			}

		} catch (Exception e) {
			e.printStackTrace();
			writer
			.print("<p align=\"center\">Houve um erro ao inserir os registros por favor tente novamente.<BR><a href=\"javascript:history.back(1);\">Clique aqui para voltar.</a></p><table style=width:\"100%\";>");
		}

	}
	public ServletVenda(){
	}
	
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Acontece que quando preencho o formulário JSP e clico no botão para salvar ocorre o seguinte erro:

INFO: Reloading this Context has started
16/03/2010 22:34:14 org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet ServletVenda as unavailable
16/03/2010 22:34:14 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Allocate exception for servlet ServletVenda
java.lang.Error: Unresolved compilation problem: 
	The blank final field conn may not have been initialized

	at br.bmweb.servlet.ServletVenda.<init>(ServletVenda.java:57)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1116)
	at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Meu web.xml está assim:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>BMWEB</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description>ServletVenda</description>
    <display-name>ServletVenda</display-name>
    <servlet-name>ServletVenda</servlet-name>
    <servlet-class>br.bmweb.servlet.ServletVenda</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletVenda</servlet-name>
    <url-pattern>/ServletVenda</url-pattern>
  </servlet-mapping>
</web-app>

Como posso arrumar isso?

7 Respostas

evandro.santos

The blank final field conn may not have been initialized.

Você não iniciou a variável final Connection conn.

C

Obrigado cara, isso é verdade, mas na realidade essa variável não vou usar pra nada nesse Servlet, removi ela do código e agora deu certo, está dando erro de conexão com o MySQL mas isso já consigo arrumar. Obrigado.

C
Surgiu outra dúvida, eu não estou querendo deixar dentro do Servlet os métodos de inserção, alteração e exclusão dos dados, para isso criei a classe abaixo:
package br.bmweb.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import br.bmweb.util.*;
import br.bmweb.pojo.*;

public class VendaDao {
	Connection con = new Conexao().conecta();

	public boolean grava(){
		String sql = "INSERT INTO TB_VENDA (ve_cod_funcionario, ve_cod_cliente, ve_cod_orcamento, ve_data_venda, " +
		"ve_data_fechamento, ve_status_venda, ve_valor_unit, ve_valor_total, ve_desconto, " +
		"ve_tipo_venda, ve_tipo_pagamento)" + 
		"VALUES (?,?,?,?,?,?,?,?,?,?,?)";
		try {
			PreparedStatement stmt = con.prepareStatement(sql);
			Venda venda = new Venda();
			stmt.setInt(1,venda.getCod_funcionario());
			stmt.setInt(2, venda.getCod_cliente());
			stmt.setInt(3, venda.getCod_orcamento());
			stmt.setDate(4,(Date) venda.getData_venda());
			stmt.setDate(5, (Date) venda.getData_fechamento());
			stmt.setString(6, venda.getStatus_venda());
			stmt.setDouble(7, venda.getValor_unitario());
			stmt.setDouble(8, venda.getValor_total());
			stmt.setDouble(9, venda.getValor_desconto());
			stmt.setString(10, venda.getTipo_venda());
			stmt.setString(11, venda.getTipo_pagamento());
			con.close();
			return true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}

	public List pesquisaPorData(){
		String sql =   "SELECT ve_cod_funcionario, ve_cod_cliente, ve_cod_orcamento, ve_data_venda, " +
		"ve_data_fechamento, ve_status_venda, ve_valor_unit, ve_valor_total, "+ 
		"ve_desconto, ve_tipo_venda, ve_tipo_pagamento " +
		"FROM tb_venda" +
		"WHERE ve_data_venda BETWEEN ? " +
		"AND ?" +
		"ORDER BY ve_data_venda";
		try{
			PreparedStatement stmt = con.prepareStatement(sql);

		}catch (SQLException e) {
			e.printStackTrace();
			// TODO: handle exception
		}
		return null;

	}


}

Acontece que dentro do próprio Servlet os dados estão setados na classe venda, mas a partir do momento que é executada a linha 43 do servlet os dados são perdido e a classe VendaDao recebe valores nulos. Vou precisar alterar o método "grava" da classe VendaDao para receber todos os dados do formulário que foram capturados no Servlet? Tem alguma forma "mais elegante" de se fazer?

C

Alguém tem alguma idéia?

quikkoo

olha a linha 22 da classe VendaDao, vc instancia uma Venda e grava ela no banco, obviamente nenhum valor voi inicializado, oq vc deveria fazer é passar o objeto venda q é usado no servlet como parametro para a função ‘grava’ da sua classe dao

flw, t+

walacy

Chamada do “grava” na servlet:

if(vendadao.grava(venda)){  //venda como parametro.
...

Seu método na “dao”:

public boolean grava(Venda venda){  //Passa a "venda" como parametro.
         String sql = "INSERT INTO TB_VENDA (ve_cod_funcionario, ve_cod_cliente, ve_cod_orcamento, ve_data_venda, " +  
         "ve_data_fechamento, ve_status_venda, ve_valor_unit, ve_valor_total, ve_desconto, " +  
         "ve_tipo_venda, ve_tipo_pagamento)" +   
         "VALUES (?,?,?,?,?,?,?,?,?,?,?)";  
         try {  
             PreparedStatement stmt = con.prepareStatement(sql);  
// REMOVE ISSO.
//             Venda venda = new Venda();  
             stmt.setInt(1,venda.getCod_funcionario());  
...
C

Testei as sugestões e deu certo, obrigado à todos pela atenção.

Criado 16 de março de 2010
Ultima resposta 17 de mar. de 2010
Respostas 7
Participantes 4