Configuración de Resultados y Vistas en Struts2

En el framework Struts2, la relación entre los resultados de una Acción y las vistas se establece mediante la etiqueta result en el archivo de configuración XML. Este mecanismo permite al framework determinar qué vista presentar al usuario basándose en la cadena de texto devuelta por la Acción. El proceso se divide en dos fases: la Acción genera un resultado (una cadena), y el framework lo mapea a un recurso de vista correspondiente.

<struts>
    <package name="sistema" namespace="/app" extends="struts-default">
        <action name="procesar_*" class="controlador.{1}Accion" method="{2}">
            <!-- El atributo 'name' define la cadena de resultado esperada, por defecto 'exito' -->
            <!-- Si el valor comienza con '/', indica una ruta absoluta; de lo contrario, se interpreta relativa al namespace -->
            <result name="exito">/vistas/confirmacion.jsp</result>
        </action>
    </package>
</struts>

La etiqueta result posee un atributo name que especifica el resultado devuelto por la Acción. Struts2 incluye cinco resultados predefinidos:

  • EXITO: La Acción se ejecutó correctamente, se muestra la vista asociada.
  • NINGUNO: La Acción se ejecutó sin errores, pero no se renderiza ninguna vista.
  • ERROR: La Acción falló, se redirige a una vista de manejo de errores.
  • LOGIN: La Acción requiere autenticación, se redirige a la página de inicio de sesión.
  • ENTRADA: La Acción necesita parámetros del formulario, pero la validación falló (por ejemplo, conversión de tipo o campos obligatorios vacíos). Struts2 devuelve este resultado automáticamente en ciertos casos.

Por ejemplo, si una Acción devuelve EXITO, el framework buscará una etiqueta result con name="exito" para determinar la vista destino.

public class AccionAutenticacion {
    
    public String autenticar() {
        // Lógica simulada de verificación
        String usuarioValido = "administrador";
        if (verificarCredenciales(usuarioValido)) {
            return "exito";
        }
        return "error";
    }
    
    private boolean verificarCredenciales(String user) {
        return user.equals("administrador");
    }
}
<struts>
    <package name="seguridad" namespace="/auth" extends="struts-default">
        <action name="login_*" class="controlador.AccionAutenticacion" method="{1}">
            <result name="exito">/paginas/bienvenida.jsp</result>
            <result name="error">/paginas/fallo.jsp</result>
        </action>
    </package>
</struts>

El resultado ENTRADA tiene un comportamiento espeical. Se devuelve automáticamente en tres situaciones:

Caso 1: Error en conversión de tipo. Si un formulario envía un valor no numérico para un campo entero, la Acción no se ejecuta y se redirige a la vista de ENTRADA.

<form action="registrar.action" method="post">
    <div>
        Nombre: <input type="text" name="nombreCompleto">
    </div>
    <div>
        Edad: <input type="text" name="edadUsuario">
    </div>
    <button type="submit">Enviar</button>
</form>
public class AccionRegistro {
    private String nombreCompleto;
    private Integer edadUsuario;

    public String ejecutar() {
        if (nombreCompleto == null || nombreCompleto.isEmpty()) {
            return "error";
        }
        // Proceso exitoso
        return "exito";
    }
    
    // Getters y setters omitidos por brevedad
}

Caso 2: Validación manual con campos de error. Si se añaden errores de campo mediante addFieldError, la Acción debe devolver explícitamente ENTRADA.

public String ejecutar() {
    if (edadUsuario == null || edadUsuario < 18) {
        addFieldError("edadUsuario", "La edad debe ser mayor o igual a 18 años");
        return "entrada";
    }
    // Continuar con la lógica principal
    return "exito";
}

Caso 3: Validación en el método validate(). Si se sobrescribe este método y se registran errores, Struts2 devuelve ENTRADA automáticamente sin llegar a ejecutar la acción principal.

@Override
public void validate() {
    if (nombreCompleto == null || nombreCompleto.trim().length() == 0) {
        addFieldError("nombreCompleto", "El nombre no puede estar vacío");
    }
}

La etiqueta result también posee un atributo type que define el tipo de resultado. Su valor por defecto es dispatcher, adecuado para JSP. Otros tipos comunes incluyen:

  • redirect: Redirección HTTP (pierde parámetros de solicitud).
  • chain: Encadena una Acción con otra.
  • plaintext: Devuelve el código fuente de la página.
  • stream: Genera un flujo de datos, útil para descargas de archivos.
<action name="exportar">
    <result name="exito" type="stream">
        <param name="contentType">application/octet-stream</param>
        <param name="inputName">flujoDatos</param>
    </result>
</action>

Para mayor flexibilidad, los parámetros de la vista pueden definirse mediante etiquetas hijo param. El parámetro location establece el recurso de vista, y parse (por defecto true) permite usar expresiones OGNL en el nombre del recurso.

<action name="detalle">
    <result name="vista">
        <param name="location">/recursos/detalle.jsp</param>
        <param name="parse">false</param>
    </result>
</action>

Los resultados se clasifican en dos categorías:

  • Resultados locales: Configurados dentro de una etiqueta action específica y aplicables solo a esa Acción.
  • Resultados globales: Definidos en global-results y compartidos por todas las Acciones dentro del mismo paquete.
<struts>
    <package name="comun" extends="struts-default">
        <global-results>
            <result name="error404">/errores/no_encontrado.jsp</result>
        </global-results>
    </package>
</struts>

Etiquetas: struts2 java MVC Action Result

Publicado el 6-28 22:32