[RESOLVIDO]Ajuda com lógica e servlets

13 respostas
j_gff
estou com uma dúvida em Java na parte de lógica usando servlets. A seguinte questão: estou fazendo um questionário em Java usando servlet, porém estou tendo que usar um servlet para cada questão, pq não consegui colocar todas as questões dentro do mesmo servlet. Acontece que a variável que estou usando para contador(pontuacao) no primeiro servlet não está sendo atualizada nos demais. Como faço:

index.jsp

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Questionário!!!</h1>
        <form action="media" method="POST">
            <h3>Questao 1:</h3>
            <input type="radio" name="nota1" value="op1" id="nota1"/>oksjdf<br>
            <input type="radio" name="nota1" value="op2" id="nota1" />pgjeg<br>
            <input type="radio" name="nota1" value="op3" id="nota1"/>oiwueuri<br>
            <input type="radio" name="nota1" value="op4" id="nota1"/>utywoeiur<br>
            <input type="radio" name="nota1" value="op5" id="nota1"/>ttosiduuw<br>
            <input type="submit" value="Responder" />
        </form>
    </body>
</html>

media.java(servlet)

public class media extends HttpServlet {
    int pontuacao;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

            String nota1 = request.getParameter("nota1");
            System.out.println(nota1);
            String nota2 = request.getParameter("nota2");
            System.out.println(nota2);
            String nota3 = request.getParameter("nota3");
            System.out.println(nota3);
             String nota4 = request.getParameter("nota4");
            System.out.println(nota4);
             String nota5 = request.getParameter("nota5");
            System.out.println(nota5);
        try {
            if(nota1.equals("op1")) {
                System.out.println("");
                 pontuacao=pontuacao + 1;
            }
            else if(nota1.equals("op2")) {
                
            }
            else if(nota1.equals("op3")) {
                System.out.println("");
             
            }
              else if(nota1.equals("op4")) {
                System.out.println("");

            }
              else if(nota1.equals("op5")) {
                System.out.println("");

            }
        } finally {
            RequestDispatcher rd = null;
            rd = request.getRequestDispatcher("resultado.jsp?pontuacao=" + pontuacao);
            rd.forward(request, response);
            out.close();
        }
    } 

}

resultado.jsp

<%
   int pontuacao = Integer.parseInt(request.getParameter("pontuacao"));
%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Resultado da média</title>
    </head>
    <body>
        <h1>Resultado:</h1>
        <h2>O resultado do aluno e:<%=pontuacao%></h2>
    </body>
</html>
Agradeço pela ajuda.

13 Respostas

drigo.angelo

[size=9]Acho que você desabilitou formatação BB na msg hehe (a propósito, porque voce coloca citação quando vai escrever? )[/size]

Mas então… para você atualizar a variável, você tem que deixar ela na requisição/sessão/etc… tipo assim, se o usuário vai fazer uma requisição para cada questão e você quer que a pontuação dele acumule os valores dessas requisições, seria uma solução colocar na sessão… algo do tipo:

if(request.getSession().getAttribute("pontuacao") == null) request.getSession().setAttribute("pontuacao", pontuacao); //pontuacao é a variavel que voce quer salvar else{ pontuacao += request.getSession().getAttribute("pontuacao"); request.getSession().setAttribute("pontuacao", pontuacao); }
Lembrando que nesse caso pontuacao seria um objeto, provavelmente do tipo Integer :smiley:

j_gff
Alterei o código e mesmo assim não está atualizando o valor da variável. Lembrando que cada form está em uma página. O que pode estar faltando???
public class validarResposta extends HttpServlet {

    int pontuacao = 0;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String questao1 = request.getParameter("questao1");
        System.out.println(questao1);

        try {

            if (questao1.equals("op1")) {
                System.out.println("");
            } else if (questao1.equals("op2")) {
                System.out.println("");
            } else if (questao1.equals("op3")) {
                pontuacao = pontuacao + 1;
            }

        } finally {
            if (request.getSession().getAttribute("pontuacao") == null) {
                request.getSession().setAttribute("pontuacao", pontuacao); //pontuacao é a variavel que voce quer salvar
            } else {
                pontuacao = (Integer) request.getSession().getAttribute("pontuacao");
                request.getSession().setAttribute("pontuacao", pontuacao);
            }
            RequestDispatcher rd = null;
            rd = request.getRequestDispatcher("questao2.jsp?pontuacao=" + pontuacao);
            rd.forward(request, response);
            out.close();
        }
    }
}

public class validarResposta2 extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String questao2 = request.getParameter("questao2");
        System.out.println(questao2);
        int pontuacao = (Integer) request.getSession().getAttribute("pontuacao");
        try {

            if (questao2.equals("r2")) {
                System.out.println("");
            } else if (questao2.equals("r3")) {
                System.out.println("");
            } else if (questao2.equals("r4")) {
                pontuacao = pontuacao + 1;
            }

        } finally {
            if (request.getSession().getAttribute("pontuacao") == null) {
                request.getSession().setAttribute("pontuacao", pontuacao); //pontuacao é a variavel que voce quer salvar
            } else {
                pontuacao = (Integer) request.getSession().getAttribute("pontuacao");
                request.getSession().setAttribute("pontuacao", pontuacao);
            }
            RequestDispatcher rd = null;
            rd = request.getRequestDispatcher("questao3.jsp?pontuacao=" + pontuacao);
            rd.forward(request, response);
            out.close();
        }
    }
}

