Heim >Java >javaLernprogramm >Bestimmen Sie, ob AJAX in Javas Struts aufgerufen werden soll, und verwenden Sie Interceptoren, um es zu optimieren
Strut2 bestimmt, ob es sich um einen AJAX-Aufruf handelt
1 AJAX und traditionelle Form
Tatsächlich handelt es sich bei beiden im Allgemeinen um POST-Anfragen über HTTP. Der Unterschied besteht darin, dass der Browser nach dem Absenden des Formulars erwartet, dass der Server eine vollständige HTML-Seite zurückgibt. Der AJAX-Aufruf wird vom XMLHttpRequest-Objekt ausgegeben (verschiedene Browser können unterschiedlich sein). Der Browser erwartet, dass der Server ein HTML-Fragment zurückgibt. Es gibt keine Anforderungen für JSON, XML usw. Wie es nach der Rückkehr zum Browser verwendet wird, wird auch vom JS-Skript selbst bestimmt.
2. Ob die Anfrage AJAX ist
Wie kann man also serverseitig feststellen, ob eine HTTP-Anfrage ein AJAX-Aufruf ist? Dazu ist ein Blick auf den HTTP-Header erforderlich.
Wir können anhand des x-request-with im Header beurteilen. Obwohl verschiedene Browser AJAX-Anfragen an unterschiedliche Objekte senden, wird die Kennung hinzugefügt, wenn jQuery zum Senden von AJAX-Anfragen verwendet wird, wenn jQuery Ajax intern implementiert. Der jQuery-Quellcode sieht folgendermaßen aus: xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); Wenn die Front-End-Seite des Projekts daher AJAX-Anfragen über jQuery sendet, ist diese Beurteilung sicher.
Das Folgende sind die Header-Informationen, die von der HTTP-Anfrage übertragen werden.
Normale Formularübermittlung
===MimeHeaders === accept = */* referer =http://localhost:8080/user2/toQueryPage.action accept-language = zh-CN user-agent = Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C;.NET4.0E) accept-encoding = gzip, deflate host = localhost:8080 connection = Keep-Alive cache-control = no-cacheAJAX-Aufruf (IE)
===MimeHeaders === x-requested-with = XMLHttpRequest accept-language = zh-cn referer =http://localhost:8080/user2/toQueryPage.action accept = application/json, text/javascript,*/*; q=0.01 content-type =application/x-www-form-urlencoded accept-encoding = gzip, deflate user-agent = Mozilla/4.0 (compatible; MSIE8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C;.NET4.0E) host = localhost:8080 content-length = 57 connection = Keep-Alive cache-control = no-cache
3 der HTTP-Anforderungsheader in Action
Rufen Sie in der Action-Klasse das HttpServletRequest-Objekt über die ServletRequestAware-Schnittstelle ab und rufen Sie dann die gewünschten Header-Informationen über die getHeader-Methode ab.
public abstract class BaseAction <ParamVo extends BaseParamVo, ResultVo extends BaseResultVo> extends ActionSupport implements ServletRequestAware { private static final String AJAX_RESULT_NAME = "ajaxResult"; private static final String XHR_OBJECT_NAME = "XMLHttpRequest"; private static final String HEADER_REQUEST_WITH = "x-requested-with"; /** * Request对象,用来判断请求是否是AJAX调用 */ private HttpServletRequest request; private ParamVo paramVo; private ResultVo resultVo; @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
Wenn wir bei der Arbeit einige kleine Anforderungen umsetzen müssen, können wir genauso gut zuerst eine einfache Umfrage durchführen Wenn das von Ihnen verwendete Open-Source-Framework bereits über die von uns benötigte Funktionalität verfügt, müssen Sie das Rad nicht neu erfinden.
Nehmen wir als Beispiel Leistungstests, um zu sehen, wie wir untersuchen können, ob das Struts2-Framework über diese Funktion verfügt.
<span style="white-space:pre"> </span><interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/> <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" /> <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" /> <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /> <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> <interceptornameinterceptorname="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/> <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/> <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/> <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/> <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/> <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/> <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/> <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/> <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" /> <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" /> <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /> <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" /> <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" /> <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />Struts2 verfügt über viele integrierte Abfangjäger wie eine Schatzkiste. Sie sehen, dass Profiling wahrscheinlich der Abfangjäger ist, der unseren Anforderungen entspricht. Öffnen Sie ihn also Schauen Sie sich jetzt den Quellcode an.
2. ProfilingActivationInterceptor
public class ProfilingActivationInterceptor extendsAbstractInterceptor { private String profilingKey = "profiling"; private boolean devMode; @Inject(StrutsConstants.STRUTS_DEVMODE) public void setDevMode(String mode) { this.devMode = "true".equals(mode); } @Override public String intercept(ActionInvocationinvocation) throws Exception { if (devMode) { Object val =invocation.getInvocationContext().getParameters().get(profilingKey); if (val != null) { String sval = (val instanceof String ?(String)val : ((String[])val)[0]); boolean enable = "yes".equalsIgnoreCase(sval)|| "true".equalsIgnoreCase(sval); UtilTimerStack.setActive(enable); invocation.getInvocationContext().getParameters().remove(profilingKey); } } return invocation.invoke(); } }
Aus dem Quellcode ist ersichtlich, dass der Leistungsinterceptor die Timer-Toolklasse öffnet und die Ausführungszeit der Aktion ausgibt, solange die vom Browser gesendeten HTTP-Anforderungsparameter profiling = true oder ja enthalten.
<package name="ajax-default" extends="velocity-default"> <result-types> <result-type name="json" class="org.apache.struts2.json.JSONResult"/> </result-types> <interceptors> <interceptor-stacknameinterceptor-stackname="ajaxInterceptorStack"> <interceptor-refnameinterceptor-refname="defaultStack" /> <interceptor-ref name="profiling"/> </interceptor-stack> </interceptors> <default-interceptor-refnamedefault-interceptor-refname="ajaxInterceptorStack" /> <global-results> <result name="comAjaxResult" type="json"> <param name="excludeNullProperties">true</param> <param name="root">result</param> <param name="ignoreHierarchy">false</param> </result> </global-results> </package>4. userview.jsSie können jetzt die AJAX-Aufrufparameter ändern und Profilierungsparameter hinzufügen, um mit der Leistungsoptimierung zu beginnen.
function searchAllUser(){ jQuery.ajax({ type:"post", url: "searchAllUser.action", processData:true, dataType:'json', data:jQuery("#userQueryForm").serialize() + "&profiling=yes", success:function(data) { if (data.status == 1) { alert("创建成功"); generateTableFromJson("result", data.resultRows); } else { alert("创建失败"); } } }); }
Der Endeffekt
Das gedruckte Ergebnis ist wie folgt. Zusätzlich zur Gesamtausführungszeit werden die Ausführungszeit der Aktionsmethode und die Renderzeit des Ergebnisses separat aufgeführt.