Mostrando postagens com marcador Struts 2. Mostrar todas as postagens
Mostrando postagens com marcador Struts 2. Mostrar todas as postagens

segunda-feira, 15 de outubro de 2007

Artigo : Adotando o Struts 2

The framework for the next generation of Java Web applications
Um Framework para a próxima geração de aplicações Web Java

foi disponibilizado esses dias atrás um artigo excelente sobre o Struts 2, principalmente para quem já conhece/trabalha com o Struts 1, pois mostra as novas características e benefícios de uso =]

Artigo : Java World : Adopting Struts 2.0

cometário: recomendo a qualquer um que queria efetivamente produtividade, além de um framework robusto, renovado, agil e acima de tudo prazeroso de utilizar, para que você ainda quer ficar sofrendo utilizando o JSF? seja feliz use o Struts 2, te garanto que será outro nível de desenvolvimento ;)

Fonte : DZone

sexta-feira, 5 de outubro de 2007

Adobe Flex enviando parametros para a aplicação web em Java

eis um grande problema quando estamos utilizando o Adobe Flex, como enviar de modo que funcione parametros para nossa aplicação java, segue uma dica de como fazer para enviar os parametro de forma que funcione para aplicações que utilizam o Struts 2 ou o Mentawai na aplicação que roda no servidor (pelo menos nos testes que eu fiz funcionou...)

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  
  <mx:Script>
    <![CDATA[
      
      import mx.controls.Alert;
      import mx.rpc.events.ResultEvent;
      import mx.rpc.events.FaultEvent;
      import mx.utils.ObjectUtil;
      import mx.rpc.http.HTTPService;
      
       public function getLoginParameters():Object {
              return {
                "user.login": loginField.text, 
                "user.password" : passwordField.text 
              };
            }
      
      public function enviarDados()void {                          
        userRequest.sendthis.getLoginParameters() );          
      }
      
        public function onSuccess(event:ResultEvent):void {
    
        Alert.showXML(event.result) );
    
        //cria String baseado no resultado
        var rawData:String = String(event.result);
        
        Alert.showrawData );              
        }
    
        public function onError(event:FaultEvent):void {
            Alert.show(ObjectUtil.toString(event.fault));
        }      
            
    ]]>
  </mx:Script>
  
  <mx:HTTPService id="userRequest" 
     url="http://localhost:8080/mentawai_teste/FlexAction.loginXML.mtw" 
     result="onSuccess(event)"
    fault="onError(event)"
    resultFormat="e4x"
    method="POST"/>

   <mx:Panel width="300" height="154" layout="absolute" horizontalCenter="0" verticalCenter="11" title="Login">
      <mx:Form width="100%" height="100" x="0" y="0">
         <mx:FormItem label="Login">
            <mx:TextInput id="loginField"/>
         </mx:FormItem>
         <mx:FormItem label="Password">
            <mx:TextInput id="passwordField"/>
         </mx:FormItem>
      </mx:Form>
      <mx:Button y="84" label="OK" horizontalCenter="0" id="sendBtn" click="enviarDados()"/>
      <mx:Label x="10" y="96" text="{loginField.text}" enabled="false"/>
      <mx:Label x="174" y="96" text="?" enabled="false"/>
   </mx:Panel>
  
</mx:Application>

Observe: a function getLoginParameters():Object, aqui está a questão, o formato que finalmente funcionou para envio dos parametros de forma que chegassem corretamente no servidor, sem nenhum erro inesperado...

onde a comunicação com o servidor é efetuada através do componente : mx:HTTPService, sendo que neste caso utilizei retorno em XML como resultado da execução da action

---

quanto a aplicação em java eu tenho na minha classe action o respectivo atributo setado na classe:

private UserBean user;

onde a estrutura dessa classe é:
public class UserBean {

  private String login;
  private String password;
  
  public String getLogin() {
    return login;
  }
  public void setLogin(String login) {
    this.login = login;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  
}

bom fica ae a dica para conseguir enviar parametros do Flex para sua aplicação em java ;)

quarta-feira, 26 de setembro de 2007

Tutorial : Rafael Carneiro : Struts2, o início

aos interessados no Struts 2 que estão procurando material de estudo, mais um tutorial legal para os iniciantes...

Ver no blog do Rafael Carneiro : Struts2, o início

Fica a dica ;)

sábado, 22 de setembro de 2007

MVC : Struts 1 vs. Struts 2

ainda vejo muita empresa utilizando o Struts 1 e muitas dessas desconhecem o Struts 2...

bom vejamos algums motivos para utilizar o Struts 2:

- POJO Actions
não precisa mais herdar nada, nem ter os métodos da classe action atrelados ao HttpServletRequest, HttpServletResponse ou outro parametro, simplesmente nada, basta ter um retorno String para orientar o mapeamento a action...

