Sistemas Web com Java Server Faces (JSF) - IME-USP

Propaganda
Seminário JavaServer Faces


Paulo Venancio Lopes
Daniel Sguillaro
Tópicos
Introdução
● Aplicação Web
● Tecnologia Java Servlet
● Custom Tags
● JavaServer Pages
● JavaServer Faces
●
Aplicação Web
Aplicação web é a extensão dinâmica da web ou
application server, e são divididas em dois tipos:
● Presentation-oriented: Cria páginas interativas contendo
HTML, XML, e outros, e conteúdos dinâmicos em
resposta a uma requisição.
● Service-oriented: Implementa a parte final de um web
service. Aplicações presentation-oriented são
frequentemente clientes de uma aplicação serviceoriented web.
Aplicação web (continuação)
Interação entre um cliente e uma aplicação web:
Aplicação web (continuação)
Servlets: são classes java que dinamicamente
processam requisições e constroem respostas.
●
Paginas JSP: são documentos textos que são
executados como servlets e são apropriados para
geração de markup language tais com HTML,
SVG, WML, e XML.
●
Aplicação web (continuação)
Relação entre as tecnologias de aplicação java web
Ciclo de vida da aplicação Web
●
Desenvolvimento do código do componente
web.
● Desenvolvimento do descritor de implantação.
● Compilar componentes da aplicação web e
classe auxilares.
● Opcionalmente empacotar a aplicação em uma
unidade de implantação.
● Implantar a aplicação em um web container.
● Acessar a URL que referência a aplicação web.
●
Módulo Web
Empacotando Módulos Web
Um módulo web pode ser empacotado num
arquivo
*.war que é simplesmente um arquivo *.jar
renomeado,
para ser implantado em um web container. Mas
pode se
implantar o módulo diretamente.
Implantando Módulo Web
Pode-se implantar o módulo de duas forma:
1. Copiando o módulo web para o diretório de
implantação do web container.
2. Copiando o pacote do módulo web (arquivo
*.war) no diretório de implantação do web
container.
Obs1: Pode-se ainda no caso do Tomcat configurar o descritor
server.xml para que identifique o módulo web.
Obs2: Um context root identifica a aplicação web num JEE server
(ex: http://host:port/context_root/alias).
Tecnologia Java Servlet
Um servlet é uma classe java que extende as
capacidades do servidor que acessam aplicações
num modelo de programa requisição e resposta.
Todos os servlets podem responder qualquer tipo
de requisição, para cada aplicação a tecnologia
java servlet define classes servlet especificas para
HTTP.
Tecnologia Java Servlet (cont.)
Os pacotes javax.servlet e javax.sservlet.http
provem interfaces e classes para escrever
servlets. Todos servlets devem implementar a
interface Servlet, a qual define os métodos de
ciclo de vida
Ciclo de Vida do Servlet
O ciclo de vida de um servlet é controlado pelo
container no qual o servlet tenha sido implantado.
Quando uma requisição é mapeada para o
servlet, o container performa os seguintes
passos.
1. Se uma instância do servlet não existe, o web
container :
a. Carrega a classe do servlet.
Ciclo de Vida do Servlet (cont.)
b. Cria uma instância da classe do servlet.
c. Inicializa a instância do servlet
chamando o método init.
2. Invoca o método service, passando os
objetos request e response .
Obs: Se o container necessitar remover o
servlet , ele finaliza o servlet chamando o
método destroy.
Custom Tags numa página JSP
É o elemento da linguagem JSP definida por um Usuário.
<%@ taglib uri="/tlt" prefix="tlt" %>
<html>
<body bgcolor="white">
<tlt:iterator var="departmentName"
type="java.lang.String"
group="${myorg.department
Names}">
</body>
</html>
Tecnologia JavaServer Pages
JavaServer Pages (JSP) permite fácil criação de
conteúdos web sendo ambos componentes
dinâmicos e estáticos.
Página JSP é um documento texto que contém
dois tipos de textos: dados estáticos (HTML, SVG,
WML, XML, e outros), e elementos JSP, para
construir conteúdos dinâmicos (recomenda-se a
extensão *.jsp).
Ciclo de vida da Pagina JSP
São determinadas pela tecnologia Java Servlet.
Quando um request é mapeado para uma página
JSP, o web container primeiro checa se o servlet
da pagina JSP é mais velha do que a pagina JSP.
Se for o web container traduz a pagina JSP para
uma classe servlet e a compila. Durante o
desenvolvimento , uma das vantagens das
paginas JSP sobre o servlet é que o processo de
construção é feito automáticamente
Ciclo de vida da Pagina JSP (Cont.)
Tradução e compilação
Durante a fase de tradução cada tipo de dado na
pagina JSP é tratado diferentemente. Dados
estáticos são transformados em código que
emitirão dados para o stream de resposta.
●
Ciclo de vida da Pagina JSP (Cont.)
Os elementos JSP são tratados como a seguir:

