strut2は、それがajax呼び出しであるかどうかを決定します
1。Ajaxおよび従来の形式
実際、どちらも通常、httpを介した投稿リクエストです。違いは、ブラウザがフォームフォームを送信した後、サーバーが完全なHTMLページを返すことを期待することです。 ajaxコールはxmlhttprequestオブジェクトによって発行されます(異なるブラウザーは異なる場合があります)。ブラウザは、サーバーがHTMLフラグメントを返すことを期待していますが、JSON、XMLなどの要件はありません。ブラウザに戻った後の使用方法は、JSスクリプト自体によっても決定されます。
2。リクエストajaxです
サーバー側の場合、HTTP要求がAJAX呼び出しであるかどうかを判断するにはどうすればよいですか?これには、HTTPヘッダーが必要です。
ヘッダーのX-Requestで判断することができます。さまざまなブラウザがAjaxを送信するものは異なるオブジェクトを要求しますが、jQueryがAJAXリクエストを送信するために使用する場合、jQueryがAjaxを内部的に実装するときに識別子が追加されています。 jQueryソースコードは次のとおりです。xhr.setRequestheader( "x-requested-with"、 "xmlhttprequest");
したがって、プロジェクトのフロントエンドページがjQueryを介してajaxリクエストを送信する場合、この判断は安全です。
以下は、HTTPリクエストによって伝達されるヘッダー情報です。
通常のフォームフォームの提出
=== mimeheaders === accept = */ *referer = http:// localhost:8080/user2/toquerypage.actionaccept-language = zh-cnuser-agent = mozilla/4.0(互換; msie8.0; windows nt 6.1; wow64; trididen CLR3.5.30729;
ajaxコール(すなわち)
=== mimeheaders === x-requested-with = xmlhttprequestaccept-language = zh-cnreferer = http:// localhost:8080/user2/toquerypage.actionaccept = application/json、text/javascript、*/*; Q = 0.01Content-Type = application/x-www-form-urlencodedaccept-encoding = gzip、deflateuser-agent = mozilla/4.0(互換; msie8.0; windows nt 6.1; wow64; trident/4.0; slcc2; .net clr 2.0.50727; .net 3.0.30729;
3. HTTPリクエストヘッダーを取得します
アクションクラスでは、httpservletrequestオブジェクトはservletrequestawareインターフェイスを介して取得され、希望するヘッダー情報はgetheaderメソッドを介して取得されます。
パブリックアブストラクトクラスのベースアクト<paramvo extends baseparamvo、rescourdvo extends baseeresultvo> extends actionsupport emptorts 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"; / ***リクエストオブジェクト。リクエストがajax呼び出しであるかどうかを判断するために使用されます*/ private httpservletrequestリクエスト。プライベートパラマボパラマボ; private rescturevo rescturevo; @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> <インターセプター名= "エイリアス"/> <インターセプター名= "autowiring"/> <interceptor name = "Chain"/> <インターセプター名= "ConventionError"/> <インターセプター名= "Cookie"/>> <インターセプター名= "creatcers"/> <interpector = <"/>>> <インターセプター名= "execandwait"/> <インターセプター名= "exec"/> <interceptor name = "execandwait"/> <interceptornameinterceptorname = "例外"/> <インターセプター名= "例外"/> <インターセプター= "fileupload"/> <インターセプター名= " name = "ModelDriven"/> <インターセプター名= "ScopedModeldriven"/> <Interceptor name = "params"/> <Interceptor name = "ActionMappingParams"/> <インターセプター名= "Prepare"/> <インターセプター名= "StaticParams"/>> <インターセプター= "scope"/> <interpector = <interpector name "/> <interpector name"/> <interpector name "/> name = "Timer"/> <インターセプター名= "タイマー"/> <インターセプター名= "name =" token "/> <インターセプター名="トークンセッション "/> <インターセプター名="検証 "/> <ワークフロー"/>> <インターセプター名= "store"/> <インターセプター= " name = "役割" /> <インターセプターname = "annotationworkflow" /> <インターセプターname = "multiselect" />
Struts2には、宝箱のように多くのインターセプターが組み込まれています。プロファイリングは、おそらく私たちのニーズを満たすインターセプターであることがわかります。次に、ソースコードを開き、今すぐ確認します。
2。profilingactivationInterceptor
org.apache.struts2.interceptor.profilingactivationIvationInterceptor.java
パブリッククラスProfiLingActivationIvationInterceptor extendSabstractInterceptor {private string profilingkey = "profiling";プライベートブール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 = valocation.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 ichvocation.invoke(); }}
ソースコードから、ブラウザによって送信されたHTTP要求パラメーターにプロファイリング= trueまたははいが含まれる限り、パフォーマンスインターセプターがタイマーツールクラスをオンにし、アクションの実行時間を印刷することがわかります。
3。Struts.xml
プロファイリングインターセプターはデフォルトのDefaultStackに含まれていないため、まずカスタムインターセプタースタックに追加する必要があります。
<package name="ajax-default" extends="velocity-default"> <result-types> <result-type name="json"/> </result-types> <interceptors> <interceptor-stacknameinterceptor-stackname="ajaxInterceptorStack"> <interceptor-refnameinterceptor-refname="defaultStack" /> <interceptor-ref name = "profialing"/> </interceptor-stack> </interceptors> <default-interceptor-refnamedefault-interceptor-refname = "ajaxinterceptorStack"/> <global-results> <result name = "comajaxresult" type = "json"> <param name = "from </parm </parm </parm </parm </parm </< name = "Ignorehierarchy"> false </param> </result> </global-results> </package>
4。USERVIEW.JS
これで、AJAXコールパラメーターを変更してから、プロファイリングパラメーターを追加してパフォーマンスチューニングを開始できます。
function searchalluser(){jquery.ajax({type: "post"、url: "searchalluser.action"、processdata:true、datape: 'json'、data:jquery( "#userqueryform")。 GenerateTableFromJson(datas.resultrows); }
5。最終効果
印刷の結果は次のとおりです。総実行時間に加えて、アクション方法の実行時間と結果のレンダリング時間は個別にリストされます。