A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser

Apresentações semelhantes


Apresentação em tema: "Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser"— Transcrição da apresentação:

1 Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser

2 Tópicos Introdução Servlets JSP / Javabeans JSP / Javabeans / Servlets Exercício: setup ambiente Modelos de Desenvolvimento Model Model Controller O Framework Conceito MVC Padrões de Projeto Struts Struts Componentes Exercício: refactoring Ciclo de vida TAG Library Exercí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 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 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 Desenvolvimento Jakarta 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 Modelo
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 Framework Jakarta 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 Componentes Jakarta 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 ActionForm Maneira 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) nome=João da Silva cpf=

23 ActionForm ActionForm Maneira 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 public class ClienteForm extends ActionForm {
private String nome; private String cpf; public void setNome(String umNome) { this.nome = umNome; } public String getNome() { return this.nome; public void setCpf(String cpf) { this.cpf = cpf; public String getCpf() { return this.cpf;

25 Action Action O 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(); return mapping.findForward(“erro”); } return mapping.findForward(“sucesso”);

27 struts-config.xml Declaração do ActionForm
Struts-config.xml Informando 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-bean name=”clienteForm” type=”meuPacote.ClienteForm”/> </form-beans> ...

28 struts-config.xml Declaração da Action
Struts-config.xml Informando 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> <action path="/cadCli" type=“meuPacote.ClienteAction“ name=“clienteForm" scope="request“> <forward name="sucesso“ path="/inicio.jsp"/> </action> </action-mappings> …

29 struts-config.xml Declaração da Action
Struts-config.xml Informando 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 Declaração da Action
Struts-config.xml Informando ao controlador onde e quais são os nossos recursos A classe que implement a Action do struts. package meupacote; public class 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 Declaração da Action
Struts-config.xml Informando 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 Declaração da Action
Struts-config.xml Informando 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 Declaração da Action
Struts-config.xml Informando 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.xml Informando 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> <param-name>debug</param-name> <param-value>3</param-value> <param-name>detail</param-name> <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 Action sucesso 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:text property=“nome” name=“clienteForm”/> Cpf<br/> <html:text property=“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 ActionForm Usando um objeto já existente..
Cliente.java public class Cliente implements Serializable { private String nome; private String cpf; //getters e setters } ClienteForm.java public class 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:text property=“cliente.nome” /> Cpf<br/> <html:text property=“cliente.cpf” /> <html:submit value=“Salvar”/> </html:form> </body> </html>

44 Modelo (JavaBean, EJB, DAO)
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 library Jakarta 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ções html: tudo relacionado a HTML bean: 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:notEmpty name=“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”/>

51 Struts Exercício (listando todos os clientes cadastrados...)
Crie mais um novo atributo na classe ClienteForm: private java.util.List clientes; 2. Crie um link na página de cadastro de clientes que, ao ser clicado: Chame uma Action que irá consultar no banco por todos os clientes cadastrados. De posse da lista de clientes obtida no passo ‘a’, definir a propriedade clientes do ClienteForm com esta lista. Despachar a requisição para a página de listagem de clientes (listCli.jsp) e utilizar a TAG <logic:iterator> para exibir a lista.

52 Plugins Classes que implementam esta interface, são inicializadas junto com a aplicação, ao iniciar o Tomcat. Quando o Struts inicia, é chamado o método init() Quando o Struts é finalizado é chamado o método destroy(). Declaração no struts-config.xml <plug-in className=”meuPacote.meuPlugin”/>

53 Plugins public class CursoPlugin implements PlugIn {
public void init(ActionServlet servlet, ModuleConfig moduleConfig) throws ServletException { servlet.getServletContext().setAttribute("MODO-OPERACAO", "RESTRITO"); } public void destroy() { System.out.println("Destruindo o plugin");

54 ...concluindo Em uma aplicação EE, o Struts preenche perfeitamente os requisitos para elaborar uma camada WEB de boa qualidade. Outros frameworks com a mesma finalidade podem ser utilizados como o JSF e o Spring (ambos em evidência). Vale a pena lembrar sobre o conceito Web2.0 e os frameworks RIA como Flex e Lazlo. Ambos podem ser integrado na plataforma.

55 ...concluindo WEB Tier (Struts, JSF)
Business Tier (Session/Message Driven Beans) DB Tier (Oracle, DB2 ...) Client Tier (Swing, SWT) Persistence Layer (Hibernate, Entity Beans)


Carregar ppt "Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser"

Apresentações semelhantes


Anúncios Google