Tópicos avançados no
Framework Struts
Sistemas de Informação
Prof. Vinicius Cardoso Garcia
vcg@cin.ufpe.br
Licença do Material
Este Trabalho foi licenciado com uma
Licença
CreaIve Commons -‐
Atribuição-‐NãoComercial-‐
ComparIlhaIgual 3.0 Não Adaptada
.
Mais informações visite
Referências
•
Notas de aula baseadas no material do curso:
–
Programação Web
, Módulo 6, versão 1.0 – Novembro/
2007
–
JEDI: Java Educa>on & Development Ini>a>ve (DFJUG-‐
BRASIL)
•
HALL, Marty.
Core Servlets and Java Server Pages
,
Pren>ce Hall, 2000
•
GOODWILL, James
. Mastering Jakarta Struts
, Wiley,
2002
•
Paul Deitel e Harvey Deitel.
Java -‐ Como Programar -‐
8ª Edição
. Pren>ce Hall -‐ Br, 2010.
LogísIca
• Apresentação do professor
• Material
• Dúvidas? Interrompam a
vontade...
• Celulares silenciosos
• Exercício
Warm up
• Na aulaanterior, trabalhamos com o básico do framework Struts. • Aprendemos como incluir o framework Struts em nossa aplicação
configurando o Ac>onServlet para manipular as requisições.
• Também aprendemos como criar instâncias de classes Ac>on que servem como manipuladores de ações para submissões de forms e outras requisições de usuário.
• Vimos como criar classes Ac>onForm que oferecem uma maneira fácil de transferir dados de forms para os Ac>onHandlers
apropriados.
• Finalmente, vimos como usar as bibliotecas de tag incluídas a fim de auxiliar na junção dos forms HTML às páginas JSP dentro do framework.
ObjeIvos
•
Ao final desta aula, o estudante será capaz de:
–
Usar os DynaAc>onForms para minimizar o
número de classes que precisamos desenvolver
–
Prover validação do lado servidor em nossa
aplicação com o framework Validator
–
Compar>mentalizar a camada de apresentação
com o framework Tiles
O Que veremos?
•
DynaAc>onForms
•
Validadores
•
Pacote de Recursos
DynaAcIonForms
• Funciona exatamente igual ao Ac>onForms
• Uma instância pode ser ob>da e seus métodos chamados por Ac>on handlers
• A principal diferença é que cada DynaAc>onForm não é definido ou declarado com uma classe separada
• Configurado dentro do arquivo struts-‐config.xml
• Criar DynaAc>onForm é mais simples e rápido do que codificar uma instância completa de um Ac>onForm
• Não é necessário listar todas as propriedades do formulário e criar os métodos get e set para cada uma delas
• Declarar o nome e >po da propriedade
• E responsabilidade do framework prover uma instância de trabalho baseado nas informações
<?xml version="1.0"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/ struts/dtds/struts- config_1_1.dtd"> <struts-config> <form-beans> <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm”>
<form-property name="loginName" type="java.lang.String"/> <form-property name="password" type="java.lang.String"/> </form-bean> </form-beans> <action-mappings> <action name="loginForm" path="/login" scope="request" type="action.LoginAction">
<forward name="success" path="/success.jsp"/> <forward name="failure" path="/failure.jsp"/> </action>
</action-mappings> </struts-config>
DynaAcIonForms
• São os seguintes os >pos Java suportados pelo DynaAc>onForm:
– java.lang.BigDecimal – java.lang.BigInteger
– boolean e java.lang.Boolean – char e java.lang.Character – double e java.lang.Double – float e java.lang.Float
– int e java.lang.Integer – long e java.lang.Long – short e java.lang.Short – java.lang.String
– java.lang.Date – java.lang.Time
DynaAcIonForms
•
Mais conveniente, mas não é sempre a
melhor solução
•
Existem ainda situações onde usar
Ac>onForms é mais apropriado:
–
DynaAc>onForms suporta apenas um
conjunto limitado de >pos Java
– DynaAc>onForms não suporta o conceito
de herança
Validadores
•
Validação
–
Valida o formato e o conteúdo dos valores fornecido
pelo usuário
–
Uma tarefa que deve ser realizada para toda entrada de
dados
•
Framework provido pelo Struts para aliviar a vida do
desenvolvedor que teria que fazer a validação
•
Vantagens:
–
Prove várias regras de validação pré-‐definidas
–
Elimina redundância no código de validação
–
Prove ponto único de manutenção
Validadores
•
Passos requeridos para inclusão da
funcionalidade de Validadores dentro de
aplicações Struts já existentes:
–
Configure o plug-‐in Validator
–
Declare os formulários requerendo validação
–
Crie as mensagens mostradas no caso de
falha da validação
–
Modifique o arquivo struts-‐config para a>var
a validação automá>ca
validator-‐rules.xml
•
Define as classes que implementam o código de validação
•
O framework vem com um cópia deste arquivo com classes
de validação pré-‐definidas já configuradas
•
Nomes lógicos dos validades que são entregues dentro do
framework
– required – propriedades marcadas como required devem ter ao
menos um caractere.
– mask – propriedades sujeitas ao validador de máscara devem
combinar com a expressão regular que submetemos usando o parâmetro mask.
– minlength – se aplicado a uma propriedade, deve ter um tamanho
igual ou maior que o valor do parâmetro min que passamos.
– maxlength -‐ se aplicado a uma propriedade, deve ter um tamanho
validator-‐rules.xml
•
range
– a propriedade deve estar entre os valores
fornecidos através dos parâmetros min e max.
•
byte, short, integer, long, float, double
– a propriedade
deve poder ser conver>da para o >po de dado primi>vo
específico.
•
date
– valida se o valor da propriedade é uma data válida.
•
creditCard
– valida se o valor da propriedade pode ser um
número de cartão de crédito válido.
•
– valida se o valor da propriedade pode ser um
endereço de email válido.
validaIon.xml
•
Declara quais formulários requerem
validação
•
Declara quais regras de validação
devem ser implementadas
•
O framework fornece a estrutura do
arquivo
•
Desenvolvedores devem configurar este
arquivo
Definindo o Pacote de Recursos
•
O elemento <arg0> define a chave que necessita
como entrada um conjunto de recursos
•
Framework validator faz uso do mesmo conjunto de
recursos que o Struts framework u>liza
•
Pode ser encontrado no diretório WEB-‐INF/classes
sob o nome Applica>onResources.proper>es
•
Exemplo:
error.loginname.required=Por favor informe seu login error.password.required=Informada senha em branco ou com menos de 4 caracteres
LoginAcIon.java
package action;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class LoginAction extends Action { @Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception { DynaActionForm dForm = (DynaActionForm) form;
String loginName = (String) dForm.get("loginName"); String password = (String) dForm.get("password");
if (!(loginName.equals(”JACK") && password.equals(”BAUER"))) { return mapping.findForward("failure");
}
HttpSession session = request.getSession(); session.setAttribute("USER", loginName); return mapping.findForward("success"); }
LoginStruts.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> <html:html> <head> <title>Login Page</title> </head> <body> <h1> Login Page </h1> <br/> <html:form action="/login"> User Name: <html:text property="loginName"/> <html:errors property="loginName"/> <br/> Password: <html:password property="password"/> <html:errors property="password"/> <br/> <html:submit/>
Tiles
•
Permite a fácil definição de modelo
(templates) e instâncias de telas as
quais podemos usar com nossas
aplicações
•
É um modelo que pode ser reu>lizado
por qualquer página da aplicação
•
Usar modelos permite a aplicação a
aparência mais consistente e
Modelos (templates)
•
Como podemos implementar um conjunto
de páginas similares?
–
Refatorando as en>dades de código
separadas que seriam duplicada por todo
código da aplicação
–
Usar modelos que definam o formato e a
visão padrão das páginas
–
Qualquer mudança necessária em um dos
aspectos da camada de apresentação seria
aplicada a todas as páginas uma única vez
Construindo um Modelo de
Layout
•
O primeiro passo na construção de uma modelo é
iden>ficar os componentes a serem colocados
Header
Construindo um Modelo de
Layout
Criando definições de Tela
•
Uma vez que temos um modelo,
podemos fazer uso dele para definir
uma tela
•
A criação de definições pode ser feita
dentro do Tiles framework de duas
maneiras:
–
Definição usando páginas JSP
– Definição usando um arquivo de
configuração XML
Usando as Definições de Telas
•
Para colocar uma Definição em uso, podemos
usar o tag <>les:insert> e fornecer a ele o nome
da definição a ser mostrada:
•
Exemplo:
<%@ taglib uri="http://jakarta.apache.org/struts/ tags- tiles" prefix="tiles" %>
<tiles:insert beanName="welcomePage" flush="true"/>