Strut2 bestimmt, ob es sich um einen Ajax -Anruf handelt
1. Ajax und traditionelle Formformen
In der Tat sind beide im Allgemeinen nach HTTP -Anfragen nach Anfragen. Der Unterschied besteht darin, dass nach dem Einreichen des Formulars des Browsers erwartet wird, dass der Server eine vollständige HTML -Seite zurückgibt. Der AJAX -Aufruf wird vom XMLHTTPREQUEST -Objekt ausgestellt (verschiedene Browser können unterschiedlich sein). Der Browser erwartet, dass der Server HTML -Fragmente zurückgibt. Es gibt jedoch keine Anforderungen an JSON, XML usw. Die Verwendung nach der Rückkehr zum Browser wird auch vom JS -Skript selbst bestimmt.
2. Ist die Anfrage Ajax
Wie können Sie für die Serverseite feststellen, ob eine HTTP -Anforderung ein AJAX -Anruf ist? Dies erfordert den HTTP -Header.
Wir können nach dem X-Request-Mit--im Header beurteilen. Obwohl verschiedene Browser AJAX -Anforderungen verschiedener Objekte senden, wurde die Kennung hinzugefügt, wenn JQuery AJAX -Anforderungen sendet, wenn JQuery AJAX intern implementiert. Der JQuery-Quellcode lautet wie folgt: xhr.setRequestheader ("X-Requested-with", "XmlhttpRequest");
Wenn die Front-End-Seiten des Projekts AJAX-Anfragen über JQuery senden, ist dieses Urteil sicher.
Nachfolgend finden Sie die Headerinformationen, die von HTTP -Anfragen übernommen wurden.
Einreichung von Normalformformular
=== Mimeheaders === Akzeptieren = */ *referer = http: // localhost: 8080/user2/toquerypage.ActionAccept-Sprache = ZH-CNUSER-Agent = Mozilla/4.0 (kompatibel; msie8.0; Windows NT 6.1; WOW64; TRIDER/4.0; SLCC2; SLCC2; CLR3.5.30729;
Ajax Call (dh)
=== Mimeheaders === x-requestiert-with = xmlhttprequestaccept-language = zh-cnreferer = http: // localhost: 8080/user2/toquerypage.actionaccept = application/json, text/javaScript,*/*; q = 0,01Content-Typ = Anwendung/x-www-form-urlencodedaccept-codieren = gzip, Deflateuser-Agent = Mozilla/4,0 (kompatibel; MSIE8.0; Windows NT 6,1; WOW64; Trident/4.0; 3.0.30729;
3. erhalten Sie HTTP -Anforderungsheader in Aktion
In der Aktionsklasse wird das HttpServletRequest -Objekt über die ServletRequestaware -Schnittstelle erhalten, und dann werden die von uns gewünschten Headerinformationen durch die Getheader -Methode erhalten.
public abstract Class Baseacction <paramvo erweitert BaseParamvo, resultVo erweitert Basisultevo> erweitert die ActionVorts -Implementierung servletRequestaware {private statische endgültige Zeichenfolge ajax_result_name = "ajaxresult"; private statische endgültige Zeichenfolge xhr_object_name = "xmlhttprequest"; private statische endgültige String-Header_request_with = "X-Requested-with"; / *** Anforderungsobjekt, verwendet, um festzustellen, ob die Anforderung ein AJAX -Anruf ist*/ private httpServletRequest -Anforderung; private paramvo paramvo; private resultvo resultvo; @Override public String execute () {String resultPage = Erfolg; 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
Wenn wir in unserer Arbeit bestimmte kleine Bedürfnisse erfüllen müssen, können wir genauso gut eine einfache Umfrage durchführen, um festzustellen, ob das von uns verwendete Open -Source -Framework bereits über die Funktionen verfügt, die wir benötigen, damit wir das Rad nicht wiederholt erfinden müssen.
Nehmen wir Leistungstests als Beispiel durch, um zu untersuchen, ob das Struts2 -Framework diese Funktion hat.
1. Struts-Default.xml
Da viele der Kernfunktionen von STRUTS2 basierend auf internen Interceptors implementiert sind, müssen wir zunächst feststellen, ob es mit leistungsstimmungsbedingten Interceptors mit leistungsstimmungsbedingten Tuning verfügt. Auf diese Weise müssen Sie die Standardkonfigurationsdatei struts-default.xml in Strut2-core-2.3.1.2.jar überprüfen.
<span style = "White-Space: PRE"> </span> <interceptor name = "alias"/> <interceptor name = "autowiring"/> <interceptor name = "ketten"/> <interceptor name = "ConversionError"/> <Interceptor name = "Cookie"/> <Interceptor Name "ClearSession"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> < <interceptor name="execAndWait"/> <interceptor name="exec"/> <interceptor name="execAndWait"/> <interceptornameinterceptorname="exception"/> <interceptor name="exception"/> <interceptor name="fileUpload"/> <interceptor name="i18n"/> <interceptor name="logger"/> <interceptor name="modelDriven"/> <interceptor name="scopedModelDriven"/> <interceptor name="params"/> <interceptor name="actionMappingParams"/> <interceptor name="prepare"/> <interceptor name="staticParams"/> <interceptor name="scope"/> <interceptor name="servletConfig"/> <interceptor name="timer"/> <interceptor name = "timer"/> <interceptor name = "name =" token "/> <interceptor name =" tokensession "/> <interceptor name =" validation "/> <interceptor name =" Workflow "/> <Interceptor name =" Story "/> <Interceptor name =" checkbox "/> <Interceptor name"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/> <"/"/> <"/"/> < name = "AnnotationWorkflow" /> <interceptor name = "multiselect" />
Struts2 hat viele Interceptors wie eine Schatzkiste. Sie können sehen, dass Profiling wahrscheinlich ein Interceptor ist, der unseren Bedürfnissen entspricht. Öffnen Sie dann den Quellcode und finden Sie es jetzt heraus.
2. Profilingaktivierungsinterceptor
org.apache.struts2.Interceptor.profilingActivationInterceptor.java
PUBLIC CLASS -ProfilingActivationInterceptor ExtendSAbStractInterceptor {private String profilingKey = "Profiling"; privat boolean devMode; @Inject (strutsConstants.struts_devMode) public void setDevMode (String -Modus) {this.devMode = "true" .equals (modus); } @Override public String intercept (actionInvocationInvocation) löst eine Ausnahme aus {if (devMode) {Object val = invocation.getInvocationContext (). GetParameters (). Get (ProfilingKey); if (val! boolean enable = "yes" .equalSignoreCase (SVAL) || "wahr" .EqualSignoreCase (SVAL); UtiltImseStack.setActive (aktivieren); invocation.getInvocationContext (). getParameters (). Remove (ProfilingKey); }} return Invocation.invoke (); }}
Aus dem Quellcode können wir feststellen, dass der vom Browser gesendete HTTP -Anforderungsparameter Profiling = True oder Ja, der Performance -Interceptor die Timer -Toolklasse einschaltet und die Ausführungszeit der Aktion ausdruckt.
3.. Struts.xml
Da der Profiling -Interceptor nicht im Standard -Standardstack enthalten ist, müssen wir ihn zunächst an unseren benutzerdefinierten Interceptor -Stack anhängen.
<package name = "ajax-default" extends = "velocity-Default"> <result-types> <result-type name = "json"/> </result-types> <interceptors <interceptor-ref name = "Profiling"/> </interceptor-stack> </interceptors> <Standard-Interceptor-refnamedefault-interceptor-refname = "ajaxInterceptorStack"/> <global-results name = "root"> result </param> <param name = "ignorehierarchy"> false </param> </result> </global-results> </package>
4. UserView.js
Sie können jetzt die AJAX -Aufrufparameter ändern und dann die Profilerierungsparameter hinzufügen, um die Leistungsstimmung zu starten.
Function SearchAlluser () {jQuery.ajax ({Typ: "post", url: "searchAlluser.action", processData: true, dataType: 'json', data: jQuery ("#userQueryForm"). serialize () + "& provisioning = yes", erfolgreich: Funktion (data) {if (Data). GeneratEtableFromjson ("Ergebnis", Data.Resultrows); }
5. Endwirkung
Das Druckergebnis ist wie folgt. Zusätzlich zur Gesamtausführungszeit werden die Ausführungszeit der Aktionsmethode und die Renderzeit der Ergebnisse separat aufgeführt.