INTRODUÇÃO A APLICAÇÕES WEB

 

 

Containers WEB e Aplicações WEB

INTRODUÇÃO A SERVLETS

Servlets versus CGIs

 

  Servlets CGI's
Independência de plataforma Os servlets podem rodar em qualquer plataforma sem serem reescritos ou até mesmo compilados novamente. Os Scripts PERL, por serem interpretados, também possuem esta funcionalidade mas são muito lentos. As aplicações CGI que necessitam de alta performance são escritas em C.
Desempenho Os servlets são carregados apenas uma vez e para cada nova requisição o servlet gera um novo thread. O método init() do servlet, assim como nas applets, ocorre apenas na primeira vez que a classe é carregada. É geralmente no método init() que, por exemplo, estabelecemos uma conexão ao Banco de Dados. Cada uma das threads geradas pode usar a mesma conexão aberta no método init(). Este tipo de tratamento aumenta em muito o tempo de performance do servlet, já que você faz a conexão ao BD apenas uma vez  e todos as outras requisições usam esta conexão. Um novo programa CGI é carregado para cada requisição ao servidor. Isto quer dizer que se você tiver 10 requisições simultâneas, você tem 10 programas iguais na memória.
Extensibilidade Com Java  você  pode criar aplicações muito mais modulares, tirar todo o proveito da orientação a objetos e utilizar o grande número de APIs disponíveis pela Javasoft e terceiros. Com CGI's é possível atender a um requisito de extensibilidade também. Porém o overhead gerado para que esta funcionalidade seja implementada, torna sua execução muito lenta.

Resumo comparativo entre Servlets e CGI's

Visão Geral da API Java Servlet

Pacote javax.servlet

Pacote javax.servlet.http

Onde executar?

Ciclo de vida de um Servlet

Ciclo de vida de um servlet

Implementando um Servlet

1. importar os pacotes: javax.servlet e javax.servlet.http:

import javax. servlet.*;
import javax. servlet. http.*;

2. Um Servlet normalmente é uma classe que estende javax. servlet.http.HttpServlet, portanto:

public class MeuServlet extends HttpServlet{
...}

3. Implementar os métodos:

doGet(...)  : Para tratar requisições GET;
doPost(...) : Para tratar requisições POST;
service(...): Para tratar tanto requisições GET como POST

Requisições e Respostas

Tratando requisições e respostas

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException

Requisições do cliente

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
...
String nome = request.getParameter(“nome”);
String[] filmes = request.getParameterValues(“filme”);
...
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
...
response.setContentType(“text/ html”);
...
}
PrintWriter out = response.getWriter();
out.println(“< html> TESTE</ html>”);
out.close();
...
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
  response.setContentType("text/html");
  StringBuffer str = new StringBuffer();

  str.append("<html>\n");
  str.append("<head>\n");
  str.append("<title>Página de exemplo 2</title>\n");
  str.append("</head>\n");
  str.append("<body bgcolor='white'>\n");
  str.append("<h1>Exemplo 2</h1>\n");
  str.append("<h4>Página formada usando o StringBuffer, no Servlet</h4>");
  str.append("</body>\n");
  str.append("</html>");

  response.getWriter().println(str.toString());

}
...
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;


public class ExemploServletOutputStream extends HttpServlet {

private FileInputStream in;
private File file;


public void init(ServletConfig config) throws ServletException {
super.init(config);
try{
   file = new File("c:\\bola.gif");
   in = new FileInputStream(file);
   }catch(Exception e){
    throw new UnavailableException ("Nao foi possivel abrir o arquivo");
   }
}

public void destroy(){
  super.destroy();
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
  response.setContentType("image/gif");
  ServletOutputStream out = response.getOutputStream();

  for(int i=0; i<file.length(); i++){
    out.write(in.read());
  }
  out.close();
}

}

Problemas com threads

public class ExemploServlet extends HttpServlet implements SingleThreadModel { ... }

Sessão, Aplicação e Cookies

Cookies

Criando um cookie:

...
Usuario user = new Usuario();
user. setNome(“ Jose da Silva”);
user. setIdade( 35);
Cookie c = new Cookie(“ jose”, user));
response. addCookie( c);
...

Recuperando os cookies do usuário:

...
Cookie[] cookies = request. getCookies();
Cookie userCookie;
for( i= 0; i < cookies. length; i++) {
   Cookie userCookie = cookie[ i];
   if(userCookie. getName(). equals(“ jose")) {
     Usuario user = (Usuario) userCookie. getValue();
   }
}
...

Alterando o “tempo de vida” de um cookie:

...
Cookie c = new Cookie(“ login”,” jose”);
c. setMaxAge( int seg); -Define durante quanto tempo o
cookie se manterá ativo. Após o “maxAge”, o cookie é apagado.
...

Sessão

...
HttpSession sessao = request.getSession();
Ou
HttpSession sessao = request.getSession(true);
...
sessao.setAttribute(“cesta”, new Cesta());
...
HttpSession sessao = request. getSession();
if(! sessao. isNew()){
Cesta cesta = (Cesta) sesso. getAttribute(“ cesta”);
}
...
...
HttpSession sessao = request. getSession();
sessao. invalidate();
...
sessao. setMaxInactiveInterval( 60* 5); // 5 mins

A camada de aplicação

...
getServletContext(), herdado da super classe HttpServlet;
public void doGet( HttpServletRequest ...){
ServletContext c = getServletContext();
}
...
c.setAttribute(“ BD”, new DBAccess());
ServletContext c = getServletContext();
DBAccess db = (DBAccess) c.getAttribute(“ BD”);
ServletContext c = getServletContext();
c.removeAttribute(“DB”);

 

servlets programa próxima