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

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

Transcript of Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

Page 1: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

Jakarta Struts 1.1Ago/2006Softplan/PoligraphAlessandro Lemser

Page 2: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro 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

Page 3: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 4: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 5: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 6: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 7: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 8: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

Modelos de DesenvolvimentoJakarta Struts 1.1

Page 9: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

JSP

JSP

JSP

JSP JSP

Bean BeanTOMCAT

JSP

JSP

Banco de Dados

Model 1

Page 10: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 11: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

Controlador

JSP JSP JSP

TOMCAT

Banco de Dados

Modelo

Apresentação

Model 2 (MVC)

Bean Bean

Page 12: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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)

Page 13: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 14: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

O FrameworkJakarta Struts 1.1

Page 15: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 16: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 17: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• “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

Page 18: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 19: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

ComponentesJakarta Struts 1.1

Page 20: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 21: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 22: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 23: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 24: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 25: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 26: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 27: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 28: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 29: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 30: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 31: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 32: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 33: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 34: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 35: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 36: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 37: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 38: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 39: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 40: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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>

Page 41: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 1. Reformule a aplicação criada no primeiro exemplo usando os componentes do Struts.

Exercício (refactoring do primeiro exercício...)

Struts

Page 42: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 43: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

<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

Page 44: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 45: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

Tag libraryJakarta Struts 1.1

Page 46: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 47: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

<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

Page 48: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 49: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 50: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 51: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 52: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

• 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

Page 53: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 54: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

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

Page 55: Jakarta Struts 1.1 Ago/2006 Softplan/Poligraph Alessandro Lemser.

...concluindo

WEB Tier(Struts, JSF)

Business Tier(Session/Message Driven Beans)

DB Tier(Oracle, DB2 ...)

Client Tier(Swing, SWT)

Persistence Layer(Hibernate, Entity Beans)