Diretivas são usadas para controlar como o
web container traduz e executa a pagina JSP.

Elementos scripts são inseridos no servlet da
pagina JSP.
Ciclo de vida da Pagina JSP (Cont.)
Expressões Expression Language são
passadas comparâmetros para as chamadas
para o JSP expressionevaluator.
●
jsp:[set|get]Property elemento é convertido
numa chamada para método no componente
JavaBeans.
●
Ciclo de vida da Pagina JSP (Cont.)
•
•
•
O jsp:plugin elemento é convertido num
específico browser markup para ativação num
applet.
Custom tags são convertidas em chamadas
para o tag handler que implementa a custom
tag.
jsp:[include|forward] elemento é convertido
numa invocação da API Java Servlet.
Scripts nas paginas JSP
Elementos scripts são usados tipicamente para
criar e acessar objetos, definir métodos, e
gerenciar fluxo de controle.
Muitas tarefas que usam scripts podem ser
eliminadas usando custom tag library.
Scripts nas paginas JSP (cont.)
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>JSP Expressions</TITLE>
<META NAME="author" CONTENT="Marty Hall">
<META NAME="keywords"
CONTENT="JSP,expressions,JavaServer,Pages,servlets">
<META NAME="description"
CONTENT="A quick example of JSP expressions.">
<LINK REL=STYLESHEET
HREF="JSP-Styles.css"
TYPE="text/css">
</HEAD>
Scripts nas paginas JSP (cont.)
<BODY>
<H2>JSP Expressions</H2>
<UL>
<LI>Current time: <%= new java.util.Date() %>
<LI>Your hostname: <%= request.getRemoteHost() %>
<LI>Your session ID: <%= session.getId() %>
<LI>The <CODE>testParam</CODE> form parameter:
<%= request.getParameter("testParam") %>
</UL>
</BODY>
</HTML>
Sintaxe básica - JSP

Texto HTML
–
–
<H1>Blah</H1>
Passado para o cliente. Transformado em código servlet:


Comentários HTML
–
–

out.print("<H1>Blah</H1>");
<!-- Comentário -->
Mesmo que um outro HTML: Passado para o cliente
Comentário JSP
–
–
<%-- Comment --%>
Não envia para o cliente
Tipos de elementos scripts

Expressões
–
–

Scriptlets
–
–

Formato: <%= expression %>
Avaliada e inserida na saída do servlet:
out.print(expression)
Formato: <% code %>
Incorporado ao método do servlet _jspService
Declarações
–
–
Format: <%! code %>
Inserido no corpo de uma classe servlet, fora de
qualquer método.
Expressões JSP

Formato
–

Result
–
–

Expressão avaliada, convertida para String, e colocada na
página HTML no local onde ocorre na página JSP.
Expressão colocada no método _jspService dentro do
out.print
Exemplos
–
–

<%= Java Expression %>
Data: <%= new java.util.Date() %>
Hostname: <%= request.getRemoteHost() %>
Sintaxe XML
–
–
<jsp:expression>Expressão Java</jsp:expression>
Versão XML não suportada pelo TomCat 3. Deste JSP 1.2 os
Correspondência JSP/Servlet

