Tecnologias para Web - Wiki LES PUC-Rio

Propaganda
Tecnologias para Web
Carlos Lucena
[email protected]
Vitor Pellegrino
[email protected]
Cidiane Lobato
[email protected]
Andrew Diniz
[email protected]
Agenda
• Servlets
• MVC
• JSP
• Taglibs
• Boas Práticas
© LES/PUC-Rio
2
Arquitetura J2EE
Arquitetura J2EE
• Plataforma para desenvolvimento Java Enterprise (Java EE)
• Voltada para aplicações Multi-Camadas baseadas em
componentes.
• Executada em um Application Server
– Glassfish
– Weblogic
– JBOSS
– Etc..
© LES/PUC-Rio
4
Arquitetura J2EE
• Composta por várias outras especificações
– JDBC (Java Database Connectivity) : utilizado no acesso a
bancos de dados;
– Servlets: são utilizados para o desenvolvimento de aplicações
Web com conteúdo dinâmico.
– JSP (Java Server Pages) : um especialização do servlet que
permite que conteúdo dinâmico seja facilmente desenvolvido.
– JTA (Java Transaction API) : é uma API que padroniza o
tratamento de transações dentro de uma aplicação Java.
– EJBs : utilizados no desenvolvimento de componentes de
software, contendo as regras de negócio da aplicação.
© LES/PUC-Rio
5
Arquitetura J2EE
© LES/PUC-Rio
6
Modelos de Componente J2EE
• A plataforma J2EE define quatro tipos diferentes de
componentes de aplicação:
– Aplicações cliente
• aplicação Java
• mantidos e executados no cliente
• GUI
– Applets
• Normalmente executados dentro do browser
• Mantidos pelo servidor e executados no cliente
© LES/PUC-Rio
7
Modelos de Componente J2EE
– Servlets e Java Server Pages (JSPs) (componentes Web)
• Servlet
– Objetos java que respondem requisições em HTTP
– Resposta normalmente é Html gerado dinamicamente
– Mantidos e executados no servidor
• JSP
– Linguagem de script adequada para escrita de servlets de apresentação
– Enterprise JavaBeans (EJBs)
• Mantidos e executados em um ambiente gerenciado pelo servidor
• Provê:
– Monitoramento transacional.
– Persistência.
– Distribuição de objetos.
– Segurança.
• Não são JavaBeans!
© LES/PUC-Rio
8
Java Servlets
O que é um Servlet?
• Resposta da comunidade Java ao CGI.
• Módulo Java executado em servidores orientados a
request/response, como servidores web (TomCat, JBoss).
• Vantagens
– Melhor aproveitamento dos recursos do sistema
– Fácil de programar
• Em aplicações web, o cliente faz requisições utilizando
protocolo HTTP
© LES/PUC-Rio
10
O que é um Servlet?
• Com Servlets, para cada requisição o servidor cria uma nova
Thread
• Conteúdo dinâmico
• Camada intermediária entre a lógica da aplicação e a
interface Web.
© LES/PUC-Rio
11
Arquitetura Cliente-Servidor
GET (request) Documento
HTML
retorna (response) Documento
HTML
Formulário Submetido via POST
(request)
Servidor retorna HTML gerado pelo
Servlet
Cliente / Browser
Servidor
© LES/PUC-Rio
12
Requisitando um Servlet via GET
GET (HTTP)
http://localhost/servlet/ServletHyperMed?Comando=SetCtxLabPorNome&No=Apsen
© LES/PUC-Rio
13
Requisitando um Servlet via POST
© LES/PUC-Rio
14
A API de Servlet
• A API de Servlet é um conjunto de classes Java que define
uma interface padrão entre o cliente web e o servidor web.
java.lang.Object
|
+----javax.servlet.GenericServlet
|
+----javax.servlet.http.HTTPServlet
|
+----com.teccomm.pss.MeuServlet
© LES/PUC-Rio
15
HttpServlet
• Tratador de requisições HTTP
• Trata métodos HTTP específicos:
– doGet(HttpServletRequest req, HttpServletResponse resp)
– doPost(HttpServletRequest req, HttpServletResponse resp)
• doGet e doPost são chamados pelo método service()
• Subclasses reescrevem os métodos doGet, doPost e podem
reescrever os métodos init() e destroy()
© LES/PUC-Rio
16
Ciclo de Vida do Servlet
• Criação e inicialização
– Realizado uma única vez.
– init(ServletConfig config)
– Sempre chama o método da super classe primeiro
• super.init(config)
– Pode sinalizar a exceção UnavailableException caso ocorra algum
erro durante o processo de inicialização
• Os métodos service(), doGet(), doPost() são chamados para
atender requisições de clientes
– Cada requisição é atendida por uma nova thread
© LES/PUC-Rio
17
Ciclo de Vida do Servlet
• destroy() e Coleta de lixo
– Executado somente uma vez
– Alguns servidores somente removem o servlet quando ocorre o
shutdown.
– Utilizado para liberar recursos.
© LES/PUC-Rio
18
Recapitulando...
• Para criar um Servlet é necessário:
– Estender a classe HttpServlet
• pacote javax.servlet.http do JSDK
– Implementar os métodos doGet ou doPost
© LES/PUC-Rio
19
Request e Response
• Os métodos doGet(), doPost() recebem dois parâmetros:
– HttpServletRequest
• encapsula os parâmetros da requisição
– HttpServletResponse
• encapsula a resposta ao cliente
© LES/PUC-Rio
20
HttpServletRequest
• Interface que encapsula a requisição feita pelo cliente
através do protocolo HTTP
• Possui métodos que recuperam dados da requisição:
– cabeçalho
– dados de formulários ou parâmetros enviados
– informações sobre a sessão do cliente
© LES/PUC-Rio
21
HttpServletRequest
• Alguns métodos definidos em HttpServletRequest
– Manipulação de Parâmetros
• java.util.Enumeration getParameterNames()
– Obtém listagem, contendo nomes de parâmetros da requisição
• java.lang.String[] getParameterValues(java.lang.String name)
– Obtém valores do parâmetro “name” da requisição
• java.lang.String getParameter(java.lang.String name)
– Obtém valor do parâmetro “name” da requisição
© LES/PUC-Rio
22
HttpServletResponse
• Interface que encapsula a resposta ao cliente
• Possui o método getWriter() responsável por recuperar o
canal de resposta com o cliente
– retorna um PrintWriter
– Ex: PrintWriter out = response.getWriter();
out.println( “Escrevendo no cliente” );
• Também é possível configurar qual é o tipo dos dados que
estão sendo enviados de volta ao cliente
– setContentType( String type )
– Os tipos mais comuns são text/html, text/xml
– O método setContentType deve ser chamado antes do método
getWriter
© LES/PUC-Rio
23
Hello World!
Hello World!
© LES/PUC-Rio
24
Segundo Exemplo
© LES/PUC-Rio
25
Gerenciamento de sessão (I)
• O protocolo HTTP é um protocolo sem estado
• Não é possível a princípio conhecer o estado do cliente anterior à
uma requisição
• O gerenciamento de sessão provê uma maneira de identificar
usuários e recuperar suas informações
– Dados do estado do cliente
• Para obter uma sessão:
• HttpSession session = request.getSession()
– Obtém sessão existente, caso não exista retorna uma nova sessão.
• HttpSession session = request.getSession(boolean create)
– Obtém sessão existente ou cria uma nova sessão dependendo do valor de o
parâmetro create.
• Funciona a base de cookie ou reescrita de URL
© LES/PUC-Rio
26
Gerenciamento de sessão (II)
• Principais métodos para manipulação de objetos em sessão
– void removeAttribute(java.lang.String name)
• Retira objeto da sessão
– void setAttribute(java.lang.String name, java.lang.Object value)
• Coloca ou sobreescreve objeto na sessão identificado por name
– java.lang.Object getAttribute(java.lang.String name)
• Obtém objeto da sessão
– java.util.Enumeration getAttributeNames()
• Obtém os nomes de todos os objetos armazenados na sessão
© LES/PUC-Rio
27
Gerenciamento de sessão (III)
• Tempo de duração da sessão
– As sessões em geral têm intervalo máximo de tempo que podem
ficar inativas
– public int getMaxInactiveInterval()
– public void setMaxInactiveInterval(int interval)
• As sessões também podem ser encerradas explicitamente
pelo programador:
– public void invalidate()
© LES/PUC-Rio
28
Colocando para Funcionar
• Para que o servlet “funcione” é preciso um servidor
web/aplicação com suporte a java que escute as requisições
do cliente
• Ex: IBM WebSphere Application Server, Jakarta Tomcat,
Java Web Server, etc.
© LES/PUC-Rio
29
Jakarta Tomcat
• Servidor gratuito baseado em java
• Configurável de maneira simples via XML
• Oferece suporte a Java (Servlets e JSP)
© LES/PUC-Rio
30
Jakarta Tomcat e Jboss
• Tomcat
– Pode ser gratuitamente obtido em http://www.apache.org
– Utilizem a versão 5.x
– VM j2sdk 1.5.x
• Jboss
– Servidor web similar ao Tomcat, mas com mais recursos
– Na prática, ele é compatível com mais recursos da especificação
J2EE
© LES/PUC-Rio
31
Publicação de Servlets
• Imagine que você implementou um Servlet, gerou o .java e
compilou para ter o .class.
• E agora? Como o Servlet é publicado no servidor?
• Na verdade, existe um local para colocar as classes de sua
aplicação.
© LES/PUC-Rio
32
Configurando o Tomcat
• Onde colocar as classes dos Servlets?
• Primeiro, é preciso criar uma aplicação web
– Cria-se um diretório em %TOMCAT_HOME%\webapps\, sem
espaços no nome.
– Dentro do diretório do projeto, cria-se a pasta WEB-INF
– Dentro de WEB-INF, criam-se 2 pastas: lib e classes
– Dentro de WEB-INF, cria-se o arquivo web.xml (deployment
descriptor web)
© LES/PUC-Rio
33
Configurando o Tomcat
• As classes são colocadas no diretório:
– %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEBINF\classes
– A partir deste diretório devem ser colocadas em seus próprios
pacotes
• As libs (arquivos .jar) devem ser colocadas no diretório:
– %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEBINF\lib
© LES/PUC-Rio
34
Configurando o Tomcat
• Registrando os Servlets
– Os servlets devem ser chamados com seu nome completo
(pacotes e classe)
– Muitas vezes o nome se torna grande demais
– Pode-se então dar um nome ao servlet através do qual o
servidor redirecionará a chamada à classe específica
© LES/PUC-Rio
35
Configurando o Tomcat
• Registrando Servlets (1)
– O arquivo web.xml localizado no diretório:
• %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF
© LES/PUC-Rio
36
Configurando o Tomcat
• Registrando Servlets (2)
<web-app>
<servlet>
<servlet-name>ServletSistema</servlet-name>
<servlet-class>controller.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletSistema</servlet-name>
<url-pattern>/servlet/ServletSes</url-pattern>
<servlet-mapping>
</web-app>
© LES/PUC-Rio
37
Chamada do servlet
© LES/PUC-Rio
38
Configurando o Tomcat
• Agora, o servlet poderá ser acessado através da URL:
http://<host>:<porta>/DIRETÓRIO_APLICAÇÃO/servlet/ServletSes
localhost:8080
© LES/PUC-Rio
39
Configurando o Tomcat
• Outras configurações
– O arquivo server.xml localizado no diretório:
• %TOMCAT_HOME%\conf
– Configuração da porta do servidor:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
© LES/PUC-Rio
40
JSP
Arquitetura
HTML de resposta montado a
partir de sucessivos comandos
out.println(...).
Controlador
Browser
Objetos de Negócio
JavaBean de
Resposta
JSP
© LES/PUC-Rio
42
O que é JSP
• JSP é uma tecnologia que permite combinar informações estáticas
com informações geradas dinamicamente.
• Script executado no servidor:
– Combinação de sintaxe JSP e tags de marcação
– Tags estáticas
• HTML, XML
– Conteúdo dinâmico gerado pelo código do script
• Java
• Exemplo:
– <HTML><HEAD><TITLE>Primeiro JSP</TITLE></HEAD>
– <BODY><H1>Data e hora:
– <%= new java.util.Date() %></H1>
– </BODY></HTML>
© LES/PUC-Rio
43
Passos
requisição para xxx.jsp
xxx.jsp
Geração de
Código Java
resposta
xxx.java
(servlet)
© LES/PUC-Rio
44
Escopo dos Atributos
• O JSP pode acessar objetos em tempo de execução em
quatro escopos diferentes:
– Página
• Objeto PageContext corrente (pageContext)
– Requisição
• Objeto HttpServletRequest corrente (request)
– Sessão
• Objeto HttpSession corrente (session)
– Aplicação
• Objeto ServletContext corrente (servletContext)
• Para armazenar informações: setAttribute(String, Object)
• Para recuperar informações: getAttribute(String)
© LES/PUC-Rio
45
Tags JSP
• Diretivas
– Configuração do processador JSP
– Inclusão estática de conteúdo
– Encaminhamento de requisições para outros servidores
• Comandos de script
– Inserção de código para a programação de conteúdo dinâmico
• Ações
– Tags de alto nível que encapsulam padrões de programação
mais corriqueiros
© LES/PUC-Rio
46
Diretivas
• <%@ nome-da-diretiva
[nome-atributo = “valor-do-atributo”]* %>
•
Diretivas disponíveis:
– <%@ include file=“url-relativa” %>
– <%@ taglib uri=“url-relativa-da-biblioteca-de-tags”
prefix=“prefixo-das-tags” %>
– <%@ page lista-de-atributos %>
© LES/PUC-Rio
47
Atributos da Diretiva Page
• language=“nome-da-linguagem-de-script”
• contentType=“mime-type | mime-type; charset=nomecharset”
• errorPage=“url-página-de-erro”
• isErrorPage=“true | false”
• buffer=“none|tamanho-em-kb”
• auto-flush=“true | false”
• import=“lista-de-pacotes”
• extends=“nome-da-classe-base”
• session=“true | false”
• isThreadSafe=“true | false”
• info=“texto-informativo”
© LES/PUC-Rio
48
Exemplos de Diretivas
• Diretiva Include
• Diretiva Taglib
© LES/PUC-Rio
49
Exemplos de Diretivas
• Diretiva Page
• Ou
© LES/PUC-Rio
50
Tags de Script
• Declarações
– <%! declaração %>
• Scriptlets
– <% comandos %>
• Expressões
– <%= expressão %>
• Comentários
– <!-- comentário html -->
– <%-- comentário jsp -->
© LES/PUC-Rio
51
Declarações
• <%! declarações %>
Exemplos:
<%! int i = 0;
public void metodo {...} %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
Declara variáveis ou métodos a serem utilizados no código JSP.
© LES/PUC-Rio
52
Scriptlets
• <% fragmento_de_código_válido %>
Exemplo:
<% String name = null;
if (request.getParameter(“nome") == null)
{
%>
<%@ include file="error.html" %>
<%
}
else
{
foo.setName(request.getParameter(“nome"));
}
%>
Um scriptlet pode conter qualquer número de instruções, variáveis,
métodos, declarações ou expressões válidos.
© LES/PUC-Rio
53
Expressão
• <%= expressão %>
Exemplo:
O mapa tem
<font color="blue"><%= mapa.getCount() %></font>
entradas.
Esta tag contém uma expressão que é avaliada e convertida para
string, depois de processada.
© LES/PUC-Rio
54
Comentários
• <!-- comentário [ <%= expressão %> ] -->
Exemplo:
<!-- Comentário -->
<!-- Esta página foi carregada em
<%= (new java.util.Date()).toLocaleString() %> -->
O processador JSP trata um comentário como texto HTML não
interpretado, retornando-o ao cliente.
Uma expressão pode ser incluída em um comentário, sendo
avaliada e seu resultado é retornado ao usuário juntamente com o
HTML de resposta.
© LES/PUC-Rio
55
Comentários para Desenvolvimento
• <%-- comentário --%>
Exemplo:
<%@ page language="java" %>
<html>
<head><title>Um teste - comentário</title></head>
<body>
<h2>Um teste - comentário</h2>
<%-- Este comentário não estará disponível para o cliente --%>
</body>
</html>
O processador JSP simplesmente ignora este tipo de comentário
e não processa nenhum código ou expressão contida entre os
delimitadores.
Este tipo de comentário não será enviado para o cliente.
© LES/PUC-Rio
56
Objetos Pré-Definidos
• Disponíveis para scriplets e expressões
– request
– response
– session
– out
– exception (somente em páginas de erro)
– page
© LES/PUC-Rio
57
© LES/PUC-Rio
58
Model View Controller (MVC)
• O que é MVC?
– Padrão arquitetural em três camadas para desenvolvimento de
sistemas, surgido nos anos 80.
NewClass7
NewClass3
NewClass
NewClass2
HTTP
browser
NewClass8
NewClass9
NewClass10
Servlet
NewClass5
© LES/PUC-Rio
NewClass6
NewClass4
59
Arquitetura MVC
• Sugere a divisão de uma aplicação visual em 3 partes
– Model: Modelo da sua aplicação, com as regras de negócio
(business logic) e todo o processamento da aplicação
– View: Apresenta a informação e recolhe os dados fornecidos pelo
usuário
– Controller: Recebe as informações da entrada e as transmite
para o modelo
© LES/PUC-Rio
60
Arquitetura MVC
• Em Java:
– O modelo será uma aplicação orientada a objetos.
– O controlador será alguma tecnologia de implementação (padrão
comando) que juntamente com o Servlet redirecionará as
chamadas feitas pelo cliente aos objetos no modelo.
– A apresentação será representada pelo JSP.
© LES/PUC-Rio
61
Taglibs
Ações
• jsp:useBean
• jsp:setProperty
• jsp:getProperty
• jsp:include
• jsp:forward
© LES/PUC-Rio
63
jsp:useBean
• Cria ou recupera uma instância de um bean.
• <jsp:useBean lista_de_atributos>
• A lista_de_atributos pode ser
– id: “nomeDaInstânciaDoBean”
– scope:”page|request|session|application”
– class: “com.teccomm.NomeClasse”
– type: “com.teccomm.NomeDoTipo”
• Exemplo:
© LES/PUC-Rio
64
jsp:include e jsp:forward
• Ações utilizadas para o encadeamento de páginas jsp.
• <jsp:include page=“url-relativa-da-página” />
– suspende o processamento da página chamadora;
– repassa o controle para a página chamada até que o retorne.
• <jsp:forward page=“url-relativa-da-página” />
– o processamento da página chamadora é terminado;
– controle repassado sem espera de retorno para a página
chamada.
© LES/PUC-Rio
65
jsp:include
• <jsp:include page="{URLrelativa |<%=expressão%>}"/>
• Exemplo
© LES/PUC-Rio
66
jsp:forward
• <jsp:forward page="{URLrelativa|<%=expressão%>}"/>
Exemplo:
A tag <jsp:forward> repassa o objeto request enviado para o arquivo
JSP para que seja processado por outra aplicação.
O processador JSP não executa o restante das instruções contidas após
a tag.
© LES/PUC-Rio
67
JSP Standard Tag Library
• Versão JSTL (Java 1.4) lançada em meados de 2002
impulsionou o desenvolvimento com JSP.
• Requer servlet container que suporte Servlet 2.4 and JSP
2.0 (tomcat 5.x)
• Provê 4 standard Tag Libs:
– core, internationalization/format, XML, and SQL
• Provê uma Expression Language (EL).
© LES/PUC-Rio
68
JSTL EL
© LES/PUC-Rio
69
JSTL – Core Tag Lib
© LES/PUC-Rio
70
JSTL - Format tag lib
© LES/PUC-Rio
71
Boas Práticas
O padrão Comando (I)
• Como implementar?
– Atributo hidden
© LES/PUC-Rio
73
O padrão Comando (II)
• Como implementar?
Atributo hidden + Comando abstrato +
Hashtable
– Atributo hidden – Ex:
© LES/PUC-Rio
74
O padrão Comando (III)
• O Comando Genérico:
• HttpServletRequest
– Passa o comando a ser instanciado (input do formulário)
• HttpServletResponse
– Contém o PrintWriter que deverá receber as respostas do
Comando
© LES/PUC-Rio
75
O padrão Comando (IV)
• O Servlet deve possuir um atributo HashTable com todos os
Commands
• Ao ser iniciado, cada Comando deve ser instanciado e
inserido na HashTable
© LES/PUC-Rio
76
O padrão Comando (V)
© LES/PUC-Rio
77
O padrão Comando (VII)
HttpServlet
MeuServlet
comandos : Hashtable
doGet()
doPost()
init()
ComandoAbstrato
processaComa ndo()
ComandoA
ComandoB
ComandoC
processaComando()
processaComando()
processaComando()
© LES/PUC-Rio
78
Dicas de Modelagem
© LES/PUC-Rio
79
J2EE no Eclipse
• É possível utilizar o Eclipse como ambiente de
desenvolvimento
– Plug-in Eclipse 3.x:
• Lomboz: Instalação e Configuração
• Execução do Exemplo no Eclipse
– Lomboz + Tomcat
© LES/PUC-Rio
80
Ferramentas
• Eclipse 3.x
• Jakarta Tomcat 5.x
– http://jakarta.apache.org/
• Lomboz para eclipse 3.x
– http://www.objectlearn.com/projects/download.jsp
© LES/PUC-Rio
81
Download