تنفذ هذه المقالة بشكل أساسي وظيفة إعادة توجيه دعامات الدعامات. وظائف أخرى سوف تعوض ببطء.
لقد تعلمت مؤخرًا محتوى Javassist ، ورأيت مقالًا.
فيما يلي إطار STURTS2 بسيط ، وفي الوقت نفسه ، تضيف بعضًا من فهمك.
تنفذ هذه المقالة بشكل أساسي وظيفة إعادة توجيه دعامات الدعامات. وظائف أخرى سوف تعوض ببطء.
بادئ ذي بدء ، في إطار STRUTS2 ، يتم تكوين تنفيذ الطلبات والقفز بشكل أساسي بواسطة Struts.xml. يشير التسمية <Search> إلى تعريف للطلب ، والذي يحتوي على اسم "اسم" ؛ تحدد "تسمية النتيجة" نوع "اسم" النتيجة ، بما في ذلك "النجاح" ، "لا شيء" ، "تسجيل الدخول" ، "الإدخال" ، "خطأ" ؛ ② النوع "النوع" ، بما في ذلك "Dispatcher (Default)" "،" سلسلة "،" إعادة توجيه "،" إعادة توجيه "،" تيار "؛ بعد تكوين struts.xml ، يمكن للنموذج في الواجهة العثور على علامة الإجراء المقابلة من خلال قيمة سمة الاسم المحددة بواسطة خاصية الإجراء ، وذلك للعثور على فئة المقابلة وأساليب التنفيذ. ثم قم بمطابقة سلسلة السلسلة التي تم إرجاعها بواسطة طريقة التنفيذ لتطابق الاسم في علامة النتيجة ، وقم بتنفيذ عملية الطلب التالي وفقًا لنوع النوع المحدد.
حسنًا ، بعد فهم كيفية توصيل Struts2 الواجهة التي تطلب وظيفة البرنامج نفسها ، يمكننا تنفيذ هذا الجزء من الوظيفة من خلال الكود الخاص بنا.
فكيف نبدأ؟
سنقسم إلى جزأين مع وظائف بسيطة ① جزء ② جزء
جزء العمل
① نحتاج إلى العثور على فئة وأساليب التنفيذ المقابلة وفقًا لطلب الواجهة
نتيجة جزء
① نحتاج إلى إرجاع سلسلة نوع "النجاح" و "لا شيء" و "تسجيل الدخول" و "الإدخال" و "الخطأ"
② يجب تحديد أنواع مختلفة من عنوان الطلب لأنواع مختلفة من العودة
③ الأنواع التي يجب تعريفها ، بما في ذلك "Dispatcher (افتراضي)" ، "سلسلة" ، "إعادة توجيه" ، "إعادة توجيه" ، "دفق"
في هذه المقالة ، تدرك أنواع النتيجة فقط نوعين من "النجاح" و "تسجيل الدخول" ، وفي الوقت الحالي ، لا يفكرون في نوع الطلب. سيتم تجديد الوظيفة المثالية لاحقًا.
ثم ، دعنا نرى كيفية تحقيق الوظيفة أعلاه من خلال الكود.
أولاً ، يطلب اثنين من التعليقات التوضيحية المخصصة للتشتيت والنتائج الطريقة المقابلة وطريقة السلسلة التي تم إرجاعها بواسطة التعليقات التوضيحية المخصصة للإجراءات
! () الافتراضي {} ؛} /*** ارجع إلى كائن التعليقات التوضيحية: الاسم يعادل اسم النتيجة في تكوين الدعامات ، بما في ذلك "النجاح" ، "لا شيء" ، "خطأ" ، "إدخال". Login '؛ () الافتراضي "index.jsp" ؛}
ثم نحدد فئة ActionContext لحفظ المحتوى المطلوب للطلب
/*** قم بتنفيذ دعامات المحاكاة تقفز إلى المحتوى المطلوب لتنفيذ الطريقة المقابلة وفقًا لملف التكوين*Author Linling **/class public ActionContext {/*** يعادل عنوان URL -pattern في web.xml ، فقط url url السلسلة الخاصة ؛ على سبيل المثال: "النجاح" ؛ عمل الكائن الخاص ؛ * / string private [] ActionParamsName ؛
التحليل هو طريقة مطلوبة لتجميع ActionContext
/** * اجتاز ملف الفئة ضمن حزمة Scan_Package ، والتي تستخدم طريقة الإجراء لتحليلها ، وتجميعها في كائن ActionContext ووضعه في urlmap * param real_path scan_package * thro ws classNotFoundException * throws instantiationexception * throws intervalicalAccessexception * throws notfoundException */ public static void analysepackage (string real_path ، string scan_package informception ، instantificationexception ، inchalaccessexception ، notfound {file file = new file (real_path) ؛ ] f iles = file.listFiles () ؛ ClassStype = class.forname (اسم الملف) ؛ . طريقة خطأ في التحديد طريقة! " + method +" ، actionName: " + url +" ، result.length: ؛ هل فارغ ") ؛} map.put (result.name () ، value) ؛} ActionContext.setResults (map) ؛ Act ionContext.setClasStype (classtype) ؛ actionContext. method.getParameterTypes ()) ؛
GetParams هي صفيف معلمة طلب بناءً على محتوى الطلب في طلب HTTPServleTRequest.
/** * استنادًا إلى نوع المعلمة parastype واسم المعلمة ActInparamSname لتحليل طلب طلب إنشاء كائن معلمة [] * param request * paramstype * param actionparamsname * @retourn * @throws يلقي alficalAlArgumentException * @ @ @ @ @ @ @ @ rehrows ConsultArtArgetException * throws nosuchmedhodexception * throws securityexception */ كائن ثابت عام [] Quest ، class <؟ invocat iontargexception ، nosuchmethodexception ، securityexception {Object] object = comple [paramstype.length] ؛ Parampe Style [i]) {Objects [i] = paramsutils.getparam (request ، paramstype [i] ، actionparamsname [i]) ؛ classStype.getDeClardFields () ؛ ) {{string key = iterator.next () ؛ الطول! = 2) {متابعة ؛} if (! actionParamSname [i] .equals ( قيمة السلسلة = مفتاح) [0] ؛ } الكائنات الإرجاع ؛}
حسنًا ، التالي. يمكننا تنفيذ طريقة الإجراء
LogInAction الفئة العامة {actionNotation (ActionName = "login.action" ، النتائج = {resultAnitation (name = resulttype.success . (ActionName = "loginforuse.action" ، النتائج = {resannotation (name = resultType.success ، value = "indexp") otary (name = resultType.login ، value = "login.jsp")})}) resultType loginforuser (رقم int ، loginpojo loginpojo) {if ("hello" .equals (loginpojo.getusername ()) && "world" .equojo.getpa ssword ())) {return resulttype.success ؛
بعد ذلك ، ما نحتاج إلى القيام به هو السماح للبرنامج بتجاوز جميع الأساليب في دليل العمل عند البدء ، واستخدام طريقة ActionAntation لمعرفة وتجميعها في ActionContext. وبهذه الطريقة ، عند وصول الطلب ، يمكننا العثور على ActionContext المقابل وفقًا لعنوان الطلب ، واتصل بالطريقة بواسطة آلية الانعكاس.
وضعنا اثنين من servlets. يستخدم واحد لأداء برامج التهيئة. واحد يستخدم لتصفية جميع طلبات الإجراءات
<Srevlet> <Srectlet> StrutSinitServlet </servlet-name> <Servlet-class> com.bayern.struts.servletsinitservlet </revlet-class> <par am-name> scan_package </param-name> <Param-value> com com .bayern.struts.one </param-value> </ith-param> <load-on-startup> 10 </oval-startup>> <stervlet-name> dispatcherservlet </servlet-name> <cervlet-class> com.bayern.struts.one.servlet.dispatcherservlet </servlet-mapping </servlet-mapping> <sterled-name> dispatcherservlet </servlet-name> <url-pattern>*. Servlet Mapping>
يقوم Dispatcherservlet بتنفيذ تصفية طلب الإجراء المستخدم ، ويمكّنه من تنفيذ طريقة الإجراء المقابلة ، وجعل القفزة التالية
uBlic void dopost (httpservletrequest request ، remited) ؛ (طلب ، ActionContext.getParamStype () ، ActionContext.getActionParamsName () ؛ .
حسنًا ، لقد قمنا الآن بتنفيذ وظيفة إعادة توجيه طلب STRUT2 الأكثر بساطة. الوظيفة قاسية للغاية ، والعديد من الحالات لم تفكر في ذلك بعد.
ما سبق هو كل محتويات هذه المقالة.