Maison  >  Article  >  Java  >  Déterminez s'il faut appeler AJAX dans Struts de Java et utiliser des intercepteurs pour l'optimiser

Déterminez s'il faut appeler AJAX dans Struts de Java et utiliser des intercepteurs pour l'optimiser

高洛峰
高洛峰original
2017-01-09 14:22:401388parcourir

Strut2 détermine s'il s'agit d'un appel AJAX
1 AJAX et Form traditionnel
En fait, les deux sont généralement des requêtes POST via HTTP. La différence est qu'une fois 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 (les différents navigateurs peuvent être différents). Le navigateur s'attend à ce que le serveur renvoie un fragment HTML. Plus précisément, il n'y a aucune exigence pour JSON, XML, etc. La manière de l'utiliser après le retour au navigateur est également déterminée par le script JS lui-même.

2. Si la requête est AJAX
Donc côté serveur, comment déterminer si une requête HTTP est un appel AJAX ? Cela nécessite de regarder l'en-tête HTTP.

Nous pouvons juger par x-request-with dans l'en-tête. Bien que différents navigateurs envoient des requêtes AJAX à différents objets, si jQuery est utilisé pour envoyer des requêtes AJAX, l'identifiant a été ajouté lorsque jQuery implémente ajax en interne. Le code source de jQuery ressemble à ceci : xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
Par conséquent, si la page frontale du projet envoie des requêtes AJAX via jQuery, ce jugement est sûr.

Ce qui suit sont les informations d'en-tête portées par la requête HTTP.

Soumission sous forme normale

===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

Appel AJAX (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. l'en-tête de requête HTTP dans Action
Dans la classe Action, obtenez l'objet HttpServletRequest via l'interface ServletRequestAware, puis obtenez les informations d'en-tête souhaitées via la méthode getHeader.

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
Lorsque nous devons mettre en œuvre quelques petites exigences au travail, autant mener d'abord une simple enquête Voir. si le framework open source que vous utilisez possède déjà les fonctionnalités dont nous avons besoin, vous n'avez donc pas à réinventer la roue.
Prenons les tests de performances comme exemple pour voir comment déterminer si le framework Struts2 a cette fonction.

1. struts-default.xml

Étant donné que de nombreuses fonctions principales de Struts2 sont implémentées sur la base d'intercepteurs internes, nous devons d'abord voir s'il dispose d'un dispositif d'interception lié au réglage des performances. Cela nécessite de 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" 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 possède de nombreux intercepteurs intégrés comme un coffre au trésor. Vous pouvez voir que le profilage est probablement l'intercepteur qui répond à nos besoins, alors ouvrez-le. Maintenant, consultez le code source.

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();
   
  }
   
}


Comme le montre le code source, tant que les paramètres de requête HTTP envoyés par le navigateur contiennent profiling=true ou yes, l'intercepteur de performances ouvrira la classe d'outils Timer 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 le defaultStack par défaut, nous devons d'abord l'ajouter à notre pile d'intercepteur personnalisée.

<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

Vous pouvez maintenant modifier les paramètres d'appel AJAX et ajouter des paramètres de profilage pour démarrer le réglage des performances.

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("创建失败");
    }
    }
  });
}


5. L'effet final

Le résultat imprimé est le suivant. En plus du temps d'exécution total, le temps d'exécution de la méthode Action et le temps de rendu du Résultat seront répertoriés séparément.

Déterminez sil faut appeler AJAX dans Struts de Java et utiliser des intercepteurs pour loptimiser


Pour plus d'articles sur la façon de déterminer s'il faut appeler AJAX dans Struts de Java et utiliser des intercepteurs pour l'optimiser, veuillez faire attention au PHP Site chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn