1 / 55

Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser

Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser. Tópicos.

liza
Download Presentation

Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Jakarta Struts 1.1Ago/2006Softplan/PoligraphAlessandro Lemser

  2. 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

  3. 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!

  4. 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!

  5. 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!

  6. 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!

  7. 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.

  8. Modelos de DesenvolvimentoJakarta Struts 1.1

  9. Model 1 JSP JSP JSP JSP JSP JSP JSP TOMCAT Bean Bean Banco de Dados

  10. 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).

  11. Model 2 (MVC) Apresentação JSP JSP JSP Bean Controlador Bean TOMCAT Modelo Banco de Dados

  12. 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.

  13. 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.

  14. O FrameworkJakarta Struts 1.1

  15. 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.

  16. 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.

  17. 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.

  18. 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);

  19. ComponentesJakarta Struts 1.1

  20. 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?

  21. 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).

  22. 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

  23. 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.

  24. 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; • } • }

  25. 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).

  26. 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”); • } • }

  27. 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> • ...

  28. 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>…

  29. 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>…

  30. 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>…

  31. 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>…

  32. 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>…

  33. 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>…

  34. 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...

  35. 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>

  36. 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>

  37. 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>

  38. 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

  39. 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>

  40. 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>

  41. Struts Exercício (refactoring do primeiro exercício...) • 1.Reformule a aplicação criada no primeiro exemplo usando os componentes do Struts.

  42. 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}

  43. 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>

  44. 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)

  45. Tag libraryJakarta Struts 1.1

  46. 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

  47. 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>

  48. 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”/>

  49. 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”/>

  50. 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”/>

More Related