jakarta struts 1.1 ago/2006 softplan/poligraph alessandro lemser
Post on 17-Apr-2015
113 Views
Preview:
TRANSCRIPT
Jakarta Struts 1.1Ago/2006Softplan/PoligraphAlessandro Lemser
TópicosIntrodução Servlets JSP / Javabeans JSP / Javabeans / Servlets Exercício: setup ambiente
Modelos de Desenvolvimento Model 1 Model 2 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
• 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!
...antigamente
Introdução
• 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!
...antigamente
Introdução
• 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!
...antigamente
Introdução
• 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!
...antigamente
Introdução
• 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.
Exercício (setup do ambiente e esclarecimento de conceitos)
Introdução
Modelos de DesenvolvimentoJakarta Struts 1.1
JSP
JSP
JSP
JSP JSP
Bean BeanTOMCAT
JSP
JSP
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 1
Controlador
JSP JSP JSP
TOMCAT
Banco de Dados
Modelo
Apresentação
Model 2 (MVC)
Bean Bean
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 (MVC)
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.
Model 2: O Controlador
O FrameworkJakarta Struts 1.1
• 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.
Framework
Introdução: Struts
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.
MVC
Introdução: Struts
• “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.
Padrões de Projeto (Design Patterns)
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);
Introdução: Struts
ComponentesJakarta Struts 1.1
• 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?
O Struts fornece um série de componentes Alguns deles são usados mais rotineiramente, outros nem tanto...
Componentes
• 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).
... O mais importante que o framework oferece:
Componentes
ActionFormManeira prática de recuperar os dados da requisição.
ActionForm
Nome
Cpf
ObservaçõesHTML
<html> <body>
<form action=“cadCli.do” meth...>
Nome<br/> <input name=“nome” type=“text”/>
Cpf<br/> <input name=“cpf” type=“text”/>
...
</form> </body></html>
Request (post)
http://localhost:8080/curso/cadCli.donome=João da Silvacpf=0544568599
• 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.
ActionFormManeira prática de recuperar os dados da requisição.
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;
}}
ActionForm
ActionForm
ActionActionO 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).
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”); }
}
Action
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-bean name=”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> <action path="/cadCli" type=“meuPacote.ClienteAction“ name=“clienteForm" scope="request“>
<forward name="sucesso“ path="/inicio.jsp"/>
</action> </action-mappings>…
struts-config.xml
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.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>
struts-config.xml
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.xmlInformando 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 {}
struts-config.xml
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.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.
struts-config.xml
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.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!
struts-config.xml
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.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”)
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
<?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>
Struts-config.xml
struts-config.xml
<?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.xmlweb.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>
web.xmlweb.xml: ActionServlet
• Normalmente no Struts cria-se:
JSP ActionForm Action
JSP
JSP
Struts-config.xml
form-beans action-mappings
action-forward
JSPs/ActionForm/Action
forward
sucesso
erro
1. Usando o formulário<html:form action=“/cadCli”>
...</html:form>
2. Usando links<html:link action=“/cadCli”>
Cadastrar cliente</html:link>
<a href=“cadCli.do”>Cadastrar cliente
</a>
Como chamar um Action da página JSP
TAGs
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>
• 1. Reformule a aplicação criada no primeiro exemplo usando os componentes do Struts.
Exercício (refactoring do primeiro exercício...)
Struts
ActionFormUsando um objeto já existente..
Javabean/ActionForm
public class Cliente implements Serializable { private String nome; private String cpf;
//getters e setters
}
Cliente.java
public class ClienteForm extends ActionForm { private Cliente cliente; public ClienteForm() { this.cliente = new Cliente(); } //getters e setters}
ClienteForm.java
<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>
Javabean/ActionForm
Controlador(ActionServlet)
struts-config.xml
ActionForm
Action
3. cria /popula / valida
4. cria / dispara o execute
5. pega eseta atributos JSP
TAGs
7. usa
6. redireciona
8. pega atributos
1. POST para salveCliente.do
9. Página exibida para o usuário
Modelo (JavaBean, EJB, DAO)
2. Procura oActionMappingcorrespondente
Ciclo de vida
Tag libraryJakarta Struts 1.1
• 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
Tag library
<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>
<logic:...>
Tag library: logic
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”/>
HTML: equivalência para os elementos do HTML
Tag library: 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”/>
HTML: equivalência para os elementos do HTML
Tag library: html
write <bean:write name=”umBean” property=”umaPropriedade”/>
header <bean:header id=”browser” name=”User-Agent”/>
message <bean:message key=”boas.vindas”/>
bean: acesso e obtenção de valores
Tag library: bean
1. 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:
a. Chame uma Action que irá consultar no banco por todos os clientes cadastrados.
b. De posse da lista de clientes obtida no passo ‘a’, definir a propriedade clientes do ClienteForm com esta lista.
c. Despachar a requisição para a página de listagem de clientes (listCli.jsp) e utilizar a TAG <logic:iterator> para exibir a lista.
Exercício (listando todos os clientes cadastrados...)
Struts
• 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”/>
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");
}
}
Plugins
...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.
...concluindo
WEB Tier(Struts, JSF)
Business Tier(Session/Message Driven Beans)
DB Tier(Oracle, DB2 ...)
Client Tier(Swing, SWT)
Persistence Layer(Hibernate, Entity Beans)
top related