Strut2 détermine s'il s'agit d'un appel ajax
1. Ajax et formes de forme traditionnelle
En fait, les deux sont généralement des demandes de poste via HTTP. La différence est qu'après que le navigateur a soumis le formulaire, il s'attend à ce que le serveur renvoie une page HTML complète. L'appel AJAX est émis par l'objet XMLHTTPRequest (différents navigateurs peuvent être différents). Le navigateur s'attend à ce que le serveur retourne les fragments HTML, mais il n'y a aucune exigence pour JSON, XML, etc. Comment l'utiliser après le retour au navigateur est également déterminé par le script JS lui-même.
2. Est la demande ajax
Donc, pour le côté serveur, comment déterminer si une demande HTTP est un appel ajax? Cela nécessite l'en-tête HTTP.
Nous pouvons juger par le X-Request avec l'en-tête. Bien que différents navigateurs envoient des demandes AJAX différents objets, si JQuery utilise pour envoyer des demandes AJAX, l'identifiant a été ajouté lorsque jQuery implémente AJAX en interne. Le code source jQuery est le suivant: xhr.setRequestHeader ("x-requied-with", "xmlhttprequest");
Par conséquent, si les pages frontales du projet envoient des demandes Ajax via jQuery, ce jugement est sûr.
Vous trouverez ci-dessous les informations d'en-tête transportées par les demandes HTTP.
Soumission de formulaire de formulaire normal
=== MIMEHEADERS === Accept = * / * référer = http: // localhost: 8080 / user2 / toqueryPage.ActionAccept-Language = Zh-Cnuser-Agent = Mozilla / 4.0 (compatible; MSIE8.0; Windows NT 6.1; Wow64; Trident / 4.0; Slcc2; .net Clr 2.0.50727; CLR.5.30729; .net CLR 3.0.30729;
AJAX Call (IE)
=== MIMEHEADERS === X-RESSET-WITH = XMLHTTPREQUESTACGENNE-Language = Zh-CnReferrer = http: // LocalHost: 8080 / User2 / ToQueryPage.ActionACcept = Application / JSON, Text / Javascript, * / *; Q = 0,01content-type = application / x-www-form-urlencodedaccept-coding = gzip, défleser-agent = mozilla / 4.0 (compatible; msie8.0; windows nt 6.1; wow64; trident / 4.0; scc2; .net Clr 2,0.50727; .net CLR3.5.50 3.0.30729;
3. Obtenez l'en-tête de demande HTTP en action
Dans la classe d'action, l'objet HttpServletRequest est obtenu via l'interface ServletRequestaware, puis les informations d'en-tête que nous voulons sont obtenues via la méthode Getheader.
Classe abstraite publique BaseAction <paramvo étend BasEparamvo, ResultVo étend BaseResultVo> ActionSUpport implémente ServLetRequestAware {chaîne finale statique privée ajax_result_name = "ajaxResult"; chaîne finale statique privée xhr_object_name = "xmlhttprequest"; chaîne finale statique privée en tête_request_with = "x-requied-with"; / ** * Objet de demande, utilisé pour déterminer si la demande est une demande Ajax Call * / Private HttpServletRequest; Paramvo privé paramvo; Resultime privé ResultimeVO; @Override public String execute () {String resultPage = Success; try {resultVo = doExecute (paramvo); } catch (BasEException e) {resultPage = error; } if (xhr_object_name.equals (request.getheader (header_request_with))) {resultPage = ajax_result_name; } return resultPage; }} Struts2 Performance Tuning Interceptor
Lorsque nous devons répondre à certains petits besoins dans notre travail, nous pourrions aussi bien mener une simple enquête pour voir si le cadre open source que nous utilisons a déjà les fonctions dont nous avons besoin, afin que nous n'ayons pas à inventer à plusieurs reprises la roue.
Prenons des tests de performances comme exemple pour voir comment déterminer si le cadre Struts2 a cette fonction.
1. Struts-default.xml
Étant donné que de nombreuses fonctions principales de Struts2 sont mises en œuvre sur la base d'intercepteurs internes, nous devons d'abord voir s'il a des intercepteurs liés au réglage des performances. Cela vous oblige à vérifier le fichier de configuration par défaut Struts-default.xml dans Strut2-core-2.3.1.2.jar.
<span style = "White-Space: pre"> </ span> <interceptor name = "alias" /> <interceptor name = "Autowiring" /> <interceptor name = "chain" /> <interceptor name = "ConversionError" /> <interceptor name = "cooking" /> <interceptor name = "ClearSession" /> <interceptor name = "CreateSession" <interceptor name = "execandwait" /> <interceptor name = "exec" /> <interceptor name = "execandwait" /> <interceptornameInterceptorName = "exception" /> <interceptor name = "exception" /> <interceptor name = "fileupload" /> <interceptor name = "i18n" /> <interceptor name = "logger" /> <intercepteur nom <interceptor name = "ScopedModeLriven" /> <interceptor name = "params" /> <interceptor name = "ActionMappingParams" /> <interceptor name = "prépare" /> <interceptor name = "staticparams" /> <interceptor name = "scope" /> <interceptor name = "servletcong" /> <interceptor name = "Timber" /> <interceptor " name = "timer" /> <interceptor name = "name =" token "/> <interceptor name =" tokensse "/> <interceptor name =" validation "/> <interceptor name =" workflow "/> <interceptor name =" store "/> <interceptor name =" coussin "/> <interceptor name =" profil name = "annotationworkflow" /> <interceptor name = "Multiselect" />
Struts2 a de nombreux intercepteurs intégrés comme un coffre au trésor. Vous pouvez voir que le profilage est probablement un intercepteur qui répond à nos besoins. Ouvrez ensuite le code source et découvrez maintenant.
2. ProfilenactivationInterceptor
org.apache.struts2.interceptor.profilingactivationInterceptor.java
classe publique ProfilantActivationInterceptor étendAbstractInterceptor {private String ProfilKKey = "Profil"; Devmode booléen privé; @Inject (strutsconstants.struts_devmode) public void setDevMode (mode string) {this.devmode = "true" .equals (mode); } @Override public String Intercept (ActionInvocationInvocation) lève l'exception {if (devmode) {object val = invocation.getInvocationContext (). GetParameters (). Get (ProfilKKey); if (val! = null) {String sval = (Val instanceof String? (String) val: ((string []) val) [0]); booléen active = "Oui" .EqualSignoreCase (sval) || "true" .equalsignorecase (sval); Ultimerstack.setActive (activer); invocation.getInvocationContext (). getParameters (). Suppter (ProfilingKey); }} return invocation.invoke (); }}
À partir du code source, nous pouvons voir que tant que les paramètres de demande HTTP envoyés par le navigateur incluent le profilage = true ou oui, l'intercepteur de performance activera la classe d'outils de minuterie et imprimera le temps d'exécution de l'action.
3. struts.xml
Étant donné que l'intercepteur de profilage n'est pas inclus dans la valeur par défaut defaultStack, nous devons d'abord l'ajoutant à notre pile d'intercepteur personnalisée.
<package name = "ajax-default" étend = "Velocity-default"> <setult-type> <result-type name = "json" /> </sult-type> <interceptors> <interceptor-stacknameInterceptor-stackname = "ajaxInterceptorStack"> <interceptor-refnameterceptor-refname = "defaultstack"> <interceptor-refnameterceptor-refname = "parkingstack"> <Interceptor-Refnameterceptor-Refname = "DAU l'aPar name = "Profil" /> </ interceptor-stack> </ interceptors> <default-interceptor-refnamedefault-interceptor-refname = "ajaxInterceptOrStack" /> <global-résiltes> <résultat name = "ComajaxResult" type = "JSON"> <param name " name = "ignorehierarchy"> false </ param> </sult> </lobal-résults> </package>
4. userView.js
Vous pouvez maintenant modifier les paramètres d'appel AJAX, puis ajouter les paramètres de profilage pour démarrer le réglage des performances.
fonction searchaluser () {jQuery.ajax ({type: "Post", URL: "searchaluser.action", processData: true, dataType: 'json', data: jQuery ("# userQueryform"). serialize () + "& Profilation = oui", Success: function (data) {if (data.status == 1) {alert) "); GenerateTableFromJSON ("Result", Data.Resultrows);} else {alert ("Create Faich");}}}); }
5. Effet final
Le résultat de l'impression est le suivant. En plus du temps d'exécution total, le temps d'exécution de la méthode d'action et le temps de rendu des résultats sont répertoriés séparément.