Cet article implémente principalement la fonction de transfert de demande de Struts. D'autres fonctions se composeront lentement.
Récemment, j'ai appris le contenu de Javassist, et j'ai vu un article.
Voici un simple framework Struts2, et en même temps, vous ajoutez une partie de votre propre compréhension.
Cet article implémente principalement la fonction de transfert de demande de Struts. D'autres fonctions se composeront lentement.
Tout d'abord, dans le cadre Struts2, l'implémentation et le saut des demandes sont principalement configurés par Strut.xml. Une étiquette <action> indique une définition d'une demande, qui contient le nom "Nom" de la demande; Le <le résultat "Label définit le type" Nom "du résultat, y compris« Success »,« None »,« Login »,« entrée »,« erreur »; ② Le type« type », y compris« Dispatcher (par défaut) » '', 'Chaîne', 'redirection', 'redirectaction', 'stream'; Après avoir configuré la struts.xml, le formulaire dans l'interface peut trouver la balise d'action correspondante via la valeur d'attribut de nom définie par la propriété Action, afin de trouver la classe et les méthodes d'exécution correspondantes. Faites ensuite correspondre la chaîne de chaîne renvoyée par la méthode d'exécution pour correspondre au nom dans la balise de résultat et effectuez l'opération de demande suivante en fonction du type de type défini.
Eh bien, après avoir compris comment Struts2 connecte l'interface demandant la même fonction de programme, nous pouvons implémenter cette partie de la fonction via notre propre code.
Alors, comment commençons-nous?
Nous serons divisés en deux parties avec des fonctions simples ①Action partie ②Result partie
la partie d'action
① Nous devons trouver la classe et les méthodes d'exécution correspondantes en fonction de la demande de l'interface
Résultat Partie
① Nous devons renvoyer la chaîne de type de «succès», «aucun», «connexion», «entrée» et «erreur»
② Différents types d'adresse de demande doivent être spécifiés pour différents types de retour
③ Les types qui doivent être définis, y compris «Dispatcher (par défaut)», «chaîne», «redirection», «redirection», «stream»
Dans cet article, les types de résultats ne réalisent que les deux types de «succès» et de «connexion», et pour le moment, ils ne considèrent pas le type de demande. La fonction parfaite sera reconstituée plus tard.
Ensuite, voyons comment réaliser la fonction ci-dessus via le code.
Premièrement, les deux annotations personnalisées de l'actionannotation et de la résultant demandent la méthode et la méthode correspondantes de la chaîne renvoyée par les deux annotations personnalisées des actions
/ ** * Remarque Action: ActionName est équivalent à l'URL -Pattern * @Author Linling * * / @retention (RetentionPolicy.Runtime) @ TargetType.Method Blic @Interface ActionsNotation {String ActionName () Default ""; () par défaut {};} / *** Retour à l'objet Annotation: le nom est équivalent au nom du résultat dans la configuration de Struts, y compris «Success», «None», «Error», «Input. Login '; () par défaut "index.jsp";}
Ensuite, nous définissons une classe ActionContext pour enregistrer le contenu requis pour une demande
/ *** Implémentez les entretoises de simulation sauter au contenu requis pour exécuter la méthode correspondante en fonction du fichier de configuration * @author ling ** / classe publique ActionContext {/ *** équivalent à URL -Patdern dans le web.xml, le uniquement * / URL de chaîne privée; Par exemple: Key: 'Success'; Action d'objet privé; / *** Type de paramètre de la méthode * / classe privée <?> [] ParamStype; * / Private String [] ActionParamsName; / *** La demande httpservletRequest * / privatevletRequest;
AnalysePackage est une méthode requise pour assembler ActionContext
/ ** * a traversé le fichier de classe sous le package scan_package, qui utilise la méthode d'actionannotation pour l'analyser, l'a assemblée dans un objet ActionContex @throws illégalaccessException * @throws notfoundException * / public static void analysepackage (String real_path, string scan_package FoundException, instantificationxception, illégalaccessException, notfoundException {file file = new File (real_path); if (file.isdirectory ()) {file [] f (real_path); ] f iles = file.listfiles (); ClassStype = class.forname (filename); méthode [] méthodes = classStype.getMethods (); .GetAnnotation (ActionAnnotation.Class); String Url = ActionAnnotation.Act IonName (); Méthode Annitation Error! "+ Method +", ActionName: "+ url +", result.length: "+ result.lengts.lengt h);} actionContext.setUrl (url); actiontextext.setMethod (méthode.getName ()) ; Map <Res) Map = Nouveau Hashmap <Res) (); is null ");} map.put (result.name (), valeur);} actionContext.SetResults (map); acte ionContext.setClasstype (cllasstype); actionContext. Method.getParameterTypes ());
GetParams est un tableau de paramètres de demande basé sur le contenu de la demande dans la demande httpservletRequest.
/ ** * Basé sur le parastype de type de paramètre et nom de paramètre actinAramsName pour analyser la demande de demande pour créer un objet de paramètre [] * @param request * @paramstype * @param actionParamsName * @retourn * @ lance InstantiationException * @throws illégalAccessException * @ @ @ @ @ @ lance illégalArgumentException * @ @ @ @ @ @ @ lance InvolutionantArgetException * @throws NosuchMedHodeException * @throws SecurityException * / Public Static Object [] Quest Demande, classe <?> [] ParamStype, String [] ActionParamsName) lance InstantiationException, illégalaccessException, illégalagumedException, InstantiationException Invocat ionTargexception, nosuchMethodexception, SecurityException {objet [objet] objets = nouveau objet [paramstype.length]; Parampe Style [i])) {objets [i] = paramsUtils.getParam (request, paramstype [i], actionParamsName [i]);} else {class <?> Classtype = paramstype [i]; classStype.getDetDeclardFields (); ) {{String key = iterator.next (); Longueur! String Value = Map.get (Key) [0]; } Return objets;}
D'accord, ensuite. Nous pouvons implémenter la méthode d'action
Classe publique LoginAction {@ActionNotation (ActionName = "Login.Action", résultats = {@Resultanitation (name = resultType.Success, value = "i ndex.jsp"), @ resultannotation (name = resultType.Login, Value = "Login = . (ActionName = "loginForUse.action", résultats = {@resannotation (name = resultType.Success, value = "indexp") otary (name = resultType.login, value = "login.jsp")})}) public ResultType LoginForUser (Int n °, loginpojo loginpojo) {if ("hello" .equal
Ensuite, ce que nous devons faire est de permettre au programme de traverser toutes les méthodes du répertoire de travail lors du démarrage, et d'utiliser la méthode ActionAnnotation pour le découvrir et l'assembler dans ActionContex. De cette façon, lorsque la demande arrive, nous pouvons trouver le CONSETTACT d'action correspondant en fonction de l'adresse de la demande et appeler la méthode par le mécanisme de réflexion.
Nous avons réglé deux servlets. L'un est utilisé pour effectuer des programmes d'initialisation. Celui utilisé pour filtrer toutes les demandes d'action
<Serplet> <Serplet> StrutSinitservlet </vrlett-name> <servlet-class> com.bayern.struts.servletsitservlet </vrlett-class> <par am-name> scan_package </onsam-name> <param-valeur> com .Bayern.struts.one </ param-valeur> </ init-param> <charge-on-startup> 10 </ load-startup>> <Servlet-name> Dispatcherservlet </ serplet-name> <servlet-Class> com.bayern.struts.one.servlet.dispatcherservlet </ servlet-mapping </ servlet-mapping> <servlet-name> Dispatcherservlet </ servlet-name> <url-potern> *. Mappage de servlet>
DispatcherServlet implémente le filtrage de la demande d'action utilisée et lui permet d'exécuter la méthode d'action correspondante et de faire le saut suivant
Ublic void DOPOST (HTTPSERVETREQUEST, HTTPSERVETRESSERSPONSE) lance le service) .;); (request, actioncontext.getParamStype (), ActionContext.getActionParamsName ()); .GetAction (), Params);
Eh bien, nous avons maintenant implémenté la fonction de transfert de demande de framework Strut2 la plus simple. La fonction est très rude, et de nombreux cas ne l'ont pas encore considéré.
Ce qui précède est tout le contenu de cet article.