Pregunta

Por defecto Quiero mi aplicación struts2 que transmita a una acción:

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

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />

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


        <action name="Login_*" method="{1}" class="myApp.SessionManager">
            <result name="input">/myApp/Login.jsp</result>
            <result type="redirectAction">Menu</result>     
        </action>

    </package>

    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <action name="index">
            <result type="redirectAction">
                <param name="actionName">Login_input.action</param>
                <param name="namespace">/myApp</param>
            </result>
        </action>
    </package>


</struts>

Busco la aplicación llame SessionManager.input (), pero en su lugar se llama SessionManager.execute ().

¿Fue útil?

Solución

Usted no quiere típicamente un método público input () . El escenario más básico y típico de una acción es:

  • La acción tiene por objeto "hacer algo" (una cosa), y esta acción necesita un poco de la entrada del usuario.
  • La acción tiene que algo que en el método execute ()
  • Si la acción con éxito hizo que algo, que returs . Esto desencadena una página JSP informativo resultado.
  • Si la acción no tuvo la entrada del usuario (porque no había ninguna, o porque era insuficiente o incorrecta) devuelve entrada . Esto desencadena una "forma de entrada" JSP de modo que el usuario puede rellenar los datos y (re) a intentar la acción.

Ahora, este escenario básico se puede codificar de varias maneras, entre ellas:

1) Dos asignaciones diferentes, uno para el formulario de entrada, otros para la ejecución

<!-- default action class: execute does nothing, returns SUCCES -->
<action name="ActionXXXShowForm"> 
                <result>/myApp/XXXForm.jsp</result>
</action>

<action name="ActionXXX" class="myApp.XXXAction"> 
                <result name="input">/myApp/XXXForm.jsp</result>
                <result>/myApp/XXXDone.jsp</result>
</action>

2) Sólo una cartografía

<action name="ActionXXX"  class="myApp.XXXAction"> 
                <result name="input">/myApp/XXXForm.jsp</result>
                <result>/myApp/XXXDone.jsp</result>
</action>

Los dos son muy similares (especialmente si están haciendo su validación programática). En ambos casos, sólo tenemos un método "puntales" en la acción ( ejecutar ), que es una buena práctica como nuestra acción sólo "hace una cosa". Pero en el segundo caso, tenemos que lidiar con el caso en el que no hay datos de correos, y no te emitirá un mensaje de error para ese caso.

Ejemplo: En el caso 1:

public class XXXAction extends ActionSupport {
    ...    
    public String execute() throws Exception {
        if(! inputOk()) return INPUT;
         // .. do your stuff
        return SUCCESS;
    }

    private boolean inputOk() {
       // ... check your inputs - sort of programatic validation
       if( surname == null ) addActionError("no surname");
       // .... more checks
       return ! hasActionErrors());
    }

}

En el caso 2 se modifica ligeramente:

public class XXXAction extends ActionSupport {
    ....    
    public String execute() throws Exception {
        if( emptyInput() ) return INPUT;  // no error messages in this case
        if(! inputOk()) return INPUT;
         // .. do your stuff
        return SUCCESS;
    }

    private boolean inputOk() {
       // same as before
    }

    private boolean emptyInput() {
       // detect no input was sent. do not emit errors herer
    }
}

Otros consejos

Cuando se llama a una de las acciones JSP, el método por defecto es ejecutar (). Si desea llamar a otro método, puede spec por el método de atributo = "".

<s:url action="SessionManager" method="input"/>

El método atributo es común en otras etiquetas.

Si está utilizando una etiqueta <s:a..., entonces no va a ser capaz de llamar al método previsto aparte del defecto método execute (). En lugar de la etiqueta <s:a..., es necesario definir la acción utilizando una etiqueta <s:url... con un ID y llamar a la misma usando html normal, es decir etiqueta de anclaje., <a href=${<<id>>} pero es posible que tenga que especificar el método en su struts.xml o cualquier otro archivo de configuración XML, que ha incluido en su archivo struts.xml con el atributo de método en su cláusula <action... method="...".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top