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.
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 ?
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.
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.