Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. Java Server Pages Arquitectura de uma aplicação distribuída em Internet Figura 1 – “Modelo 2” A implementação desta arquitectura, com um controlador que direcciona a execução de JSPs, de Servlets e de JavaBeans, exige a resolução de problemas de “encaminhamento”, invocação e passagem de parâmetros. Este documento aborda essas questões. 1 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 1. Invocação de um Servlet num JSP O servlet e o JSP devem pertencer ao mesmo módulo web. O servlet deve estar compilado e o JSP gravado. Considere o servlet seguinte : package com.mycompany; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class NewServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Este é o NewServlet !!!!!!!!!!"); out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Descrição do NewServlet"; } } 2 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. e o JSP seguinte : <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head><title>JSP Page</title></head> <body> Este é o JSP teste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <jsp:forward page="NewServlet" /> </body> </html> Quando o JSP é invocado, o servlet é chamado através de <jsp:forward page="NewServlet" /> repare que não é utilizada a extensão do ficheiro NewServlet. 3 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 2. Invocação de um JSP noutro JSP Os dois JSPs devem estar gravados no mesmo módulo web. Considere o JSP outroTeste.jsp seguinte: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head><title>JSP Page</title></head> <body> Este é o JSP outroTeste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! </body> </html> Este JSP pode ser invocado a partir do nosso JSP teste.jsp da seguinte forma: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head><title>JSP Page</title></head> <body> Este é o JSP teste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <jsp:forward page="outroTeste.jsp" /> </body> </html> A invocação é efectuada através de <jsp:forward page="outroTeste.jsp" /> repare que, ao contrário do caso anterior, é obrigatório indicar a extensão do ficheiro. 4 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 3. Invocação de um JSP num Servlet O JSP e o Servlet devem pertencer ao mesmo módulo web. Considere novamente o JSP outroTeste.jsp. Este pode ser invocado no servlet NewServlet através do código seguinte: // Invocação do JSP outroTeste.jsp getServletConfig().getServletContext( ).getRequestDispatcher("/outroTeste.jsp").forward(request, response); Repare que a String que identifica o JSP deve começar por “/”. O método getServletConfig() retorna um objecto ServletContext que contém informações sobre a rede em que o servlet está a correr. O método getServletContext() de ServletContext retorna o contexto do servlet. O método getRequestDispatcher(…) permite enviar um pedido (request) a determinado URL. Retorna o RequestDispacher. Os objectos request e response) são enviados ao RequestDispacher (URL que está a ser invocado) por forward(request, response). Assim, o servlet NewServlet invoca o JSP outroTeste.jsp da seguinte forma: 5 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. package com.mycompany; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class NewServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Este é o NewServlet !!!!!!!!!!"); // Invocação do JSP outroTeste.jsp getServletConfig( ).getServletContext( ).getRequestDispatcher( "/outroTeste.jsp").forward( request, response); } out.println("</body>"); out.println("</html>"); out.close(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Descrição do NewServlet"; } } 6 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 4. Invocação de um servlet a partir de outro servlet Os dois servlets devem pertencer ao mesmo módulo web e devem estar compilados. Considere agora o servlet OutroNewServlet : package com.mycompany; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class OutroNewServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Este é o OutroNewServlet !!!!!!!!!!"); out.println("</body>"); out.println("</html>"); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Descrição do OutroNewServlet"; } } 7 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. Para que OutroNewServlet seja invocado de NewServlet, este último deve ser: package com.mycompany; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class NewServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Este é o NewServlet !!!!!!!!!!"); // Invocação do JSP outroTeste.jsp getServletConfig( ).getServletContext( ).getRequestDispatcher( "/OutroNewServlet").forward(request, response); } out.println("</body>"); out.println("</html>"); out.close(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Descrição do NewServlet"; } } Repare que um servlet é invocado sem extensão e precedido por “/”. 8 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 5. Invocação de uma classe a partir de um servlet O servlet e a classe devem pertencer ao mesmo módulo web e devem estar compilados. A classe deve estar compilada na mesma directoria que o servlet, isto é /WEBINF/classes/com/mycompany . Considere a classe seguinte: package com.mycompany; public class ClasseJavaTeste { public ClasseJavaTeste() { } String imprimeMensagem(){ return "Instanciei ClasseJavaTeste !"; } } Assim, o servlet NewServlet fica: package com.mycompany; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class NewServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("Este é o NewServlet !!!!!!!!!!"); // Instanciação de uma classe JAVA e utilização da instancia ClasseJavaTeste ijpt = new ClasseJavaTeste(); out.println(ijpt.imprimeMensagem()); out.println("</body>"); out.println("</html>"); out.close(); 9 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Descrição do NewServlet"; } } A classe ClasseJavaTeste é livremente utilizada no servlet NewServlet. 10 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 6. Invocação de uma classe a partir de uma página JSP Uma página JSP não pode instanciar directamente uma classe JAVA existente no servidor (a não ser que esta classe pertença ao SDK, como por exemplo a classe String). Por este motivo, a utilização de objectos JAVA em JSPs deve ser feita através do servlet “controlador” (veja a Figura 1 – Modelo 2 na pág.1 deste texto). Quando um JSP necessita de uma instância JAVA: (1) no momento da inicialização o controlador cria a instância pretendida; (3) o controlador coloca a instância na sessão (isto é, a instância torna-se numa variável global para os JSPs e servlets activos na sessão); (4) o controlador invoca o JSP; (5) o JSP pode aceder ao objecto através da variável session. Assim, para invocarmos uma classe a partir de uma página JSP temos que ser capazes de, num servlet, criar uma instância da classe e disponibilizá-la na sessão. 7. Instanciação de uma classe num servlet e disponibilização da instância na sessão Como já vimos, a instanciação e utilização de uma classe num servlet pode ser feita da seguinte forma: // Instanciação ClasseJavaTeste icjt = new ClasseJavaTeste(); String descricao = icjt.imprimeMensagem(); Para que a instância seja disponibilizada na sessão, temos que obter uma instância de HttpSession a partir do request: // Disponibilização da instãncia na sessão HttpSession mySession = request.getSession(); Colocar um valor na sessão: mySession.setAttribute("descricaoClasseJavaTeste", descricao); 11 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 8. Acesso a um valor da sessão num JSP Finalmente, invocamos o JSP: // Invocação do JSP outroTeste.jsp getServletConfig( ).getServletContext( ).getRequestDispatcher( "/teste.jsp").forward( request, response); No JSP o objecto que está na sessão é obtido da seguinte forma: <%-- Obtem a descricao (String) que está na sessão --%> <% String descricao = (String)(session.getAttribute("descricaoClasseJavaTeste")); %> O que nos permite a sua utilização: <%-- Mostra a descricão --%> <%= descricao %> 9. Invocação de uma classe a partir de uma página JSP – exemplo completo Servlet que instancia e coloca valor na sessão: package com.mycompany; import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; public class Controlador extends HttpServlet { private String login = null; private String password = null; public void init(ServletConfig config) throws ServletException { super.init(config); } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 12 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. response.setContentType("text/html"); PrintWriter out = response.getWriter(); // Instanciação ClasseJavaTeste icjt = new ClasseJavaTeste(); String descricao = icjt.imprimeMensagem(); // Disponibilização da instãncia na sessão HttpSession mySession = request.getSession(); mySession.putValue("descricaoClasseJavaTeste", descricao); // Invocação do JSP outroTeste.jsp getServletConfig( ).getServletContext( ).getRequestDispatcher( "/teste.jsp").forward( request, response); } out.close(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } public String getServletInfo() { return "Descrição do servlet"; } } JSP que obtêm o valor a partir da sessão e que o utiliza: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@page import="com.mycompany.*" %> <html> <head><title>JSP Page</title></head> <body> Este é o JSP teste.jsp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <%-- Obtem a descricao (String) que está na sessão --%> <% String descricao = (String)(session.getAttribute("descricaoClasseJavaTeste")); %> <%-- Mostra a descricão --%> <%= descricao %> </body> </html> 13 JSP Texto de apoio para a disciplina de Programação em Rede. Texto, exemplos e imagens baseados e retirados da bibliografia da cadeira. Não pode ser utilizado sem autorização expressa do coordenador da disciplina. 10. Condições em JSPs Exemplo da programação de uma condição if-else num JSP. <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <html> <head><title>JSP Page</title></head> <body> <%! boolean b = true; %> <% if(b == true){ %> É verdade. <% } else { %> É falso. <% } %> </body> </html> Repare no abrir e fechar das tags dos scriplets e na continuidade do código JAVA entre scriplets consecutivos. Exercício Adapte a sua resolução do exercício anterior para que fique de acordo com a arquitectura “Modelo 2” (controlador - JSPs). 14 JSP