- Esqueça os FormBeans e DynaFormBeans
isso era e é algo que julgo muito chato quando estou trabalhando com um projeto em Struts 1, no Struts 2 esqueça disso, para que sofrer, ou seja use outras classes no formato POJO e defina essas como atributos da classe action, com respectivos métodos set e get para este e pronto, eis a tua classe Formulário, simples, rápido, menos traumatico, mais flexível, pois você pode utilizar quantas classes quizer =]

- Mapeamento com parametros alteráveis
é isso mesmo que você leu, digamos que você mapeou lá a tua action, mas precissa que esta saída da action seja flexível e possa ser alterada passando parametros para flexibilizar a saída, isso tem como fazer brincando no Struts 2, sabia?

- Configuração mínima
não quer utilizar XML para mapear a action ou a saída, então não use, você pode utilizar Annotations para configurar suas actions

- Mapeamento Reutilizáveis
isso mesmo que você leu, com um único mapeamento você pode utiliza-lo para inumeras actions, pois tem como você montar o mapeamento definindo parametros, onde esses parametros são partes enviadas na URL da request... por exemplo: /suaApp/casoDeUso/operacao/, esse formado de URL tem como ser mapeado onde você faz com que o caso de uso, seja o nome do pacote, ou mesmo nome da classe action a ser chamada e a operação o método interno da classe ( isto que citei é apenas um exemplo muito basico, da possibilidade oferecida por esta funcionalidade )

- Tiles 2 ou Sitemesh
facilmente integravel com o Tiles 2 ou com o SiteMesh, que são gerenciadores de layout para facilitar o desenvolvimento da interface da tua aplicação

- Templates costumizáveis de componentes
sim, o Struts 2 possui componentes prontos, de suas taglib que podem ser configurados de acordo com tua necessidade...

- Plugins e mais plugins
diversidade de plugins para o Struts 2, quer integrar com o Spring? sem problemas =]

----

e você ainda vai continuar usando o Struts 1? a vai, bom se está sendo obrigado, devido a definição de algum projeto paciência ( as vezes isso também me acontece ), mas se puder escolher use o Struts 2, te garanto que será outro nível e outra experiência, irá notar que é realmente produtivo ( muito mais que o JSF, se bem que tem gente que integra os 2, mas tem louco para tudo nessa vida )

----

Outros posts sobre o Struts 2, em alguns tem exemplos de projeto ;)
Um post de resposta sobre o Struts 2 no Portal Java : [link]

sábado, 30 de junho de 2007

Struts : exemplo de projeto

algo útil em geral, pelo menos eu tenho maior facilidade de assimilar conhecimento pegando um projeto funcionando, ver os fontes e debugar =]

baseado nisso estou disponibilizando 5 projetos simples de uso do Struts:

- struts1_tiles_crud
uso do Struts 1 em conjunto do Tiles( gerenciador de templates ) em um caso de CRUD simples

- struts2_action_annotations
exemplo de como utilizar actions através de anotações no Struts 2

- struts2_blank
exemplo de um projeto simples em branco do Struts 2, também nesse projeto tem um exemplo de como definir saída de stream de dados dinamicamente

- struts2_crud_example
exemplo de crud simples utilizando o Struts 2

- struts2_tiles2_example
exemplo de uso do Tiles 2 em conjunto do Struts 2

Obs.: em todos os projetos possuem um arquito NOTA.txt, com mais informações

ambiente no qual foi montado esses projetos:
- Eclipse 3.2
- WTP 1.5.3
- Java SDK 1.5.x
- Java SDK 1.4.x
- Apache Tomcat 5.5.20
- Apache Tomcat 5.0.28

quarta-feira, 30 de maio de 2007

Struts 2: Annotation Action : correção

no post anterior fiz algumas considerações baseados nos primeiros testes que realizei utilizando actions + annotations, porém hoje realizando um novo código verifiquei que é possível utilizar outros métodos alem do execute, padrão de uma classe action e também funcionou para uma POJO Action...

ps.: faltava altera uma configuração no struts.xml para habilitar os outros métodos internos dentro da classe action...

segue os novos códigos do teste agora funcionando:


/WEB-INF/[web.xml] configuração da aplicação
tendo os jar´s básicos do struts 2 e o plugin: struts2-codebehind-plugin-2.x.jar

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_S2AA" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>struts2_action_annotations</display-name>  
  <!-- ======= -->   
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    <init-param>
      <!-- define os pacotes que irá considerar contendo classes actions -->
      <param-name>actionPackages</param-name>
      <!--  para definir mais de um pacote utilize "," -->
      <param-value>actions</param-value>
    </init-param>
    </filter>
  <!-- ======= -->
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <!-- ======= -->    
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


