Programação em Rede IGE, ETI e EI Servlets Redigido a partir de http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ Estrutura básica de um servlet - exemplo de servlet que gere pedidos GET. Os pedidos GET, em HTTP, são realizados quando o utilizador solicita a navegação para determinado site (os servlets também podem gerir pedidos POST). Exemplo com GET: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SomeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Use "request" to read incoming HTTP headers // and HTML form data (e.g. data the user entered and submitted) // Use "response" to specify the HTTP response line and headers PrintWriter out = response.getWriter(); // Use "out" to send content to browser } } Programação em Rede IGE, ETI e EI Uma classe servlet deve herdar de HttpServlet e sobrecarregar doGet ou doPost, ou ambos. HttpServletRequest tem métodos para obter informações acerca dos dados input. HttpServletResponse tem métodos para obter informações acerca dos dados de output e permite obter um objecto PrintWriter utilizado para responder a um cliente. Exemplo de Servlet que gera texto: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); } } Programação em Rede Um Servlet que gera HTML A maioria dos servlets são utilizados para gerar HTML e não apenas texto (como no exemplo precedente). Para isso, é necessário: (1) notificar o browser de que o servlet está a enviar HTML e (2) construir uma página HTML bem formada através de instruções prinln. IGE, ETI e EI Inicialmente é indicado o Content-Type da página da seguinte forma: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + "<HTML>\n" + "<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n" + "<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY></HTML>“ ); // fim de out.println } } Programação em Rede Resultado: IGE, ETI e EI Programação em Rede IGE, ETI e EI Num servlet existem duas partes da página HTML que normalmente não mudam: DOCTYPE e HEAD. DOCTYPE é ignorado pela maioria dos browser e utilizado apenas para a validação formal de páginas HTML e para a verificação da versão HTML. HEAD contém apenas o título da página. Para facilitar a redacção de servlets, podemos criar um método que recebe o título da página e que retorna uma String que compõe o DOCTYPE, HEAD e TITLE. public class ServletUtilities { public static final String DOCTYPE = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; public static String headWithTitle(String title) { return(DOCTYPE + "\n" + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n"); } } Programação em Rede IGE, ETI e EI Agora, a classe HelloWWW fica: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWWW2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(ServletUtilities.headWithTitle("Hello WWW") + "<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY></HTML>“ ); } } Programação em Rede IGE, ETI e EI Exercício: Crie o seu primeiro servlet no NetBeans. Utilize a classe auxiliar ServletUtilities.