Programação em Rede 2006-07 IGE, ETI e EI Java Server Pages O código HTML pode indicar o método de arranque do servlet gerado por um JSP : doGet ou doPost. Exemplo em que o método get é invocado no arranque do servlet: <form action="show_email_entry.jsp" method="get"> <table cellspacing="5" border="0"> <tr> <td align="right">Name:</td> <td><input type="text" name="firstName"></td> </tr> <tr> <td align="right">Email address:</td> <td><input type="text" name="emailAddress"></td> </tr> <tr> <td></td> <td><br><input type="submit" value="Submit"></td> Programação em Rede 2006-07 IGE, ETI e EI Codificação de scriplets: utilizadas para embutir instruções JAVA que terminam com “ ; ” . Codificação de expressões: utilizadas para embutir expressões JAVA que retornam uma String. Exemplo de dois scriplets e de uma expressão que mostra repetidamente uma linha HTML : <% int numOfTimes = 1; while (numOfTimes <= 5){ %> <h1> Esta linha é mostrada <%= numOfTimes %> vezes numa JSP. </h1> <% numOfTimes++; } %> Programação em Rede 2006-07 IGE, ETI e EI Método getParameter : quando aplicado a um campo de texto retorna a String introduzida pelo utilizador; quando aplicado a radio buttons ou combo box retorna o item seleccionado. Se não existe selecção retorna null. Exemplo de scriplet que determina se uma checkbox foi seleccionada: <% // retorna o valor seleccionado; se não houver nenhum // seleccionado retorna “nul” String rockCheckBox = request.getParameter("Rock"); if (rockCheckBox != null){ %> Estava um valor seleccionado na CheckBox ! <% } %> Programação em Rede 2006-07 IGE, ETI e EI Normalmente uma JSP é gravada na mesma directoria em que está a página HTML que a invoca, (que deve ser uma directoria disponível para o servidor web. (exemplo : directoria webapps nos projectos web formatados pelo NetBeans). Classes JAVA “normais” que sejam invocadas por um JSP devem ser compiladas para a directoria WEB-INF\classes do módulo web. Exemplo de uma tag HTML que invoca uma JSP: <form action=“o_meu_teste.jsp" method="get"> Exemplo de dois URLs que invocam directamente ums JSP: http://localhost:8080/jmal/email4/o_meu_teste.jsp http://www.jmal.com/o_meu_teste.jsp Inclusão de parâmetros na invocação de uma JSP: o_meu_teste.jsp?primNome=John o_meu_teste.jsp?primNome=John&ultNome=Smith Utilização de GET ou POST GET é o método HTTP por defeito. GET é mais rápido e guarda os parâmetros no fim do URL. POST é utilizado para dados confidenciais (passwords, número de cartões de crédito, ...) pois não mostra os argumentos no fim do URL. Programação em Rede 2006-07 IGE, ETI e EI Execução concorrente de JSPs Quando uma JSP é invocada, uma instância dessa página JSP é criada e carregada para memória da máquina. Para isso, uma THREAD executa o código JAVA presente na JSP. As variáveis declaradas nos scriplets são locais, i.e., são instanciadas em cada thread. As variáveis declaradas através de declarações JSP são instanciadas na 1ª thread e são comuns a todas as threads executadas a partir daí. Uma JSP deve ter código “sensível” sincronizado – métodos ou blocos de código que não devem ser executados por diferentes threads “em simultâneo”. A sincronização permite o acesso concorrente ao código sensível. Exemplo: Código que declara uma variável partilhada: <%@ page import="business.*, data.*, java.util.Date, java.io.*" %> Código que declara uma variável local : <%! int accessCount = 0; %> Programação em Rede 2006-07 IGE, ETI e EI Código que declara um método sincronizado: <%! public synchronized void addRecord(User user, String filename) throws IOException{ PrintWriter out = new PrintWriter( new FileWriter(filename, true) ); out.println( user.get enderecoEmail()+ "|“ + user.get primNome() + "|" + user.get ultNome() ); out.close(); } %> Utilização do método e exemplo de bloco de código sincronizado: <% String firstName = request.getParameter(“primNome"); String lastName = request.getParameter(“ultNome"); String emailAddress = request.getParameter(“enderecoEmail"); User user = new User(primNome, ultNome, enderecoEmail); addRecord(user, "../webapps/jmal/WEB-INF/etc/EmailUtilizadores.txt"); int localCount = 0; synchronized (this) { accessCount++; localCount = accessCount; } %> … <p> <i>This page has been accessed <%= localCount %>times. </i></p> Programação em Rede 2006-07 IGE, ETI e EI Exercício : Programe um contador de acessos numa página JSP.