คำนำ
ระบบ Interceptor เป็นส่วนสำคัญของกรอบ Struts2 มันไม่มีการพูดเกินจริงที่จะบอกว่าหากไม่มีระบบ interceptor จะไม่มีกรอบ struts2 ที่ใช้งานง่ายเช่นนี้ ในเฟรมเวิร์ก Struts2 จำนวนผู้ใช้จำนวนมากได้ทำหน้าที่พื้นฐานมากมายให้เสร็จสมบูรณ์ ตัวอย่างเช่นการสกัดกั้นพารามิเตอร์มีหน้าที่ในการแยกวิเคราะห์พารามิเตอร์ของคำขอ HTTP และตั้งค่าคุณสมบัติของการดำเนินการ servlet-config interceptor ผ่านอินสแตนซ์ httpservletrequest โดยตรงและอินสแตนซ์ httpservletResponse ในการร้องขอ HTTP เพื่อดำเนินการ; fileupload interceptor มีหน้าที่แยกวิเคราะห์โดเมนไฟล์ในพารามิเตอร์คำขอและการตั้งค่าโดเมนไฟล์เป็นคุณสมบัติสามประการของการกระทำ ... ทั้งหมดนี้ทำโดย interceptor ในตัว ดังนั้นการเรียนรู้หลักการและวิธีการใช้ interceptors ใน struts2 เราสามารถเข้าใจ "เส้นชีวิต" ของกรอบ struts2
อย่างไรก็ตามจนถึงขณะนี้นอกเหนือจากการกำหนดค่าตัวกรอง strutsprepreprepareedexecutefilter ใน web.xml เรายังไม่ได้ติดต่อตัวดักอื่น ๆ เหตุใดแอปพลิเคชันของเราจึงทำงานได้ดี? ในความเป็นจริง struts2 ได้เปิดใช้งานตัวดักจับทั่วไปจำนวนมากโดยค่าเริ่มต้น ตัวดักเหล่านี้จะทำงานได้ตราบใดที่แพ็คเกจที่กำหนดค่าสำหรับการกระทำนั้นสืบทอดแพ็คเกจ Struts-Default มาดูการสกัดกั้นในตัวของ Struts2 ในตัว
struts2 interceptor ในตัว
มีตัวดักจับในตัวมากมายในกรอบ Struts2 ตัวดักเหล่านี้เกือบจะเสร็จสิ้น 70% ของการทำงานของกรอบ Struts2 รวมถึงพารามิเตอร์การตอบสนองการแยกวิเคราะห์การกำหนดพารามิเตอร์การร้องขอให้คุณลักษณะการกระทำ ฯลฯ การออกแบบที่ชาญฉลาดของ struts2 ส่วนใหญ่เกิดจากการออกแบบของ interceptor; เมื่อมีความจำเป็นที่จะต้องขยายฟังก์ชั่น struts2 คุณจะต้องจัดเตรียม interceptor ที่สอดคล้องกันและกำหนดค่าในคอนเทนเนอร์ struts2
interceptors ในตัวเหล่านี้ได้รับการกำหนดค่าในไฟล์ struts-default.xml ในรูปแบบของคู่ชื่อคลาสโดยที่ชื่อคือชื่อของ interceptor ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันของตัวดักจับที่จะใช้ในภายหลัง; ชั้นเรียนระบุคลาสการใช้งานของ interceptor สำหรับคำอธิบายโดยละเอียดของตัวดักจับในตัวเหล่านี้โปรดดูเอกสารอย่างเป็นทางการ
กำหนดค่าการสกัดกั้น
การกำหนด interceptor ในไฟล์ struts.xml ต้องการการระบุชื่อ interceptor สำหรับคลาส interceptor เท่านั้นและคำจำกัดความการสกัดกั้นจะเสร็จสมบูรณ์ กำหนดตัวดักจับโดยใช้ <interceptor .../> ตัวอย่างเช่น:
<!-กำหนด interceptor โดยการระบุชื่อ interceptor และคลาสการใช้งาน interceptor-> <interceptor name = "ชื่อ interceptor"> <param name = "ชื่อ param"> ค่าพารามิเตอร์ </param>
นอกจากนี้ยังสามารถเชื่อมต่อกับตัวดักหลายตัวเข้าด้วยกันเพื่อสร้างสแต็ก interceptor และ <interceptor-ref .../> ใช้ในตัวดักเพื่อกำหนดการอ้างอิง interceptor ตัวอย่างเช่น:
<interceptor-stack name = "interceptor stack one"> <interceptor-ref name = "interceptor one"/> <interceptor-ref name = "interceptor สอง"/> ...
จากมุมมองของโครงสร้างโปรแกรมสแต็กสกัดกั้นประกอบด้วยตัวดักหลายตัว แต่จากมุมมองของฟังก์ชั่นโปรแกรมสแต็ก interceptor และ interceptor นั้นเหมือนกันและวิธีการที่พวกเขามีจะถูกดำเนินการโดยอัตโนมัติก่อนการดำเนินการของวิธีการดำเนินการ ดังนั้นเราสามารถปฏิบัติต่อสแต็คสกัดกั้นเป็นตัวดักขนาดใหญ่ได้อย่างสมบูรณ์
เนื่องจากสแต็ก interceptor และ interceptor มีความสอดคล้องกันสแต็ก interceptor จึงสามารถมีสแต็ก interceptor ได้เช่น:
<interceptor-stack name = "interceptor stack 2"> <interceptor-ref name = "ModelDriven"/> <interceptor-ref name = "Interceptor Stack 1"/> </preceptor-stack>
ใช้ interceptor
เมื่อมีการกำหนดสแต็ก interceptor และ interceptor สแต็กสแต็คหรือสแตมคอนสเตอร์นี้สามารถใช้เพื่อสกัดกั้นการกระทำ พฤติกรรมการสกัดกั้นของ Interceptor จะถูกดำเนินการก่อนการดำเนินการ
โดยการใช้องค์ประกอบ <interceptor-ref .../>> ไวยากรณ์การกำหนดค่าของการใช้ interceptor ในการกระทำนั้นเหมือนกับไวยากรณ์ของการอ้างอิงการดักจับเมื่อกำหนดค่าสแต็ก interceptor ตัวอย่างเช่น:
<action name = "เข้าสู่ระบบ"> <name result = "ข้อผิดพลาด">/reror.jsp </result> <name result = "success">/welcome.jsp </result> <!-stack stack interceptor-> <interceptor-ref name = "defaultStack"/> <! name = "key"> พารามิเตอร์แบบไดนามิก </param> </interceptor-ref> </action>
หลังจากการกำหนดค่านี้เสร็จสมบูรณ์ตัวดักจับทั้งสามนี้จะทำงานก่อนที่จะดำเนินการดาวน์โหลด
กำหนดค่า interceptor เริ่มต้น
เมื่อกำหนดค่าแพ็คเกจสามารถระบุได้ด้วย interceptor เริ่มต้น เมื่อระบุการสกัดกั้นเริ่มต้นสำหรับแพ็คเกจแล้วตัวดักเริ่มต้นจะทำงานหากการกระทำในแพ็คเกจนั้นไม่ได้ระบุตัวดักจับอย่างชัดเจน อย่างไรก็ตามเมื่อเราใช้การดักจับกับการกระทำในแพ็คเกจอย่างชัดเจนแล้วตัวดักเริ่มต้นจะไม่ทำงาน หากการดำเนินการต้องใช้ interceptor เริ่มต้นที่จะใช้คุณต้องกำหนดค่าการอ้างอิงไปยังตัวดักจับด้วยตนเอง
ตัวดักเริ่มต้นสำหรับแพ็คเกจที่การกระทำนั้นจะมีผลเฉพาะในกรณีที่ไม่มีการใช้อย่างชัดเจนในการดำเนินการ
กำหนดค่าตัวดักเริ่มต้นเพื่อใช้องค์ประกอบ <ค่าเริ่มต้น-interceptor-ref .../>> ซึ่งใช้เป็นลูกขององค์ประกอบ <แพ็คเกจ .../> และกำหนดค่าการดักจับเริ่มต้นสำหรับการกระทำทั้งหมดภายใต้แพ็คเกจนี้ ตัวอย่างเช่น:
<default-interceptor-ref name = "default interceptor"/>
นอกจากนี้คุณยังสามารถระบุพารามิเตอร์สำหรับการสกัดกั้นเริ่มต้นตัวอย่างเช่น:
<default-interceptor-ref name = "default interceptor"> <param name = "ชื่อพารามิเตอร์"> ค่าพารามิเตอร์ </param> </default-interceptor-ref>
ในไฟล์ struts-default.xml แพ็คเกจนามธรรมที่ชื่อว่า Struts-Default ได้รับการกำหนดค่าซึ่งมีการกำหนดอ้างอิงการสกัดกั้นเริ่มต้นที่ชื่อว่า DefaultStack ถูกกำหนดไว้ เมื่อแพ็คเกจที่เรากำหนดให้สืบทอดแพ็คเกจ Struts-Default มันยังสืบทอดสแต็ค Interceptor เริ่มต้น: DefaultStack ซึ่งหมายความว่าหากเราไม่ได้ใช้ Interceptor สำหรับการกระทำอย่างชัดเจนสแต็ก Interceptor DefaultStack จะมีผลโดยอัตโนมัติ
สกัดกั้นที่กำหนดเอง
1>. เพิ่มคลาสเพื่อสืบทอดคลาส AbstractInterceptor หรือใช้อินเตอร์เฟส Interceptor
TimeLinceptor Public Class ขยาย AbstractInterceptor {/*** ค่าส่งคืนของวิธีการหลักของการสกัดกั้นคือสตริง*/@overridePublic String intercept (actionInvocation Invocation) โยนข้อยกเว้น {// toDo วิธีการที่สร้างอัตโนมัติ stubreturn "ล็อกอิน";}}}}}}}}}}}}2>. เพิ่มโหนดลูก interceptors ในแพ็คเกจ struts.xml และเพิ่มโหนด interceptor ใต้
<package name = "goods" namespace = "/goods" ขยาย = "Common-pkg"> <interceptors> <interceptor name = "TimeNisterceptor"> </interceptor>
3>. เพิ่มโหนดลูก interceptor-ref ภายใต้โหนดแอ็คชั่นที่คุณต้องการสกัดกั้น
<action name = "list_category" method = "list"> <interceptor-ref name = "TimeNinterceptor"> </interceptor-ref> <name result = "list" type = "dispatcher">/pages/category/list.jsp </result> </action>
สรุป
บทความนี้ให้ข้อมูลสรุปเบื้องต้นของแกนกลางของ Stuts2 - ตัวดักจับ ในบทความที่ตามมาเราจะใช้ interceptor ของเราเองและใช้จุดความรู้ที่สรุปไว้ในบทความนี้
โอเคข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com