Submit em 02 formularios que estão em uma pagina jsp

10 respostas
java
J

Olá Pessoal!

Estou desenvolvendo um sistema de conciliação bancária, onde preciso de um formulário para fazer os lançamentos de débitos e créditos. O formulário na pagina jsp segue abaixo:

<%@page import="br.com.jairo.modelo.Usuarios"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib tagdir="/WEB-INF/tags" prefix="tagsJairo" %>
<tagsJairo:verificaSessao/>
<c:import url="cabecalho.jsp"/>

form id="formCredito" method="post" action="LancamentoCRUD">
    h1>Credito</h1>
    label for="credata">Data.:</label>
    input type="date" name="credata" id="credata"  onkeypress="formata_mascara(this,'##/##/####'); return Numero(event);" placeholder="dd/mm/aaaa" pattern="[0-9]{2}/[0-9]{2}/[0-9]{4}" required size="10" maxlength="10" value="${param.credata}" /><br><br>
    label for="concodigo">Conta.:</label>
    input type="text" name="concodigo" id="concodigo" required size="3" maxlength="3" value="${param.concodigo}"/>
    select name="selectConta" id="selectConta">
        tagsJairo:listaContasSelect/>
    /select>
    label for="crevalor">Valor:</label>
    input type="text" name="crevalor" id="crevalor" required size="12" maxlength="12" value="${param.crevalor}"/><br><br>
    label for="crehistorico">Historico:</label>
    input type="text" name="crehistorico" id="crehistorico" required size="30" maxlength="30" value="${param.crehistorico}"/><br>
    input type="submit" name="acao" value="novo" />--> este botão deixei oculto para testar somente o botão do formulario abaixo mais não funcionou!
/form>
form id="formDebito" method="post" action="LancamentoCRUD">
    h1>Debito</h1>
    label for="debdata">Data.:</label>
    input type="date" name="debdata" id="debdata" onkeypress="formata_mascara(this,'##/##/####'); return Numero(event);" placeholder="dd/mm/aaaa" pattern="[0-9]{2}/[0-9]{2}/[0-9]{4}" required size="10" maxlength="10" /><br><br>
    label for="concodigo">Conta.:</label>
    input type="text" name="concodigo" id="concodigo" required size="3" maxlength="3" value="${param.concodigo}"/>
    select name="selectConta" id="selectConta">
        tagsJairo:listaContasSelect/>
    /select>
    label for="debvalor">Valor:</label>
    input type="text" name="debvalor" id="debvalor" required size="12" maxlength="12" /><br><br>
    label for="debhistorico">Historico:</label>
    input type="text" name="debhistorico" id="debhistorico" required size="30" maxlength="30"/><br>
    input type="submit" name="acao" value="novo" />
/form>
c:import url="rodape.jsp"/>

Obs.: O SUBMIT DEVE CHAMAR APENAS UMA SERVLET QUE ESTÁ DESCRITA ABAIXO:

public class LancamentoCRUD extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, ParseException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    RequestDispatcher rd = null;

    String creCodigo = request.getParameter("crecodigo");
    String creData = request.getParameter("credata");
    String conCodigo = request.getParameter("concodigo");
    String creValor = request.getParameter("crevalor");
    String creHistorico = request.getParameter("crehistorico");
    String debCodigo = request.getParameter("debcodigo");
    String debData = request.getParameter("debdata");
    String conCodigoDeb = request.getParameter("concodigo");
    String debValor = request.getParameter("debvalor");
    String debHistorico = request.getParameter("debhistorico");

    Creditos creditos = new Creditos();
    if (creCodigo != null) {
        creditos.setCreCodigo(Integer.parseInt(creCodigo));
    }
    DateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
    if (creData != null) {
        Date creDataFormatada = formatoData.parse(creData);
        creditos.setCreData(creDataFormatada);
    }
    if (conCodigo != null) {
        creditos.setConCodigo(Integer.parseInt(conCodigo));
    }
    if (creValor != null) {
        creditos.setCreValor(Double.parseDouble(creValor));
    }
    creditos.setCreHistorico(creHistorico);

    CreditoDAO creditoDAO = new CreditoDAO();
    DebitoDAO debitoDAO = new DebitoDAO();

    Debitos debitos = new Debitos();
    if (debCodigo != null) {
        debitos.setDebCodigo(Integer.parseInt(debCodigo));
    }
    //DateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");
    if (debData != null) {
        Date debDataFormatada = formatoData.parse(debData);
        debitos.setDebData(debDataFormatada);
    }
    if (conCodigo != null) {
        debitos.setConCodigo(Integer.parseInt(conCodigo));
    }
    if (debValor != null) {
        debitos.setDebValor(Double.parseDouble(debValor));
    }
    debitos.setDebHistorico(debHistorico);
    //Verificar qual é a ação
    String acao = request.getParameter("acao");

    if (acao == null) {
        acao = "listarCredito";
    }

    if (acao.equals("alterar")) {
        //contaDAO.alteraConta(contas);
        //rd = request.getRequestDispatcher("/ContaCRUD?acao=listarConta");
    } else if (acao.equals("excluir")) {
        //contaDAO.excluiConta(contas);
        //rd = request.getRequestDispatcher("/ContaCRUD?acao=listarConta");
    } //else if (acao.equals("listarConta")) {
        //int numPagina = 1;
        //if (request.getParameter("numpagina") != null) {
            //numPagina = Integer.parseInt(request.getParameter("numpagina"));
        //}
         else if (acao.equals("novo")) {
        creditoDAO.novaCredito(creditos);
        debitoDAO.novoDebito(debitos);
        rd = request.getRequestDispatcher("/lancamento.jsp");
    }

    rd.forward(request, response);
}