Obs.: usando esse tipo de definição de mapeamento de action não é necessário definir nenhum mapeamento no struts.xml para as actions do pacote indicado, porém é necessário habilitar a chamada dinâmica de outros métodos internos da action( aconselho a sempre utilizar como true essa configuração )

/WEB-INF/classes/[struts.xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

  <!-- habilita o uso de outros métodos de action internamente na classe action -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="false" />

  <!-- configuração automática -->
  
</struts>


classe action
package actions;

import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;

@Results({
    @Result(name="success", value="/jsp/result.jsp"),
    @Result(name="method_1", value="/jsp/result.jsp"),
    @Result(name="method_2", value="/jsp/result.jsp")
})
public class AnnotAction  {
  //--------------------------------------------------------------------------
  private static final long serialVersionUID = 1L;
  //--------------------------------------------------------------------------
  private String message;
  //--------------------------------------------------------------------------  
  public String execute() {
    this.setMessage"Success" );
    return "success";
  }
  
  public String method_1() {
    this.setMessage"Method 1" );
    return "method_1";
  }
  
  public String method_2() {
    this.setMessage"Method 2" );
    return "method_2";
  }
  //--------------------------------------------------------------------------
  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }
  //--------------------------------------------------------------------------
}


/jsp/[result.jsp]
<%taglib prefix="s" uri="/struts-tags" %>
<center><s:property value="message"/></center>


no jsp exibe apenas a mensagem =]

agora sim funcionando corretamente...

terça-feira, 29 de maio de 2007

Struts 2: Annotation Action

uma característica interessante do Struts 2 é o suporte a anotações, nesse caso vou falar sobre o suporte para definição de action...


.:verifique o post de correção desse [link]:.


segue os respectivos códigos


/WEB-INF/[web.xml] configuração da aplicação
tendo os jar´s básicos do struts 2 e o plugin: struts2-codebehind-plugin-2.x.jar

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_S2AA" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>struts2_action_annotations</display-name>  
  <!-- ======= -->   
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    <init-param>
      <!-- define os pacotes que irá considerar contendo classes actions -->
      <param-name>actionPackages</param-name>
      <!--  para definir mais de um pacote utilize "," -->
      <param-value>actions</param-value>
    </init-param>
    </filter>
  <!-- ======= -->
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <!-- ======= -->    
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


Obs.: usando esse tipo de definição de mapeamento de action não é necessário definir nenhum mapeamento no struts.xml para as actions do pacote indicado


actions.[AnnotationAction] : classe action

package actions;

import org.apache.struts2.config.Result;
import com.opensymphony.xwork2.ActionSupport;

@Result(name="success", value="/jsp/success.jsp")
public class AnnotAction extends ActionSupport {
  private static final long serialVersionUID = 1L;
  public String execute() {
    return "success";
  }  
}


ps.: a página JSP de resultado da action contém nesse exemplo um texto qualquer, apenas para verificar o funcionamento da action...


considerações:


quanto a esse tipo de mapeamento verifiquei que funcionou apenas para o método execute da classe action, sendo que esta herdava de ActionSupport para ser reconhecida como uma action dentro desse pacote....

tentei acessar outros metodos internos na mesma action, mapeada dessa forma, verifiquei que o Struts 2 não localizava tais métodos...


de modo geral esse tipo de action é bom para casos de actions onde conterá apenas um método executor, no caso padrão o public String execute()...

