1. اعتراض في Struts2 (جوهر وظيفة الإطار)
1. تصفية مقابل اعتراض
وظيفة التصفية مقابل اعتراضية هي شيء واحد. المرشحات هي التكنولوجيا في مواصفات servlet التي يمكنها تصفية الطلبات والاستجابات.
المقاطعات هي التكنولوجيا في إطار STRUTS2 ، وتنفيذ فكرة البرمجة AOP (الموجهة نحو القسم) ، والتي يمكن تصويرها ويمكن اعتراضها قبل أو بعد الوصول إلى طريقة عمل معينة.
مكدس اعتراض: انضم إلى المقاطعات في سلسلة بترتيب معين. عند الوصول إلى طريقة التقاطع ، سيتم استدعاء المقاطعات في سلسلة اعتراض Struts2 بالتسلسل بالترتيب الذي تم تعريفه مسبقًا.
مبدأ التنفيذ Struts2 - التحليل الأساسي
2. اعتراض مخصص
تحدد Struts2 واجهة اعتراض واجهة اعتراضية.
هناك ثلاث طرق مجردة في واجهة التقاطع
• init: سيتم استدعاء هذه الطريقة مباشرة بعد إنشاء التقاطع ، وسيتم استدعاؤها مرة واحدة فقط خلال حياة التقاطع. يمكن تهيئة الموارد ذات الصلة في هذه الطريقة.
• Interpept: سيتم استدعاء هذه الطريقة مرة واحدة في كل مرة يتم فيها اعتراض طلب إجراء.
• تدمير: سيتم استدعاء هذه الطريقة قبل تدمير المعترض ، وسيتم استدعاؤها مرة واحدة فقط خلال دورة حياة التقاطع.
ستدعو الدعامات بدورها إلى طريقة التقاطع لكل اعتراض مسجل من قبل المبرمج لاتخاذ إجراء. في كل مرة تسمى طريقة التقاطع ، ستجتاز الدعامات مثيلًا لواجهة التصنيع.
ActionInvocation: يمثل حالة تنفيذ إجراء معين. يمكن أن يحصل المعترض على كائن الإجراء وكائن النتيجة المرتبط بالإجراء من كائن هذه الفئة. بعد الانتهاء من مهمة Interceptor الخاصة ، سيتصل Interceptor بالطريقة الاحتجاجية لكائن التصنيع إلى الخطوة التالية في عملية معالجة الإجراء.
يمكنك أيضًا استدعاء طريقة AddPrerEsultListener لكائن ActionInvocation "لعلاق" مستمع واحد أو أكثر من مستمعي PreresultListener. يمكن لكائن المستمع أن يفعل شيئًا قبل البدء في تنفيذ نتيجة الإجراء بعد تنفيذ الإجراء.
خطوات اعتراض مخصصة:
أ. اكتب فئة لتنفيذ com.opensymphony.xwork2.Interceptor.Interceptor واجهة ، أو الوراثة
com.opensymphony.xwork2.Interceptor.abstractInterceptor. (وضع المحول) ، اختر عمومًا أن يرث المجرى التجريبي (سيقيم اعتراض في الذاكرة). لأن فئة interctiveproceptor تقوم بتنفيذ واجهة التقاطع. يوفر تنفيذًا فارغًا لـ Init and Dorder
اكتب اثنين من اعتراضات interceptordemo1 و interceptordemo2
package com.itheima.Interceptor ؛ import com.opensymphony.xwork2.ActionInvocation ؛ import com.opensymphony.xwork2.Interceptor.abstractInterceptor ؛ public class interceptordemo1 يمتد مجردة {// هذه الطريقة تسمى في كل مرة يتم الوصول إلى الإجراء بين intercept intercept (incocation) string rtvalue = invocation.invoke () ؛ // الإصدار ، لماذا تعود السلسلة هنا؟ نظرًا لأن النتيجة النهائية تُرجع نتيجة الإجراء ، ونتيجة الإجراء هي نوع السلسلة system.out.println ("Intercept Demo1") ؛ إرجاع rtvalue ؛ }} package com.itheima.Interceptor ؛ استيراد com.opensymphony.xwork2.ActionInvocation ؛ استيراد com.opensymphony.xwork2.Interceptor.abstractInterceptor ؛ import com.opensymphony.xwork. invocation) يلقي استثناء {// invocation.addpreresultListener (New PreresultListener () {// // public void beforeresult (invocation ActionInvocation ، string resultcode) {// system.out.println ("قبل عرض النتيجة") ؛ //} //}) ؛ System.out.println ("قبل العرض demo2") ؛ string rtvalue = invocation.invoke () ؛ // release system.out.println ("Delecteded Demo2") ؛ إرجاع rtvalue ؛ }}ب. يجب تعريفه في Struts.xml ، وتحديد المعترض ، وتحديده أولاً قبل الاستخدام.
<package name = "p1" تمديد = "Struts-Default"> <!-اعتراض التعريف: فقط صالح للحزمة الحالية-> <interceptor name = "interceprotdemo1"> </stilection> <interceptor name = "InterceProtdemo2"> </interceptor> </interceptor>
ج. يمكن استخدامه في تكوين العمل
<Action Name = "Action1" method = "execute"> <!- استخدم المعترض المحدد. إذا لم يتم تحديد أي اعتراض ، يتم استخدام جميع التقاطعات في مكدس القصص الافتراضية افتراضيًا ؛ بمجرد تحديد أي اعتراض ، يكون الافتراضي غير صالح-> <interceptor-ref name = "interceProtDemo1"> </stilection-ref> <interceptor-ref name = "interceprotdemo2"> </interceptor-ref> <dred>
تنفيذ Action Class Demo1action
package com.itheima العودة النجاح }}
نتائج التشغيل
نظرًا لأن الوظائف مثل تحميل الملفات ، والتحقق من البيانات ، وتغليف معلمات الطلبات للعمل في Struts2 ، يتم تنفيذها بواسطة التقاطع في الافتراضي الافتراضي للنظام ، يحتاج المعترض الذي نحدده إلى الإشارة إلى الافتراضي الافتراضي للنظام ، بحيث يمكن للتطبيق استخدام العديد من الوظائف التي يقدمها إطار STRUTS2.
إذا لم يتم تحديد أي اعتراض ، يتم استخدام جميع التقاطعات في مكدس القصص الافتراضية افتراضيًا ؛ بمجرد تحديد أي اعتراض ، يكون الافتراضي غير صالح. بالإضافة إلى استخدام اعتراض مخصص ، تحتاج أيضًا إلى استخدام DefaultStack. يمكنك القيام بذلك
الطريقة 1: (المستخدمة من قبل نفسك) ، ما عليك سوى تكوين Custom و DefaultStack في العمل.
الطريقة 2: (عندما يستخدمه الجميع) ، إذا كنت تريد أن تستخدم جميع الإجراءات ضمن الحزمة اعتراضًا مخصصًا ، فأنت بحاجة إلى استخدام مكدس اعتراض اعتراض ، وتحديد مجموعة اعتراضية ، وبعد ذلك في الإجراء ، يمكنك أن تشوه المعتشر على أنه التقاطع الافتراضي من خلال <-devault-interceptor-ref name = "mydefaultstack"/> ، ويمكنك الحصول على اسم mydefulf by.
<Riptroptors> <interceptor name = "interceprotdemo1"> </20100 name = "interceprotdemo1"> </stilection-ref> <interceptor-ref name = "interceProtDemo2"> </interceptor-ref> </stilection-stack> </2010> </action3 " <stred> /success.jsp </reduct> </action>
3. اعتراض Struts2 الخاص
الحالة 1: تحقق مما إذا كان المستخدم قد تم تسجيل الدخول
1. اكتب الصفحة login.jsp
<Body> <form Action = "$ {pagecontext.request.contextpath} /login.action" method = "post"> <input type = "text" name = "username"/> <br/> <input type = "text" name = "password"/> <br/> <input type = "submit" value "/>2. اكتب فئة LoginCheckInterceptor للتحقق من تسجيل الدخول
package com.itheima.Interceptor ؛ import javax.servlet.http.httpsession ؛ import org.apache.struts2 الاحتجاج) يلقي استثناء {httpsession session = servleTactionContext.getRequest (). getSession () ؛ // الحصول على كائن الجلسة من خلال كائن ServleTactionContext user = session.getAttribute ("user") ؛ if (user == null) {// no login return "login" ؛ // return to a logical view} return3. كتابة ملفات التكوين struts.xml
<package name = "p2" تمديد = "struts-default"> <interceptors> <interceptor name = "loginCheckInterceptor"> </interceptor> <interceptor-stack name = "myDefaultStack"> <interceptor-ref name = "defaultStack"> </interceptor-ref> </stilection-ref> </stilection-stack> </stilection-stack> </20100
4. اكتب عميل فئة العمل
package com.itheima servleTactionContext.getRequest (). getSession (). العودة النجاح }}
الحالة 2: مراقبة كفاءة تنفيذ أساليب العمل
اكتب الموقت
package com.itheima.Interceptor ؛ import com.opensymphony.xwork2.ActionInvocation ؛ import com.opensymphony.xwork2.Interceptor.abstractInterceptor ؛ public class timeerInterceptor يمتد مجردة interceptor {public intercept intercept (incotation incocation) استثناء {long time = system.nanotime () ؛ String rtvalue = invocation.invoke () ؛ System.out.println (rtvalue+"وقت التنفيذ:"+(system.nanotime ()-time)+"nanosecond") ؛ إرجاع rtvalue ؛ }}اكتب ملفات التكوين
<package name = "p2" تمديد = "struts-default"> <interceptors> <interceptor name = "loginCheckInterceptor"> </stilestriptor> <interceptor name = "timerInterceptor"> </interceptor> <interceptor-stack = "myDefaultStack name = "logInCheckInterceptor"> </interceptor-ref> <interceptor-ref name = "loginCheckInterceptor"> </interceptor-ref> <interceptor-ref name = "timerInterceptor"> </interceptor-ref>
كما يتضح من ما سبق ، يمكن تكوين مرشحات متعددة في إجراء واحد.
4. اعتراض مخصص: يمكن تحديد طريقة الاعتراض أو طريقة عدم الاعتراض
يمكنه تحديد طريقة الاعتراض أو طريقة دون اعتراض. عند كتابة مرشح ، يمكنك تنفيذ فئة MethodFilterInterceptor ، التي تحتوي على حقلين. عن طريق حقن المعلمات ، يمكنك تحديد تلك دون اعتراض. يمكن استخدام واحد فقط من المعلمتين. عندما يكون هناك اعتراضات أقل ، يمكنك استخدام IncludeMethods. عندما يكون هناك المزيد من التقاطعات ، يمكنك استخدام reviledemethods.
revisedemethods = collections.emptyset () ؛ // استبعاد هؤلاء
includeMethods = collections.emptyset () ؛ // تضمين تلك
الحالة: متابعة تسجيل تسجيل الدخول.
1. اكتب مرشح تسجيل الدخول
package com.itheima.Interceptor ؛ import javax.servlet.http.httpsession ؛ import org.apache.struts2.servletactionContext com.opensymphony.xwork2.Interceptor.MethodFilterInterceptor ؛ فئة public loginCheckInterceptor يمتد MethodFilterInterceptor {protect string dointercept (actionInvocation invocation) استثناء {httpsession session = servletactionContext.getRequest (). getession () ؛ مستخدم الكائن = session.getAttribute ("المستخدم") ؛ if (user == null) {// no login return "login" ؛ // return to a logical view} return2. اكتب ملفات التكوين
3. اكتب عامل عمل عميل
package com.itheima.action ؛ import org.apache.struts2 الطريقة ") ؛ إرجاع نجاح ؛} سلسلة تسجيل الدخول العامة () {system.out.println (" login ") ؛ servleTActionContext.getRequest (). 4. اكتب صفحة
addCustomer.JSP
<body> أضف عميلًا </body>
editCustomer.JSP
<body> قم بتعديل العميل </body>
login.jsp
<Body> <form Action = "$ {pagecontext.request.contextpath} /login.action" method = "post"> <input type = "text" name = "username"/> <br/> <input type = "text" name = "password"/> <br/> <input type = "submit" value "/>النجاح
<Body> Oyeah </Body>
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.