Servlets
Servlets
Java – Plataformas
Java ME – Java Platform, Micro Edition
Fornece um ambiente específico para a criação de aplicações destinadas a
dispositivos como telefones celulares, pagers, PDAs, Smartphones; etc.
Destinado a criação de aplicações para dispositivos móveis
Java SE – Java Platform, Standard Edition
Fornece um ambiente completo para o desenvolvimento de aplicações em
destktops (clientes) e também servidores
Base da tecnologia Java. Fornece a máquina virtual (JRE – Java Runtime
Environment)
Java EE – Java Platform, Enterprise Edition
Define um padrão para o desenvolvimento de aplicações baseadas em
componentes e estruturadas em várias camadas
Seu foco é o desenvolvimento de aplicações do lado servidor, cujo objetivo é
prover funcionalidades para aplicações distribuídas
Java – Java EE
O resultado desta implementação é um Servidor de Aplicações
(Application Server)
Exemplos de servidores de aplicações compatíveis com o padrão J2EE
O l
Oracle
Oracle - Oracle Application Server 10g
Sun - Sun GlassFish Enterprise Server
BEA – Oracle WebLogic Server
IBM – Websphere
JBoss – JBoss Application Server
SAP AG - Web Application Server
Sybase – EAServer
Adobe - JRun Server
Borland – AppServer
Fujitisu – Interstage Application Server
Os servidores implementam uma das especificações Java EE (1.2; 1.3;
1.4 , 5 e 6)
Programação para Internet 73
Flávio de Oliveira Silva, M.Sc.
Aplicações Distribuídas
Camadas
O modelo para desenvolvimento de aplicações utilizando o Java EE é
baseado em uma arquitetura multicamadas
Cada camada contém componentes de acordo com a sua função.
Basicamente existem as seguintes camadas:
Cliente (Client Tier)
Camada Web (Web Tier)
Camada de Negócios (Bussiness Tier)
Camada Enterprise Information System (EIS)
A camada Web Tier estará presente quando a aplicação for baseada na
WEB ou seja, o cliente é um navegador (browser)
A arquitetura acima é conhecida como três camadas (3-tier) visto que
existem 3 máquinas envolvidas:
O cliente;
O servidor de aplicações Java EE
O servidor de banco de dados
Aplicações Distribuídas
Camadas
Cliente (Client Tier)
Componentes que são executados na máquina do cliente.
Podem ser executados em um Browser ou uma aplicação desktop baseada no Java SE
Camada Web (Web Tier)
Componentes que são executados em um servidor Java EE
Basicamente tratam da apresentação do conteúdo na WEB
Esta camada é responsável por gerar e enviar para o cliente o conteúdo gerado de forma dinâmica
Camada de Negócios (Bussiness Tier)
Contém os objetos relacionados ao negócio e suas regras
O servidor de aplicações oferece recursos como controle de transações, de sessões para os objetos
desta camada.
Pode ser implementa com EJB (Enterprise JavaBeans)
Camada Enterprise Information System (EIS)
Consiste dos recursos que serão utilizados pela aplicação. Inclui gerenciadores de banco de dados
(DBMS) e aplicações legadas, baseadas em mainframes, por exemplo.
Esta camada é executada fora do servidor J2EE e a arquitetura J2EE possui uma interface para
esta camada, que pode ser feita, por exemplo, através de conectores
Aplicações Distribuídas
Arquitetura Java EE
Comunicação entre as várias camadas
Aplicações Distribuídas
Arquitetura Java EE
Camada de Negócios (Business Tier)
Baseada em EJB
Java EE contêineres
Web Contêiner
Executa Servlets e páginas JSP
Servlets
São classes Java que podem ser chamados dinamicamente e que podem executar
alguma
a gu a funcionalidade.
u c o a dade
Estes programas podem ser executado em um Servidor Web ou em um contêiner para
Servlets
Normalmente estão ligados a geração de conteúdo para browsers.
O Servlet implementa a interface Servlet e possui um funcionamento pré-definido
Os Servlets recebem e respondem a requisições feitas normalmente através do
protocolo HTTP
JavaServer Pages (JSP)
Consistem de uma maneira p para criar conteúdo dinâmico p
para a Web
Seu objetivo é criar uma separação entre a apresentação e os dados que estarão
presentes em uma página no navegador.
Normalmente a página JSP é um modelo que contém tanto o conteúdo estático, como
a indicação de como o conteúdo dinâmico será gerado
Java EE contêineres
EJB Contêiner
Existem vários tipos de EJBs cada um com características próprias
O seu uso depende das características da aplicação, de suas vantagens e desvantagens
particulares
Aplicações WEB
Em sua concepção a WEB é um meio para a troca de documentos HTML
entre diferentes pontos, utilizando a infra-estrutura oferecida pela
Internet.
A medida que a WEB se popularizou novas aplicações começaram a
surgir
Em muitos sites da WEB o conteúdo não poderia ser constituído de
código HTML estático, mas precisaria ser alterado, muitas das vezes
a cada minuto.
A partir desta necessidade começaram a surgir meios para se conseguir
a produção de conteúdos dinâmicos
A primeira
i i proposta t para a criação
i ã d de conteúdos
t úd di dinâmicos
â i ffoii através
t é d do
CGI (Common Gateway Interface)
Este mecanismo permite a execução de um código, escrito em C ou Perl,
através do navegador
HttpServlet
A classe HpptServlet define os métodos para que o Servlet possa ser utilizado
juntamente com o protocolo HTTP
Normalmente uma classe deverá especializar os métodos definidos nesta classe
a fim de imprimir o comportamento desejado pelo Servlet
Métodos principais
doGet(HttpServletRequest req, HttpServletResponse resp)
Utilizado em requisições do tipo HTTP GET
doHead(HttpServletRequest req, HttpServletResponse resp)
Utilizado em requisições do tipo HTTP HEAD
doPost(HttpServletRequest req, HttpServletResponse resp)
Utilizado em requisições do tipo HTTP POST
( p q
doPut(HttpServletRequest q, HttpServletResponse
req, p p p)
resp)
Utilizado em requisições do tipo HTTP PUT
doDelete(HttpServletRequest req, HttpServletResponse resp)
Utilizado em requisições do tipo HTTP DELETE
init; destroy; getServletInfo
HttpServlet
Além dos métodos descritos anteriormente que devem ser especializados
existe outros métodos muito utilizados em um Servlet
public ServletContext getServletContext()
Permite o obter um objeto que representa o contêiner do Servlet
public ServletConfig getServletConfig()
Recupera um objeto ServletConfig.
Este objeto contém a configuração do Servlet que contém parâmetros de
inicialização do Servlet, definidos no arquivo WEB.XML
public void log(java.lang.String msg)
Escreve uma mensagem no arquivo de log do contêiner de Servlets
O nome do Servlet é adicionado ao início da mensagem (msg)
HttpServletRequest
Métodos Principais
public java.lang.String getParameter(java.lang.String name)
Este método permite o acesso a parâmetros que são recebidos do cliente.
Cada parâmetro possui um nome (name) que deve ser informado
O nome está definido em um Form Html ou então na URL de acesso ao servlet
Ex: String sCmd = (String) request.getParameter("cmd");
public HttpSession getSession()
Retorna uma sessão (objeto HttpSession) associado ao pedido e caso a mesma não
exista uma nova sessão é criada
Através da sessão é possível compartilhar objetos entre vários execuções
pedido/resposta de um servlet
Ex: HttpSession session = request.getSession();
p p
public HttpSession g (
getSession(boolean create))
Retorna uma sessão (objeto HttpSession) associado ao pedido
Uma nova sessão é criada somente se o parâmetro create igual a true
HttpServletResponse
Métodos Principais
public void setContentType(java.lang.String type)
Permite definir o tipo de resposta que será devolvida ao navegador
O tipo mais comum é "text/hmtl"
bli java.io.PrintWriter
public j i P i tW it getWriter()
tW it () throws
th j i IOE ti
java.io.IOException
Este método obtém a stream (sequência de dados) que será utilizada na
resposta
Neste caso a stream representa uma sequência de carateres, como é um
caso do conteúdo do tipo "text/html"
public ServletOutputStream getOutputStream() throws
java.io.IOException
Este método obtém a stream (sequência de dados) que será utilizada na
resposta
Neste caso a stream representa uma sequência de bytes (binária), como é
um caso do conteúdo do tipo MIME (Multipurpose Internet Mail Extensions)
como por exemplo: “application/zip”; application/pdf ou "image/jpeg"
Deployment Descriptor
O arquivo web.xml é conhecido como "deployment descriptor"
Este arquivo contém toda a configuração do servlet que será utilizada
pelo contêiner de servlets (Tomcat)
Este arquivo é escrito em XML e deve possuir no mínimo os seguintes
elementos:
<web-app>
<context-param>
</context-param>
<servlet>
</servlet>
<servlet-mapping>
</servlet-mapping>
</web-app
Deployment Descriptor
Servlets 2.5 - JSP 2.1 (Tomcat 6)
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
p //j / / /j
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"
>
<display-name>web app name</display-name>
<!
<!– outras declarações >
-->
</web-app>
</web app>
</web-app>
Deployment Descriptor
Para acessar Servlets este deve possuir no mínimo os seguintes elementos:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xswie:bs-cahpepm
p p _a2L_o4c.axtsido"n="http://java.sun.com/xml/ns/j2ee
p //j / / /j
version="2.4">
<servlet>
<servlet-name>ServletUniqueName</servlet-name>
<servlet-class>servletClassFile</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletUniqueName</servlet-name>
<url pattern>/rootFolder</url pattern>
<url-pattern>/rootFolder</url-pattern>
</servlet-mapping>
</web-app>
Deployment Descriptor
Exemplo
Passagem de Parâmetros de
Configuração
Context-Param
O elemento context-param permite o uso parâmetros de inicialização
para todo o sistema
A partir de qualquer servlet ou página JSP é possível obter seus valores
através do método getInitParameter da classe ServletContext
O elemento contém dois elementos filhos que contém o nome do
parâmetro (param-name) e o valor do parâmetro (param-value)
O parâmetro sempre é obtido como String
<context-param>
<param-name>webmaster-email</param-name>
<param-value>[email protected]</param-value>
</context-param>
HttpSession
O protocolo HTTP é stateless, ou seja, um conjunto request/response
independe de outro
Normalmente é necessário implementar na aplicação do conceito de
sessão onde um conjunto de diferentes request/reponse estão ligados
entre si
Exemplo: Aplicação bancária – agência e conta são informadas apenas no
primeiro request, porém é compartilhada por todos os outros
request/response
Classe Implementa o conceito de sessão
Métodos principais
Object getAttribute(String name)
void setAttribute(String name, Object value)
void invalidate()
void setMaxInactiveInterval(int interval)
boolean isNew()
Programação para Internet 119
Flávio de Oliveira Silva, M.Sc.
Servlets
Classes API – Visão Geral
Armazenamento e Recuperação de
Informações (Objetos)
É possível armazenar e recuperar informações em tempo de
execução de um servlet
Desta forma é possível o intercambio de informações entre
diferentes servlets
Armazenar Objeto
void setAttribute(String name, Object object)
Recuperar Objeto
Object getAttribute(String name)
Servlets
Encaminhamento de Pedido
Uma operação comum entre vários servlets é o encaminhamento do
pedido (request)
Para isto é utilizado a classe RequestDispatcher
Este objeto pode ser obtido tanto a partir do contexto da aplicação
(ServletContext) quanto de um pedido (HttpServletRequest)
O código abaixo mostra como encaminhar o pedido uma página de erro
(/errorpage) que neste caso pode ser tratado por outro servlet
1. RequestDispatcher rd;
2. q g q p p g
rd = request.getRequestDispatcher("/errorpage");
//Encaminhar request e response para outro servlet
3. rd.forward(request, response);
Exemplo – Login
Encaminhamento Pedido
Armazenamento de Informações
Contexto da Sessão
1. public class LoginStaticServlet extends HttpServlet {
2. protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
3. //...
4
4. retorno = service doLogin(loginreceived password);
service.doLogin(loginreceived,
5. if (retorno){
6. //login com sucesso
7. //...
8. //Cria a sessão usuário, caso a mesma não exista
9. HttpSession session = request.getSession(true);
10. //Armazena o nome do usuário na sessão
11. session.setAttribute("USER", loginreceived);
12. //...
13.
13 //Encaminha pedido para o AppServerlet
14. RequestDispatcher rd;
15. rd = request.getRequestDispatcher("/apphome");
16. rd.forward(request, response);
17. }
18. }
Servlet
Papéis
No geral os servlets os servlets estão relacionados com dois papéis
básicos
Controle
Neste caso o servlet não é responsável pela produção de conteúdo
Realiza operações invocando serviços de outras classes
Armazena dados no contexto da aplicação, da sessão ou do pedido
ServletContext; HttpSession e HttpServletRequest
Encaminha pedido para outros servlets
RequestDispatcher
Exemplo Anterior: LoginServlet
Conteudo
Responsável pela produção de conteúdo
Servlet que efetivamente produz o código HTML
Devolve a resposta para o cliente
Obtém dados armazenados no contexto da aplicação, da sessão ou do pedido
Exemplo Anterior: AppServlet e LoginErrorServlet
Model 1 x Model 2
Model 1
Primeiro modelo disponível para o desenvolvimento de aplicações WEB
Elementos: Browser; Servlets/Páginas JSP e um Banco de dados
Neste modelo pode ocorrer duplicação de código
As regras de negócio e a Apresentação dos dados estão combinadas em um único
elemento, dificultando modificações e manutenções
Arquitetura MODEL 2
1.
1 O usuário envia o pedido que é recebido por um servleto de controle (Controller)
2. O servlet instância um ou mais Beans (Classes Java) para realizar o trabalho
3. O servlet adiciona os Beans no pedido, sessão ou contexto da aplicação e envia
o pedido para um Servlet de Conteúdo ou uma página JSP (VIEW)
4. Este finalmente extrai os dados destes Beans, produz a resposta HTML e envia
o resultado (response)
Programação para Internet 133
Flávio de Oliveira Silva, M.Sc.
Aplicação Exemplo
Fluxo entre páginas