550 likes | 623 Views
Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser. Tópicos.
E N D
Jakarta Struts 1.1Ago/2006Softplan/PoligraphAlessandro Lemser
Tópicos IntroduçãoServlets JSP / Javabeans JSP / Javabeans / ServletsExercício: setup ambienteModelos de Desenvolvimento Model 1 Model 2 ControllerO Framework Conceito MVC Padrões de Projeto StrutsStruts ComponentesExercício: refactoring Ciclo de vida TAG LibraryExercício: listagem PlugIns Conclusões
Introdução ...antigamente • Antes de aparecem frameworks para desenvolvimento WEB, com era feito o desenvolvimento do conteúdo dinâmico em Java? • Usando servlets! • Usando JSPs e Javabeans! • Usando JSPs, Javabeans e servlets!
Introdução ...antigamente • Usando somente servlets estávamos em meio ao caos de ter que gerar HTML dentro de uma classe Java. • Servlets são úteis como controladores. Recebem uma requisição e transformam os dados da requisição em algo “real”. • Uma aplicação WEB pode ser composta de inúmeros servlets!
Introdução ...antigamente • Usando JSPs com ou sem Javabeans, pode-se misturar Java no HTML (e não HTML no Java). Os Javabeans trazem o “benefício” de realizar conexões e lógica. • JSPs são úteis para a apresentação dos dados ao usuário. Eles utilizam os dados fornecidos pelos Javabeans para compor a visão para o usuário. • Nos dias de hoje, deseja-se que um arquivo JSP não contenha código Java dentro dele!
Introdução ...antigamente • O melhor dos cenários: JSPs, Javabeans e Servlets. Porém, fica devendo reusabilidade e gerenciamento de recursos como, por exemplo, segurança. • JSP apresenta dados contidos em Javabeans para o usuário, os quais foram montados por um Servlet, que por sua vez, consegue tais dados em um componente de lógica (distribuído ou não). • Com esses três elementos, e mais alguns recursos da API Servlet e JSP, pode-se construir frameworks!
Introdução Exercício (setup do ambiente e esclarecimento de conceitos) • 1.Crie uma classe Java simples (Javabean) cujo nome é br.com.softplan.curso.Cliente, com duas propriedades: nome e cpf. 2. Crie uma página JSP (cadCli.jsp) que contenha dois campos de input (nome e cpf), e um botão de submit do formulário em questão. 3. Crie um servlet (br.com.softplan.curso.ClienteServet) para receber a requisição que será feita pela página JSP. • 4. No servlet, extraia do request as propriedades nome e cpf, crie uma instância do Javabean Cliente e defina suas propriedades. • 5. Ao terminar o processamento, coloque a instância do Javabean criado como atributo no escopo de request e despache a requisição para a página cadCli.jsp para reapresentar os dados do cliente.
Model 1 JSP JSP JSP JSP JSP JSP JSP TOMCAT Bean Bean Banco de Dados
Model 1 • Lógica de negócio muitas vezes misturada com a lógica da apresentação. • A navegação é feita de forma caótica. • Baixa reutilização de código, alta utilização de copy-paste. • Não se sabe quem está fazendo o que. Não existem papéis bem definidos. E se eu tivesse que controlar o acesso as páginas???. Muitos códigos semelhantes em páginas diferentes e que tem a mesma funcionalidade (causado pelo POCP).
Model 2 (MVC) Apresentação JSP JSP JSP Bean Controlador Bean TOMCAT Modelo Banco de Dados
Model 2 (MVC) • Separação bem definida de papéis (Apresentação - Controle - Negócio). • Pode ter sido feito baseado em padrões de projeto que são técnicas testadas e bem sucedidas (ex: FrontController). • Alto nível de reutilização devido a componentização. • Fluxo da aplicação bem definido e centralizado através do Controlador. • Melhora a manutenção.
Model 2: O Controlador • Centraliza o processamento de requisições em um único ponto. • Possibilita o melhor gerenciamento da segurança. • Incentiva a reutilização. • Facilita a manutenção. • Possibilita a seleção da interface de acordo com o dispositivo ou usuário que fez a requisição. • Redução do acoplamento da camada de apresentação da camada de negócio.
Introdução: Struts Framework • Aplicação semi-completa, reutilizável que pode ser especializada para produzir aplicações customizadas. • São sempre reutilizados entre os projetos. • Uma aplicação nunca começa do zero. • São populares por seus bons resultados.
Introdução: Struts MVC • Padrão difundido pela linguagem de programação Smalltalk. • Model - representa os dados corporativos que estão armazenas em um meio de persistente. • View - apresentação na tela da visão do modelo. • Controller - Define a maneira de como a interface do usuário reage às entradas do controlador e abstrai da visão a lógica de negócios. • Um componente de uma das camadas pode ser substituído causando mínimo impacto nas outras camadas.
Introdução: Struts Padrões de Projeto (Design Patterns) • “Os padrões permitem documentar um problema conhecido recorrente e sua solução em um contexto especifico e comunicar esses conhecimentos a outras pessoas” (Alur, 2002). • Evitam reinvenção da roda; • São observados através da experiência; • Dão suporte a melhorias contínuas; • Podem ser usados em conjunto para solucionar problemas maiores.
Introdução: Struts • Framework para desenvolvimento de aplicações WEB no padrão de arquitetura MVC; • Torna rápido e organizado o desenvolvimento de aplicações Java para a WEB; • Construído tendo em mente boas práticas e padrões de projeto; • Provê componentes para facilitar a codificação da interface (taglibs);
Componentes O Struts fornece um série de componentes Alguns deles são usados mais rotineiramente, outros nem tanto... • O que, numa aplicação JSP/Servlet pura, é mais tedioso do que transformar os dados do request (basicamente Strings) em um Objeto Java? • O que pode ser pior que um for ou while no JSP para montar uma tabela?
Componentes ... O mais importante que o framework oferece: • Maneira prática para recuperar os dados de um formulário HTML (ActionForm); • Um FrontController que delega o processamento da requisição para um componente específico para seu processamento (Action); • Uma biblioteca de TAGs para lidar com os objetos nas páginas JSP (o JSTL é uma opção melhor); • Um arquivo XML onde é informado ao Controlador, quais as Actions responsáveis para o atendimento de determinada requisição (struts-config.xml).
ActionForm ActionFormManeira prática de recuperar os dados da requisição. <html> <body> <form action=“cadCli.do” meth...> Nome<br/> <input name=“nome” type=“text”/> Cpf<br/> <input name=“cpf” type=“text”/> ... </form> </body></html> Nome Cpf HTML Observações Request (post) http://localhost:8080/curso/cadCli.donome=João da Silvacpf=0544568599
ActionForm ActionFormManeira prática de recuperar os dados da requisição. • O ActionForm realiza o mapeamento de cada entrada de um formulário HTML, para uma classe Java. • Os valores dos atributos são definidos automaticamente pelo processador de requisições do controlador. • Os dados informados podem ser validados.
ActionForm ActionForm • publicclass ClienteForm extends ActionForm { • private String nome; • private String cpf; • publicvoid setNome(String umNome) { • this.nome = umNome; • } • public String getNome() { • returnthis.nome; • } • publicvoid setCpf(String cpf) { • this.cpf = cpf; • } • public String getCpf() { • returnthis.cpf; • } • }
Action ActionO componente para o processamento da requisição. • Pode-se fazer uma analogia com um servlet. • Local onde se processam os dados do formulário preenchido na página JSP. • O método execute() recebe como parâmetro o ActionForm.Além dele, recebe o ActionMapping, o HttpServletRequest e o HttpServletResponse. • Ao terminar a execução do método, deve dizer ao controlador para quem vai a requisição (ActionForward).
Action • package br.com.softplan.curso.struts.action;import…; • public class ClienteAction extends Action { • public ActionForward execute(ActionMapping mapping, • ActionForm form, HttpServletRequest request, • HttpServletResponse response) throws ServletException, • IOException { • try { • ClienteForm cForm = (ClienteForm) form; • //fazer algo... • } catch (Exception ex) { • ex.printStackTrace(); • returnmapping.findForward(“erro”); • } • returnmapping.findForward(“sucesso”); • } • }
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos • Declaração do ActionForm • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • <form-beans> <form-beanname=”clienteForm” • type=”meuPacote.ClienteForm”/> • </form-beans> • ...
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos • Declaração da Action • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • ... • <action-mappings> • <actionpath="/cadCli" type=“meuPacote.ClienteAction“name=“clienteForm" scope="request“> • <forward name="sucesso“ path="/inicio.jsp"/> • </action> • </action-mappings>…
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos Como a Action será chamada (url-pattern) <html:form action=“/cadCli”><a href=“cadCli.do”>Salvar</a> • Declaração da Action • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • ... • <action-mappings> • <action path="/cadCli"type=“meuPacote.ClienteAction“name=“clienteForm" scope="request“> • <forward name="sucesso“ path="/inicio.jsp"/> • </action> • </action-mappings>…
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos A classe que implement a Action do struts. package meupacote;publicclass ClienteAction extends Action {} • Declaração da Action • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • ... • <action-mappings> • <action path="/cadCli"type=“meuPacote.ClienteAction“name=“clienteForm" scope="request“> • <forward name="sucesso“ path="/inicio.jsp"/> • </action> • </action-mappings>…
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos ActionForm associado a esta Action. Pode ser omitido, caso a Action realize um processamento que não necessite de formulário. • Declaração da Action • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • ... • <action-mappings> • <action path="/cadCli"type=“meuPacote.ClienteAction“name=“clienteForm"scope="request“> • <forward name="sucesso“ path="/inicio.jsp"/> • </action> • </action-mappings>…
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos Em qual escopo o ActionForm associado a Action irá ficar (request, session, application)O default é session! • Declaração da Action • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • ... • <action-mappings> • <action path="/cadCli"type=“meuPacote.ClienteAction“name=“clienteForm" scope="request“> • <forward name="sucesso“ path="/inicio.jsp"/> • </action> • </action-mappings>…
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos Indica para qual recurso o FrontController (ActionServlet) deve despachar a requisição.mapping.findForward(“sucesso”) • Declaração da Action • <?xml version = '1.0' encoding = 'windows-1252'?> • <struts-config> • ... • <action-mappings> • <action path="/cadCli"type=“meuPacote.ClienteAction“name=“clienteForm" scope="request“> • <forward name="sucesso“ path="/inicio.jsp"/> • </action> • </action-mappings>…
struts-config.xml Struts-config.xmlInformando ao controlador onde e quais são os nossos recursos • Deve ficar dentro do diretório WEB-INF (normalmente) • Outros elementos:<global-forwards>:forwards comuns entre todas as Actions do Struts • <message-resources>:Arquivo de recurso utilizado para internacionalização e outras informações úteis (*.properties). • <plug-in>:Componentes semelhantes ao ServletContextListener<controller>:Customizações do FrontControler<data-sources>: Configurações para acesso a DataSources entre outros...
struts-config.xml Struts-config.xml • <?xml version = '1.0' encoding = 'windows-1252'?> <struts-config> • <form-beans> • <form-bean name=“clienteForm“ type="meuPacote.ClienteForm"/></form-beans> <global-forwards> • <forward name="erro" path="/errorPage.jsp"/></global-forwards><action-mappings> • <action path="/clienteAction" type="meuPacote.ClienteAction“ name=“clienteForm" scope="request“> • <forward name="sucesso" path="/inicio.jsp"/> • </action> • </action-mappings> • <message-resources parameter=”ApplicationResources"/> • <plug-in className=”meuPacote.MeuPlugin”/> • </struts-config>
web.xml web.xml: ActionServlet • <?xml version = '1.0' encoding = 'windows-1252'?><webapp><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> • <init-param> • <param-name>debug</param-name> • <param-value>3</param-value> • </init-param> • <init-param> • <param-name>detail</param-name> • <param-value>3</param-value> • </init-param> • <load-on-startup>0</load-on-startup> </servlet> • <!– continua... --> • </webapp>
web.xml web.xml: ActionServlet <?xml version = '1.0' encoding = 'windows-1252'?><webapp> <servlet> ………… </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping></webapp>
JSPs/ActionForm/Action • Normalmente no Struts cria-se: JSP JSP ActionForm sucesso Action forward erro JSP action-mappings form-beans action-forward Struts-config.xml
TAGs Como chamar um Action da página JSP • Usando o formulário • <html:form action=“/cadCli”>... • </html:form> • Usando links<html:link action=“/cadCli”> Cadastrar cliente</html:link> • <a href=“cadCli.do”> Cadastrar cliente</a>
TAGs <html> <body> <bean:message key=“label.cad.cli”/> <html:form action=“/cadCli” focus=“nome”> Nome<br/> <html:textproperty=“nome” name=“clienteForm”/> Cpf<br/> <html:textproperty=“cpf” name=“clienteForm”/> ... <html:submit value=“Salvar”/> </html:form> </body></html>
Struts Exercício (refactoring do primeiro exercício...) • 1.Reformule a aplicação criada no primeiro exemplo usando os componentes do Struts.
Javabean/ActionForm ActionFormUsando um objeto já existente.. Cliente.java publicclass Cliente implements Serializable {private String nome;private String cpf; //getters e setters } ClienteForm.java publicclass ClienteForm extends ActionForm {private Cliente cliente;public ClienteForm() {this.cliente = new Cliente(); } //getters e setters}
Javabean/ActionForm <html> <body> <bean:message key=“label.cad.cli”/> <html:form action=“/cadCli” focus=“nome”> Nome<br/> <html:textproperty=“cliente.nome” /> Cpf<br/> <html:textproperty=“cliente.cpf” /> ... <html:submit value=“Salvar”/> </html:form> </body></html>
Ciclo de vida 1. POST para salveCliente.do 9. Página exibida para o usuário 3. cria / popula / valida 8. pega atributos ActionForm TAGs Controlador (ActionServlet) 7. usa 5. pega e seta atributos 2. Procura o ActionMapping correspondente 4. cria / dispara o execute JSP Action 6. redireciona struts-config.xml Modelo (JavaBean, EJB, DAO)
Tag library • Evitam a codificação scriptlets dentro da página JSP • Facilitam a manipulação dos formulários • Facilitam a iteração de coleções • Facilitam a organização da lógica de apresentação na página • Grupo de TAGs mais comuns:logic: iterações, condições, comparaçõeshtml: tudo relacionado a HTMLbean: acesso às propriedades dos objetos
Tag library: logic <logic:...> <logic:present name=“meuBean”> Meu bean está presente em algum dos escopos válidos… <logic:notEmptyname=“meuBean” property=“nome”> A propriedade nome não está nula… </logic:notEmpty> </logic:present> <logic:iterate id=”umItemDoList” name=”objetoQContemOList” property=”propriedadeListDoObjeto”> <bean:write name=”umItemDoList” property=”nome”/> </logic:iterate>
Tag library: html HTML: equivalência para os elementos do HTML Form<html:form action=”/actionPath”></html:form> Text<html:text name=”umBean” property=”umaPropriedade”/> Select<html:select name=”umBean” property=”umaPropriedade”> usar uma das tags abaixo… </html:select> Option<html:option name=”umBean” property=”umaPropriedade”/> Options<html:options collection=”meusItens” property=”meuValor” labelProperty=”textoDoSelect”/>
Tag library: html HTML: equivalência para os elementos do HTML checkbox<html:checkbox name=”umBean” property=”umaPropriedade”/> radio<html:radio name=”umBean” property=”umaPropriedade” value=”valor”/> hidden <html:hidden name=”umBean” property=”umaPropriedade”/> password<html:password name=”umBean” property=”umaPropriedade”/> submit<html:submit value=”OK”/>
Tag library: bean bean: acesso e obtenção de valores • · write <bean:write name=”umBean” property=”umaPropriedade”/> • · header<bean:header id=”browser” name=”User-Agent”/> • · message<bean:message key=”boas.vindas”/>