اعتراض اعتراض في springMVC هو أيضا مهم جدا ومفيد. وظيفتها الرئيسية هي اعتراض طلبات المستخدم وإجراء المعالجة المقابلة. على سبيل المثال ، يمكنه إجراء التحقق من الإذن ، أو تحديد ما إذا كان المستخدم قد تم تسجيل الدخول ، أو تحديد ما إذا كان الوقت الحالي هو وقت شراء التذاكر مثل 12306.
1. تحديد فئة تنفيذ التقاطع
يتم تنفيذ طلبات اعتراض اعتراض في springMVC من خلال المعالج. تحديد اعتراض في springMVC أمر بسيط للغاية. هناك طريقتان رئيسيتان. تتمثل الطريقة الأولى في تحديد فئة التقاطع التي تنفذ واجهة معالج الربيع ، أو أن هذه الفئة ترث الفئة التي تنفذ واجهة المعالج ، مثل الفئة التجريدية التي وفرت الربيع التي تنفذ واجهة المعالج ، والتي يتم توفيرها بالفعل بحلول الربيع ؛ الطريقة الثانية هي تنفيذ واجهة Spring WebRequestInterceptor ، أو ترث الفئة التي تنفذ واجهة WebRequestInterceptor.
(ط) تنفيذ واجهة المعالج
هناك ثلاث طرق محددة في واجهة المعالج ، ونحن نستخدم هذه الطرق الثلاث لاعتراض طلبات المستخدم.
(1) طلب prehandle (طلب httpservletrequest ، استجابة httpservletresponse ، مقبض الكائن) ، كما يوحي الاسم ، سيتم استدعاؤه قبل معالجة الطلب. يتم استدعاء اعتراض في springMVC في شكل سلسلة. يمكن أن توجد أجهزة اعتراضية متعددة في نفس الوقت في التطبيق أو في طلب. سيتم تنفيذ كل مكالمة اعتراضية بالتسلسل وفقًا لترتيب الإعلان الخاص بها ، ويتم تنفيذ أولها هي طريقة ما قبل HOLDLE في التقاطع ، لذلك يمكن تنفيذ بعض عمليات ما قبل التخصيص في هذه الطريقة أو في المعالجة المسبقة للطلب الحالي ، أو يمكن إصدار بعض الأحكام في هذه الطريقة لتحديد ما إذا كان ينبغي استمرار الطلب.
قيمة إرجاع هذه الطريقة من نوع منطقي Boolean. عندما يعود إلى FALSE ، فهذا يعني أن الطلب ينتهي ، ولن يتم تنفيذ المعترض ومراقبي اللاحقة مرة أخرى ؛ عندما تكون قيمة الإرجاع صحيحة ، ستستمر استدعاء طريقة prehandle للاعتراض التالي. إذا كان هذا هو العرض الأخير بالفعل ، فسيتم استدعاء طريقة وحدة التحكم للطلب الحالي.
(2) Postthandle (طلب httpservletrequest ، استجابة httpservletresponse ، مقبض الكائن ، طريقة modelandview modelandview). من خلال شرح طريقة prehandle ، نعلم أن هذه الطريقة ، بما في ذلك طريقة Aftercompletion المراد ذكرها لاحقًا ، لا يمكن استدعاؤها إلا عندما تكون قيمة إرجاع طريقة prehandle للاعتراض الحالي صحيحة.
يتم تنفيذ طريقة Posthandle ، كما يوحي الاسم ، بعد معالجة الطلب الحالي ، أي بعد استدعاء طريقة وحدة التحكم ، ولكن سيتم استدعاؤها قبل إرجاع Serpatcherservlet ويجعل العرض ، حتى نتمكن من العمل على كائن ModelandView بعد عملية التحكم في هذه الطريقة. إن اتجاه نداء طريقة Posthandle هو عكس Prehandle ، مما يعني أن طريقة Posthandle of the Interceptor المعلنة أولاً سيتم تنفيذها لاحقًا ، والتي تشبه إلى حد ما عملية تنفيذ المعترض في Struts2. يتم أيضًا ربط عملية التنفيذ للاعتراض في Struts2 ، ولكن في Struts2 ، يجب استدعاء طريقة الاستدعاء في العمل يدويًا لتشغيل الدعوة إلى الاعتراض أو الإجراء التالي. ثم يتم تنفيذ المحتوى في كل اعتراض قبل تنفيذ طريقة الاستدعاء بالترتيب المعلن ، ويتم عكس المحتوى بعد طريقة الاستدعاء.
(3) Aftercompletion (طلب httpservletrequest ، استجابة httpservletresponse ، مقبض الكائن ، استثناء EX) ، يجب تنفيذ هذه الطريقة عندما تكون قيمة إرجاع طريقة prehandle المقابلة الحالية صحيحة. كما يوحي الاسم ، سيتم تنفيذ هذه الطريقة بعد اكتمال الطلب بأكمله ، أي بعد أن يقوم المرسل بإعداد العرض المقابل. الوظيفة الرئيسية لهذه الطريقة هي تنظيف الموارد.
هنا وصف رمز بسيط:
استيراد javax.servlet.http.httpservletrequest ؛ استيراد javax.servlet.http.httpservletresponse ؛ استيراد org.springframework.web.servlet.handlerinterceptor ؛ استيراد org.springframework.web.servlet.modelandview ؛ الطبقة العامة springmvcinterceptor تنفذ المعالج { /*** يتم استخدام طريقة prehandle لاعتراض المعالج. كما يوحي الاسم ، سيتم استدعاء هذه الطريقة قبل عملية التحكم. يتم ربط اعتراض التقاطع في springmvc ، ويمكن أن توجد اعتراضات متعددة في نفس الوقت. ثم سيتم تنفيذ SpringMVC واحدًا تلو الآخر وفقًا لترتيب الإعلان ، وسيتم استدعاء جميع أساليب Prehandle في Interceptor قبل استدعاء طريقة وحدة التحكم. يمكن أيضًا مقاطعة بنية سلسلة اعتراض SPRINGMVC. طريقة المقاطعة هذه تجعل قيمة إرجاع prehandle إلى false. عندما تكون قيمة إرجاع Prehandle خاطئة ، ينتهي الطلب بأكمله. */ Override Public Boolean Prehandle (طلب httpservletrequest ، استجابة httpservletresponse ، معالج الكائن) يلقي الاستثناء {// todo method method method stub return ؛ } /*** لن يتم تنفيذ هذه الطريقة إلا عندما تكون قيمة الإرجاع الحالية لطريقة prehandle للاعتراض صحيحة. يتم استخدام Posthandle لاعتراض المعالج. وقت التنفيذ الخاص به هو بعد معالجة المعالج*، أي بعد استدعاء طريقة وحدة التحكم ، ولكن سيتم تنفيذها قبل أن يعرض Sipatcherservlet العرض ، مما يعني أنه في هذه الطريقة يمكنك تشغيل ModelandView*. بنية سلسلة هذه الطريقة هي عكس اتجاه الوصول العادي ، أي أن الطريقة المعلنة أولاً سيتم استدعاؤها لاحقًا. هذا يشبه إلى حد ما عملية تنفيذ الاعتراض في Struts2. * فقط في طريقة التقاطع في Struts2 ، يجب استدعاء طريقة الاستدعاء في العمل يدويًا. تتمثل طريقة الاستدعاء في العمل في Struts2 في استدعاء المعترض التالي * أو استدعاء الإجراء ، ثم يتم كتابة المحتويات التي يجب استدعاؤها قبل كتابة المعترض قبل الدعوة للاستدعاء ، والمحتويات التي يجب استدعاؤها بعد كتابة المعترض بعد المكالمة إلى طريقة الاستدعاء. * / Override public void postthandle (طلب httpservletrequest ، استجابة httpservletresponse ، معالج الكائنات ، modelandview modelandview) يلقي الاستثناء {// todo todo methodle methodle} / *** يجب أن يتم تنفيذ هذه الطريقة أيضًا عند تطبيق قيمة الإرجاع الخاصة بتقاطع المقابل الحالي. سيتم تنفيذ هذه الطريقة بعد اكتمال الطلب بأكمله ، أي أن Dispatcherservlet يجعل تنفيذ العرض. * الوظيفة الرئيسية لهذه الطريقة هي تنظيف الموارد. بالطبع ، لا يمكن تنفيذ هذه الطريقة إلا عندما تكون قيمة الإرجاع الحالية لطريقة prehandle للاعتراض صحيحة. */ Override public void Aftercompletion (طلب httpservletrequest ، استجابة httpservletresponse ، معالج الكائن ، استثناء EX) يلقي الاستثناء {// todo method method method}}} (2) تنفيذ واجهة WebRequestInterceptor
هناك أيضًا ثلاث طرق محددة في WebRequestInterceptor ، ونحن نستخدم أيضًا هذه الطرق الثلاث لتنفيذ الاعتراض. تمر جميع الطرق الثلاثة بنفس المعلمة WebRequest ، فما هو WebRequest؟ هذا WebRequest هو واجهة تحددها الربيع. تعاريف الطريقة في ذلك هي في الأساس نفس httpservletrequest. سيتم مزامنة جميع العمليات التي يتم تنفيذها على WebRequestInterceptor في WebRequestInterceptor مع httpservletrequest ، ثم تم تمريرها في الطلب الحالي.
(1) طريقة prehandle (طلب WebRequest). سيتم استدعاء هذه الطريقة قبل معالجة الطلب ، أي أنه سيتم استدعاؤه قبل استدعاء طريقة وحدة التحكم. هذه الطريقة تختلف عن prehandle في المعالج. الفرق الرئيسي هو أن قيمة إرجاع الطريقة باطلة ، مما يعني أنه لا توجد قيمة إرجاع. لذلك ، نستخدمه عمومًا لإعداد الموارد. على سبيل المثال ، عندما نستخدم Hibernate ، يمكننا إعداد كائن جلسة السبات في هذه الطريقة ، ثم نستخدم setAttribute (الاسم ، القيمة ، نطاق) WebRequest لوضعه في خاصية WebRequest. هنا يمكننا التحدث عن نطاق المعلمة الثالث لطريقة setAttribute ، والتي هي من نوع عدد صحيح. يتم تعريف ثلاث ثوابت من أجل واجهة WebRequest للطبقة الوالدية:
SCOPE_REQUEST: قيمتها هي 0 ، مما يعني أنه لا يمكن الوصول إليه إلا عند الطلب.
Scope_session: قيمتها هي 1. إذا سمحت البيئة بذلك ، فإنها تمثل جلسة معزولة محلية ، وإلا فإنها تمثل جلسة عادية ويمكن الوصول إليها في نطاق الجلسة.
SCOPE_GLOBAL_Session: قيمتها هي 2. إذا سمحت البيئة بذلك ، فإنها تمثل جلسة مشتركة عالميًا ، وإلا فإنها تمثل جلسة عادية ويمكن الوصول إليها في نطاق الجلسة.
(2) Posthandle (طلب WebRequest ، نموذج ModelMap). سيتم استدعاء هذه الطريقة بعد معالجة الطلب ، أي بعد استدعاء طريقة وحدة التحكم ، ولكن سيتم استدعاؤها قبل تقديم إرجاع العرض ، بحيث يمكنك تغيير عرض البيانات عن طريق تغيير نموذج نموذج البيانات في هذه الطريقة. هذه الطريقة لها معلمتان. يتم استخدام كائن WebRequest لتمرير بيانات الطلب بأكملها. على سبيل المثال ، يمكن تمرير البيانات التي تم إعدادها في Prehandle والوصول إليها من خلال WebRequest ؛ ModelMap هو كائن النموذج الذي تم إرجاعه بعد عملية التحكم. يمكننا تغيير النموذج الذي تم إرجاعه عن طريق تغيير خصائصه.
(3) طريقة Aftercompletion (طلب WebRequest ، استثناء EX). سيتم تنفيذ هذه الطريقة بعد معالجة الطلب بأكمله ، أي بعد إرجاع العرض وتقديمه. لذلك ، في هذه الطريقة ، يمكن تنفيذ عملية إصدار الموارد. يمكن لمعلمة WebRequest تمرير الموارد التي أعددناها في Prehandle هنا للإصدار. تمثل معلمة الاستثناء كائن الاستثناء المطلوب حاليًا. إذا تمت معالجة الاستثناء الذي تم إلقاؤه في وحدة التحكم بواسطة معالج استثناء الربيع ، فإن كائن الاستثناء هو فارغ.
هنا وصف رمز بسيط:
استيراد org.springframework.ui.modelmap ؛ استيراد org.springframework.web.context.request.webrequest ؛ استيراد org.springframework.web.context.request.webRequestInterceptor ؛ يقوم AllInterceptor من الفئة العامة بتنفيذ WebRequestInterceptor { /*** تنفيذ قبل معالجة الطلب. تُستخدم هذه الطريقة بشكل أساسي لإعداد بيانات الموارد ، وبعد ذلك يمكن وضعها في WebRequest كسمات طلب*/ Override public void prehandle (WebRequest request) يرمي الاستثناء {// tode method method method system.out.println ("allinterceptor ......................") ؛ request.setAttribute ("request" ، "request" ، webrequest.scope_request) ؛ // يتم وضع هذا ضمن نطاق الطلب ، حتى لا تتمكن إلا من الحصول على request.setattribute ("الجلسة" ، "الجلسة" ، في الطلب الحالي. webrequest.scope_session) ؛ إذا سمحت البيئة بذلك ، فلا يمكن الوصول إليها إلا في جلسة معزولة محليًا. خلاف ذلك ، يمكن الوصول إليها في الجلسة الحالية العادية. request.setAttribute ("Globalsession" ، "Globalsession" ، WebRequest.Scope_Global_Session) ؛ // إذا سمحت البيئة بذلك ، فيمكن الوصول إليها في جلسة مشتركة عالميًا ، وإلا يمكن الوصول إليها في الجلسة الحالية العادية/*** سيتم تنفيذ هذه الطريقة بعد تنفيذ المراقب وقبل العودة إلى العرض. يمثل ModelMap كائن النموذج الذي يتم إرجاعه بعد طلب وحدة التحكم لمعالجة وحدة التحكم ، بحيث يمكن تعديل خصائص الخريطة النموذجية في هذه الطريقة لتحقيق تأثير تغيير النموذج الذي تم إرجاعه. */ Override public void posthandle (طلب WebRequest ، خريطة الطراز) يلقي استثناء {// todo method method method tuto for (string key: map.keyset ()) system.out.println (key + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- بعد طلب WebRequest ، استثناء استثناء) ، يلقي استثناء {// TODO Method Method Method System.out.println (استثناء + "--=-=-=-=-=-=-=--=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=----=-=-=-=-=-=-=-=-=-=--=-=-=----- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ") ؛ }}2. أضف فئة التقاطع المحددة إلى نظام اعتراض springMVC
1. أضف مخططًا يدعم MVC في ملف تكوين SPRINGMVC
Xmlns: mvc = "http://www.springframework.org/schema/mvc" http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "
فيما يلي مثال على بياني:
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xmlns: mvc = "http://www.springframework.org/schema/mvc" XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframeworg http://www.springframework.org/schema/context/spring-context-3.0.xsd
وبهذه الطريقة ، يمكنك استخدام علامة MVC في ملف تكوين SpringMVC. هناك MVC: اعتراضات في علامة MVC التي يتم استخدامها لإعلان اعتراض springMVC.
(2) استخدم علامة MVC: اعتراضية لإعلان الاعتراض الذي يجب إضافته إلى سلسلة اعتراض SPRINGMVC
<mvc: اعتراضات> <!- استخدم الفول لتحديد اعتراض. التقاطع المحدد مباشرة تحت جذر MVC: سوف يعترض التقاطعات جميع الطلبات-> <bean/> <mvc: interceptor> <mvc: mapping path = "/test/number.do"/> <!
من المثال أعلاه ، يمكننا أن نرى أنه يمكن الإعلان عن سلسلة من المقاطعات باستخدام علامة MVC: Interceptors ، ثم يمكنها تشكيل سلسلة اعتراضية. يتم تنفيذ ترتيب تنفيذ الاعتراض بترتيب الإعلانات. سيتم تنفيذ طريقة prehandle في التقاطع المعلن أولاً ، ولكن سيتم تنفيذ طريقة Posthandle وطريقة Aftercompletion لاحقًا.
هناك طريقتان رئيسيتان لإعلان التقاطع بموجب علامة MVC: TAGEROTS:
(1) حدد مباشرة كائن حبة لفئة تنفيذ اعتراض. اعتراض اعتراض المعلن بهذه الطريقة سوف يعترض جميع الطلبات.
(2) استخدم MVC: علامة اعتراضية للإعلان. يمكن أن يعلن Interceptor بهذه الطريقة مسار الطلب الذي يجب اعتراضه من خلال MVC: Mapping Subtag.
بعد خطوتين أعلاه ، سيعمل التقاطع المحدد لاعتراض الطلبات المحددة.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.