PROJETO WEB: Este projeto nos mostra uma página JSP que contém um formulário para digitarmos um número inteiro. Na mesma página, o sistema retorna se esse número é primo ou não - caso não seja primo, retorna o valor de um número inteiro que seja seu divisor. Estrutura do projeto depois de finalizado: WWW.COTIINFORMATICA.COM.BR 1
Para criar esse projeto: Clicar no menu File -> New -> Dynamic Web Project Vamos criar um pacote chamado control, onde vamos ter as classes do nosso sistema. WWW.COTIINFORMATICA.COM.BR 2
Para criar um novo pacote clique em Resources e depois, clique com o botão direito em src [abaixo de Resources]. WWW.COTIINFORMATICA.COM.BR 3
Depois escolha New -> Package. WWW.COTIINFORMATICA.COM.BR 4
Dê o nome control e clique em Finish. WWW.COTIINFORMATICA.COM.BR 5
Agora, precisamos criar a interface funcional de nosso sistema. Como toda interface, ela vai conter apenas a assinatura dos métodos sem a sua implementação. Para criar uma nova interface funcional, clique com o botão direito em control [veja imagem abaixo] e escolha New -> Interface. Depois, basta dar o nome para a interface funcional e clicar em Finish. WWW.COTIINFORMATICA.COM.BR 6
O nome da nossa interface funcional é ICalculoDois. Essa interface terá um método apenas. Toda interface funcional deve ter apenas um método. Essa interface irá receber 2 números inteiros. O primeiro é o número que queremos saber se é primo ou não, e o segundo é o número inteiro mais próximo do valor da raiz quadrada do primeiro número, por exemplo, se a raiz quadrada do primeiro número for 33,7, o número inteiro mais próximo é 34 e se for 33,1 o número inteiro mais próximo é 33. Recebe 2 números inteiros e retorna um número inteiro - todos Integer. WWW.COTIINFORMATICA.COM.BR 7
ICalculoDois.java package control; @FunctionalInterface public interface ICalculoDois { public Integer operacao(integer a, Integer b); } Precisamos criar uma Classe chamada Controle. Nessa Classe, vamos implementar o método que foi declarado na interface funcional que criamos. Para criar a Classe Controle, Clique com o botão direito no pacote control e selecione New -> Class. Depois, é só dar o nome Controle e clicar em Finish. WWW.COTIINFORMATICA.COM.BR 8
WWW.COTIINFORMATICA.COM.BR 9
A Classe Controle irá implementar o método declarado na interface funcional. Essa implementação é como no exemplo abaixo: public static ICalculoDois PRIMO = (a, b) -> (a % b == 0? b : Controle.PRIMO.operacao(a, b - 1)); WWW.COTIINFORMATICA.COM.BR 10
A expressão mostrada acima é uma Função Lambda. Funções Lambda fazem parte do 8 no contexto de Programação Funcional. Uma Função Lambda pode ser criada como se fosse um método público e estático, sem haver necessidade de criar um objeto para utilizála. Função Lambda P implementa o método operacao da interface funcional ICalculoDois; recebe 2 parâmetros Integer (a, b) e retorna o valor que é calculado à direita da seta -> O valor inicial de b, é o valor inteiro mais próximo da raiz quadrada de a. A Função Lambda então executa um Ternário da seguinte forma: Se o resto da divisão de a por b for zero, a Função Lambda retorna b, caso contrário, a Função chama ela mesma, recursivamente, passando os parâmetros a e (b-1) e segue buscando um número que divida a. Controle.java package control; public class Controle { public static ICalculoDois PRIMO = (a, b) -> (a % b == 0? b : Controle.PRIMO.operacao(a, b - 1)); } Precisamos criar o Servlet que vai receber o número enviado via POST por um formulário html. Esse Servlet irá chamar o método implementado na classe Controle, e vai retornar a mensagem se o número é primo ou não. Para criar um novo Servlet, clique com o botão direito no pacote control e selecione New -> Servlet. Depois dê um nome ao Servlet e clique em Next. WWW.COTIINFORMATICA.COM.BR 11
WWW.COTIINFORMATICA.COM.BR 12
Depois de Clicar Next na tela mostrada acima, clicamos em Next na tela seguinte. Vamos entrar na tela mostrada abaixo. Como vamos enviar os dados de um formulário html via POST, desmarcamos o método doget, indicado pela seta. Depois, clicamos em Finish. WWW.COTIINFORMATICA.COM.BR 13
Criamos o Servlet ControlPrimo. Esse Servlet irá fazer algumas avaliações sobre o número recebido antes de chamar a Função Lambda definida na Classe Controle, para evitar uma chamada desnecessária. Primeiramente, o Servlet recebe o valor passado por form, que vem como String, e o converte para Integer. Integer n = Integer.parseInt((request.getParameter("N1"))); Se o número enviado for 2 ou 3, o Servlet retorna a mensagem que o número digitado é primo; se o número digitado for 0 ou 1, o Servlet retorna a mensagem que deve ser digitado um número maior que 1; e se WWW.COTIINFORMATICA.COM.BR 14
o resto da divisão do número por 2 for zero, o Servlet retorna a mensagem que o número digitado é par. Criamos um contador inteiro com o valor 1, e chamamos de i. Se o Servlet enviar qualquer uma das 3 mensagens citadas acima, esse contador é decrementado e todo o resto do processamento do Servlet não é executado. Se o valor do contador que criamos for maior que zero, então o Servlet chama a Função Lambda definida na Classe Controle, passando como parâmetros o número recebido do formulário html [chamamos esse parâmetro de n no Servlet], e o valor de i, que passa a ser o valor inteiro mais próximo da raiz quadrada de n. Recursivamente, a Função Lambda executa até chegar a um número que divida n. O Servlet, por fim, avalia se esse número é 1 se for o caso, então o Servlet retorna a mensagem que o número é primo, caso contrário, retorna a mensagem que o número não é primo e exibe i como um divisor de n. O Envio dessas mensagens é feito via Expression Language, como veremos mais adiante. ControlPrimo.java package control; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; @WebServlet("/ControlPrimo") WWW.COTIINFORMATICA.COM.BR 15
public class ControlPrimo extends HttpServlet { private static final long serialversionuid = 1L; public ControlPrimo() { super(); } protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { Integer n = Integer.parseInt((request.getParameter("N1"))); Integer i = 1; if (n == 2 n == 3) { request.setattribute("primo", n + " é primo!!!"); i--; } else if (n == 1 n == 0) { request.setattribute("primo", "Digite um valor maior que 1..."); i--; } else if (n % 2 == 0) { request.setattribute("primo", n + " é par!!!"); i--; } if (i > 0) { i = Controle.PRIMO.operacao(n, (int) (Math.round(Math.sqrt(n)))); if (i == 1) { request.setattribute("primo", n + " é primo!!!"); } else { request.setattribute("primo", n + " não é primo!!!<br>é um número divisível por " + i); } WWW.COTIINFORMATICA.COM.BR 16
} request.getrequestdispatcher("destino.jsp").forward(re quest, response); } } Precisamos criar uma página JSP, e colocar nela o formulário que irá enviar via POST o número digitado para o Servlet ControlPrimo. Para criar uma nova página JSP, primeiro clicamos com o botão direito em WebContent e selecionamos New -> JSP File. WWW.COTIINFORMATICA.COM.BR 17
Em seguida, damos um nome ao arquivo JSP e clicamos Next. Para o nosso projeto, na tela seguinte, selecionamos o template pronto New JSP File (html 5), como na imagem abaixo. Depois clicamos em Finish. WWW.COTIINFORMATICA.COM.BR 18
WWW.COTIINFORMATICA.COM.BR 19
sistema.jsp <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="utf-8"> <title>números Primos</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12. 1/jquery-ui.css" /> <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.js"></script> <script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jqueryui.js"></script> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/cs s/bootstrap.min.css" rel="stylesheet"> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/ bootstrap.min.js"></script> <script> $(document).ready(function() { var txtn1 = ""; function dadospagina() { } txtn1 = $("#N1").val(); $("#btn1").on('click', function() { dadospagina(); $.ajax({ url : "ControlPrimo", method : "POST", data : { N1 : txtn1, WWW.COTIINFORMATICA.COM.BR 20
} }).done(function(resultado) { $("#resposta1").html(resultado); }); }); }); </script> </head> <body style="padding: 25px 50px; width: 800px; margin: auto; background-color: #ededed;"> <div class="container"> <h3 style="text-align: center;">números Primos</h3> <hr style="border: 0; height: 1px; backgroundimage: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));"> <form id="form" style="margin-top: 20px;"> Digite o Número:<br> <img src="https://static.todamateria.com.br/upload/ta/be/tabelap rimos1000.jpg" style="float: right; width: 400px; marginbottom: 20px;"> <input type="number" step=1 name="n1" size="10" id="n1"><br> <br> <button type="button" id="btn1" class="btn btnprimary">enviar AJAX</button> <br> </form> <br> <br> <div id="resposta1" style="color: #4B0082;">Aqui vai aparecer a resposta...</div> </div> </body> </html> WWW.COTIINFORMATICA.COM.BR 21
Na tag <head>, vemos os links CDN de todos os recursos de que vamos necessitar: JQuery, JQuery-UI, Bootstrap. Logo abaixo desses links temos a tag <script> que marca o início das funções JQuery e AJAX que vamos utilizar. $(document).ready(function() { No momento em que a página é carregada, inicia o código [veja abaixo] que "zera" o valor da variável txtn1, que vamos utilizar para envio do número digitado no formulário html. var txtn1 = ""; Abaixo desse código, existe o código da função que vai instanciar a variável txtn1 com o valor inserido no formulário html. function dadospagina() { txtl1 = $("#N1").val(); }.val() indica que o valor vem do formulário html, no caso, do input com o id= N1. E, terminando esse trecho de código, temos a função que é disparada no evento do clique no botão btn1 e, via AJAX, chama o servlet ControlTriangulo enviando via POST os valores de txtn1. $("#btn1").on('click', function() { dadospagina(); $.ajax({ url : "ControlPrimo", method : "POST", data : { N1 : txtn1 } }).done(function(resultado) { $("#resposta1").html(resultado); WWW.COTIINFORMATICA.COM.BR 22
Abaixo da tag <script> temos o formulário html onde vamos digitar o número inteiro que queremos saber se é primo ou não. As classes CSS utilizadas nesse layout são do BootStrap, que incluímos na tag <head>. Ex: class="container" class="btn btn-primary" Nessa página, também existe uma imagem com uma lista de números primos até 1000 para facilitar os testes. destino.jsp <%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <strong> ${primo} </strong> Essa é a última página de nosso projeto. Nela serão inseridos os dados enviados pelo Servlet, via expression language..done(function(resultado) { $("#resposta1").html(resultado); O trecho de código acima está na página sistema.jsp, e pega o que foi enviado pelo Servlet em resposta ao processamento da requisição enviada via formulário HTML; e essa resposta, que é o conteúdo da página destino.jsp, é inserida no html da div com o id resposta1, substituindo o texto Aqui vai aparecer a resposta... WWW.COTIINFORMATICA.COM.BR 23
Tela do sistema ao carregar WWW.COTIINFORMATICA.COM.BR 24
Tela do sistema com a resposta se o número digitado é primo ou não. Não se esqueça de testar com os valores 0 e 1 também. WWW.COTIINFORMATICA.COM.BR 25