ホームページ  >  記事  >  Java  >  Java の Struts で AJAX を呼び出し、インターセプターを使用して最適化するかどうかを決定します。

Java の Struts で AJAX を呼び出し、インターセプターを使用して最適化するかどうかを決定します。

高洛峰
高洛峰オリジナル
2017-01-09 14:22:401388ブラウズ

Strut2 は、AJAX 呼び出しであるかどうかを決定します
1. AJAX と従来のフォーム フォーム
実際には、どちらも通常、HTTP を介した POST リクエストです。違いは、ブラウザがフォームを送信した後、サーバーが完全な HTML ページを返すことを期待していることです。 AJAX 呼び出しは XMLHttpRequest オブジェクトによって発行されます (ブラウザーによって異なる場合があります)。特に、JSON、XML などの要件はありません。ブラウザに戻った後の使い方もJSスクリプト自体によって決まります。

2. リクエストが AJAX かどうか
それでは、サーバー側では、HTTP リクエストが AJAX 呼び出しであるかどうかを判断するにはどうすればよいでしょうか?これには、HTTP ヘッダーを確認する必要があります。

ヘッダーのx-request-withで判断できます。ブラウザーによって AJAX リクエストが異なるオブジェクトに送信されますが、AJAX リクエストの送信に jQuery が使用されている場合、jQuery が内部的に ajax を実装するときに識別子が追加されます。 jQuery のソース コードは次のようになります: xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
したがって、プロジェクトのフロントエンド ページが jQuery を通じて AJAX リクエストを送信する場合、この判断は安全です。

以下は、HTTP リクエストによって伝送されるヘッダー情報です。

通常のフォーム送信

===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 呼び出し (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. Action で HTTP リクエスト ヘッダーを取得します
Action クラスで、ServletRequestAware インターフェイスを介して HttpServletRequest オブジェクトを取得し、処理を完了します。 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 パフォーマンス チューニング インターセプター
仕事でいくつかの小さな要件を実装する必要がある場合、最初に簡単な調査を行って、使用しているオープンソース フレームワークに必要な機能が既にあるかどうかを確認するとよいでしょう。車輪を再発明する必要はありません。
パフォーマンス テストを例として、Struts2 フレームワークにこの機能があるかどうかを調査する方法を見てみましょう。

1. struts-default.xml

Struts2 の多くのコア機能は内部インターセプターに基づいて実装されているため、最初にパフォーマンス チューニングに関連するインターセプターがあるかどうかを確認する必要があります。これには、strut2-core-2.3.1.2.jar 内のデフォルト構成ファイル struts-default.xml を確認する必要があります。

<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 は、多くのインターセプターが組み込まれた宝箱のようなものです。プロファイリングがおそらく私たちのニーズを満たすインターセプターであることがわかります。それでは、ソース コードを開いて確認してください。

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


ブラウザによって送信された HTTP リクエストパラメータに profiling=true が含まれている限りまたははい。パフォーマンス インターセプターはタイマー ツール クラスを開き、アクションの実行時間を出力します。

3. struts.xml

プロファイリング インターセプターはデフォルトの defaultStack に含まれていないため、最初にカスタム インターセプター スタックに追加する必要があります。

<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

これで、AJAX 呼び出しパラメーターを変更し、プロファイリング パラメーターを追加して、パフォーマンス チューニングを開始できます。

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. 最終的な効果

印刷結果は以下の通りです。合計実行時間に加えて、Action メソッドの実行時間と Result のレンダリング時間が個別にリストされます。

Java の Struts で AJAX を呼び出し、インターセプターを使用して最適化するかどうかを決定します。


Java の Struts で AJAX を呼び出すかどうかの決定とインターセプターを使用した最適化に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。