strut2 กำหนดว่าเป็นการโทร AJAX
1. รูปแบบ AJAX และแบบดั้งเดิม
ในความเป็นจริงทั้งสองมักจะโพสต์คำขอผ่าน HTTP ความแตกต่างคือหลังจากเบราว์เซอร์ส่งแบบฟอร์มแล้วคาดว่าเซิร์ฟเวอร์จะส่งคืนหน้า HTML ที่สมบูรณ์ การโทร AJAX ออกโดยวัตถุ XMLHTTPREQUEST (เบราว์เซอร์ที่แตกต่างกันอาจแตกต่างกัน) เบราว์เซอร์คาดว่าเซิร์ฟเวอร์จะส่งคืนชิ้นส่วน HTML แต่ไม่มีข้อกำหนดสำหรับ JSON, XML ฯลฯ วิธีการใช้งานหลังจากกลับไปที่เบราว์เซอร์จะถูกกำหนดโดยสคริปต์ JS เอง
2. คือคำขอ AJAX
ดังนั้นสำหรับฝั่งเซิร์ฟเวอร์วิธีการตรวจสอบว่าคำขอ HTTP เป็นสาย AJAX หรือไม่? ต้องใช้ส่วนหัว HTTP
เราสามารถตัดสินได้โดย x-request-with ในส่วนหัว แม้ว่าเบราว์เซอร์ที่แตกต่างกันจะส่งคำขอ AJAX ที่แตกต่างกันหาก jQuery ใช้เพื่อส่งคำขอ AJAX ตัวระบุจะถูกเพิ่มเมื่อ JQuery ใช้ AJAX ภายใน ซอร์สโค้ด jQuery มีดังนี้: XHR.SetRequestheader ("X-Requested-With", "XMLHTTPREQUEST");
ดังนั้นหากหน้าส่วนหน้าของโครงการส่งคำขอ AJAX ผ่าน jQuery การตัดสินนี้ปลอดภัย
ด้านล่างนี้เป็นข้อมูลส่วนหัวที่ดำเนินการโดยคำขอ HTTP
การส่งแบบฟอร์มแบบฟอร์มปกติ
=== MimeHeaders === Accept = */ *ผู้อ้างอิง = http: // localhost: 8080/user2/toQueryPage.actionaccept-language = zh-cnuser-agent = mozilla/4.0 (เข้ากันได้; msie8.0; windows nt 6.1; wow64; CLR3.5.30729;
Ajax Call (เช่น)
=== mimeheaders === x-requested-with = xmlhttprequestaccept-language = zh-cnreferer = http: // localhost: 8080/user2/toQueryPage.ActionAccept = แอปพลิเคชัน/JSON, ข้อความ/javascript,*/*; q = 0.01Content-type = แอปพลิเคชัน/X-WWW-FORM-URLENCODEDACCEPT-ENCODING = GZIP, deflateUser-agent = mozilla/4.0 (เข้ากันได้; msie8.0; windows nt 6.1; wow64; trident/4.0; 3.0.30729;
3. รับส่วนหัวคำขอ HTTP ในการดำเนินการ
ในคลาสแอ็คชั่นวัตถุ HttpservletRequest จะได้รับผ่านอินเตอร์เฟส servletrequestaware จากนั้นข้อมูลส่วนหัวที่เราต้องการจะได้รับผ่านวิธี Getheader
Public Abstract Class Baseaction <Paramvo ขยาย baseparamvo, resultvo ขยาย baseresultvo> ขยาย actionsupport ดำเนินการใช้งาน servletrequestaware {สตริงสุดท้ายคงที่ส่วนตัว ajax_result_name = "ajaxResult"; สตริงสุดท้ายคงที่ส่วนตัว XHR_OBJECT_NAME = "XMLHTTPREQUEST"; header header_request_with = "x-requested-with"; / *** วัตถุคำขอใช้เพื่อตรวจสอบว่าคำขอนั้นเป็นคำขอ AJAX*/ คำขอ HTTPSERVLETREQUEST ส่วนตัวหรือไม่ Paramvo Paramvo ส่วนตัว; Private ResultVo ผลลัพธ์ vo; @Override สตริงสาธารณะ execute () {String resultPage = ความสำเร็จ; ลอง {resultVo = doExecute (paramvo); } catch (baseexception e) {resultPage = ข้อผิดพลาด; } if (xhr_object_name.equals (request.getheader (header_request_with))) {resultpage = ajax_result_name; } return resultpage; - struts2 interceptor การปรับแต่งประสิทธิภาพ
เมื่อเราต้องการบรรลุความต้องการเล็กน้อยในงานของเราเราอาจทำแบบสำรวจง่ายๆเพื่อดูว่าเฟรมเวิร์กโอเพ่นซอร์สที่เราใช้อยู่แล้วมีฟังก์ชั่นที่เราต้องการหรือไม่เพื่อที่เราจะไม่ต้องคิดค้นล้อซ้ำ ๆ
มาทดสอบประสิทธิภาพเป็นตัวอย่างเพื่อดูวิธีการตรวจสอบว่าเฟรมเวิร์ก Struts2 มีฟังก์ชั่นนี้หรือไม่
1. struts-default.xml
เนื่องจากฟังก์ชั่นหลักจำนวนมากของ struts2 ถูกนำไปใช้ตามตัวดักภายในเราจึงต้องดูว่ามีการดักจับที่เกี่ยวข้องกับประสิทธิภาพหรือไม่ สิ่งนี้ต้องการให้คุณตรวจสอบไฟล์การกำหนดค่าเริ่มต้น struts-default.xml ใน strut2-core-2.3.1.2.jar
<span style = "space สีขาว: pre"> </span> <interceptor name = "alias"/> <interceptor name = "AutoWiring"/> <interceptor name = "chain"/> <interceptor name = "conversionerror"/> <interceptor name = "Cookie"/> <interceptor name = "execandwait"/> <interceptor name = "exec"/> <interceptor name = "ExecandWait"/> <interceptornameInterceptorName = "Exception"/> <interceptor name = "Exception"/> <interceptor name = "fileUpload"/> <interceptor name = "scopedModelDriven"/> <interceptor name = "params"/> <interceptor name = "ActionMappingParams"/> <interceptor name = "เตรียม"/> <interceptor name = "Interceptor"/interceptor name = "timer"/> <interceptor name = "name =" token "/> <interceptor name =" tokensession "/> <interceptor name =" การตรวจสอบความถูกต้อง "/> <interceptor name =" Workflow "/> <interceptor name =" store "/> name = "AnnotationWorkFlow" /> <interceptor name = "multiSelect" />>>
Struts2 มีตัวดักหลายตัวที่สร้างขึ้นมาเหมือนหีบสมบัติ คุณจะเห็นว่าการทำโปรไฟล์อาจเป็นตัวดักจับที่ตรงกับความต้องการของเรา จากนั้นเปิดซอร์สโค้ดและค้นหาตอนนี้
2. ProfilingActivationInterceptor
org.apache.struts2.interceptor.profilingActivationInterceptor.java
ProfilingActilingActivationInterceptor Public Class ExtractintInterceptor {สตริงส่วนตัว profilingKey = "การทำโปรไฟล์"; บูลีนส่วนตัว Devmode; @Inject (strutsconstants.struts_devmode) โมฆะสาธารณะ setDevMode (โหมดสตริง) {this.devmode = "true" .equals (โหมด); } @Override การสกัดกั้นสตริงสาธารณะ (ActionInVocationInVocation) พ่นข้อยกเว้น {ถ้า (devMode) {Object val = Invocation.getInVocationContext (). getParameters (). รับ (profilingKey); if (val! = null) {string sval = (val อินสแตนซ์ของสตริง? (สตริง) val: ((string []) val) [0]); บูลีนเปิดใช้งาน = "ใช่" .equalsignorecase (sval) || "true" .equalsignorecase (sval); utiltimerstack.setactive (เปิดใช้งาน); Invocation.getInvocationContext (). getParameters (). ลบ (profilingKey); }} return invocation.invoke (); -
จากซอร์สโค้ดเราจะเห็นได้ว่าตราบใดที่พารามิเตอร์คำขอ HTTP ที่ส่งโดยเบราว์เซอร์รวมถึงการทำโปรไฟล์ = จริงหรือใช่การสกัดกั้นประสิทธิภาพจะเปิดคลาสเครื่องมือจับเวลาและพิมพ์เวลาดำเนินการของการดำเนินการ
3. struts.xml
เนื่องจากตัวดักจับการทำโปรไฟล์ไม่รวมอยู่ในค่าเริ่มต้นเริ่มต้นเราจึงต้องต่อท้ายไปยังสแต็ก Interceptor ที่กำหนดเองของเราก่อน
<package name = "ajax-default" ขยาย = "Velocity-default"> <result-types> <name-type name = "json"/> </result-types> name = "การทำโปรไฟล์"/> </interceptor-stack> </preceptors> <ค่าเริ่มต้น interceptor-refnamedefault-interceptor-refname = "AjaxInterceptorStack"/> <ส่วนบนโลก <param name = "engentoreHierarchy"> false </param> </result> </global-results> </package>
4. userview.js
ตอนนี้คุณสามารถแก้ไขพารามิเตอร์การเรียก AJAX จากนั้นเพิ่มพารามิเตอร์การทำโปรไฟล์เพื่อเริ่มการปรับประสิทธิภาพ
ฟังก์ชั่น searchAlluser () {jQuery.ajax ({ประเภท: "โพสต์", url: "searchAlluser.action", processData: จริง, ข้อมูล: 'JSON', ข้อมูล: jQuery ("#userQueryform). serialize () +" generatetefromjson ("result", data.resultrows); -
5. เอฟเฟกต์สุดท้าย
ผลการพิมพ์มีดังนี้ นอกเหนือจากเวลาดำเนินการทั้งหมดเวลาดำเนินการของวิธีการดำเนินการและเวลาการแสดงผลของผลลัพธ์จะถูกระบุแยกต่างหาก