Como passar um Objeto pelo RequestDispatcher ?

Estou com uma dúvida, preciso passar uma objeto contrato que criei pra uma JSP é possível ? Sei que devo usar o RequestDispatcher, mas não sei como utiliza-lo neste caso. Alguém poderia me ajudar ?

Estou usando um select atraves da função retornaMaior() para buscar as informações no banco, criando um contrato e setando os atributos.

A função está assim:

	public Contrato retornaMaior() {
		try {
		PreparedStatement stmt = connection.prepareStatement("SELECT id, nomeProdutor, produto, quantidadeKg, dataNegociacao, valor FROM CONTRATOS WHERE ID = (SELECT MAX(ID) FROM CONTRATOS)"); 
		ResultSet rs = stmt.executeQuery();
		Contrato contrato = new Contrato();
		if(rs.next()) {
			contrato.setId(rs.getLong("id"));
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNegociacao"));
			contrato.setDataNegociacao(data);
			contrato.setNomeProdutor(rs.getString("nomeProdutor"));
			contrato.setProduto(rs.getString("produto"));
			contrato.setQuantidadeKg(rs.getLong("quantidadeKg"));
			contrato.setValor(rs.getDouble("valor"));
		}
		stmt.close();
		rs.close();
		return contrato;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
	}

E a servlet que está utilizando ela está assim:

@WebServlet("/geraCodigo")
public class GeraCodigoServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		String nomeProdutor = request.getParameter("nomeProdutor");
		String produto = request.getParameter("produto");
		long quantidadeKg = Long.parseLong(request.getParameter("quantidadeKg"));
		String dataEmTexto = request.getParameter("dataNegociacao");
		Calendar dataNegociacao = null;
		
		try {
			Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
			dataNegociacao = Calendar.getInstance();
			dataNegociacao.setTime(date);
		} catch (ParseException e) {
			out.println("Erro de Conversão de Data");
			return;
		}
		
		double valor = Double.parseDouble(request.getParameter("valor"));
		
		Contrato contrato = new Contrato();
		contrato.setDataNegociacao(dataNegociacao);
		contrato.setNomeProdutor(nomeProdutor);
		contrato.setProduto(produto);
		contrato.setQuantidadeKg(quantidadeKg);
		contrato.setValor(valor);
		
		Connection connection = (Connection) request.getAttribute("conexao");
		ContratosDao dao = new ContratosDao(connection);
		dao.adiciona(contrato);
		
		out.println("<html> <head> <title> Numero de contrato </title> </head> <body>");
		out.println("O número de contrato é: " + dao.retornaMaior().getId() + "para o produtor " + dao.retornaMaior().getNomeProdutor() + "</body> </html>");
		
	}
}

O que eu preciso é substituir esse final da servlet (Tudo enviado pelos dois out.println) usando o RequestDispatcher pra encaminhar para contrato-gerado.jsp. Porém preciso que o contrato vá junto ! Como faço ? Seria melhor se eu enviasse cada atributo como string e gerasse esse contrato na JSP ?

Que eu saiba (sou leigo em jsp), a RequestDispatcher só recebe String como parametro. No seu caso seria melhor criar uma session e usar na pagina que você quer.

 HttpSession session = request.getSession();
 session.setAttribute("contrato", contrato);

Depois você utiliza o RequestDispatcher para redirecionar para a pagina que você quer utilizar.

Matheus obrigado pela ajuda !

Nesse caso acredito que não posso passar Contrato como atributo por ele ser um Objeto, ou estou enganado ?
Acredito que terei que fazer um setAttribute para cada atributo do contrato. E como eu vou recuperar estes atributos na jsp ? Somente usando o session e o Request Dispatcher estes atributos já serão enviados para a JSP ?

Parando pra analisar um pouco aqui, acredito que eu consiga recuperar com EL usando {param.attribute} correto ?

E pra enviar o session e o RD são suficientes ?

A session sera criada na servlet, dai como você criou um novo objeto de contrato, quando você criar a sessão, aquele objeto será passado para a jsp, dai você podera utlizalo utilizando “${contrato.nomeProduto}” etc

Isso, ela irá passar o atributo para a jsp, todavia você pode perder esse objeto se a sessão for encerrada.

Ai já não consigo te responder :confused:

Fiz o seguinte no lugar dos Out.println’s:

		HttpSession session = request.getSession();
		session.setAttribute("contrato", contrato);
		RequestDispatcher rd = request.getRequestDispatcher("/codigoGerado.jsp");
		rd.forward(request, response);

e na JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <font size="5">O código gerado é ${contrato.id} !</font> 
</body>
</html>

Bem simples mesmo só pra testar se funcionaria, porém o resultado gerado na página foi:

“O código gerado é 0 !”

Alguém sabe porque ?

Cara, se tá usando .jsp não precisa usar o PrinterWriter no Servlet. O .jsp veio pra tirar isso. Desmisturar HTML com o Java diretamente.

Outra coisa, esse código não foi testado, mas a ideia é essa. Faz o teste e diz o que acontece. Qualquer coisa vai perguntando que o pessoal vai ajudando, inclusive eu.