Arquivos de sites
Parte 2 – Tutorial: Criando uma aplicação Struts 2 no Eclipse
Posted by Gustavo Amaro
Sejam bem-vindos a parte 2 da série de 7 partes onde vamos explorar o mundo do framework Struts 2. No artigo anterior nós passamos pelo básico do Struts2, seu Diagrama de Arquitetura, ciclo de vida do processamento das requisições e uma breve comparação do Struts1 e Struts2. Se você não passou no nosso artigo anterior, eu altamente recomendo você fazer isso antes de botar a mão na massa hoje.
Coisa que nós precisamos
Antes de nós começarmos com nosso primeiro exemplo Hello World no Struts 2, nós vamos precisar de algumas ferramentas.
- JDK 1.5 ou acima (download)
- Tomcat 5.x ou acima ou qualquer outro container (Glassfish, JBoss, Websphere, Weblogic etc) (download)
- Eclipse 3.2.x ou acima (download)
- Arquivos JAR do Apache Struts2. Segue a lista dos arquivos JAR necessários para essa aplicação.
- commons-logging-1.0.4.jar
- freemarker-2.3.8.jar
- ognl-2.6.11.jar
- struts2-core-2.1.6.jar
- xwork-2.1.2.jar
Observe que dependendo da versão utilizada do Struts2, o número da versão dos arquivos JAR acima podem mudar.
Nosso Objetivo
Nosso objetivo é criar uma aplicação básica de Struts2 com uma página de Login. O usuário entrará com a credencial de login(username e senha) e se for autenticado com sucesso ele será redirecionado à uma página de ‘Bem-Vindo’ na qual mostrará a mensagem ” Howdy, <username>…!“. Se o usuário não autenticar, ele será redirecionado de volta para página de login.
Primeiros Passos
Vamos começar com a nosa primeira aplicação baseada em Struts2.
Abra o Eclipse e vá em File -> New -> Project e selecione Dynamic Web Project na tela New Project.
Após selecionar Dynamic Web Project, pressione Next.
Digite o nome do projeto. Por exemplo StrutsHelloWorld. Uma vez que fez isso, selecione o target runtime environment (ex.: Apache Tomcat v6.0). Isso é pra rodar o projeto dentro do ambiente do eclipse. Depois disso clique em Finish.
Uma vez que o projeto está criado, você pode ver essa estrutura no Project Explorer.
Agora copie todos os arquivos JAR requeridos no pasta WebContent -> WEB-INF -> lib. Crie essa pasta se ela não existir.
Mapeamento o Struts2 no WEB.xml
Como discutido no artigo anterior, o ponto de entrada da aplicação Struts2 será definir o Filter no web.xml. Daqui nós definiremos uma entrada da classe org.apache.struts2.dispatcher.FilterDispatcher no web.xml.
Abra o arquivo web.xml que está abaixo da pasta WEB-INF e copie e cole o seguinte código.
<?xml version="1.0" encoding="UTF-8"?>
|
O código acima no web.xml mapeará o filtro do Struts2 com a url /*. O mapeamento padrão de url para aplicação struts2 será /*.action. Também observe que nós temos que definir Login.jsp
como arquivo de boas-vindas.
Observação: O filtro FilterDispatcher
está depreciado desde a versão 2.1.3 do Struts. Se você está utilizando a última versão do Struts2 ( > 2.1.3) utilize a classe StrutsPrepareAndExecuteFilter
em vez disso.
<filter>
|
A classe Action
Precisaremos de uma classe Action que irá autenticar nosso usuário e manterá o valor do username e da senha. Para isso vamos criar um pacote net.viralpatel.struts2 na pasta source. Esse pacote conterá o arquivo action.
Crie uma classe chamada LoginAction no pacote net.viralpatel.struts2 com o seguinte conteudo.
package net.viralpatel.struts2;
|
Observe que, a classe action acima contém dois campos, username e senha qual manterá os valores do formulário e também contem o método execute()
que autenticará o usuário. Neste simples exemplo, nós vamos checar se o username admin é e a senha é admin123.
Também observe que diferente da classe Action no Struts1, a classe Action do Struts2 é uma simples classe POJO com os atributos necessários e método.
O método execute()
retorna um valor String qual irá determinar a página de resultado. Também, no Struts2 o nome do método não é fixo. Neste exemplo nós devemos definir o método execute(). Você pode querer definir um método authenticate() em vez disso.
O ResourceBundle
ResourceBundle é uma entidade Java muito útil que ajuda a colocar o conteúdo estático fora do arquivo fonte. A maioria das aplicações definem um arquivo resource bundle como ApplicationResources.properties o qual conterá mensagens estáticas como Username e Senha e inclui isso com a aplicação.
ResourceBundle se torna útil quando nós queremos adicionar suporte a internacionalização(I18N) a uma aplicação.
Nós definiremos um arquivo ApplicationResources.properties para nossa aplicação. Esse arquivo de propriedade deve estar presente na pasta WEB-INF/classes quando a fonte for compilada. Portanto criaremos uma pasta source chamada resources e colocar esse arquivo ApplicationResources.properties dentro dela.
Para criar uma pasta source, clique com o botão direito no seu projeto no Project Explorer e selecione New -> Source Folder.
Especifique o nome da pasta como resources e clique em Finish.
Crie um arquivo ApplicationResources.properties embaixo da pasta resources.
Copie o sequinte conteúdo dentro do ApplicationResources.properties.
label.username= Username
|
O JSP
Nós vamos criar dois arquivos JSP para renderizar a saída ao usuário. Login.jsp será o ponto de partida da nossa aplicação, no qual conterá um simples formulário de login com username e senha. Em uma autenticação bem sucedida, o usuário será redirecionado à Welcome.jsp que irá mostrar uma simples mensagem de boas vindas.
Crie dois arquivos JSP Login.jsp e Welcome.jsp na pasta WebContent do seu projeto. Copie o seguinte conteúdo dentro deles.
Login.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
|
Welcome.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
|
Observe que nós usamos a tag <s:> do Struts 2 para renderizar as caixas de texto e labels. Struts2 vem com uma ponderosa biblioteca de tags embutida para renderizar elementos UI com mais eficiência.
O arquivo struts.xml
O Struts2 lê a configuração e a definição de classe de um arquivo XML chamado struts.xml. Esse arquivo é carregado do classpath do projeto. Nós definiremos o arquivo struts.xml na pasta resources. Crie o arquivo struts.xml na pasta resources.
Copie o seguinte conteúdo dentro do struts.xml.
<?xml version="1.0" encoding="UTF-8" ?>
|
Observe que no arquivo de configuração acima, nós temos definido a action Login da nossa aplicação. Dois result paths (caminhos de resultado) estão mapeados com LoginAction dependendo do resultado do método execute(.
Se o método execute()
retornar sucesso, o usuário será redirecionado para Welcome.jsp se não para Login.jsp.
Também observe que uma Constant é especificada com o nome struts.custom.i18n.resources. Essa constante especifica o arquivo resource bundle que nós criamos nos passos acima. Nós apenas precisamos especificar o nome do arquivo resource bundle sem a extensão (ApplicationResources sem o .properties).
Nosso LoginAction contém o método execute() o qual é o método padrão sendo chamado pelo Struts2. Se o nome do método é diferente, ex.: authenticate(); então devemos especificar o nome do método na tag <action>.
<action name="login" method="authenticate"
|
Quase pronto
A aplicação está quase pronta. Você talvez queira rodar a aplicação agora e ver o resultado você mesmo. Eu presumo que você já tenha configurado o Tomcat no eclipse. Tudo que você precisa fazer:
Abrir a view de Server em Windows -> Show View -> Server. Botão direito nesta view e selecionar New -> Server e adicionar os detalhes do seu servidor.
Para rodar o projeto, botão direito no nome do projeto no Project Explorer e selecione Run as -> Run on Server (Atalho: Alt+Shift+X, R)
Mas ai tem um pequeno problema. Nossa aplicação roda perfeitamente bem até este ponto. Mas então o usuário entra com as credenciais erradas, ela será redirecionada para página de Login. Mas nenhuma mensagem de erro é mostrada. O usuário não sabe oque aconteceu. Uma boa aplicação sempre mostrará mensagens de erro apropriadas ao usuário. Então nós devemos mostrar uma mensagem de erro Invalid Username/Password. Please try again quando a autenticação do usuário falhar.
Toque final
Para adicionar essa funcionalidade, primeiro nós vamos adicionar a mensagem de erro no nosso arquivo ResourceBundle. Abra o ApplicationResources.properties e adicione uma entrada para error.login. O ApplicationResources.properties final parecerá como:
label.username= Username
|
Nós também precisamos adicionar lógica no LoginAction para adicionar a mensagem de erro se o usuário não autenticar. Mas ai nós temos um problema. Nossa mensagem de erro está especificada no arquivo ApplicationResources.properties. Nós precisamos especificar a chave error.login no LoginAction e a mensagem deverá aparecer na página JSP.
Para isso nós precisamos implementar a interface com.opensymphony.xwork2.TextProvider
que fornece o método getText()
. Esse método retorna um valor String do arquivo resource bundle. Nós precisamos apenas passar o valor chave como argumento para o método getText(). A interface TextProvider define vários métodos que nós precisamos implementar a fim de conseguir segurar o método getText(). Mas nós não queremos estragar o nosso código adicionando todos esses métodos que não temos a intenção de usar. Tem um bom jeito de lidar com este problema.
Struts2 vem com uma classe muito útil com.opensymphony.xwork2.ActionSupport
. Nós precisamos estender nossa classe LoginAction com esta classe e diretamente usar métodos como o getText(), addActionErrors() e etc. Portanto nós iremos estender a classe LoginAction com a classe ActionSupport e adicionar a lógica para reportar o erro dentro dela. O código final do LoginAction deve se parecer com:
package net.viralpatel.struts2;
|
E é isso. Nossa primeira aplicação Hello World em Struts2 está pronta.
Isso é tudo pessoal
Execute a aplicação no eclipse e rode-o no seu navegador favorito.
Página de Login
Página de boas vindas
Página de Login com erro
Download do código fonte
Código fonte sem os arquivos JAR (9 KB)
Código fonte com os arquivos JAR (3 MB)
Fonte: viralpatel.net – Viral Patel
Publicado em Java, Java Web, Struts, Struts2
Etiquetas: ActionSupport, addActionErrors, basic, basico, beginner, brasil, brazil, brazilian, brazilian portuguese, classes, começando, desenvolvendo, desenvolvimento, dojo, Dynamic Web Project, Eclipse, example, execute, fácil, FilterDispatcher, forma simples, framework, getText, glassfish, Hello World, I18N, início, iniciante, internacionalização, JAR, java, java web, JBoss, lib, libs, método, method, passo-a-passo, POJO, portugues, portuguese, prático, projeto, properties, ResourceBundle, sample, simples, struts, struts 1, struts.custom.i18n.resources, struts1, struts2, StrutsPrepareAndExecuteFilter, tag, tags, TextProvider, trabalhando, tutorial, usando, utilizando, viral patel, WEB-INF, WEB.xml, WebContent, Weblogic, Websphere, xml
Parte 1 – Introdução ao Framework Struts 2
Posted by Gustavo Amaro
Então vamos começar a parte 1 de uma série de 7 partes, Nestes tutoriais nós vamos discutir a Introdução ao Framework Struts2, framework de validação, os interceptadores no Struts2, plugin Tiles e essa aplicação com exemplo, um exemplo de upload de arquivo e exemplo de Ajax do Struts2.
Introdução ao Framework Struts 2
Apache Struts 2 é um framework elegante e extensível para criação de aplicações web em java. O framework é projetado para simplificar todo o ciclo de desenvolvimento, desde a construção, implantação, manutenção de aplicações ao longo do tempo.
Apache Struts2 foi originalmente conhecido como WebWork 2. Após trabalhar independentemente por vários anos, as comunidades WebWork e Struts juntaram forças para criar o Struts2. Essa nova versão do Struts é mais simples de usar e mais próximo de como o Struts sempre pretendia ser.
Struts 2 é um framework pull-MVC. Isto é, os dados que são mostrados ao usuáro tem que ser puxado da Action.
Struts2 suporta configurações baseadas em anotação que é mais fácil de criar e mais intuitiva. Classe action no Struts 2 atua como model na aplicação web. Ao contrário do Struts, a classe action do Struts 2 são simples objetos POJO assim slimplificando o teste do código. Struts2 também bem com poderosas APIs para configurar Interceptadores que reduzem muito o acoplamento na aplicação. A parte de view do Struts 2 é altamente configurável e suporta diferentes result-types como Velocity, FreeMarker, JSP e etc.
A Arquitetura do Struts 2
A Arquitetura do Struts 2 é baseado no framework WebWork 2. Isto influência as tecnologias JEE Standard como Java Filters, JavaBeans, ResourceBundles, Locales, XML etc nesta arquitetura.
Abaixo segue o diagram do framework.
Imagem: struts.apache.org
- O ciclo de vida normal do struts começa quando a requisição é enviada pelo cliente. Isto resulta na invocação do servlet container que por sua vez é passa através da cadeia de filtros padrão.
- O filtro
FilterDispatcher
que é chamado consulta o ActionMapper para determinar se uma Action deveria ser invocada. - Se o ActionMapper encontra uma Action a ser invocada, o FilterDispatcher delega controle ao ActionProxy.
- O ActionProxy lê o arquivo de configuração como o struts.xml. ActionProxy cria uma instancia da classe ActionInvocation e delega o controle.
- ActionInvocation é responsável pela implementação padrão de comando. Ela invoca os Interceptors(Interceptadores) um por um (se necessário) e então invoca a Action.
- Uma vez que a Action retorna, o ActionInvocation é responsável por procurar o resultado da propriedade associada com o código resultado da Action mapeada no
struts.xml
. - Os Interceptors são executados de novo na ordem contrária e a resposta é retornada para o Filter (Na maioria dos casos ao
FilterDispatcher
). E o resultado é então enviado para o servlet container que por sua vez o envia de volta ao cliente.
Ciclo de vida do Processamento da Requisição
O ciclo de vida do processamento da requisição do framework Struts2 é bastante discutida na sessão acima, onde vimos a arquitetura do framework Struts 2.
- A requisição é gerada pelo usuário e enviada ao Servlet container.
- Servlet container invoca o filtro FilterDispatcher que por sua vez determina a ação apropriada.
- Um por um dos Intercetors são aplicados ante de chamar a Action. Interceptors executam tarefas como Logging, Validation, File Upload, Double-submit guard e etc.
- Action é executada e o Result é gerado pela Action.
- A saída da Action é renderizada na view (JSP, Velocity, etc) e o resultado é retornado ao usuário.
Suporte AJAX no Struts 2
AJAX é um termo bem conhecido no desenvolvimento web. Agora é possível escrever aplicações desktop como web2.0 usando AJAX. Até o Struts 1.x, o desenvolvedor tinha que escrever e manter o código em javascript para adicionar o suporte AJAX.
Mas agora o Struts 2 lhe dá o Ajax ‘for a da caixa’. Sem escrever javascript, sem debugar comparando vários browsers; apenas configure e vai.
Struts 2 vem com uma biblioteca de tags AJAX altamente configuráveis quais podem ser usada diretamente sem escrever código JavaScrip. Struts 2 também suporta biblioteca Dojo. Agora é muito fácil adicionar características de AJAX habilitado como o Autocomplete a sua aplicação web.
Relacionado: Introdução ao DOJO Toolkit (em inglês)
Comparação do Struts 1 e Struts 2
Vamos ver a diferença básica entre o framework Struts 1 e 2.
- Diferente do Struts 1, o Struts 2 não necessita de implementar a classe Action. A Action no Struts 2 é um objeto POJO. Assim fazendo isso ficar fácil para teste unitário do código.
- Actions do Struts 1 são singletons e deve ser thread-safe uma vez que só terá apenas uma instancia de uma classe para manipular todas as requisições para aquela Action. Objetos action do Struts 2 são instanciados para cada requisição, então não tem problemas de thread-safety.
- As actions do Struts 1 tem dependências da servlet API desde que a
HttpServletRequest
eHttpServletResponse
é passada ao método execute quando uma Action é invocada. As actions do Struts 2 não são acopladas a um container. Mais frequentemente os contextos de servlet são representadas como simples Maps, permitindo Actions serem testadas em isolamento. - Struts 1 usa um objeto ActionForm para capturar a entrada. Como as Actions, todos ActionForms devem estender uma classe base. Uma vez que outro JavaBeans não pode ser usada como ActionForms, desenvolvedores criam mais classes redundantes para capturar as entradas. Struts 2 usa Action properties como input properties, eliminando a necessidade por um segundo objeto de entrada. Input properties podem ser tipos de objetos ricos quais podem ter suas próprias propriedades.
- Struts 1 integra com JSTL, assim utilizando o JSTL EL. O EL tem basic object graph traversal, mas é relativamente uma coleção fraca e suporte de propriedades indexado. Struts 2 pode utilizar JSTL, mas o framework também suporta uma linguagem de expressão (expression language) muito mais poderosa e flexível, chamada “Object Graph Notation Language” (OGNL).
- Struts 1 usa o mecanismo padrão JSP para fazer o binding (amarração) dos objeto dentro do contexto da página para acesso. Struts 2 usa um tecnologia “ValueStack” de modo que as taglibs podem acessar valores sem acoplar sua view ao tipo do objeto que ela está renderizando.
Struts 1 suporta separar Request Processors (ciclos de vida) para cada módulo, mas todas as Actions no modulo necessitam compartilhar o mesmo ciclo de vida. Struts 2 suporta criar diferentes ciclos de vida em cada Action base via Interceptor Stacks. Custom stacks podem ser criadas e usada com diferentes Actions, conforme desejado.
—————————————————————-
Espero que tenham gostado dessa primeira parte, assim que possível postarei a parte 2 😀
See ya!
Fonte: viralpatel.net – Viral Patel
Publicado em Java, Java Web, Struts, Struts2, Tradução
Etiquetas: action, actions, ajax, beginner, binding, brasil, brazil, brazilian, brazilian portuguese, ciclo de vida, começando, Custom stacks, desenvolvendo, desenvolvimento, EL, em português, example, expression language, fácil, forma simples, início, iniciante, Interceptor Stacks, introdução, java, java web, jsp, JSTL, lifecycle, Object Graph Notation Language, OGNL, passo-a-passo, POJO, portugues, portuguese, prático, Request Processors, sample, simples, struts, struts1, struts2, taglibs, tiles, trabalhando, tradução, traduzido, tutorial, usando, utilizando, ValueStack, viral patel