Beruflich Dokumente
Kultur Dokumente
Java Servlets
Servlet uma tecnologia para a construo de componentes que executam em conteineres Web na plataforma J2EE. Por executarem em conteineres Web, servlets se interpem entre uma requisio gerada por um navegador Web (ex: submisso de formulrio HTML) e outros componentes da aplicao executando neste tier intermedirio ou no tier da lgica da aplicao. Servlets podem implementar controladores MVC ou objetos de controle identificados em diagramas de robustez.
Java Servlets
EJB
Navegador Web
HTTP
Servlet
Continer Web
CORBA
JDBC
Descritor de Instalao (web.xml)
Vantagens de Servlets
Programao 100% Java no lado do servidor; Portvel e disponvel (parte do J2EE); Eficiente (servlets executam como threads); Perfeita integrao com outras tecnologias Java (RMI, JDBC, etc.); Base para outras tecnologias (ex: JSP, Struts); Maior controle no processamento de requisies HTTP (ex: autenticao, sesso, cookies); Permite gerar respostas on-the-fly para o cliente.
O que um Servlet ?
Servlet uma classe Java derivada da classe HTTPServlet, implementada pelo desenvolvedor e carregada por um servidor Web que suporta esta tecnologia (ex. Apache Tomcat, JBoss). Servlets so mapeadas em uma URL, sendo ativadas pelo servidor quando uma requisio HTTP dirigida para esta URL. Servlets implementam um mtodo para cada requisio HTTP (doGet, doPost, doTrace, etc.).
Exemplo de Servlet
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>Al Mundo !</body></html>"); } }
Inicializao de Servlets
Servlets so iniciadas quando carregadas ou quando invocadas pela primeira vez (no em cada requisio). O mtodo init implementado pelo servlet invocado pelo continer Web nestas ocasies. public void init() throws ServletException public void init(ServletConfig config) throws ServletException ServletConfig contem parmetros passados pelo continer conforme definidos no descritor de instalao.
O Conceito de Sesso
HTTP um protocolo stateless, ou seja, no armazena um estado entre interaes consecutivas. Exemplo: em uma aplicao de compras on-line como associar um carrinho de compras ao cliente remoto ? (ou de outra forma: como manter uma sesso entre o cliente e o servidor que perdure por mltiplas interaes HTTP ?) Existem algumas solues: cookies; adio de parmetros URL; campos de formulrios escondidos.
Cookies
Cookies so informaes que um servidor envia ao navegador que as armazena em disco local. Estas informaes so retornadas ao servidor em todas as interaes subsequentes. Navegadores usualmente limitam o tamanho do cookie em 4 Kbytes, permitindo no mximo 20 cookies por site. Cookies no apresentam risco segurana (nunca so executados) mas podem comprometer a privacidade: registram aes efetuadas pelo usurio em determinado site (ex: compras, consultas, etc.); sites irresponsveis podem adicionar informaes sensveis ao cookie (ex: nmero do carto de crdito). Por estas razes, os navegadores permitem desabilitar a instalao total ou parcial de cookies.
Cookies e Servlets
Para enviar um cookie ao cliente: Cookie cookie = new Cookie("usuario", "Eleri Cardozo"); cookie.setMaxAge(60 * 60 * 24 * 365); // 1 ano response.addCookie(cookie); Para processar os cookies recebidos do cliente: Cookie[] cookies = request.getCookies(); Cookie c; for(int i = 0; i < cookies.length; i++) { ck = cookies[i]; String nome = ck.getName(); String valor = ck.getValor(); }
Gerenciamento da Sesso
A classes HttpSession permite ao servlet gerenciar sesses mantidas com os clientes sem a necessidade do programador gerenciar cookies e parmetros. Esta classe permite: criar um objeto de sesso: HttpSession sessao = request.getSession(true); obter o identificador nico da sesso: String sessid = session.getId(); acrescentar e recuperar informao ao objeto de sesso: sessao.setAttribute("nome", nomeCliente); sessao.removeAttribute("nome"); Object valor = sessao.getAttribute("nome"); Enumeration enum = sessao.getAttributeNames();
Apache Tomcat
Tomcat a implementao de referncia para Servlets e Java Server Pages (JSP). Pode ser obtido gratuitamente para vrias plataformas (Linux, Windows) em http://jakarta.apache.org/tomcat/ Tomcat totalmente escrito em Java e requer J2EE ou J2SE instalado. Tomcat pode atuar como servidor HTTP padro ou em conjunto com servidor Apache (recebendo as requisies para servlets e pginas JSP). Tomcat suporta HTTPS, autenticao de usurios (senha/papel), gerenciamento atravs de navegador e configurao individual de aplicaes.
10
Estrutura de Diretrios
Tomcat possui a seguinte estrutura de diretrios (a partir da raiz onde foi instalado): bin: scripts .sh e .bat (startup.sh e shutdown.sh) logs: arquivos de log de execuo (catalina.out) conf : arquivos de configurao (server.xml, tomcatusers.xml) webapps: aplicaes
Estrutura de Aplicaes
Estrutura simplificada de uma aplicao:
/ webapps / MinhaAplic *.html *.jsp / WEB-INF *.gif ... web.xml / classes descritor de instalao *.class servlets, beans
11
Estrutura de Aplicaes
Estrutura recomendada de uma aplicao:
/ webapps raiz da aplicao / MinhaAplic / src web.xml / WEB-INF / web (pginas, figuras, ...) / docs (javadocs) / package-n / MinhaAplic
/ package-1
/ lib (jars)
ant
12
Descritores de Instalao
Estrutura do Descritor de Instalao (web.xml)
<web-app> <servlet> <servlet-name>ManagementServlet</servlet-name> <display-name>SNMP Servlet</display-name> <description>Servlet that gets MIB information</description> <servlet-class>demo.web.mgmtServlet</servlet-class> <init-param> <param-name>Comunity</param-name> <param-value>public</param-value> </init-param> </servlet>
13
Autenticao de Usurios
O esquema de autenticao no Tomcat identifica usurios atravs de trs parmetros: nome (username), senha (password) e papeis (roles). Estes parmetros so estabelecidos pelo administrador do Tomcat. Estas informaes so armazenadas em "bases de dados" denominadas Realm. Tomcat fornece alguns realms (o desenvolvedor pode implementar seu prprio realm): Memory Realm: base de dados armazenada em memria (lida a partir do arquivo tomcat-users.xml) JDBC Realm: base de dados mantidas em um gerenciador de base de dados acessvel via JDBC. JNDI Realm: base de dados mantidas em servidor de diretrio LDAP acessvel via JNDI (Java Naming and Directory Interface).
Memory Realm
o esquema mais simples de autenticao e emprega o arquivo tomcat-users.xml (diretrio conf) para identificar usurios e papis:
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="admin"/> <role rolename="manager"/> <role rolename="usuario"/> <user username="admin" password="$258" roles="manager,admin"/> <user username="maria" password="segredo" roles="usuario"/> <user username="joo" password="1234" roles="usuario"/> </tomcat-users>
14
<login-config> <!-- pode ser FORM ou BASIC --> <auth-method>BASIC</auth-method> <realm-name>Autenticao Bsica</realm-name> </login-config> <security-role> <!-- Papis referenciados por esta aplicao --> <role-name>usuario</role-name> </security-role> <security-role> <role-name>admin</role-name> </security-role> ... </web-app>
15
JDBC Realm
JDBC Realm utiliza tabelas de usurios e papis armazenados em bases de dados. mais convenveniente que o Memory Realm quando: existem muitos usurios e/ou usurios so adicionados e removidos com frequncia (via aplicativo de administrao); a aplicao permite alguma funcionalidade ao usurio tal como troca de senha e envio da senha esquecida por e-mail; a aplicao j utiliza bases de dados acessadas com JDBC.
tabela "users" user_name admin maria joo user_pass $258 segredo 1234
tabela "user_roles" user_name role_name admin admin manager admin maria usuario
16
17
Java Server Pages (JSP) a segunda tecnologia para a construo de componentes (pginas JSP) que executam em containers Web na plataforma J2EE. JSP permite compor contedo esttico (HTML, XML) com contedo dinmico (cdigo Java, taglibs) formando as chamadas pginas dinmicas. Quando a pgina acessada, o cdigo executado e seu resultado incorporado ao contedo esttico. A pgina esttica (sem cdigo) resultante ento enviada ao cliente.
18
contedo esttico
Exemplo de JSP
<%-- Exemplo de pgina JSP --%> <html> <head> <title>Hora Certa</title> </head> <%@ page import="java.util.*" %> <% Date dt = new Date(); %> <h1>Servio JSP de Hora Certa</h1> Benvindo, a hora certa neste servidor <%= dt.toString() %> </body> </html>
19
Vantagens de JSP
Mais poderoso que qualquer tecnologia baseada puramente em script (ASP, PHP); Portvel e disponvel (parte do J2EE); Eficiente (pgina compilada apenas no primeiro acesso); Perfeita integrao com outras tecnologias Java (RMI, JDBC, etc.); Maior controle no processamento de requisies HTTP (ex: autenticao, sesso, cookies).
JSP x Servlet
JSP e servlets so 100% equivalentes (o que um faz o outro tambm capaz de fazer). Isto se deve ao fato de que uma pgina JSP ao ser compilada gera um servlet correspondente. este servlet que ir atender as requisies HTTP de acesso pgina. O uso de JSP recomendado quando a parte esttica bem mais extensa que a parte dinmica. JSP evita a programao de servlets com centenas de out.println com parmetros constantes.
20
21
Diretiva page
Atributo import - importao de pacotes <%@ page import="java.util.*" %> Atributo contentType - define o tipo MIME do contedo sendo enviado <%@ page contentType="text/html" %> Atributo isThreadSafe - define se requisies concorrentes sero ou no tratadas por mltiplas threads: <%@ page isThreadSafe="false" %> Atributo errorPage - permite definir uma pgina padro em caso de exceo no tratada (excees devem ser tratadas !): <%@ page errorPage="erro.jsp" %> Atributo isErrorPage - define uma pgina como pgina de tratamento de erro (neste caso a varivel exception pr-definida para a pgina): <%@ page isErrorPage="true" %>
Diretiva include
Atributo file - permite incluir um arquivo dado pela sua URL relativa em tempo de compilao: <%@ include file="./menu.jsp" %> Atributo page - permite incluir um arquivo dado pela sua URL relativa em tempo de execuo: <%@ include page="./menu.html" %> Elemento jsp:include - construo XML equivalente ao atributo page acima: <jsp:include page="./menu.html" flush="true"/> NOTA: arquivos includos em tempo de execuo (atributo page ou elemento jsp:include) no podem conter elementos JSP.
22
Integrao JSP-Servlets
Navegador
Servlet
Processamento inicial da requisio: deciso sobre contedo; adio de novos atributos requisio; criao de Java Beans (escopo da aplicao).
Scriptlets
Programadores JSP experientes evitam o uso extensivo de scriptlets: cdigo no reusvel (encoraja copy-and-paste); misturam lgica e apresentao; inseguro (expem passwords, por exemplo); dificultam manuteno e teste de pginas JSP; erros gerados por scriptlets so difceis de depurar. Solues: 1. Uso de Java Beans. 2. Uso de Tags customizadas. 3. Uso de bibliotecas de tags (taglibs).
23
Java Beans
Um Java Bean uma classes Java com um formato especial: 1. a classes possui um construtor sem argumentos; 2. a classe no possui atributos pblicos; 3. atributos so manipulados por mtodos de acesso tipo get (ou is para atributos tipo boolean) e set.
public class currentUser { private String name; // property Name currentUser () { name = "unknown"; } // ctor String getNane() { return name; } // accessors void setName(String n) { name = n; } }
24
Pgina JSP
Java Bean
Pacotes Java
A interao Java Beans-JSP consiste de: instanciar um Java Bean em pgina JSP; manipular propriedades (atributos) do Java Bean a partir da pgina JSP; associar Java Beans a parmetros de entrada da pgina JSP; compartilhar Java Beans entre mltiplas pginas JSP e servlets.
25
26
27
No caso de compartilhamento de Java Beans, a instanciao deve ser condicional pois o bean j pode ter sido instanciado: <jsp:useBean id="car" class="ComprasOnLine.Carrinho" scope="session"> <jsp:setProperty name="car" property=cliente" param="Cliente"/> </jsp:useBean>
28
possvel definir novas tags para o JSP. O processo segue o seguintes passos: 1. criar um arquivo com a definio no novo tag (XML com extenso .tld) no diretrio WEB-INF/jsp da aplicao (Tomcat); 2. implementar a classe de manipulao desta tag. Esta classe deve herdar de javax.servlet.jsp.tagext.TagSupport e implementa mtodos chamados no incio (doStartTag) e final (doEndTag) do processamento da tag. Classes de manipulao de tags devem ser definidas em pacotes e instalados abaixo do diretrio WEB-INF da aplicao.
29
30
Bibliotecas JSTL
JSTL composta de 4 bibliotecas: 1. Ncleo (tags <c: >): controle de fluxo, controle de variveis, gerncia de URL, tratamento de erros e impresso. 2. Internacionalizao (tags <fmt: >): formatao de datas, moedas e mensagens. 3. XML (tags <x: >): transformaes, parsing, e impresso de documentos XML. 4. SQL (tags <sql: >): manipulao de banco de dados.
31
<c:import url="/books.xml" var="xml"/> <c:import url="/WEB-INF/xslt/bookDisplay.xsl" var="xslt"/> <x:transform source="${xml}" xslt="${xslt}> <x:param name="locale" value="${locale}"/> </x:transform>
Transformaes XSLT so importantes a apresentao de documentos XML em outros formatos (HTML, WML, etc.).
32
<sql:query dataSource="jdbc:mysql://localhost/clientes, org.mysql.jdbc.Driver, clientes, #dfr.675" var="consulta"> select * from clientes where faturamento > ? <sql:param value="100000"/> </sql:query> <c:forEach var="linha" items="${consulta.rows}"> <tr><td> <c:out value="${linha.nome}"/> </td> <td><fmt:formatNumber type="currency" value="${linha.faturamento}"/> maxFractionDigits="0"/></td></tr> </c:forEach>
33
34