Java EE
Projeto de Sistemas de Software
2 © LES/PUC-Rio
Agenda
• Visão geral da Arquitetura Java EE
• Servlets
• JSP
• Boas Práticas– MVC
– Command
3 © LES/PUC-Rio
JavaTM Platform, Enterprise Edition (Java EE)
• Arquitetura de referência
• Plataforma de Tecnologias
• Desenvolvimento de aplicações corporativas distribuídas
• Provê
– Suporte ao gerenciamento automático de componentes
– Infra-estrutura de serviços complexos
• Transações
• Segurança
• Persistência
• Objetivo Central
– Desenvolvedores podem concentrar-se no desenvolvimento da lógica de negócio
4 © LES/PUC-Rio
Componentes Java EE
• Aplicações Java EE
– Constituídas por componentes
• Componente Java EE
– Unidade funcional de software
– Formada por
• Conjunto de classes
• Arquivos relacionados
– Pode se comunicar com outros componentes
– Pode ser reusado durante a construção de aplicações Java EE
– Deve seguir a especificação Java EE
5 © LES/PUC-Rio
Modelos de Componente Java EE
• Aplicações stand-alone
– aplicação Java
– mantidos e executados no cliente
– GUI
• 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
• Applets
– Normalmente executados dentro do browser
– Mantidos pelo servidor e executados no cliente
• Enterprise JavaBeans (EJBs)
– componentes 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!
• A especificação Java EE define os seguintes componentes Java EE:
6 © LES/PUC-Rio
Exemplos de Componentes Java EE
• Componentes Clientes
– Applets
– Aplicações Java Stand-Alone
• Componentes Web
– Servlets
– JSPs
• Componentes EJB
– Session Beans
– Message-Driven Beans
7 © LES/PUC-Rio
Arquitetura de Aplicações Java EE
8 © LES/PUC-Rio
Servidores Java EE
• Componentes Java EE são instalados em servidores
• Servidores
– Oferecem infra-estrutura para gerenciamento do ciclo de vida dos componentes
– Incluem containers Web e EJB
– Provêem diversos serviços para os componentes
• Transações
• Persistência
• Segurança
• Nomes
• Distribuição
9 © LES/PUC-Rio
Java EE – Tecnologias Associadas
• Panacéia de tecnologias
– Ambientes de desenvolvimento
– Servidores de aplicação
– Frameworks de apoio ao desenvolvimento
– Padrões de Projeto
– Ferramentas de geração de código
Java Servlets
11 © LES/PUC-Rio
Servlet - Conceito
• Aplicação Java executada do lado do servidor, estendendo a capacidade do servidor web
– Alternativa Java para os scripts CGI
– Gerenciado pelo módulo web
• Vantagens
– Melhor aproveitamento dos recursos do sistema
– Fácil de programar
– Portável
12 © LES/PUC-Rio
Arquitetura Cliente-Servidor
GET (request) Documento HTML
retorna (response) Documento HTML
Cliente / Browser Servidor
Formulário Submetido via POST (request)
Servidor retorna HTML gerado pelo Servlet
13 © LES/PUC-Rio
Arquitetura Cliente-Servidor
• Arquitetura baseada na divisão do processamento em processos distintos
– Servidor
• responsável pela manutenção da informação
– Clientes
• responsáveis pela obtenção dos dados
• envio de pedidos ao processo servidor
• Cliente faz requisições utilizando protocolo HTTP
• Para cada requisição o servidor cria uma nova Thread
14 © LES/PUC-Rio
Requisitando um Servlet via GET
GET (HTTP)
http://localhost/servlet/ServletHyperMed?Comando=SetCtxLabPorNome&Por=&No=Apsen
15 © LES/PUC-Rio
Requisitando um Servlet via POST
16 © LES/PUC-Rio
API de Servlet
• API de Servlet
– Conjunto de classes Java
– Define 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
17 © LES/PUC-Rio
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
– Chamados pelo método service()
• Subclasses reescrevem os métodos
– doGet
– doPost
• Podem reescrever os métodos
– init()
– destroy()
18 © LES/PUC-Rio
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édotos service(), doGet(), doPost() são chamados para atender requisições de clientes– Cada requisição é atendida por uma nova thread
• destroy() e Coleta de lixo – Executado somente uma vez
– Alguns servidores somente removem o servlet quando ocorre o shutdown
– Utilizado para liberar recursos
19 © LES/PUC-Rio
Recapitulando...
• Para criar um Servlet é necessário
– Estender a classe HttpServlet
• pacote javax.servlet.http do JSDK
– Implementar os métodos doGet ou doPost
20 © LES/PUC-Rio
Request e Response
• Métodos doGet(), doPost() recebem dois parâmetros
– HttpServletRequest
• encapsula os parâmetros da requisição
– HttpServletResponse
• encapsula a resposta ao cliente
21 © LES/PUC-Rio
HttpServletRequest
• Interface que encapsula a requisição feita pelo cliente através do protocolo HTTP
• Possui métodos que permitem recuperar os dados da requisição
– cabeçalho
– dados de formulários ou parâmetros enviados
– informações sobre a sessão do cliente
22 © LES/PUC-Rio
HttpServletRequest
• Alguns métodos definidos em HttpServletRequest para 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
23 © LES/PUC-Rio
HttpServletResponse
• Interface que encapsula a resposta ao cliente
• Possui um método responsável por recuperar o canal de resposta com o cliente
– getWriter()
• 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
24 © LES/PUC-Rio
Primeiro Exemplo: Hello World!
Hello World!
25 © LES/PUC-Rio
Segundo Exemplo
26 © LES/PUC-Rio
Gerenciamento de sessão (I)
• Protocolo HTTP– 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 através de várias requisições HTTPs e recuperar suas informações– Dados do estado do cliente
• Para obter uma sessão– HttpSession getSession()
• Obtém sessão existente, caso não exista retorna uma nova sessão
– HttpSession getSession(boolean create) • Obtém sessão existente ou cria uma nova sessão dependendo do
valor do parâmetro create
27 © LES/PUC-Rio
Gerenciamento de sessão (II)
• 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
28 © LES/PUC-Rio
Gerenciamento de sessão (III)
• Tempo de duração da sessão
– Sessões em geral tem 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()
29 © LES/PUC-Rio
Exemplo – Carrinho de compras (I)Adicionando parâmetros à Sessão
30 © LES/PUC-Rio
Exemplo – Carrinho de compras (II)Recuperando parâmetros da Sessão
31 © LES/PUC-Rio
Exemplo – Carrinho de compras (III)Recuperando parâmetros da Sessão
32 © LES/PUC-Rio
Exemplo – Carrinho de compras (IV)Encerrando a Sessão
33 © LES/PUC-Rio
Colocando para Funcionar
• Para que o servlet “funcione”
– Necessário que 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.
• Jakarta Tomcat
– Servidor gratuito baseado em java
– Configurável de maneira simples via XML
– Oferece suporte a Java (Servlets e JSP)
34 © LES/PUC-Rio
Configurando o Tomcat
• Onde colocar as classes dos Servlets?
– Em geral as classes são colocadas no diretório:
%TOMCAT_HOME%\webapps\XXX\WEB-INF\classes
– A partir deste diretório devem ser colcadas em seus próprios pacotes
35 © LES/PUC-Rio
Configurando o Tomcat
• Registrando os Servlets
– 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
– Arquivo web.xml
• Localizado em geral no diretório %TOMCAT_HOME%\webapps\ROOT\WEB-INF
– Registrando um servlet
<web-app>
<servlet>
<servlet-name>ServletSes</servlet-name>
<servlet-class>interfPesquisa.ServletSes</servlet-
class>
</servlet>
</web-app>
36 © LES/PUC-Rio
Jakarta Tomcat
37 © LES/PUC-Rio
Configurando o Tomcat
• Outras configurações
– Arquivo server.xml
• Localizado no diretório %TOMCAT_HOME%\conf
– Configuração da porta do servidor
<Connector
className="org.apache.tomcat.service.SimpleTcpConnector">
…
<Parameter name="port" value="8081"/>
</Connector>
JSP
39 © LES/PUC-Rio
Arquitetura
HTML de resposta montado a partir de sucessivos comandos out.println(...).
Servlet + Controladores
(Controle)
Objetos de Negócio
(Modelo)
JavaBean de Resposta
Browser
JSP
doGet()
doPost()
(Visão)
40 © LES/PUC-Rio
JSP - Conceito
• 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áticos
• 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>
41 © LES/PUC-Rio
Compilação de JSP (cont.)
xxx.jsp
requisição
para xxx.jsp
resposta
resposta de erro
xxx.class
(servlet)
Geração de
Código Java
xxx.java
(servlet)
Compilação
42 © LES/PUC-Rio
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
43 © LES/PUC-Rio
Diretivas
<%@ nome-da-diretiva
[nome-atributo = “valor-do-atributo”]* %>
• Diretivas disponíveis
– <%@ include file=“url-relativa” %>
• Inclusão em tempo de compilação
– <%@ taglib uri=“url-relativa-da-biblioteca-de-tags”
prefix=“prefixo-das-tags” %>
– <%@ page lista-de-atributos %>
44 © LES/PUC-Rio
Atributos da Diretiva Page
• language=“nome-da-linguagem-de-script”
• contentType=“mime-type | mime-type; charset=nome-charset”
• 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”
45 © LES/PUC-Rio
Exemplos de Diretivas
• Diretiva Include
<%@ include file=“/teccommdoc/header.html” %>
• Diretiva Taglib
<%@ taglib uri=“/tags/teccommtags” prefix=“teccomm” %>
<teccomm:exemplo parametro=“demonstracao” />
• Diretiva Page
<%@ page language=“java” errorPage=“erro.jsp”
isErrorPage=“false” buffer=“12kb” auto-flush=“true”
session=“true” isThreadSafe=“true” info=“TecComm” %>
• Ou
<%@ page language=“java” %>
<%@ page errorPage=“erro.jsp” %>
<%@ page import=“com.teccomm.output.*” %>
46 © LES/PUC-Rio
Tags de Script
• Declarações
<%! declaração %>
• Scriptlets
<% comandos %>
• Expressões
<%= expressão %>
• Comentários
<!-- comentário html -->
<%-- comentário jsp -->
47 © LES/PUC-Rio
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
48 © LES/PUC-Rio
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
49 © LES/PUC-Rio
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.
50 © LES/PUC-Rio
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
51 © LES/PUC-Rio
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
52 © LES/PUC-Rio
Objetos Pré-Definidos
• Disponíveis para scriplets e expressões
– request
– response
– session
– out
– exception (somente em páginas de erro)
– page
53 © LES/PUC-Rio
54 © LES/PUC-Rio
Ações
• jsp:include
• jsp:forward
– ou então tags personalizadas via taglib
55 © LES/PUC-Rio
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 e repassa o controle para a página chamada até que esta retorne-o
<jsp:forward page=“url-relativa-da-página” />
– O processamento da página chamadora é terminado e o controle é repassado sem espera de retorno para a página chamada
56 © LES/PUC-Rio
jsp:include
• <jsp:include page="{URLrelativa |<%=expressão%>}"/>
• Exemplo
<jsp:include page="scripts/login.jsp" />
<jsp:include page="copyright.html" />
<jsp:include page="/index.html" />
57 © LES/PUC-Rio
jsp:forward
• <jsp:forward page="{URLrelativa|<%=expressão%>}"/>
• Exemplo
<jsp:forward page="scripts/login.jsp" />
• 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.
Boas Práticas
MVC
59 © LES/PUC-Rio
Servlet + Modelo de Objetos
• Agora sabemos
– Programar servlets
– Modelar um sistema orientado a objetos
• Mas como fazer os dois funcionarem juntos?
60 © LES/PUC-Rio
Servlet + Modelo de Objetos
browserHTTP
Servlet
NewClass5
NewClass
NewClass4NewClass6
NewClass7
NewClass2
NewClass3 NewClass8
NewClass9 NewClass10
??
61 © LES/PUC-Rio
Arquitetura MVC
• O que é MVC?
– MVC – Model-View-Controller
– Surgiu nos anos 80 com SmallTalk
• Sugere a divisão de uma aplicação visual em 3 partes fundamentais
– Model
• Representa o modelo da sua aplicação, com as regras de negócio (business logic) e todo o processamento da aplicação
– View
• Representa a informação e recolhe os dados fornecidos pelo usuário
– Controller
• Recebe as informações da entrada e as transmite para o modelo
62 © LES/PUC-Rio
Arquitetura MVC
• Pela arquitetura, a interação de um usuário com o sistema se dá através de seqüências de chamadas MVC
Servlet + Controladores
(Controle)
Objetos de Negócio
(Modelo)
JavaBean de Resposta
Browser
JSP
doGet()
doPost()
(Visão)
63 © LES/PUC-Rio
Arquitetura MVC
• O modelo será uma aplicação Java 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 responsáveis no modelo
• A apresentação será representada pelo JSP
Boas Práticas
Padrão Command
65 © LES/PUC-Rio
Padrão Command
• Objetivos
– Reduzir acoplamento entre as requisições dos clientes e os objetos que as executam
– Parametrizar objetos por uma ação a ser executada
– Especificar, enfileirar e executar solicitações em tempos diferentes para desfazer operações, por exemplo
– Estruturar um sistema em torno de operações de alto nível, como transações, por exemplo
66 © LES/PUC-Rio
Padrão Command (I)
• Como implementar?
– Atributo hidden
67 © LES/PUC-Rio
Padrão Command (II)
• Como implementar?
– Atributo hidden
• Ex:
• Atributo hidden + Comando abstrato + Hashtable
68 © LES/PUC-Rio
Padrão Command (III)
HttpServlet
ComandoA
processaComando()
ComandoB
processaComando()
ComandoC
processaComando()
MeuServlet
comandos : Hashtable
doGet()doPost()init()
ComandoAbstrato
processaComando()
69 © LES/PUC-Rio
Padrão Command (IV)
• 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
70 © LES/PUC-Rio
Padrão Command (V)
• O Servlet deve possuir um atributo HashTable com todos os Commands
• Ao ser iniciado, cada Comando deve ser instanciado e inserido na HashTable
71 © LES/PUC-Rio
Padrão Command (VI)
72 © LES/PUC-Rio
Padrão Command (VII)
73 © LES/PUC-Rio
Dicas de Modelagem
Fim
Perguntas?