Java para Web com Struts Danilo Toshiaki Sato [email protected] Treinamento ALESP – SPL Módulo III Agenda - Módulo III 1. Recapitulando... 2. Construindo a View 1. 2. 3. 4. Internacionalização TagLibs Struts Validator Struts Tiles 3. Configurando o Struts 1. web.xml 2. struts-config.xml 4. Considerações sobre o SPL Copyleft 2006 Danilo Sato 2 Recapitulando... Fluxo Básico de Controle View Config Copyleft 2006 Danilo Sato 3 Construindo a View Suporte à Internacionalização (i18n): No Struts, o suporte é limitado à apresentação de conteúdo internacionalizado Internacionalização na entrada de dados fica a cargo do cliente (navegador) Aplicações na web podem ser acessadas por pessoas de diversos países Internacionalização permite que a aplicação seja localizada para cada usuário: Língua Formato de data Formato numérico Formato monetário Copyleft 2006 Danilo Sato 4 Construindo a View Conceitos principais: Locale: Classe Java que representa uma escolha de localização (país e língua – en_US) ResourceBundle: Classe Java para prover recursos localizados MessageFormat: Classe Java que permite a definição de mensagens parametrizadas (Ex: “Valor máximo: {0}”) MessageResources: Classe do Struts para obter mensagens localizadas de ResourceBundles, num Locale diferente do padrão no servidor Copyleft 2006 Danilo Sato 5 Construindo a View Um ResourceBundle é um mapeamento chave (String) valor (Object) PropertyResourceBundle: uma subclasse de ResourceBundle para representar localização de mensagens (String) definidas num arquivo de propriedades Sintaxe: “nome=valor” Copyleft 2006 Danilo Sato 6 Construindo a View Para criar conteúdo localizado no Struts: 1. Crie os arquivos de propriedades para cada localização do ResourceBundle 2. Coloque os arquivos de propriedades no classpath da aplicação web (WEBINF/classes/diretórios_do_pacote) 3. Configurar os parâmetros de internacionalização na configuração do ActionServlet (web.xml) 4. Utilizar as taglibs do Struts para exibição de mensagens e conteúdo localizado no JSP Copyleft 2006 Danilo Sato 7 Construindo a View 1. MeusRecursos.properties erro.usuario.invalido=Usuário inválido erro.nome.invalido=Nome deve ter no máximo 10 caracteres msg.nome=Nome msg.login=Login msg.login.sucesso=Login efetuado com sucesso Meus Recursos_en.properties erro.usuario.invalido=Invalid user erro.nome.invalido=Maximum length of name is 10 msg.nome=Name msg.login=Login msg.login.sucesso=Login successfull Copyleft 2006 Danilo Sato 8 Construindo a View 2. Salvar os arquivos no diretório WEB-INF/classes/app 3. Configurar os parâmetros locale e application no web.xml (ou <message-resources> no strutsconfig.xml para o Struts 1.1) <servlet (... Configurações do ActionServlet)> <init-param> <param-name>application</param-name> <param-value>app.MeusRecursos</param-value> </init-param> <init-param> <param-name>locale</param-name> <param-value>true</param-value> </init-param> </servlet> Copyleft 2006 Danilo Sato 9 Construindo a View 4. Utilizando as taglibs para localização: <%@ taglib uri="/tags/struts-html" prefix="html"%> <%@ taglib uri="/tags/struts-bean" prefix="bean"%> <html:html> <html:form action="login.do"> <bean:message key="msg.nome"/>: <html:text property="nome"/><br> <html:submit> <bean:message key="msg.login"/> </html:submit> </html:form> <html:errors/> </html:html> Copyleft 2006 Danilo Sato 10 Construindo a View Interação com os ActionForms: Geralmente é preciso lidar com formulários HTML para entrada de dados O Struts fornece o ActionForm para representar um formulário HTML Ao montar a página HTML usando tags como <input> queremos evitar que o usuário tenha que preencher todo o formulário no caso de um erro Solução: Taglibs do Struts Copyleft 2006 Danilo Sato 11 Construindo a View TagLibs: Tags personalizadas que podem ser utilizadas na construção do JSP Sintaxe parecida com HTML: facilita leitura e visualização do código JSP Struts disponibiliza três TagLibs principais: bean: Útil para acessar JavaBeans e suas propriedades html: Útil para construção de formulários HTML e interação com os componentes do Struts logic: Útil para controle de fluxo na apresentação (condicionais, loops, ...) Copyleft 2006 Danilo Sato 12 Construindo a View Instalando as taglibs do Struts: 1. Instalar os arquivos JAR e TLD: WEB-INF\lib\struts.jar WEB-INF\struts-bean.tld WEB-INF\struts-html.tld WEB-INF\struts-logic.tld 2. Configurar as taglibs no web.xml 3. Importar as taglibs no JSP para utilização Copyleft 2006 Danilo Sato 13 Construindo a View web.xml: <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location> /WEB-INF/struts-bean.tld </taglib-location> </taglib> <taglib> <taglib-uri>/tags/struts-html</taglib-uri> <taglib-location> /WEB-INF/struts-html.tld </taglib-location> </taglib> (...) Copyleft 2006 Danilo Sato 14 Construindo a View Importando no JSP: <%@ taglib uri="/tags/struts-html" prefix="html"%> <%@ taglib uri="/tags/struts-bean" prefix="bean"%> <%@ taglib uri="/tags/struts-logic" prefix="logic"%> Utilização: <bean:write name="meuForm" property="nome"/> Consulte a documentação online para descrições completas das tags do Struts e suas propriedades Copyleft 2006 Danilo Sato 15 Construindo a View Propriedades comuns das tags Struts: id: nomeia uma variável que será criada no escopo de página name: Nome para encontrar o JavaBean existente no escopo especificado scope: Escopo para buscar o JavaBean (ordem padrão: page, request, session, application) property: Nome da propriedade do JavaBean cujo valor será recuperado <logic:iterate scope="request" name="resultado" property="colecao" id="linha"> (...) </logic:iterate> Copyleft 2006 Danilo Sato 16 Construindo a View Taglib: bean message: Apresenta uma mensagem internacionalizada parameter: Define uma variável (escopo page) com base no valor do parâmetro especificado write: Apresenta o valor da propriedade do componente especificado define: Define uma variável com base no valor da propriedade do componente especificado cookie, header, struts, include, ... Apenas message e struts estão ligadas ao framework Struts Copyleft 2006 Danilo Sato 17 Construindo a View Taglib: html form: <form> button,cancel,checkbox,file,hidden ,image,password,radio,reset,submit ,text,textarea: <input type="..."> select,option: <select> e <option> link: <a> img: <img> errors: exibe um conjunto de mensagens de erro Copyleft 2006 Danilo Sato 18 Construindo a View Taglib: logic Tags de avaliação: para testar se valores são iguais, menores que, maiores que, vazios ou se estão presentes (Ex: <logic:equal>) Tags de controle: para redirecionar o fluxo (<logic:forward> e <logic:redirect>) Tags de repetição: para iteração em coleções (<logic:iterate>) Tags logic podem ser utilizadas fora do framework Struts Copyleft 2006 Danilo Sato 19 Construindo a View Validação: Os elementos HTML aceitam qualquer valor digitado pelo usuário Validação com JavaScript pode ser desabilitada pelo usuário Recomendação: Efetuar validação no cliente (resposta mais rápida) e também no servidor (caso o JavaScript esteja desabilitado) Copyleft 2006 Danilo Sato 20 Construindo a View Precisamos de validações para: Campos obrigatórios Verificar se um valor encaixa-se na faixa de valores esperados Verificar se um valor segue um padrão esperado Verificar um formulário inteiro de uma só vez e retornar uma lista de mensagens Comparar valores entre campos Retornar os dados originais para correção Exibir mensagens localizadas quando necessário Executar validações no lado do servidor se JavaScript está desabilitado Copyleft 2006 Danilo Sato 21 Construindo a View Struts Validator: Baseado no Jakarta Commons Validator Extrai regras de validação do código Java e do HTML Suporte à internacionalização de mensagens Configurado em arquivos XML Regras de validação para tipos básicos já são parte do arcabouço Suporte à validação no cliente e no servidor Permite a criação de regras customizadas Copyleft 2006 Danilo Sato 22 Construindo a View Componentes do Struts Validator: Validadores: para lidar com tipos básicos ResourceBundle: compartilhado com o Struts Arquivos de configuração XML Tag JSP: para incluir validações JavaScript na página ValidatorForm ValidatorActionForm Copyleft 2006 Danilo Sato 23 Construindo a View Adicionando validação automática: 1. O Form deve estender org.apache.struts.validator.ValidatorFor m ou org.apache.struts.validator.ValidatorAct ionForm 2. O JSP deve incluir a tag <html:javascript> para validação JavaScript 3. Definir as validações da sua aplicação no arquivo validator.xml 4. Ligar o plug-in to Struts Validator no arquivo struts-config.xml Copyleft 2006 Danilo Sato 24 Construindo a View Diferença entre ValidatorForm e ValidatorActionForm: ValidatorForm: O nome declarado no validator.xml deve ser o mesmo do Form correspondente, como definido no atributo name do struts-config.xml ValidatorActionForm: O nome declarado no validator.xml deve ser o mesmo do Action correspondente, como definido no atributo path do struts-config.xml Você ainda pode sobrescrever o método validate(), se achar necessário: Basta chamar super.validate() no início do método Copyleft 2006 Danilo Sato 25 Construindo a View Validadores básicos: required: campo obrigatório mask: campo deve ser aceito pela expressão regular definida range: campo pertence a um intervalo maxLength: tamanho máximo do campo minLength: tamanho mínimo do campo byte,short,integer,long,float,double: campo deve ser convertido para o tipo especificado date: campo deve representar uma data válida creditCard: campo deve ser um valor válido de cartão de crédito email: campo deve ser um endereço válido de e-mail Copyleft 2006 Danilo Sato 26 Construindo a View Exemplo: validator.xml <formset> <form name="meuForm"> <field property="nome" depends="required,minlength"> <arg0 key="msg.nome"/> <var> <var-name>minlength</var-name> <var-value>1</var-value> </var> </field> </form> </formset> Copyleft 2006 Danilo Sato 27 Construindo a View Exemplo: JSP <%-- definições de taglibs ... --%> <html:html> <html:form action="login.do" onsubmit="validateMeuForm(this)"> <bean:message key="msg.nome"/>: <html:text property="nome"/><br> <html:submit> <bean:message key="msg.login"/> </html:submit> </html:form> <html:errors/> <html:javascript formName="meuForm"/> </html:html> Copyleft 2006 Danilo Sato 28 Construindo a View Exemplo: struts-config.xml <!-- Definição do Plugin do Validator --> <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEBINF/validator.xml"/> </plug-in> Copyleft 2006 Danilo Sato 29 Construindo a View Struts Tiles: Componente para definição de templates para as páginas web Uso comum para separar: cabeçalhos, rodapés, menus, ... É um plugin do Struts com um RequestProcessor especializado para o processamento dos templates Definições de template ficam centralizadas no arquivo tiles-defs.xml Inclusão nos JSP através de uma taglib <tiles> Copyleft 2006 Danilo Sato 30 Construindo a View Exemplo: layout.jsp <%@ taglib uri="/tags/struts-tiles" prefix="tiles"%> <html> <body> <tiles:insert attribute="body"/> </body> </html> index.jsp <h1>Título da página principal</h1> Copyleft 2006 Danilo Sato 31 Construindo a View Exemplo: tiles-defs.xml <tiles-definitions> <definition name="layout" path="/layout/layout.jsp"> <put name="body" value=""/> </definition> <definition name="homepage" extends="layout"> <put name="body" value="/index.jsp"/> </definition> <tiles-definitions> Copyleft 2006 Danilo Sato 32 Construindo a View Exemplo: struts-config.xml <!-- Definição do Plugin do Tiles --> <plug-in className="org.apache.struts.tiles.TilesPlugin"> <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/> </plug-in> (...) <!-- Definição dos ActionMappings --> <action path="/index" type="org.apache.struts.actions.ForwardAction" parameter="homepage"/> (...) Copyleft 2006 Danilo Sato 33 Configurando o Struts Para redirecionar as requisições HTTP para o Struts, o contêiner deve conhecer o ActionServlet Como todo Servlet, o ActionServlet é configurado no arquivo: WEBINF/web.xml Além das configurações do ActionServlet e seus mapeamentos, você precisa configurar as taglibs do Struts Copyleft 2006 Danilo Sato 34 Configurando o Struts web.xml <!-- Configuração do ActionServlet --> <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>config</param-name> <param-value> /WEB-INF/struts-config.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> Copyleft 2006 Danilo Sato 35 Configurando o Struts web.xml <!-- Redireciona requisições para o ActionServlet --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- Configuração das taglibs --> <taglib> <taglib-uri>/tags/struts-bean</taglib-uri> <taglib-location> /WEB-INF/struts-bean.tld </taglib-location> </taglib> (...) Copyleft 2006 Danilo Sato 36 Configurando o Struts As principais configurações do Struts ficam no arquivo struts-config.xml Esqueleto do arquivo: <struts-config> <data-sources>...</data-sources> <form-beans>...<form-beans> <global-exceptions>...<global-exceptions> <global-forwards>...<global-forwards> <action-mappings>...<action-mappings> <controller>...</controller> <message-resources>...</message-resources> <plug-in>...<plug-in> </struts-config> Copyleft 2006 Danilo Sato 37 Configurando o Struts DataSources: recurso JDBC para conexão com banco de dados Geralmente representam um pool de conexões SQL Estrutura básica de configuração: <data-sources> <data-source> <set-property name="${ }" value="${ }"/> <set-property name="${ }" value="${ }"/> ... </data-source> </data-sources> Copyleft 2006 Danilo Sato 38 Configurando o Struts ActionForm e DynaActionForm são definidos na tag <form-beans> Veja “Construindo o Model” para detalhes sobre esse elemento Estrutura básica de configuração: <form-beans> <form-bean name="${ }" value="${ }"> <form-property name="${ }" value="${ }"/> <form-property name="${ }" value="${ }"/> ... </form-bean> </form-beans> Copyleft 2006 Danilo Sato 39 Configurando o Struts Para tratamento declarativo de erros globais, utilize a tag <global-exceptions> Veja “Construindo o Controller” para detalhes sobre esse elemento Estrutura básica de configuração: <global-exceptions> <exception type="${ }" key="${ }" path="${ }"/> ... </global-exceptions> Copyleft 2006 Danilo Sato 40 Configurando o Struts Para definição de encaminhamentos globais, utilize a tag <global-forwards> Veja “Construindo o Controller” para detalhes sobre esse elemento Estrutura básica de configuração: <global-forwards> <forward name="${ }" path="${ }" redirect="${ }"/> ... </global-forwards> Copyleft 2006 Danilo Sato 41 Configurando o Struts Para definição de ActionMappings, utilize a tag <action-mappings> Veja “Construindo o Controller” para detalhes sobre esse elemento Estrutura básica de configuração: <action-mappings> <action path="${ }" type="${ }" name="${ }" scope="${ }" validate="${ }" input="${ }"> <forward name="${ }" path="${ }"/> <exception type="${ }" key="${ }" path="${ }"/> </action> ... </action-mappings> Copyleft 2006 Danilo Sato 42 Configurando o Struts Para configurações do ActionServlet, utilize a tag <controller> Alguns dos parâmetros antes definidos no web.xml foram migrados para o <controller> no Struts 1.1 Estrutura básica de configuração: <controller processorClass="${ }" debug="${ }" contentType="${ }" .../> Copyleft 2006 Danilo Sato 43 Configurando o Struts Para configurações do ResourceBundle para internacionalização da aplicação web, utilize a tag <controller> Definido no parâmetro application do web.xml no Struts 1.0 Estrutura básica de configuração: <message-resources parameter="${ }" null="${ }" .../> Copyleft 2006 Danilo Sato 44 Configurando o Struts Para configurações de Plug-ins como o Struts Validator e o Struts Tiles, utilize a tag <plug-in> Veja “Construindo a View” para detalhes sobre esse elemento Estrutura básica de configuração: <plug-in classname="${ }"> <set-property property="${ }" value="${ }"/> <set-property property="${ }" value="${ }"/> ... </plugin> Copyleft 2006 Danilo Sato 45 Considerações sobre o SPL Alguns sintomas observados: Muito código scriptlet no JSP Código mal-estruturado (muitas classes no mesmo pacote, JSPs misturados, ...) Código de validação espalhado e inconsistente (alguns JSPs usam JavaScript, outros não, algumas classes efetuam validação, outras não) Arquivo de configuração muito extenso e difícil de ler Copyleft 2006 Danilo Sato 46 Considerações sobre o SPL Sugestões: Utilizar melhor as taglibs do Struts nos JSPs Mover código de controle para uma ou mais Actions Separar a aplicação em módulos para: Facilitar a estruturação das classes em pacotes bem definidos Facilitar a estruturação e leitura do arquivo de configuração Utilizar o Struts Validator para código de validação Copyleft 2006 Danilo Sato 47 Dúvidas ou Sugestões? Copyleft 2006 Danilo Sato 48