Heim >Java >javaLernprogramm >Bestimmen Sie, ob AJAX in Javas Struts aufgerufen werden soll, und verwenden Sie Interceptoren, um es zu optimieren

Bestimmen Sie, ob AJAX in Javas Struts aufgerufen werden soll, und verwenden Sie Interceptoren, um es zu optimieren

高洛峰
高洛峰Original
2017-01-09 14:22:401426Durchsuche

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-cache
AJAX-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.

1. struts-default.xml

Da viele der Kernfunktionen von Struts2 auf der Grundlage interner Interceptoren implementiert sind, müssen wir zunächst prüfen, ob es über ein Abfanggerät für die Leistungsoptimierung verfügt. Dies erfordert die Überprüfung der Standardkonfigurationsdatei struts-default.xml in strut2-core-2.3.1.2.jar.

<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

org.apache.struts2.interceptor.ProfilingActivationInterceptor.java

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.

3. struts.xml

Da der Profiling-Interceptor nicht im Standard-DefaultStack enthalten ist, müssen wir ihn zuerst an unseren benutzerdefinierten Interceptor-Stack anhängen.

<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.js

Sie 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:&#39;json&#39;,
    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.

Bestimmen Sie, ob AJAX in Javas Struts aufgerufen werden soll, und verwenden Sie Interceptoren, um es zu optimieren


Weitere verwandte Artikel zum Bestimmen, ob AJAX in Javas Struts aufgerufen werden soll, und zum Verwenden von Interceptoren zur Optimierung beachten Sie bitte PHP Chinesische Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn