Este artículo implementa principalmente la función de reenvío de solicitudes de Struts. Otras funciones se compensarán lentamente.
Recientemente, aprendí el contenido de Javassist, y vi un artículo.
Aquí hay un marco Struts2 simple, y al mismo tiempo, agrega parte de su propia comprensión.
Este artículo implementa principalmente la función de reenvío de solicitudes de Struts. Otras funciones se compensarán lentamente.
En primer lugar, en el marco Struts2, la implementación y el salto de solicitudes están configurados principalmente por Struts.xml. La etiqueta <Action> indica una definición de una solicitud, que contiene el nombre "Nombre" de la solicitud; El <resultado del resultado define el tipo de "nombre" del resultado, incluido 'éxito', 'ninguno', 'Iniciar sesión,' entrada ',' error '; ② el tipo "tipo", incluido' despachador (predeterminado) ' '', 'Cadena', 'redirección', 'redirectación', 'stream'; Después de configurar el struts.xml, el formulario en la interfaz puede encontrar la etiqueta de acción correspondiente a través del valor del atributo de nombre definido por la propiedad de acción, para encontrar la clase y los métodos de ejecución correspondientes. Luego, coincida con la cadena de cadena devuelta por el método de ejecución para que coincida con el nombre en la etiqueta de resultados y realice la siguiente operación de solicitud de acuerdo con el tipo de tipo definido.
Bueno, después de comprender cómo Struts2 conecta la interfaz que solicita la misma función del programa, podemos implementar esta parte de la función a través de nuestro propio código.
Entonces, ¿cómo empezamos?
Nos dividiremos en dos partes con funciones simples, parte de la parte del resultado
la parte de acción
① Necesitamos encontrar la clase y los métodos de ejecución correspondientes de acuerdo con la solicitud de la interfaz
parte de resultado
① Necesitamos devolver la cadena de tipo de 'éxito', 'ninguno', 'Iniciar sesión,' entrada 'y' error '
② Se deben especificar diferentes tipos de dirección de solicitud para diferentes tipos de devolución
③ Los tipos que deben definirse, incluido 'despachador (predeterminado)', 'cadena', 'redirección', 'redirectación', 'stream'
En este artículo, los tipos de retorno de resultados solo se dan cuenta de los dos tipos de 'éxito' y 'inician sesión, y por el momento, no consideran el tipo de solicitud. La función perfecta se repondrá más tarde.
Luego, veamos cómo lograr la función anterior a través del código.
En primer lugar, las dos anotaciones personalizadas de ActionAnnotation y resultannotation solicitan el método y el método correspondientes de la cadena devuelta por las dos anotaciones personalizadas de acciones
/ ** * Nota de acción: ActionName es equivalente a la url -pattern * @author linling * */ @retention (retentionPolicy.runtime) @targettype.method blic @interface ActionsNotation {String ActionName () predeterminado ""; () predeterminado {};} /*** Regreso al objeto de anotación: el nombre es equivalente al nombre del resultado en la configuración de Struts, incluido el 'éxito', 'Ninguno', 'Error', 'Entrada. El valor de inicio de sesión; () predeterminado "index.jsp";}
Luego definimos una clase ActionContext para guardar el contenido requerido para una solicitud
/*** Implementar los puntales de simulación saltan al contenido requerido para ejecutar el método correspondiente de acuerdo con el archivo de configuración*@Author Linling **/public class ActionContext {/*** equivalente a URL -Pattern en Web.xml, el Only* /private String URL; Por ejemplo: Key: 'Success'; Acción de objeto privado; * / String privado [] ActionParamsName;
AnalySpackage es un método requerido para ensamblar ActionContext
/** * atravesó el archivo de clase en el paquete Scan_Package, que utiliza el método de ActionAnnotation para analizarlo, lo ensambló en un objeto ActionContext y lo coloca en URLMAP * @param real_path scan_package * @thro ws classNotFoundException * @throws InstantiationException * Ececuperion * @throws ilegalAccessException * @throws NotFoundException */ public static void analSepackage (String real_path, string scan_package foundException, instantificationException, ilegalAccessException, nofoundException {file = new File (real_path); if (file.isDirectory ()) ] f iles = file.listfiles (); ClassStype = class.forname (FileName); .GetAnnotation (ActionAnnotation.Class); Método ¡Error de anulación! " + Método +", ActionName: " + URL +", result.length: " + results.lengts.lengt H);} ActionContext.SetUrl (url); ActionTextext.SetMethod (método.getName ())) ; es nulo ");} map.put (resultado.name (), valor);} ActionContext.SetResults (MAP); Act ionContext.SetClasStype (Classtype); ActionContext. SetAction (Classtype.NewinStance ()); ActionContext.SetParamStype ( Method.getParametertypes ());
GetParams es una matriz de parámetros de solicitud basada en el contenido de solicitud en la solicitud httpservletrequest.
/** * Basado en el tipo de parámetro Parastype y el nombre del parámetro ActInParamSname para analizar la solicitud de solicitud de construir un objeto de parámetro [] * @param request * @paramstype * @param actionParamsname * @retourn * @lanza InstanciationException * @throws ilegalaccessexception * @ throws Illegalargumentexception * @ @ @ @ @ @ @ Throws InvolutionAntargetexception * @throws NosuchmedHodexception * @throws SecurityException */ Public Static Object [] Quest Request, Class <?> [] ParamStype, String [] ActionParamsName) Throws InstantiationException, IlLegalaCcessException, IlLegalagumentedException, Invocat ionTargException, nosuchmethodexception, SecurityException {object [object] objects = new Object [paramStype.length]; PARAMPE Style [i])) {objetos [i] = paramsUtils.getParam (request, paramStype [i], ActionParamsName [i]);} else {class <?> Classtype = paramStype [i]; ClassStype.getDetDecLardFields (); ) {{String key = iterator.next (); Longitud! Valor de cadena = map.get (key) [0]; } Objetos de retorno;}
Bien, siguiente. Podemos implementar el método de acción
Clase pública LoginAction {@ActionNotation (ActionName = "Login.Action", Results = {@Resultanitation (name = resultType.Success, value = "i ndex.jsp"),@resultanTation (name = denttype.login, value = "login =" logini . (ActionName = "LoginForSe.Action", Results = {@ResAnnotation (name = resultType.Success, value = "INDEPP") OTARY (name = resultType.Login, value = "Login.jsp")})}) public dentType logInforUser (Int número, loginpojo loginpojo) {if ("hello" .equals (loginpojo.getusername ()) && "world" .equojo.getpa ssword ())) {return dentatType.success;} returnttype.login;}}
A continuación, lo que debemos hacer es permitir que el programa atraviese todos los métodos en el directorio de trabajo al comenzar, y usar el método de ActionAnnotation para averiguarlo y ensamblarlo en ActionContext. De esta manera, cuando llega la solicitud, podemos encontrar el ActionContext correspondiente de acuerdo con la dirección de solicitud y llamar al método por el mecanismo de reflexión.
Establecimos dos servlets. Uno se usa para realizar programas de inicialización. Uno utilizado para filtrar todas las solicitudes de acción
<servlet> <servlet> strutsinitservlet </servlet-name> <ervlet-class> com.bayern.struts.servletsinitservlet </servlet-class> <p am-name> scan_package </amamname> <amam-value> com .Bayern.struts.One </param-value> </init-param> <load-on-startup> 10 </load-startup>>> <servlet-name> desplazador de servidor </servlet-name> <ervlet-class> com.bayern.struts.one.servlet.dispatcherservlet </servlet-mapping </servlet-mapping> <servlet-name> desplazamiento de servidor </servlet-name> <url-pattern>*. Mapeo de servlet>
DispatcherServlet implementa el filtrado de la solicitud de acción utilizada y le permite ejecutar el método de acción correspondiente y hacer el siguiente salto
UBLIC Void DOPOST (HTTPSERVELTREQUEST Solicitud, Respuesta HttpServletRess). (Solicitud, ActionContext.getParamStype (), ActionContext.GetActionParamsName ()); .GetAction (), params);
Bueno, ahora hemos implementado la función de reenvío de solicitud de marco Strut2 más simple. La función es muy dura, y muchos casos aún no lo han considerado.
Lo anterior es todo el contenido de este artículo.