7. Ejemplo 05B – Navegación en un formulario de entrada
Analizamos un formulario que presenta varios botones para enviar (submit) los datos introducidos a una acción.

7.1. El proyecto NetBeans
El proyecto NetBeans es el siguiente:

Los elementos del proyecto son los siguientes:
- [DoSomething.jsp]: la única vista de la aplicación que presenta los tres botones de navegación, así como un enlace.
- [DoSomething.java] y [DoSomethingElse.java]: las dos acciones del proyecto
- [messages.properties]: el archivo de mensajes internacionalizados
- [struts.xml]: el archivo de configuración de Struts 2
7.2. Configuration
El siguiente archivo [struts.xml] configura la aplicación:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messages" />
<package name="actions" namespace="/actions" extends="struts-default">
<action name="DoSomething" class="actions.DoSomething">
<result name="success">/vues/DoSomething.jsp</result>
</action>
<action name="DoSomethingElse" class="actions.DoSomethingElse">
<result name="success">/vues/DoSomething.jsp</result>
</action>
</package>
</struts>
- La acción [/actions/DoSomething] provocará la instanciación de la clase [actions.DoSomething] y su método execute se ejecutará por defecto. Este valor por defecto puede anularse si los parámetros pasados a la acción [Something] especifican otro método. Sea cual sea el método ejecutado, deberá devolver la clave de navegación success, ya que solo se ha definido esta clave. A continuación, se mostrará la vista [DoSomething.jsp].
- La configuración de la acción [/actions/DoSomethingElse] es idéntica.
7.3. El archivo de mensajes
El archivo de mensajes [messages.properties] es el siguiente:
formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3
7.4. La vista [DoSomething.jsp]
La vista [DoSomething.jsp] es la siguiente:

Su código es el siguiente:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="formulaire.titre1"/></title>
</head>
<body>
<h1><s:text name="formulaire.titre2"/></h1>
<s:form action="DoSomething">
<s:submit key="formulaire.execute"/>
<s:submit key="formulaire.action1" method="action1"/>
<s:submit key="formulaire.action2" action="DoSomethingElse" method="action2"/>
</s:form>
<s:url id="url" action="DoSomething" method="action3"/>
<s:a href="%{url}"><s:text name="formulaire.action3"/></s:a>
</body>
</html>
- línea 11: el formulario se enviará a la acción [DoSomething]. Esto no significa necesariamente que sea esta acción la que se vaya a activar. Depende del botón submit utilizado para el POST.
- línea 12: el botón submit no especifica ni acción ni método. Se instanciará la acción [DoSomething] especificada por la etiqueta <form>. El método que se ejecutará será el definido en el archivo [struts.xml], el método execute.
- línea 13: el botón submit especifica un método. Se instanciará la acción [DoSomething] especificada por la etiqueta <form>. El método ejecutado será el método action1.
- línea 14: el botón submit especifica una acción y un método. Se instanciará la acción [DoSomethingElse]. El método ejecutado será el método action2.
- Líneas 16-17: un enlace a la acción [DoSomething] y al método action3. Se instanciará la acción [DoSomething] y se ejecutará su método action3. A diferencia de los botones submit, al hacer clic en el enlace no se activa un POST, sino un GET. Por lo tanto, no se envía ningún parámetro.
El código HTML generado por este código, al solicitar la URL [http://localhost:8084/exemple-05B/actions/DoSomething.action], es el siguiente:
- línea 9: la etiqueta form del formulario HTML. El atributo action indica la URL a la que se enviarán los parámetros del formulario. Esta URL es la de la acción [DoSomething].
- líneas 11, 13, 15: los atributos name de los botones se enviarán a la acción de destino del botón submit. Esto es lo que permite a Struts determinar la acción que se debe instanciar y el método que se debe ejecutar.
- línea 13: el atributo name=method:action1 indica que debe ejecutarse el método DoSomething.action1.
- línea 15: el atributo name= action:DoSomethingElse!action2 indica que debe ejecutarse el método DoSomethingElse.action2.
- línea 11: el atributo name= formulaire.execute no especifica ni acción ni método. Por lo tanto, se ejecutará el método DoSomething.execute.
- línea 19: el enlace solicita explícitamente la ejecución del método DoSomething.action3
7.5. Las acciones
La acción [DoSomething] es la siguiente:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomething extends ActionSupport {
public DoSomething() {
System.out.println("DoSomething");
}
@Override
public String execute() {
System.out.println("DoSomething.execute");
return SUCCESS;
}
public String action1() {
System.out.println("DoSomething.action1");
return SUCCESS;
}
public String action3() {
System.out.println("DoSomething.action3");
return SUCCESS;
}
}
- Los métodos execute, action1 y action3 escriben en la consola del servidor web y devuelven la clave de navegación success.
- Línea 8: el constructor también escribe en la consola del servidor web
Los diferentes mensajes en la consola permiten saber qué métodos se ejecutan durante una solicitud.
La acción [DoSomethingElse] es similar:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomethingElse extends ActionSupport {
public DoSomethingElse() {
System.out.println("DoSomethingElse");
}
@Override
public String execute() {
System.out.println("DoSomethingElse.execute");
return SUCCESS;
}
public String action2() {
System.out.println("DoSomethingElse.action2");
return SUCCESS;
}
}
7.6. Las pruebas
Las pruebas muestran los siguientes resultados (en la consola del servidor web):
- al hacer clic en el botón [DoSomething.execute], se instancia la acción [DoSomething] y se ejecuta su método execute.
- Al hacer clic en el botón [DoSomething.action1], se instancia la acción [DoSomething] y se ejecuta su método action1.
- Al hacer clic en el botón [DoSomethingElse.action2], se instancia la acción [DoSomethingElse] y se ejecuta su método action2.
- Al hacer clic en el enlace [DoSomething.action3], se instancia la acción [DoSomething] y se ejecuta su método action3.