1. Problema de crianza
En Struts2, si se implementa la interfaz <model> de ModelDiven, los parámetros pasados se pueden inyectar en el modelo, y el modelo se puede usar en la acción, pero ¿qué debo hacer si hay dos modelos que necesitan usarse en la misma acción? Por ejemplo, en la sección anterior, completamos la función de pago en línea, pero el pago aún no ha finalizado. Necesitamos recibir comentarios de información de terceros. Por ejemplo, después de un pago exitoso, necesitamos enviar correos electrónicos y mensajes de texto al pagador. Por lo tanto, también necesitamos obtener los parámetros pasados del tercero en la Acción de Pago. Dado que los parámetros pasados por el tercero son diferentes de los aprobados por nosotros, tenemos que escribir un modelo (backdata) para recibir esos parámetros. Entonces, el problema es que nuestra acción de pago se ha escrito de la siguiente manera: la clase de clase pública se extiende a Baseaction <SendData>, es decir, la interfaz ModelDiven <entData> se ha implementado en la Basaza. Entonces, ¿cómo recibimos otro modelo en una acción y tenemos que manejarlos de manera diferente?
Hay una solución (en realidad, no se puede llamar una solución ... porque no se ha resuelto en absoluto ...), que es escribir un modelo y dejar que SendData y Backdata lo hereden, pero el problema es que estos dos modelos no tienen nada que ver con eso. ¿Por qué necesitamos heredar el mismo modelo? Entonces, esta solución en realidad está escapando del problema anterior.
Este problema se resuelve bien en SpringMVC (SpringMVC realmente no ha comenzado a aprender. Si dice algo mal, ¡corrígelo!) Porque cada método en SpringMVC corresponde a un modelo, en lugar de cada acción corresponde a un modelo, lo cual es conveniente. Puedo escribir dos métodos en la misma acción, y diferentes métodos tratan con diferentes modelos.
2. Solución al problema
Struts2 también proporciona una solución a este problema:
Struts2 almacena muchos mapas en el ActionContext, como la solicitud, la sesión, la aplicación, etc. mencionados anteriormente. También hay un parametermap, que almacena todos los parámetros de solicitud de la solicitud. Mientras nuestra acción implementa la interfaz ParameteraSWare, podemos obtener este Parametermap. Esto es lo mismo que ModelDiven. Si implementamos la interfaz <model> ModelDiven, entonces podemos obtener el modelo en la acción, es decir, definir un modelo e implementar el método establecido.
Bien, ahora el problema es fácil de resolver. Los parámetros de pago y los parámetros devueltos son diferentes. Es decir, los parámetros que ingresan a la pagina dos veces son diferentes, es decir, los datos instalados en el parametermap dos veces son diferentes. Mientras seleccionemos un parámetro en la acción (el parámetro se puede distinguir de las dos solicitudes de solicitud diferentes) como un fallo, sabremos qué modelo debe usarse para recibir los parámetros (SendData o Backdata). Vamos a reescribir el Código en Payation:
@Controller ("PayAction")@Scope ("Prototype") Public Class PayAction extiende Baseaction <ject> implementa ParameteraSWare {// Tenga en cuenta que SendData no se puede escribir en la base de basura heredada anteriormente. Necesitas escribir objeto. Más tarde, determinaremos cuál usar // definir un mapa para recibir solicitud de mapa privado <cadena, cadena []> parámetros; @Override public void setParameters (map <string, string []> parámetros) {this.parameters = parámetros; } / *En el artículo de Struts-Default.xml, el Interceptor de ServletConfig se ejecuta antes de ModelDriven, por lo que cuando inyectamos el modelo, el parámetro de solicitud ya está disponible, por lo que podemos usar los parámetros en el método getModel () para determinar qué solicitud usan los parámetros * /@Override Public Object GetModel () {// Hay un canal de pago COLECT (PAREMETET (PAREMETRES), PAREMETRES) no regresa // de esta manera podemos usar este parámetro para determinar si está pagado o devuelto if (parameters.get ("pd_frpid")! = null) {model = new sendData (); } else {model = new BackData (); } modelo de retorno; } // Método para enviar datos a Yibao public String Gobank () {// El modelo enviado correspondiente: SendData SendData SendData = (SendData) modelo; // La lógica de los datos de envío se ha implementado en la sección anterior ...} // El método para recibir datos devueltos publicos void backbank () {// El modelo recibido correspondiente: backdata backdata backdata = (backdata) modelo; // La lógica del manejo de datos devueltos ... se implementará más tarde, // El punto de conocimiento de Struts2 primero maneja múltiples solicitudes de modelo}}3. Struts2 Flujo de procesamiento
Analicemos el proceso de ejecución de Struts2, que será más propicio para comprender los principios anteriores. Flujo de procesamiento de puntales:
1) Después de obtener la solicitud, primero cree el proxy de la acción y luego cree la acción al crear el proxy;
2) ejecute 18 interceptores y luego llame al método de acción después de que el interceptor se ejecute con éxito;
3) Después de ejecutar el método de acción, se llaman a 18 interceptores. Entonces, de acuerdo con este proceso, sabemos: Crear acción> y luego ejecute el interceptor (primero ejecute ServletConfig, luego ejecute ModelDriven, porque el Interceptor ServletCig está equipado frente a ModelDipniven). Entonces, en el código anterior, podemos usar los datos en Parametermap en el método getModel () para emitir juicios.
Use el siguiente diagrama de tiempo simple para representar intuitivamente el flujo de procesamiento anterior:
Esto muestra el flujo de procesamiento de la intuición Struts2, por lo que es fácil entender las solicitudes de modelos múltiples de procesamiento de procesamiento anterior. En este punto, se ha analizado la parte del método de Struts2 para manejar múltiples solicitudes de modelo. La siguiente es una pequeña lógica en este proyecto.
4. Mejorar el método para recibir datos
Una lógica detrás de esto es la implementación de la lógica, es decir, procesar los datos devueltos. La lógica aquí incluye principalmente: Actualización del estado del pedido (pagado, enviado, etc.), enviando correos electrónicos, enviando mensajes de texto, etc. Primero completaremos el estado de la orden de actualización, enviaremos correos electrónicos y enviaremos mensajes de texto a la asignatura, y lo escribiremos más tarde.
Primero mejore el método de backbank ():
public void backbank () {BackData BackData = (BackData) Modelo; System.out.println (modelo); boolean isok = payservice.checkbackData (backdata); if (isok) {// 1. Actualizar el estado del pedido, los parámetros se transmiten según la situación en la base de datos, utilizada para probar ForderService.updatestatusById (Integer.ValueOf (201605006), 2); // 2. Envíe un correo electrónico de acuerdo con la dirección de correo electrónico del usuario // 3. Envíe un mensaje de texto de teléfono móvil System.out.println ("---- ¿éxito! -----"); } else {System.out.println ("---- falso !!! -----"); }}Luego completamos el método CheckbackData (BackData) en PayService (la lógica es básicamente la misma que en la Sección 21):
@Service ("PayService") Public Class PayServiceImpl implementa PayService {// omitir código irrelevante/****************************************************************************************************************************************************************************************anza de la solicitud *********************************************************** ... {// String String para prepararse para la verificación de cifrado StringBuffer Infobuffer = new StringBuffer (); infoBuffer.append (backData.getp1_merid ()); infoBuffer.append (backData.getR0_cmd ()); infoBuffer.append (backData.getR1_code ()); infoBuffer.append (backData.getR2_trxid ()); infoBuffer.append (backData.getR3_amt ()); infobuffer.append (backdata.getr4_cur ()); infoBuffer.append (backData.getR5_pid ()); infoBuffer.append (backData.getR6_order ()); infobuffer.append (backdata.getr7_uid ()); infoBuffer.append (backData.getR8_mp ()); infoBuffer.append (backData.getR9_btype ()); return infoBuffer.ToString (); } // Cifrar los datos devueltos y compararlos con el texto cifrado enviado. Si está bien, significa que los datos no han sido alterados. Public Boolean CheckbackData (BackData BackData) {String JoinParam = this.JoNBackDataparam (BackData); // Obtenga su propia cadena de texto cifrado md5 = DigestUtil.hmacSign (JoinParam.ToString (), Key); // comparación de texto cifrado con el texto cifrado enviado a través de return md5.Equals (backdata.gethmac ()); }}Finalmente, completamos el método UpdateTatusByID en ForderService:
// Interfaz de ForderService Interfaz Public Interface ForderService extiende BasesService <fosder> {// omitir otros códigos no relacionados ... // Actualice el estado de pedido de acuerdo con el número de pedido public void UpdateTatusById (int id, int SID);} // ForderServiceMeMeMiMiMeMeMeMeMeMeMeMplement Class @Service ("ForDerservice") Public Class ForderDersEvice Extends Extends Extends. Implementa que ForderService {// omita otros códigos no relacionados @Override public void updateStatusById (int id, int sid) {string hql = "Update fosher f set f.status.id =: sid where f.id =: id"; getSession (). CreateQuery (HQL) .SetInteGer ("Sid", Sid) .SetInteger ("ID", ID) .ExCuteUpdate (); }}Esto permitirá actualizar el estado del pedido después de que el cliente paga.
Enlace original: http://blog.csdn.net/eson_15/article/details/51465067
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.