1. interceptor ใน struts2 (แกนฟังก์ชันเฟรม)
1. ตัวกรองเทียบกับ interceptor
ฟังก์ชั่นตัวกรองเทียบกับ interceptor เป็นสิ่งหนึ่ง ตัวกรองเป็นเทคโนโลยีในข้อกำหนด Servlet ที่สามารถกรองคำขอและการตอบกลับ
Interceptors เป็นเทคโนโลยีในเฟรมเวิร์ก Struts2 โดยใช้แนวคิดการเขียนโปรแกรม AOP (ส่วนที่มุ่งเน้น) ซึ่งสามารถเสียบได้และสามารถสกัดกั้นก่อนหรือหลังการเข้าถึงวิธีการกระทำที่แน่นอน
Interceptor Stack: เข้าร่วม Interceptors เป็นห่วงโซ่ในลำดับที่แน่นอน เมื่อเข้าถึงวิธีการสกัดกั้นตัวดักจับในห่วงโซ่การดักจับ struts2 จะถูกเรียกตามลำดับตามลำดับที่กำหนดไว้ก่อนหน้านี้
หลักการดำเนินการ struts2 - การวิเคราะห์พื้นฐาน
2. Interceptor ที่กำหนดเอง
struts2 กำหนดอินเตอร์เฟสอินเทอร์เฟซ Interceptor Interceptor
มีสามวิธีนามธรรมในอินเตอร์เฟส interceptor
• init: วิธีนี้จะถูกเรียกทันทีหลังจากสร้างการดักจับและจะถูกเรียกเพียงครั้งเดียวในช่วงชีวิตของการดักจับ ทรัพยากรที่เกี่ยวข้องสามารถเริ่มต้นในวิธีนี้
• Interecept: วิธีนี้จะถูกเรียกอีกครั้งทุกครั้งที่มีการสกัดกั้นการดำเนินการ
•ทำลาย: วิธีนี้จะถูกเรียกก่อนที่ตัวดักถูกทำลายและมันจะถูกเรียกเพียงครั้งเดียวในระหว่างวงจรชีวิตของ Interceptor
Struts จะเรียกวิธีการสกัดกั้นของแต่ละ interceptor ที่ลงทะเบียนโดยโปรแกรมเมอร์สำหรับการดำเนินการ ทุกครั้งที่มีการเรียกวิธีการสกัดกั้น struts จะผ่านอินสแตนซ์ของอินเทอร์เฟซ ActionInvocation
ActionInvocation: แสดงสถานะการดำเนินการของการกระทำที่กำหนด Interceptor สามารถรับวัตถุการกระทำและวัตถุผลลัพธ์ที่เกี่ยวข้องกับการกระทำจากวัตถุของคลาสนี้ หลังจากเสร็จสิ้นงานของตัวสกัดกั้นตัวสกัดกั้นจะเรียกวิธีการเรียกใช้ของวัตถุ ActionInvocation ไปยังขั้นตอนต่อไปในกระบวนการประมวลผลการดำเนินการ
นอกจากนี้คุณยังสามารถเรียกวิธีการ addpreresultListener ของวัตถุ ActionInvocation เพื่อ "แขวน" ผู้ฟัง PreresultListener หนึ่งคนขึ้นไป วัตถุผู้ฟังนี้สามารถทำอะไรบางอย่างก่อนที่จะเริ่มดำเนินการผลการดำเนินการหลังจากดำเนินการดำเนินการ
ขั้นตอนการสกัดกั้นที่กำหนดเอง:
. เขียนคลาสเพื่อใช้งาน com.opensymphony.xwork2.interceptor.interceptor อินเตอร์เฟสหรือสืบทอด
com.opensymphony.xwork2.interceptor.abstractinterceptor คลาส (โหมดอะแดปเตอร์) โดยทั่วไปเลือกที่จะสืบทอด AbstractInterceptor (Interceptor จะอยู่ในหน่วยความจำ) เนื่องจากคลาส AbstractInterceptor ใช้อินเตอร์เฟส Interceptor มันให้การใช้งานที่ว่างเปล่าสำหรับ init และทำลาย
เขียนสอง interceptors interceptordemo1 และ interceptordemo2
แพ็คเกจ com.itheima.Interceptor; นำเข้า com.opensymphony.xwork2.actionInvocation; นำเข้า com.opensymphony.xwork2.interceptor.abstractinterceptor; คลาสสาธารณะ interceptordemo1 ขยายบทคัดย่อ {// วิธีนี้เรียกว่า string rtvalue = invocation.invoke (); // release ทำไมสตริงถึงกลับมาที่นี่? เนื่องจากผลลัพธ์สุดท้ายส่งคืนผลลัพธ์ของการกระทำและผลลัพธ์ของการกระทำคือประเภทสตริงระบบ. กลับ rtvalue; }} แพ็คเกจ com.itheima.interceptor; นำเข้า com.opensymphony.xwork2.actionInvocation นำเข้า com.opensymphony.xwork2.interceptor.abstractInterceptor; นำเข้า com.opensymphony.xwork2.interceptor.preeresultlistener; Intercept (actionInvocation Invocation) พ่นข้อยกเว้น {// Invocation.addpreresultListener (ใหม่ preresultListener () {// // โมฆะสาธารณะ beForeresult (actionInvocation rechocation, string resultcode) {// system.out.out.println ("ก่อนหน้านี้แสดง"); //}; System.out.println ("ก่อนการสกัดกั้น demo2"); string rtvalue = invocation.invoke (); // release system.out.println ("intercepted demo2"); กลับ rtvalue; -ข. มันจะต้องกำหนดไว้ใน struts.xml กำหนด interceptor และกำหนดก่อนการใช้งานก่อนการใช้งาน
<package name = "P1" Extend = "struts-default"> <!-คำจำกัดความ interceptor: ใช้ได้เฉพาะกับแพ็คเกจปัจจุบัน-> <interceptor name = "InterceProtDemo1"> </interceptor> <interceptor name = "InterceProtDemo2"> </interceptor>
ค. สามารถใช้ในการกำหนดค่าการดำเนินการ
<action name = "Action1" Method = "Execute"> <!- ใช้ interceptor ที่กำหนดไว้ หากไม่ได้ระบุการดักจับตัวดักจับทั้งหมดในสแต็กสแต็คเริ่มต้นจะถูกใช้โดยค่าเริ่มต้น เมื่อระบุการสกัดกั้นใด ๆ ค่าเริ่มต้นจะไม่ถูกต้อง-> <interceptor-ref name = "InterceProtDemo1"> </interceptor-ref> <interceptor-ref name = "InterceProtDemo2">
ใช้งาน Demo1Action Action Class
แพ็คเกจ com.itheima.action; นำเข้า com.opensymphony.xwork2.actionsupport; Demo1Action คลาสสาธารณะขยายการกระทำ {@Override สตริงสาธารณะดำเนินการ () โยนข้อยกเว้น {System.out.println ("Execute"); กลับมาประสบความสำเร็จ -การรันผลลัพธ์
เนื่องจากฟังก์ชั่นเช่นการอัปโหลดไฟล์การตรวจสอบข้อมูลการห่อหุ้มพารามิเตอร์การร้องขอให้ดำเนินการใน struts2 ถูกนำมาใช้โดย interceptor ในค่าเริ่มต้นเริ่มต้นของระบบการดักจับที่เรากำหนดความต้องการที่จะอ้างถึงค่าเริ่มต้นเริ่มต้นของระบบเพื่อให้แอปพลิเคชันสามารถใช้ฟังก์ชั่นจำนวนมาก
หากไม่ได้ระบุการดักจับตัวดักจับทั้งหมดในสแต็กสแต็คเริ่มต้นจะถูกใช้โดยค่าเริ่มต้น เมื่อระบุการดักจับใด ๆ แล้วค่าเริ่มต้นจะไม่ถูกต้อง นอกเหนือจากการใช้ Interceptor ที่กำหนดเองแล้วคุณต้องใช้ DefaultStack ด้วย คุณสามารถทำได้
วิธีที่ 1: (ใช้โดยตัวคุณเอง) เพียงกำหนดค่า Custom และ DefaultStack ในการดำเนินการ
วิธีที่ 2: (เมื่อทุกคนใช้มัน) หากคุณต้องการให้การกระทำทั้งหมดภายใต้แพ็คเกจใช้ตัวดักจับแบบกำหนดเองคุณต้องใช้สแต็คสแต็กสแต็กสแต็กสแต็กสแต็กสแต็ก
<interceptors> <interceptor name = "interceProtDemo1"> </interceptor> <interceptor name = "interceProtDemo2"> </interceptor> <interceptor-stack name = "myDefaultStack"> <interceptor-ref name = "defaultStack"> name = "interceProtDemo1"> </interceptor-ref> <interceptor-ref name = "InterceProtDemo2"> </interceptor-ref> </interceptor-stack> <result> /success.jsp </result> </action>
3. interceptor ของ struts2
กรณีที่ 1: ตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่
1. เขียนหน้า login.jsp
<body> <form action = "$ {pageContext.request.contextpath} /login.action" method = "post"> <อินพุต type = "text" name = "username"/> <br/> <input type = "text" name = "password"/> <br/>2. เขียนคลาส LoginCheckInterceptor สำหรับการตรวจสอบเข้าสู่ระบบ
แพ็คเกจ com.itheima.interceptor; นำเข้า Javax.servlet.http.httpsession; นำเข้า org.apache.struts2.servletactionContext; นำเข้า com.opensymphony.xwork2.actioninvocation; นำเข้า com.opensymphony.xwork2 Intercept (actionInvocation Invocation) พ่นข้อยกเว้น {httpsession session = servletactionContext.getRequest (). getSession (); // รับวัตถุเซสชันผ่านทางวัตถุ ServletActionContext Object Object = Session.getAttribute ("ผู้ใช้"); if (user == null) {// ไม่มีการเข้าสู่ระบบส่งคืน "เข้าสู่ระบบ"; // กลับไปที่มุมมองเชิงตรรกะ} return invocation.invoke (); // release}}}3. การเขียนการกำหนดค่าไฟล์ struts.xml
<package name = "P2" Exters = "struts-default"> <interceptors> <interceptor name = "loginCheckInterceptor"> </interceptor> <interceptor-stack name = "myDefaultStack"> <interceptor-ref name = "defaultStack"> </interceptor-ref> </interceptor-stack> </interceptor-stack> </interceptors> <action name = "login" method = "เข้าสู่ระบบ"> <result> /login.jsp </result> </action> </package>
4. เขียนการดำเนินการกับลูกค้าในชั้นเรียน
แพ็คเกจ com.itheima.action; นำเข้า org.apache.struts2.servletactionContext; นำเข้า com.opensymphony.xwork2.actionsupport; การเรียนรู้ระดับสาธารณะการดำเนินการขยายการกระทำ servletactionContext.getRequest (). getSession (). setAttribute ("ผู้ใช้", "ppp"); กลับมาประสบความสำเร็จ -กรณีที่ 2: การตรวจสอบประสิทธิภาพการดำเนินการของวิธีการดำเนินการ
เขียนตัวจับเวลา
แพ็คเกจ com.itheima.interceptor; นำเข้า com.opensymphony.xwork2.actionInvocation; นำเข้า com.opensymphony.xwork2.interceptor.abstractinterceptor; คลาสสาธารณะ Timerinterceptor ขยายบทคัดย่อ String rtvalue = Invocation.inVoke (); System.out.println (rtvalue+"เวลาดำเนินการ:"+(system.nanotime ()-เวลา)+"nanosecond"); กลับ rtvalue; -
เขียนไฟล์กำหนดค่า
<package name = "P2" Exters = "struts-default"> <interceptors> <interceptor name = "loginCheckInterceptor"> </interceptor> <interceptor name = "TimerInterceptor"> </Spterceptor> name = "loginCheckInterceptor"> </interceptor-ref> <interceptor-ref name = "loginCheckInterceptor"> </interceptor-ref> <interceptor-ref name = "TimerInterceptor"> </interceptor-ref> </interceptor-stack>
ดังที่เห็นได้จากด้านบนสามารถกำหนดค่าตัวกรองหลายตัวในการกระทำเดียว
4. Interceptor ที่กำหนดเอง: สามารถระบุวิธีการสกัดกั้นหรือวิธีการไม่สกัดกั้น
มันสามารถระบุวิธีการสกัดกั้นหรือวิธีการโดยไม่ต้องสกัดกั้น เมื่อเขียนตัวกรองคุณสามารถใช้คลาส MethodFilterInternceptor ซึ่งมีสองฟิลด์ โดยการฉีดพารามิเตอร์คุณสามารถระบุสิ่งเหล่านั้นได้โดยไม่ต้องสกัดกั้น สามารถใช้พารามิเตอร์เพียงหนึ่งในสองพารามิเตอร์ เมื่อมีการสกัดกั้นน้อยลงคุณสามารถใช้รวมถึงวิธีการ เมื่อมีการสกัดกั้นมากขึ้นคุณสามารถใช้ ExcludeMethods
excludemethods = collections.emptyset (); // ยกเว้นสิ่งเหล่านั้น
รวมถึง ethods = collections.emptyset (); // รวมเหล่านั้น
กรณี: ดำเนินการต่อตัวอย่างการตรวจสอบเข้าสู่ระบบ
1. เขียนตัวกรอง loginCheckInterceptor
แพ็คเกจ com.itheima.interceptor; นำเข้า Javax.servlet.http.httpsession; นำเข้า org.apache.struts2.servletactionContext; นำเข้า com.opensymphony.xwork2.actioninvocation; นำเข้า com.opensymphony.xwork2 com.opensymphony.xwork2.interceptor.methodFilterInterceptor; คลาสสาธารณะ LoginCheckInterceptor ขยาย MethodFilterInterceptor {String String Dointercept (actionInvocation Invocation) โยนข้อยกเว้น {httpsession session = servletactionContext.getRequest () Object user = session.getAttribute ("ผู้ใช้"); if (user == null) {// ไม่มีการเข้าสู่ระบบส่งคืน "เข้าสู่ระบบ"; // กลับไปที่มุมมองเชิงตรรกะ} return invocation.invoke (); // release}}}2. การเขียนไฟล์กำหนดค่า
3. เขียนการดำเนินการกับลูกค้าในชั้นเรียน
แพ็คเกจ com.itheima.action; นำเข้า org.apache.struts2.servletactionContext; นำเข้า com.opensymphony.xwork2.ActionSupport; การเรียนรู้ระดับสาธารณะขยายการกระทำ {สตริงสาธารณะเพิ่ม () {system.out.println ( Method "); return success;} public String login () {system.out.println (" เข้าสู่ระบบ "); servletactioncontext.getRequest (). getSession (). setAttribute (" ผู้ใช้ "," ppp "); 4. เขียนหน้า
addCustomer.jsp
<body> เพิ่มลูกค้า </body>
editcustomer.jsp
<body> ปรับเปลี่ยนลูกค้า </body>
เข้าสู่ระบบ.jsp
<body> <form action = "$ {pageContext.request.contextpath} /login.action" method = "post"> <อินพุต type = "text" name = "username"/> <br/> <input type = "text" name = "password"/> <br/>success.jsp
<body> oyeah </body>
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น