Servlet é a tecnologia da Java provida pela Oracle que é usada para comunicar servidores web e aplicações de clientes (como browser's). Servlet que provê ao Java uma API para facilitar o desenvolvimento das aplicações web.
Isto é parcialmente implementado pelo servidor web e pelo programador da aplicação.
Do ponto de vista da aplicação, é uma classe em Java que é criada usando o API do Servlet e instanciado pelo servidor web para processar o pedido dinamicamente.
O objetivo deste artigo é aprender o que é um Servlet, como receber informações submetidas pelos clientes web como navegadores web, e como responder ao cliente de acordo com as informações submetidas.
Servlet em detalhes:
Servlet é o API do Java que é usado para criar dinamicamente aplicações web. Para escrever em aplicação usando Servlets, o pacote chamado javax.servlet e seus sub pacotes são usados. No núcleo do API do Servlet, uma interface do javax.servlet.Servlet provê o ciclo de vida dos métodos do Servlet. Estes métodos são usados para inicializar, gerenciar e destruir um Servlet, que são os seguintes:
- init()
- service()
- destroy()
Sempre quando um usuário visita uma url de uma página web, cada visita a url é considerada como uma requisição. Em cada requisição gerada pela página web que chega ao servidor, este manda uma resposta que depende das estratégias de desenvolvimento.
- Pedido de um Servlet é mandado para o servidor web.
- O objeto ServletRequest é criado a partir do pedido.
- A informação requerida é guardada no ServletRequest Object.
- O objeto ServlerResponse é criado para a requisição.
- O método service() do servlet é invocado e é referência do ServlerRequest e o ServletRequest é provido.
- O Servlet lê a informação requerida a partir do objeto ServletRequest.
- O Servlet gera conteúdos e os guarda para o objeto ServletResponse.
- Depois da compilação do método service(), o servidor web manda os conteúdos do ServletResponse.
- Conteúdos do ServletResponse são mandados ao cliente.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>LoginInfo</title>
</head>
<body>
<form method = "post" action = "LoginInfo">
Login Id: <input type = "text" name = "name"/>
<br>
Password: <input type = "password" name = "password"/>
<br>
<input type = "submit" value = "Login"/>
</form>
</body>
</html>
Este código cria um form que aceita login id e o password como as duas entradas e as processa para o servidor web, quando o usuário clica no botão de login ou aperta enter. O form tag define que a informação será mandada usando um método de postagem. Deste modo, não será mostrado na url e será transferido para o nome do Servlet LoginInfo. Este Servlet receberá informação usando o objeto requerido criado da classe HttpServletRequest.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class test
*/
@WebServlet(urlPatterns = "/LoginInfo")
public class LoginInfo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginInfo() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request,
HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request,
HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated constructor stub
String id = request.getParameter("name");
String pass = request.getParameter("password");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
RequestDispatcher rd = null;
request.setAttribute(id, "name");
if(id.equals("name") && pass.equals("pass")){
rd = request.getRequestDispatcher("/WelcomeServlet");
rd.forward(request, response);
}
else{
out.println("<b>Invalid
Login Info.</b><br>");
rd = request.getRequestDispatcher("/LoginInfo.jsp");
rd.include(request, response);
}
out.close();
}
}
O código acima define a classe LoginInfo que estende HttpServlet e define os métodos doPost() e doGet(). O doPost() recebe a informação transferida do form HTML usando o método getParameter da classe HttpServletRequest. Esses dois métodos, doGet() e doPost() tem as exceções Servlet Exception e IOException, e aceitam dois parâmetros dos tipos HttpServletRequest e HttpServletResponse. A primeira linha do método doPost() define o tipo de resposta para o cliente. O tipo de resposta neste servlet será HTML ou do tipo de conteúdo de texto.
A próxima linha cria uma variável de referência do tipo PrintWriter e designa a referência do método response.getWrite(). A próxima linha deste método define a variável de referência ao tipo do RequestDispatcher e configura um atributo usando o método setAttribute() da classe HttpServletResquest. Agora a validação da dada entrada do cliente usando o método de string equals(). Se o nome de usuário é igual ao "name" e password é igual a "pass" o controle será transferido para o novo servlet "WelcomeServlet" usando os métodos getRequestDispatcher() e foward() como é mostrado a seguir:
rd = request.getRequestDispatcher("/WelcomeServlet");
rd.forward(request, response);
Se o login e o password não coincidirem, uma mensagem de erro será gerada "invalid login info" usando o método println() e o login da página será incluído usando o método include(), como segue:
out.println("<b>Invalid Login Info</b><br>");
rd.include(request,response);
Na última linha deste método, a stream do Writer será fechada usando o método close(). Neste servlet, o padrão da configuração da url foi definida usando anotações, como é mostrado a seguir:
@WebServlet (urlpattern = "/LoginInfo")
A configuração pode ser feita usando um arquivo xml que é o descritor de desenvolvimento. É chamado de arquivo web.xml.
<?xml version=”1.0” encoding="UTF-8"?>
<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns=http://java.sun.com/xml/ns/javaee
xmlns:web=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
id="WebApp_ID" version="2.5">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>
LoginInfoName
</servlet-name>
<servlet-class>
LoginInfo
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
LoginInfoName
</servlet-name>
<url-pattern>
/LoginInfo
</url-pattern>
<servlet-mapping>
</web-app>
Os conteúdos da listagem acima definem o arquivo web.xml (descritor de desenvolvimento). A primeira tag <xml> define a versão xml para o debugador. A próxima tag é a raiz que define a classe de servlet e seu mapeador de url form de ação html, descrição de contexto de parâmetro, e o parâmetro de inicialização usando esta tag.
A sub-tag <welcome-file-list> carrega o arquivo de início padrão, enquanto a aplicação web inicializa usando sua sub-tag <welcome-file>. A próxima tag <servlet> é usada para definir a classe de servlet que é para ser mapeada no url form de ação html usando a sub-tag (<servlet-mapping>).
A tag <servlet> usa duas sub-tags <servlet-name> e <serlet-class> para definir que nome será usado para mapear a url e a classe de Servlet que será mapeada nesta url.
<servlet>
<servlet-name>LoginInfoName</servlet-name>
<servlet-class>LoginInfo</servlet-class>
</servlet>
A url é definida usando a sub-tag <url-pattern> da tag <servlet-mapping>.
<servlet-mapping>
<servlet-name>LoginInfoName</servlet-name>
<url-pattern>/LoginInfo</url-pattern>
<servlet-mapping>
A figura acima mostra uma mensagem de erro e carrega a página de login novamente, se o usuário fornece informações de login inválidas.
A figura acima mostra a mensagem de boas-vindas depois do carregamento do WelcomeServlet, se o usuário entrar com informações válidas. A informação do usuário é validada com as informações já gravadas de userid "name" e password "pass".
Conclusão:
Neste artigo, aprendemos o que é um Servlet, qual é sua precisão, como receber informações submetidas por um cliente web como um navegador web e como responder ao cliente de acordo com as informações submetidas.