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