Introdução aos Servlets Java
1. Visão geral
Neste artigo, veremos um aspecto central do desenvolvimento da Web em Java - Servlets.
2. O servlet e o recipiente
Simplificando, um Servlet é uma classe que manipula solicitações, as processa e responde de volta com uma resposta.
Por exemplo, podemos usar um Servlet para coletar entradas de um usuário por meio de um formulário HTML, consultar registros de um banco de dados e criar páginas da Web dinamicamente.
Os servlets estão sob o controle de outro aplicativo Java chamadoServlet Container. Quando um aplicativo em execução em um servidor da web recebe uma solicitação,, o servidor entrega a solicitação ao recipiente do servlet - que por sua vez a passa para o destino Servlet.
3. Dependências do Maven
Para adicionar suporte a Servlet em nosso aplicativo da web, a dependênciajavax.servlet-api é necessária:
javax.servlet
javax.servlet-api
3.1.0
A última dependência do maven pode ser encontradahere.
Claro, também teremos que configurar um contêiner Servlet para implantar nosso aplicativo; this is a good place to start on how to deploy a WAR on Tomcat.
4. Ciclo de vida do servlet
Vamos examinar o conjunto de métodos que definem o ciclo de vida de um Servlet.
4.1. init()
O métodoinit foi projetado para ser chamado apenas uma vez. Se uma instância do servlet não existir, o contêiner da web:
-
Carrega a classe de servlet
-
Cria uma instância da classe de servlet
-
Inicializa chamando o métodoinit
O métodoinit deve ser concluído com êxito antes que o servlet possa receber qualquer solicitação. O contêiner de servlet não pode colocar o servlet em serviço se o métodoinit lançar umServletException ou não retornar dentro de um período de tempo definido pelo servidor web.
public void init() throws ServletException {
// Initialization code like set up database etc....
}
4.2. service()
Este método só é chamado depois que o métodoinit() do servlet foi concluído com sucesso.
O Container chama o métodoservice() para lidar com solicitações vindas do cliente, interpreta o tipo de solicitação HTTP (GET,POST,PUT,DELETE, etc. ) e chamadasdoGet,doPost,doPut,doDelete, etc. métodos, conforme apropriado.
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
// ...
}
4.3. destroy()
Chamado pelo Servlet Container para tirar o Servlet de serviço.
Este método só é chamado depois que todos os threads dentro do métodoservice do servlet tenham saído ou após um período de tempo limite ter passado. Depois que o contêiner chamar esse método, ele não chamará o métodoservice novamente no Servlet.
public void destroy() {
//
}
5. Servlet de exemplo
Let’s now setup a full example de manipulação de informações usando um formulário.
Para começar, vamos definir um servlet com um mapeamento/calculateServlet que irá capturar as informações POSTADAS pelo formulário e retornar o resultado usando umRequestDispatcher:
@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet")
public class FormServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String height = request.getParameter("height");
String weight = request.getParameter("weight");
try {
double bmi = calculateBMI(
Double.parseDouble(weight),
Double.parseDouble(height));
request.setAttribute("bmi", bmi);
response.setHeader("Test", "Success");
response.setHeader("BMI", String.valueOf(bmi));
RequestDispatcher dispatcher
= request.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);
} catch (Exception e) {
response.sendRedirect("index.jsp");
}
}
private Double calculateBMI(Double weight, Double height) {
return weight / (height * height);
}
}
Conforme mostrado acima, as classes anotadas com@WebServlet devem estender a classejavax.servlet.http.HttpServlet. É importante observar que a anotação@WebServlet está disponível apenas a partir do Java EE 6 em diante.
A anotação@WebServlet é processada pelo contêiner no momento da implementação e o servlet correspondente é disponibilizado nos padrões de URL especificados. É importante notar que, usando a anotação para definir padrões de URL, podemos evitar o uso do descritor de implantação XML denominadoweb.xml para o nosso mapeamento de Servlet.
Se quisermos mapear o Servlet sem anotação, podemos usar oweb.xml tradicional em seu lugar:
FormServlet
com.root.FormServlet
FormServlet
/calculateServlet
A seguir, vamos criar um HTML básicoform:
Finalmente - para ter certeza de que tudo está funcionando conforme o esperado, vamos escrever um teste rápido:
public class FormServletLiveTest {
@Test
public void whenPostRequestUsingHttpClient_thenCorrect()
throws Exception {
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost(
"http://localhost:8080/calculateServlet");
List nvps = new ArrayList<>();
nvps.add(new BasicNameValuePair("height", String.valueOf(2)));
nvps.add(new BasicNameValuePair("weight", String.valueOf(80)));
method.setEntity(new UrlEncodedFormEntity(nvps));
HttpResponse httpResponse = client.execute(method);
assertEquals("Success", httpResponse
.getHeaders("Test")[0].getValue());
assertEquals("20.0", httpResponse
.getHeaders("BMI")[0].getValue());
}
}
6. Servlet, HttpServlet e JSP
É importante entender quethe Servlet technology is not limited to the HTTP protocol.
Na prática, quase sempre é, masServlet é uma interface genérica eHttpServlet é uma extensão dessa interface - adicionando suporte específico de HTTP - comodoGetedoPost, etc.
Finalmente, a tecnologia Servlet também é o principal driver de uma série de outras tecnologias da web, comoJSP – JavaServer Pages, Spring MVC, etc.
7. Conclusão
Neste artigo rápido, apresentamos os fundamentos dos Servlets em um aplicativo da Web Java.
O projeto de exemplo pode ser baixado e executado como está comoa GitHub project.