public class validarResposta3 extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String questao3 = request.getParameter("questao3");
        System.out.println(questao3);
        int pontuacao = (Integer) request.getSession().getAttribute("pontuacao");
        try {

            if (questao3.equals("r5")) {
                System.out.println("");

            } else if (questao3.equals("r6")) {
                System.out.println("");

            } else if (questao3.equals("r7")) {
                pontuacao = pontuacao + 1;
            }

        } finally {
            if (request.getSession().getAttribute("pontuacao") == null) {
                request.getSession().setAttribute("pontuacao", pontuacao); //pontuacao é a variavel que voce quer salvar
            } else {
                pontuacao = (Integer) request.getSession().getAttribute("pontuacao");
                request.getSession().setAttribute("pontuacao", pontuacao);
            }
            RequestDispatcher rd = null;
            rd = request.getRequestDispatcher("paginaRetorno.jsp?pontuacao=" + pontuacao);
            rd.forward(request, response);
            out.close();
        }
    }
}
drigo.angelo

Isso é um trabalho ou você só está estudando mesmo?

Se for um trabalho, é pra quando?

Você já houviu falar do command pattern?

Acho que se der tempo de você implementa-lo ficaria muito melhor a estrutura do seu programa (a implementação ficaria ate mais rapida, inclusive)

Desculpa aí caso fui intrusivo demais nas perguntas, mas é só pra saber se dá tempo de voce fazer de uma forma mais “elegante”, fácil e manutenível ( <-- será que essa palavra existe mesmo o0 )

j_gff
drigo.angelo

Então… como é pra TCC, creio que desse jeito vai acabar ficando mais difícil no futuro não muito distante… vo bola um esqueminha aqui que eu acho que pode te ajudar mais… desse jeito você vai criar muito código a toa.

Da uma olhada no link que eu passe, vale a pena, pra voce conhecer nem que seja por cima…

j_gff
drigo.angelo
A única servlet que você irá precisar: Controller
public class Controller extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private HashMap<String, Command> comandos;

    public Controller() {
    	//Aqui voce tem que declarar cada comando que voce criar
        comandos = new HashMap<String, Command>();
        comandos.put("PrimeiraQuestao", new PrimeiraQuestaoCommand());
        comandos.put("SegundaQuestao", new SegundaQuestaoCommand());
        //terceira questao / etc...
    }
    
    //Neste exemplo este método atende tanto requisições do tipo GET e POST, mas voce pode fazer um tratamento diferenciado para cada uma.
    private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Em cada formulario voce vai passar qual comando ele vai chamar
    	String cmd = request.getParameter("cmd");
    	//A servlet vai apenas pegar o obj comando correspondente e chamar o metodo execute. Dentro desse método que será feita sua lógica (no caso, corrigir a pergunta)
		comandos.get(cmd).execute(request, response);
	}

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Como havia dito, quando houver uma requisição tipo GET o servlet vai apenas chamar o método processRequest (poderia ser qqr nome)
    	processRequest(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Idem ao método doGet..
		processRequest(request, response);
	}

}
Observe que aqui foi utilizado o padrão front controller, em que apenas esta servlet vai tratar todas as requisições, e não cada requisição para uma servlet como voce tava fazendo. A interface Command que garante que os objetos de comando tem um método execute:
public interface Command {
	//Voce pode colocar qualquer nome de método aqui, mas geralmente se passa como parâmetro o request e o response..
	//Voce pode escolher algum tipo de retorno também, como a nota do aluno naquela questão, um boolean indicando se ocorreu algum erro/etc..
	void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
Um exemplo de Comando, mas lembre-se que esta é uma classe como outra qqr, e você pode fazer outros métodos, definir atributos, chamar outras classes/etc..
public class PrimeiraQuestaoCommand implements Command {
	
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Integer pontuacao = request.getSession().getAttribute("pontuacao") != null ? (Integer)request.getSession().getAttribute("pontuacao"):0;
		if(perguntaEstaCerta)
			pontuacao += 10;
		request.getSession().setAttribute("pontuacao", pontuacao);
                rd = request.getRequestDispatcher( ... ); //Aqui lembre-se que não precisa passar a pontuação para a jsp, visto que ela ja esta no obj de sessão e voce pode acessa-la por session.getAttribute("pontuacao"); de dentro da jsp ...
                rd.forward( request, response );
	}

}

Esse código, apesar de ser quase funcional, não está 100% completo (ta faltando os imports aí, que tirei pra economizar espaço)
No eclipse ctrl+shift+o organiza os imports, no netbeans acho que é ctrl+i ou ctrl+shift+i...

drigo.angelo

Só mais duas observações

Em cada formulário que você for enviar para o programa deve ter um input hidden com o nome cmd (ou o nome que voce definir na servlet, caso queira trocar) e com value o nome do command, que deve ser idêntico ao nome do comando que tá no construtor da servlet.. Ex, para o form da primeira questão, ficaria assim naquele exemplo:
<form name="..." ... ... ...>
   ...
   ...
   <input type="hidden" name="cmd" value"PrimeiraQuestao" / >
</form>

Outra coisa, esse exemplo é um dos mais simples do command pattern mas se a aplicação for muito grande (o que julguei não ser o caso) ou se for necessária mais robustez (o que também julguei não ser o foco do seu projeto ) poderiam ser utilizado outros padrões, como o factory, por exemplo..

Espero ter ajudado mais do que atrapalhado ou confundido..
Qualquer coisa posta aí blz

[]'s

j_gff
j_gff

.

j_gff
drigo.angelo

Posta a solução aí, se puder… que aí depois pode vir a ajudar alguma outra pessoa :stuck_out_tongue:

E edita seu primeiro post deste topico e coloca [resolvido] no título.

j_gff
Criado 14 de março de 2011
Ultima resposta 20 de mar. de 2011
Respostas 13
Participantes 2