Java EE
Projeto de Sistemas de Software
Agenda
• Visão geral da Arquitetura Java EE
• Servlets
• JSP
• Boas Práticas
– MVC
– Command
© LES/PUC-Rio
2
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
© LES/PUC-Rio
3
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
© LES/PUC-Rio
4
Modelos de Componente Java EE
•
A especificação Java EE define os seguintes componentes Java EE:
•
Aplicações stand-alone
•
– aplicação Java
– Normalmente executados dentro
do browser
– mantidos e executados no cliente
– Mantidos pelo servidor e
executados no cliente
– GUI
•
Applets
•
Componentes Web
Enterprise JavaBeans (EJBs)
– componentes mantidos e
executados em um ambiente
gerenciado pelo servidor
– Servlet
• Objetos java que respondem
requisições em HTTP
• Resposta normalmente é Html
gerado dinamicamente
• Mantidos e executados no servidor
– JSP
– Provê
• Monitoramento transacional
• Persistência
• Distribuição de objetos
• Linguagem de script adequada
para escrita de servlets de
apresentação
© LES/PUC-Rio
• Segurança
– Não são JavaBeans!
5
Exemplos de Componentes Java EE
• Componentes Clientes
– Applets
– Aplicações Java Stand-Alone
• Componentes Web
– Servlets
– JSPs
• Componentes EJB
– Session Beans
– Message-Driven Beans
© LES/PUC-Rio
6
Arquitetura de Aplicações Java EE
© LES/PUC-Rio
7
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
© LES/PUC-Rio
8
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
© LES/PUC-Rio
9
Java Servlets
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
© 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
Servidor
Cliente / Browser
© LES/PUC-Rio
12
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
© LES/PUC-Rio
13
Requisitando um Servlet via GET
GET (HTTP)
http://localhost/servlet/ServletHyperMed?Comando=SetCtxLabPorNome&Por=&No=Apsen
© LES/PUC-Rio
14
Requisitando um Servlet via POST
© LES/PUC-Rio
15
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
© LES/PUC-Rio
16
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()
© LES/PUC-Rio
17
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
© 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
• 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 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
© LES/PUC-Rio
21
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
© LES/PUC-Rio
22
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
© LES/PUC-Rio
23
Primeiro Exemplo: Hello World!
Hello World!
© LES/PUC-Rio
24
Segundo Exemplo
© LES/PUC-Rio
25
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
© LES/PUC-Rio
26
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
© LES/PUC-Rio
27
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()
© LES/PUC-Rio
28
Exemplo – Carrinho de compras (I)
Adicionando parâmetros à Sessão
© LES/PUC-Rio
29
Exemplo – Carrinho de compras (II)
Recuperando parâmetros da Sessão
© LES/PUC-Rio
30
Exemplo – Carrinho de compras (III)
Recuperando parâmetros da Sessão
© LES/PUC-Rio
31
Exemplo – Carrinho de compras (IV)
Encerrando a Sessão
© LES/PUC-Rio
32
Parâmetros de Inicialização
• Motivação
– Muitas vezes existem valores que são constantes durante a
execução do servlet, mas que podem mudar durante a vida da
aplicação
– Ex:
• Localização de recursos
• Mensagens padrão
© LES/PUC-Rio
33
Parâmetros de Inicialização
•
Configurando no Tomcat
–
© LES/PUC-Rio
Arquivo web.xml
34
Parâmetros de Inicialização
• Principais métodos
– Classes Servlet e ServletConfig
• public java.util.Enumeration getInitParameterNames()
• public java.lang.String
getInitParameter(java.lang.String name)
© LES/PUC-Rio
35
Inicializando o Servlet
© LES/PUC-Rio
36
Inicializando o Servlet
© LES/PUC-Rio
37
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)
© LES/PUC-Rio
38
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
© LES/PUC-Rio
39
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>
© LES/PUC-Rio
40
Jakarta Tomcat
© LES/PUC-Rio
41
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>
© LES/PUC-Rio
42
JSP
Arquitetura
HTML de resposta montado a
partir de sucessivos comandos
out.println(...).
Servlet + Controladores
(Controle)
Browser
Objetos de Negócio
(Modelo)
JSP
JavaBean de
Resposta
(Visão)
© LES/PUC-Rio
44
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>
© LES/PUC-Rio
45
Compilação de JSP (cont.)
requisição
para xxx.jsp
resposta de erro
xxx.jsp
Geração de
Código Java
Compilação
resposta
xxx.java
(servlet)
xxx.class
(servlet)
© LES/PUC-Rio
46
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
47
Do Servlet ao JSP
• Include
– getServletContext().getRequestDispatcher("pagina.jsp").
include(request, response);
Servlet
JSP
• Forward
– getServletContext().getRequestDispatcher("pagina.jsp").
forward(request, response);
Servlet
© LES/PUC-Rio
JSP
48
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
49
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 %>
© LES/PUC-Rio
50
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
51
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.*” %>
© LES/PUC-Rio
52
Tags de Script
• Declarações
<%! declaração %>
• Scriptlets
<% comandos %>
• Expressões
<%= expressão %>
• Comentários
<!-- comentário html -->
<%-- comentário jsp -->
© LES/PUC-Rio
53
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
54
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
55
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
56
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
57
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
58
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
59
© LES/PUC-Rio
60
Ações
• jsp:useBean
• jsp:setProperty
• jsp:getProperty
• jsp:include
• jsp:forward
– ou então tags personalizadas via taglib
© LES/PUC-Rio
61
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
– <jsp:useBean id=“stringBean”
class=“com.teccomm.MeuBean” scope=“session”>
© LES/PUC-Rio
62
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
© LES/PUC-Rio
63
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" />
© LES/PUC-Rio
64
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.
© LES/PUC-Rio
65
Boas Práticas
MVC
Servlet + Modelo de Objetos
• Agora sabemos
– Programar servlets
– Modelar um sistema orientado a objetos
• Mas como fazer os dois funcionarem juntos?
© LES/PUC-Rio
67
Servlet + Modelo de Objetos
NewClass7
NewClass3
NewClass
NewClass2
NewClass8
??
HTTP
browser
NewClass9
NewClass10
Servlet
NewClass5
© LES/PUC-Rio
NewClass6
NewClass4
68
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
© LES/PUC-Rio
69
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)
Browser
Objetos de Negócio
(Modelo)
JSP
JavaBean de
Resposta
(Visão)
© LES/PUC-Rio
70
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
© LES/PUC-Rio
71
MVC
Servlet + Controladores
(Controle)
Browser
Objetos de Negócio
(Modelo)
JSP
JavaBean de
Resposta
(Visão)
© LES/PUC-Rio
72
Boas Práticas
Padrão Command
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
© LES/PUC-Rio
74
Padrão Command (I)
• Como implementar?
– Atributo hidden
© LES/PUC-Rio
75
Padrão Command (II)
• Como implementar?
– Atributo hidden
• Ex:
• Atributo hidden + Comando abstrato + Hashtable
© LES/PUC-Rio
76
Padrão Command (III)
HttpServlet
MeuServlet
comandos : Hashtable
doGet()
doPost()
init()
ComandoAbstrato
processaComando()
ComandoA
ComandoB
ComandoC
processaComando()
processaComando()
processaComando()
© LES/PUC-Rio
77
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
© LES/PUC-Rio
78
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
© LES/PUC-Rio
79
Padrão Command (VI)
© LES/PUC-Rio
80
Padrão Command (VII)
© LES/PUC-Rio
81
Dicas de Modelagem
© LES/PUC-Rio
82
Fim
Perguntas?
Download

Aula03-arquitetura_javaee-20101 - (LES) da PUC-Rio