JSP Original
<H1>A Random Number</H1>
<%= Math.random() %>

Código do servlet
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession(true);
JspWriter out = response.getWriter();
out.println("<H1>A Random Number</H1>");
out.println(Math.random());
...
}
JavaServer Faces (JSF)







Introdução
Ciclo de vida
Usando JSF em paginas JSP
Usando tags JSF
Usando dados localizados
Conversores e validadores.
Backing Bean
JSF – Introdução
É um framework do lado servidor baseado em
aplicações WEB.
JSF – Introdução (cont.)
JSF contém:
•
•
•
•
•
•
JavaBeans
Event Listener
Páginas JSP
Classes auxiliares do lado do servidor
Biblioteca de componentes UI
Biblioteca de event handlers, validators, e etc...
JSF – Introdução (cont.)


Backing Beans
Arquivo de configuração da aplicação
JSF – Ciclo de vida
JSF – Usando JSF em páginas JSP


Definir entrada para JSF HTML render kit
Definir entrada para JSF Core tag lib
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
Usando JSF em páginas JSP (cont.)
As tags suportam os seguintes atributos:
•
Id: Único identificador do componente.
•
Imediate: Se true, indica que qualquer evento,
validação, e conversão associado a um
componente será aplicada na fase request
value ou nas próximas fases.
Usando JSF em páginas JSP (cont.)

Style: Especifica um cascading style sheet
(css) para a tag.

styleClass: Especifica um css styleshet que
contém definições de estilo.

Value: Identifica uma fonte de dados externa e
associa seu valor a ele.
Usando JSF em páginas JSP (cont.)

Binding: identifica um bean property e associa
o componente instanciado por ele.
Usando dados localizados
Textos estáticos(labels, textos
alternativos,etc)
 Mensagens de erro
 Dados dinâmicos
Para carregar dados localizados temos que:
1. Registrar o resource bundle
2. Carregar o resource bundle
<f:loadBundle var=“b1” basename=“m.mens” />

Conversores e Validadores (cont.)
Para registrar conversores padrões:
• Associar value do componente para o backing
bean do mesmo tipo.
• Referenciar o converter pela classe ou pelo
atributo ID da tag do componente.
• Usar tag converterId ou tag binding aninhado
no componente.
Conversores e Validadores (cont.)

Via backing bean
Integer age = 0;
public Integer getAge(){ return age;}
public void setAge(Integer age) {this.age =
age;}

Via atributo converter
<h:inputText converter="javax.faces.convert.I
ntegerConverter" />
Conversores e Validadores (cont.)

BigDecimalConverter, BigIntegerConverter,
BooleanConverter,
ByteConverter,CharacterConverter
DateTimeConverter, DoubleConverter,
FloatConverter,
IntegerConverter,
LongConverter,NumberConverter,
ShortConverte
Conversores e Validadores (cont.)


DataTimeConverter
<h:outputText value="#{cashier.shipDate}">
<f:convertDateTime dateStyle="full" />
</h:outputText>
NumberConverter
<h:outputText value="#{cart.total}" >
<f:convertNumber type="currency"
</h:outputText>
Conversores e Validadores (cont.)


Registrando value-change listener
<h:inputText value="#{c.name}">
<f:valueChangeListener
type="l.NameChanged" /> </h:inputText>
Registrando action listener no componente
<h:commandLink action="bookstore">
<f:actionListener
type="listeners.LocaleChange" />
</h:commandLink>
Conversores e Validadores (cont.)


Validadores padrão
DoubleRangeValidator
LengthValidator
LongRangeValidator
Exemplo:
<h:inputText id="q" size="4"
value="#{item.quantity}" required=“true”>
<f:validateLongRange minimum="1"/>
</h:inputText>
<h:message for="quantity"/>
Backing Bean
Suas propriedades devem referenciar:
 Um valor do componente
 Uma instância do componente
 Uma instância do converter
 Uma instância do listener
 Uma instância do validator