Estou neste exato momento pensando em criar um formulário pai que pegue os dois formulários acima, e nele criar o submit chamando o servlet, será se vai funcionar?

10 Respostas

V

Por que você não faz todas as operações em um form só, já que é o mesmo controlador para os dois?

V

Se você quer fazer duas operações diferentes existem algumas possibilidades… Uma delas é criar um controlador (Servlet) para cara processo, outra possibilidade seria criar no JSP uma opção do tipo de transação que a pessoa quer fazer, dessa forma o servlet poderá pegar o tipo de transação e controlar qual processo vai ser realizador à partir de uma condicional.

Eu não entendi muito bem o que queres fazer, pode esclarecer melhor?

J

Olá Vinicius

O que desejo fazer na tela de lançamento é um lançamento único de debito e credito, ou seja, o usuário escolhe em um select a conta a ser creditada e em outro select escolhe a outra conta a ser debitada.
Fiz uma tag para o select no braço, e ainda não testei se funciona com o mesmo id em um único formulário. Acho que não funciona, por isto tentei fazer um único lançamento em dois formulários na mesma pagina jsp.

J

Como o @viniciosarodrigues falou, use um form só, no servlet você recebe as informacoes de débito e crédito na mesma requisição. Visualmente pro usuário pode ficar em dois divs como se fossem dois “formularios”, mas não tem necessidade de dois elementos form já que quer postar ao mesmo tempo.

J

Olá javaflex!

Fiz em um form só mas não funcionou devido ao select que existe no form, e seu código foi feito no braço, não peguei um select pronto. Segue abaixo o código da tag em que o select utiliza:

<%@tag body-content="empty" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:useBean id="beanConta" class="br.com.jairo.dao.ContaDAO"></jsp:useBean>
<c:set var="contador" value="${0}"></c:set>
<%
            String selected = "";
            java.util.List listaDeContas = (java.util.List) beanConta.getListaContaCombo();

            for (java.util.Iterator iterator = listaDeContas.iterator(); iterator.hasNext();) {
                br.com.jairo.modelo.Contas contas = (br.com.jairo.modelo.Contas) iterator.next();
                int conCodigo = contas.getConCodigo();
                String conDescricao = contas.getConDescricao();

                if (request.getParameter("concodigo") != null) {

                    if (conCodigo == Integer.parseInt(request.getParameter("concodigo"))) {
                        selected = "selected";
                    } else {
                        selected = "";
                    }
                }
                out.println("<option value=" + conCodigo + " " + selected + ">" + conDescricao + "</option>");
            }
%>
J

Isso já é outra dúvida, resolvendo essa parte vai conseguir postar em 1 form só. Veja se não está errando em colocar o mesmo id e name para este elemento select. Id e name tem que ser diferente para cada conta, um selectContaDebito e outro selectContaCredito.

V

Essa não é uma solução interessante, tendo em vista que você encheu o jsp com códigos java… Acho que seria melhor você voltar a forma anterior e tratar o processo dentro do servlet, para fazer o select você pode usar JSTL. Fazer dois selects com o mesmo ID vai dá bronca,

J

Olá javaflex!

Tentei esta solução que você informa, mas não funcionou, na verdade funcionou mas somente o select do formulário de débito. Tentei também em um único formulário mudando o nome do select e o id, mas aconteceu o mesmo citado acima.
Vou refazer tudo e deixar da forma que você está informando, e logo após envio o código com as modificações.

J

Olá Vinicios!

Realmente não irei conseguir, vou é criar outra pagina jsp para o usuário escolher somente a conta onde vai ocorrer o debito. Quando ele clicar no botão novo dou um request para a outra pagina jsp.
Vou fazer em JSTL sim, mas eu gosto de desenvolver primeiro no jsp e depois de testar faço um arquivo JSTL (*.tag) colocando toda codificação nela e retirando do arquivo JSP!

J

Não desiste cara, é perfeitamente possível. Em algum momento da vida você vai ter que lidar com isso e seu cliente não vai permitir que você faça diferente do resultado que ele deseja. Não tem mistério nenhum portanto que cada select tenha sua própria id e name. Assim como todos os campos do formulário devem der seu próprio id e name pra facilitar a vida, senão vai ter que ler uma array. Pelo seu código HTML/JSP alguns elementos estão com mesmo id e name para débito e crédito.

Criado 1 de setembro de 2016
Ultima resposta 3 de set. de 2016
Respostas 10
Participantes 3