minhas opinião final: achei esse suporte muito fraco, foi menos que minha espectativa inicial :(

Struts 2 + Tiles 2

outra funcionalidade muito utilizada em aplicações web que reduzem o tempo de desenvolvimento referente a interface é o esquema de templates e layout de interface, no caso com Struts 2 temos 2 possibilidades/soluções que podemos utilizar para essa finalidade:

- SiteMesh
- Tiles

no caso como anteriormente tive boas experiências no uso do Tiles junto com o Struts 1, resolvi verificar como está o uso entre Struts 2 com a nova versão do Tiles 2...

um pequeno problema...
opa calma, deixa eu explica, o problema que tive inicialmente foi encontrar uma fonte que realmente contivesse a informação de como realizar a integração entre ambos, a qual fui achar somente em um forum da França, no respectivo [link]

bom vamos aos códigos agora...


[web.xml] configurando a aplicação para utilizar Struts 2 com Tiles 2
( necessário dos jar´s do Struts 2 e do Tiles 2 [usei o 2.0.3, core e api] na lib da aplicação )

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_Struts_Tiles" version="2.4" 
  xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Struts Tiles - Example</display-name>
  <!-- ======= -->   
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
  <!-- ======= -->
    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  <!-- ======= -->    
  <listener>
      <listener-class>org.apache.tiles.listener.TilesListener</listener-class>
    </listener>  
  <!-- ======= -->    
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>


WEB-INF/[tiles.xml] configuração referente ao layout/templates

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
        "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
        "http://struts.apache.org/dtds/tiles-config_2_0.dtd">     
<tiles-definitions>
   <!-- definição do layout da página principal -->
   <definition name="template.page" template="/template/layout.jsp">
      <put name="title" value="Struts 2 + Tiles 2"/>
      <put name="header" value="/template/headerMain.jsp"/>
      <put name="menu" value="/template/menuMain.jsp"/>        
      <put name="footer" value="/template/footerMain.jsp" />
   </definition>
   <definition name="welcome.page" extends="template.page">
      <put name="body" value="/jsp/welcome.jsp"/>
   </definition>
</tiles-definitions>


ps.: nessa aplicação defini os respectivos diretório no root da aplicação:
- jsp : para os jsp´s de resultado das action
- template : para os layout de tela a ser setados no Tiles


/template/[layout.jsp] layout da tela

<%taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%taglib prefix="s" uri="/struts-tags" %>
<%-- atributo da request --%>
<tiles:importAttribute name="title" scope="request"/>
<%-- definição do layout --%>
<html>
  <head>
    <!-- recupera o atributo setado na definição do tiles.xml -->
    <title><tiles:getAsString name="title"/></title>
  </head>
  <body>  
    <table width="100%" height="100%">
      <tr bgcolor="yellow">
        <td colspan="2">
          <tiles:insertAttribute name="header" />
        </td>
      </tr>
      <tr>
        <td bgcolor="gray">
          <tiles:insertAttribute name="menu" />
        </td>
        <td>
          <tiles:insertAttribute name="body" />
        </td>
      </tr>
      <tr bgcolor="yellow">
        <td colspan="2">
          <tiles:insertAttribute name="footer" />
        </td>
      </tr>
    </table>  
  </body>
</html>


ps.: os outros .jsp dentro do diretório possui nesse exemplo apenas textos, indicando : [ cabeçalho, meno e rodapé ]


usando como tipo de retorno de uma action, a definição da action deverá conter o seguinte formato:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

   <package name="base" extends="struts-default">
      <result-types>
         <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
      </result-types>
        
      <action name="index">
         <result type="tiles">welcome.page</result>
      </action>
   </package>  

</struts>




e com essas dicas já é possível iniciar o uso do Struts 2 integrado com Tiles 2 =]

Struts 2: Saída de stream com parametros dinâmicos

usando o novo framework Struts 2, depois de um tempo brigando com a falta de conhecimento finalmente consegui montar uma action onde seto dinâmicamente os parametros para a definição do result

observe os respectivos códigos:

java: classe action
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class DynamicStreamAction {
  //--------------------------------------------------------------------------
  // parametros para uso na saída da action
  private String contentType;
  private int contentLength;
  private String contentDisposition;
  // definição da saída do stream
  private InputStream myStream;
  //--------------------------------------------------------------------------
  public String execute() {
    
    // definindo o tipo de conteúdo
    this.setContentType"application/xml" );
    // definindo que será em anexo( solicitará o salvamento do arquivo )
    this.setContentDisposition"attachment; filename=XmlAction.xml" );
    
    
    // definindo o XML de saida
    String xml = "<tag>xml teste de saída áéíóú ç à...</tag>";
        
    // setando o stream para o tributo
    this.setMyStreamnew ByteArrayInputStreamxml.getBytes() ) );

    // definindo o tamanho do contentLength
    this.setContentLengthxml.getBytes().length );    
    return "success";
  }
  //--------------------------------------------------------------------------  
  
  // get´s & set´s

}


respectivo mapeamento da action com definição dos parametros do result, tipo stream dinâmicos
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <package name="stream" namespace="/stream" extends="struts-default">

        <action name="dynamic" class="stream.DynamicStreamAction">
      <result name="success" type="stream">
        <param name="inputName">myStream</param>  
        <param name="contentType">${contentType}</param>  
        <param name="contentDisposition">${contentDisposition}</param>
        <param name="contentLength">${contentLength}</param>
      </result>
        </action>

    </package>
</struts>


* Observe: que os parametros definidos no mapeamento da action são respectivamente os mesmo nomes dos atributos da classe action...

sexta-feira, 25 de maio de 2007

Struts 2: começando

para quem está começando utilizar o Struts 2, recomendo olhar os respectivos links:

- WebWork (Struts 2) In Action [apresentação]
- Starting Struts 2 [e-book]

material em ingles...