تحدد Strut2 ما إذا كانت مكالمة Ajax
1. أشكال Ajax و Form التقليدية
في الواقع ، كلاهما عادة ما يكون الطلبات عبر HTTP. الفرق هو أنه بعد أن يقدم المتصفح نموذج النموذج ، يتوقع أن يقوم الخادم بإرجاع صفحة HTML كاملة. يتم إصدار مكالمة AJAX بواسطة كائن XMLHTTPrequest (قد تكون المتصفحات المختلفة مختلفة). يتوقع المتصفح أن يقوم الخادم بإرجاع شظايا HTML ، ولكن لا توجد متطلبات لـ JSON و XML ، وما إلى ذلك. يتم تحديد كيفية استخدامه بعد العودة إلى المتصفح أيضًا بواسطة البرنامج النصي JS نفسه.
2. هل طلب أياكس
لذلك بالنسبة لجانب الخادم ، كيفية تحديد ما إذا كان طلب HTTP هو مكالمة AJAX؟ هذا يتطلب رأس HTTP.
يمكننا الحكم على X-request-with في الرأس. على الرغم من أن المتصفحات المختلفة ترسل طلبات Ajax كائنات مختلفة ، إذا كان JQuery يستخدم لإرسال طلبات AJAX ، فقد تمت إضافة المعرف عندما ينفذ jQuery Ajax داخليًا. رمز مصدر jQuery هو كما يلي: XHR.SetRequestHeader ("X-requested-With" ، "XmlHttprequest") ؛
لذلك ، إذا أرسلت الصفحات الأمامية للمشروع طلبات Ajax من خلال jQuery ، فإن هذا الحكم آمن.
فيما يلي معلومات الرأس التي تنقلها طلبات HTTP.
تقديم النموذج العادي
=== MimeHeaders === قبول = */ *ender = http: // localhost: 8080/user2/toquerypage.actionAccept-language = Zh-Cnuser-Agent = Mozilla/4.0 (clr 2.072 ؛ CLR3.5.30729
مكالمة AJAX (أي)
=== MimeHeaders === x-requested-with = xmlhttprequestaccept-language = zh-cnreferer = http: // localhost: 8080/user2/toquerypage.actionaccept = application/json ، text/javaScript ،*/*؛ q = 0.01-content-type = application/x-www-form-urlencodedaccept-encoding = gzip ، diflateuser-agent = mozilla/4.0 (متوافق ؛ msie8.0 ؛ 3.0.30729
3. الحصول على رأس طلب HTTP في العمل
في فئة الإجراء ، يتم الحصول على كائن httpservletrequest من خلال واجهة ServleTRequestaware ، ثم يتم الحصول على معلومات الرأس التي نريدها من خلال طريقة Getheader.
Public Abstract Class BaseAction <paramvo يمتد BaseParamvo ، يمتد Resultvo Baseresultvo> يمتد ActionSupport على ServleTRequestaware {private Static Final Final Ajax_result_name = "ajaxresult" ؛ Static Final String XHR_OBJECT_NAME = "XMLHTTPREQUEST" ؛ header_request_with = "X-requested-with" ؛ / *** كائن طلب ، يستخدم لتحديد ما إذا كان الطلب هو مكالمة AJAX*/ طلب httpservletrequest الخاص ؛ Private Paramvo Paramvo ؛ نتائج النتائج الخاصة ؛ Override public string execute () {String resultPage = success ؛ حاول {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 يتم تنفيذها بناءً على اعتراضات داخلية ، نحتاج أولاً إلى معرفة ما إذا كان لديه اعتراضات متعلقة بضبط الأداء. هذا يتطلب منك التحقق من دعامات ملف التكوين الافتراضية default.xml في strut2-core-2.3.1.2.jar.
<span style = "white-space: pre"> </span> <interceptor name = "alias"/> <interceptor name = "Autowiring"/> <interceptor name = "chain"/> <interceptor name = "conversionerror"/> <interceptor name = "cookie"/> <interceptor name = <interceptor name = "execandwait"/> <interceptor name = "exec"/> <interceptor name = "execandwait"/> <interceptornameInterceptOrname = "استثناء"/> <اعتراض name = "استثناء"/> <interceptor name = "fileupload"/> <interceptor name = "i18n"/> name = "modelDriven"/> <interceptor name = "scopedModelDriven"/> <interceptor name = "params"/> <interceptor name = "actionMappParams"/> <interceptor name = "prepared"/> <interceptor name = "staticparams"/> <interceptor name = "scope"/> name = "timer"/> <interceptor name = "timer"/> <interceptor name = "name =" token "/> <interceptor name =" tokensession "/> <interceptor name =" valideal "/> <interceptor name =" interceptor "/> <interceptor name = name = "ROLES" /> <interceptor name = "antationworkflow" /> <interceptor name = "multiselect" />
يحتوي Struts2 على العديد من المقاطعات التي تم بناؤها مثل صندوق الكنز. يمكنك أن ترى أن التنميط هو على الأرجح اعتراضًا يلبي احتياجاتنا. ثم افتح رمز المصدر واكتشف الآن.
2. التنسيق التنسيق
org.apache.struts2.Interceptor.profilingActivationInterceptor.java
plugipling classivationInterceptor extendesabstractInterceptor {Private String PirforingKey = "Perfiging" ؛ خاص منطقي DevMode ؛ inject (strutsconstants.struts_devmode) public void setDevMode (mode string) {this.devmode = "true" .equals (mode) ؛ } Override Public String Intercept (ActionInvocationInvocation) يلقي الاستثناء {if (devMode) {Object val = invocation.getInvocationContext (). if (val! = null) {string sval = (val antalyof string؟ (string) val: ((string []) val) [0]) ؛ Boolean Enable = "Yes" .equalsignorecase (SVAL) || "True" .equalsignorecase (SVAL) ؛ utiltimerstack.setactive (enable) ؛ invocation.getInVocationContext (). }} return invocation.invoke () ؛ }}
من الكود المصدري ، يمكننا أن نرى أنه طالما أن معلمات طلب HTTP المرسلة من المتصفح تشمل perfiling = true أو نعم ، سيقوم اعتراض الأداء بتشغيل فئة أداة المؤقت وطباعة وقت تنفيذ الإجراء.
3. Struts.xml
نظرًا لأن اعتراض التوصيف غير مدرج في الافتراضي الافتراضي ، فيجب علينا أولاً إلحاقه بمكدس التقاطع المخصص الخاص بنا.
<package name = "ajax-default" تمتد = "velocity-default"> <result-types> <result-type name = "json"/> </result-types> <interceptors> <interceptor-stackNameInterceptor- stackName = "aJaxInterceptorStack "> name = "perfigiling"/> </interceptor-stack> </2010> <default-interceptor-refnamedefault-interceptor-refname = "ajaxInterceptorStack"/> <global-results> <result name = "comajaxResult" type = json <param name = "trasherhierarchy"> false </param> </sult
4. Userview.js
يمكنك الآن تعديل معلمات مكالمات AJAX ، ثم إضافة معلمات التنميط لبدء ضبط الأداء.
وظيفة SearchAlluser () {jQuery.ajax ({type: "post" ، url: "searchalluser.action" ، processData: true ، datatype: 'json' ، data: jQuery ("#userQueryform"). GenerateTableFromjson ("النتيجة" ، data.resultrows) ؛ }
5. التأثير النهائي
نتيجة الطباعة على النحو التالي. بالإضافة إلى إجمالي وقت التنفيذ ، يتم سرد وقت تنفيذ طريقة الإجراء ووقت تقديم النتائج بشكل منفصل.