Backing Bean (cont.)
private Integer userNumber = null;
public void setUserNumber(Integer
user_number)
{ userNumber = user_number; }
public Integer getUserNumber()
{ return userNumber; }
public String getResponse() { ... }
Backing Bean (cont.)
Configuração:
<managed-bean>
<managed-beanname>UserNumberBean</managed-beanname>
<managedbean-class>g.UserNumBean</managed-beanclass> <managed-beanscope>session</managed-bean-scope>
</managed-bean>
Fórmula p/ usar JSF
1. Criar um bean representando os dados de
um formulário
2. Usar as tags do JSF para criar o formulário
3. Especificar na tag h:commandButton um
método a ser chamado quando o formulário for
enviado (ActionController)
Fórmula p/ usar JSF (cont.)
4.Criar o Action Controller - suas responsabilidades
são:
Ler os dados do formulário
●Chamar a lógica de negócio
●Popular os beans que contém os resultados
●Devolver uma condição
●
Fórmula p/ usar JSF (cont.)
5. Declarar o form bean e as regras de
navegação no descritor faces-config.xml
6. Criar as páginas JSP para cada condição
devolvida
Exemplo
Formulário de cadastro, onde os dados fornecidos
pelo usuário farão com que o JSF tome a de qual
pagina será mostrada a seguir.
Exemplo (cont.)
<%@ taglib uri="http://java.sun.com/jsf/core"
prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html"
prefix="h" %>
<f:view>
…
<h:form>
Nome: <h:inputText value=“#{bean.nome”/><BR>
Exemplo (cont.)
Sobrenome: <h:inputText
value=“#{bean.sobrenome}”/><BR> ...
<h:commandButton
value=“Cadastrar Dados"
action="#{bean.cadastrar}"/>
</h:form>…
</f:view>
Exemplo (cont.)
Criando um action controller
package exemplo;
public class CadastroBean {
private String nome = “”;
private String sobrenome = “”;
// getters e setters
...
Exemplo (continuação)
public String cadastrar() {
if (nome.trim().equals(“”) ||
sobrenome.trim().equals(“”) ) {
return(“rejeitado");
} else {
return(“aceito");
}
}
}
Exemplo (cont.)
Declarando o action controller
<faces-config>
<managed-bean>
<managed-bean-name>
bean
</managed-bean-name>
<managed-bean-class>
exemplo.CadastroBean
</managed-bean-class>
Exemplo (cont.)
<managed-bean-scope>
request
</managed-bean-scope>
</managed-bean>
…
</faces-config>
Exemplo
Especificando regras de navegação
<faces-config>
<navigation-rule>
<from-view-id>/cadastro.jsp</from-view-id>
<navigation-case>
<from-outcome>
aceito
</from-outcome>
<to-view-id>
Exemplo
(continuação)
/WEB-INF/result/aceito.jsp
</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>
rejeitado
</from-outcome>
<to-view-id>
/WEB-INF/results/rejeitado.jsp
Exemplo
(continuação)
</to-view-id>
</navigation-case>
</navigation-rule>
…
</faces-config>
Exemplo (cont.)
<HTML>
<HEAD>…</HEAD>
<BODY>
Cadastro do usuário ${bean.nome}
${bean.sobrenome} aceito. Parabéns.
</BODY></HTML>
Exemplo (cont.)
<HTML>
<HEAD>…</HEAD>
<BODY>
Cadastro rejeitado.<br/>
<A HREF=“cadastro.faces">Tente de novo</A>.
</BODY></HTML>
Referências
•
•
•
•
Tutorial JEE da Sun:
http://java.sun.com/javaee/5/docs/tutorial/doc/
www.coreservlets.com
Geary, David; Horstmann Cay - Core
JavaServer Faces, 2004
Bergsten, Hans; JavaServer Faces, O’Reilly,
2004
Download