قابلیت ایجاد جادوگر – Spring MVC

SimpleFormController از فرم های تک صفحه ای پشتیبانی می کند. هنگامی که وارد یک فرآیند سفارش و یا ثبت نام می شویم، احتمالا به چندین صفحه، از جمله فرم های که با هم برای پر کردن یک شی دامنه[۱] استفاده می شوند نیاز داشته باشیم: صفحه ای که اطلاعات شخصی را می گیرد، صفحه ای برای اطلاعات آدرس و صفحه ای که شامل اطلاعات پرداخت است. Spring کنترلری را ارائه می دهد که به طور خاص برای پشتیبانی شکل های مختلف فرم های جادوگر[۲] طراحی شده است. org.springframework.web.servlet.mvc.AbstractWizardFormController از صفحات متعدد دارای اعمال اتمام کار و یا لغو[۳]، و همچنین رویدادهایی که صفحه را در ویزارد تغییر می دهد، پشتیبانی می کند. همانند هر کنترلر دیگری، ما می توانیم این کنترلر را نیز بر اساس نیازهای خود، با استفاده از ویژگی های تزریق وابستگی Spring، تنظیم کنیم. همچنین، همانطور که نام آن نشان می دهد، این کنترلر انتزاعی است. بنابراین ما باید برای اضافه کردن رفتارهای مورد نیاز، مانند ذخیره اشیاء، آن را گسترش دهیم.

گردش کار AbstractWizardFormController بسیار شبیه گردش کار AbstractFormController است، با این تفاوت که کنترلر دوم برای یک صفحه طراحی شده است و البته یک جادوگر چند صفحه را کنترل می کند. برای این کار، تمامی متدهای callback و قالب، که توسط AbstractFormContoller ارائه شده اند، با اضافه کردن یک شماره صفحه، در این کنترلر قرار گرفته اند. برای مثال، این کنترلر یک متد ()referenceData دارد که نه تنها یک شی درخواست و فرمان، بلکه یک عدد صحیح به نمایندگی شماره صفحه نیز دارد که به ما اجازه می دهد اطلاعات مورد نیاز صفحه ای را برگردانیم که در حال حاضر به کاربر نمایش داده شده است.

تنظیمات اولیه

ابتدا با هم خواصی را که کنترلر جادوگر پشتیبانی می کند، بررسی می کنیم:

  • pages: یک آرایه رشته ای، نام های نمایش منطقی صفحات جادوگر را نگه می دارد. برای این که همه چیز به درستی با آرایه ها کار کند، شماره صفحه ها در جادوگر از صفر شروع می شوند. نام نمایش در این آرایه در اشیاء ModelAndView که به عنوان مقادیر بازگشتی متدهای processXXX هستند، استفاده می شوند. این متدها بعدا بررسی می شوند.
  • allowDirtyBack و allowDirtyFoward: از آنجایی که حرکت در ویزارد و بین صفحات به عنوان ارسال یک فرم در نظر گرفته می شود، انقیاد داده ها و اعتبارسنجی پیوسته انجام خواهد شد. رفتار پیش فرض کنترلر جادوگر این است که اگر خطاهای اعتبار رخ دهد، از رفتن کاربران به صفحات بعد و یا قبل جلوگیری کنند. در چنین حالتی، کنترلر صفحه فعلی را دوباره نمایش داده و اجازه نمایش پیام های خطا را خواهد داد. allowDirtyBack و allowDirtyForward به ما اجازه تغییر دادن این رفتار را می دهد. با تغییر این مقادیر، به ترتیب هنگامی که کاربر به صفحه قبل و یا بعد حرکت می کند، کنترلر اعتبارسنجی را انجام نمی دهد. همانطور که گفته شد، مقدار پیش فرض این خصیصه ها false است.
  • pageAttribute: اگر مقدار این پارامتر برابر true شود، کنترلر شماره صفحه جاری را (به عنوان یک عدد صحیح)، با استفاده از رشته ای که ما مشخص می کنیم، در مدل قرار خواهد داد. ما زمانی به این نیاز داریم که از یک نمایش برای چندین صفحه استفاده کنیم (ما برای رندر کردن صفحات باید گزینه های مختلف را بررسی کنیم).

کنترلر جادوگر از AbstractFormController ارث بری می کند و بنابراین پارامترهایی مانند sessionForm، commandClass، commandName و bindOnNewForm در دسترس ما قرار دارند.

متدهای الگو

همانطور که قبلا گفته شد، این جادوگر متدهای callback و قالب مختلف را از AbstractFormController کپی کرده است. هنگام سربارگذاری این متدها، علاوه بر شی درخواست و فرمان، شماره صفحه نیز به عنوان پارامتر داده می شود. قبل از بررسی دقیق جریان کنترلر جادوگر، ابتدا این موارد را بررسی می کنیم:

referenceData(HttpServletRequest request, Object command, Errors errors, int pageNumber): متدی که می توانیم با سربارگذاری آن، اطلاعات صفحه خاصی را به مدل اضافه کنیم.

onBindAndValidate(HttpServletRequest request, Object command, BindException ex, int pageNumber): با سربارگذاری این متد، می توانیم انقیاد و اعتبارسنجی داده های صفحه خاص را انجام دهیم.

processCancel(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors): این متد زمانی فراخوانی می شود که کاربر بخواهد مثلا با زدن دکمه لغو، ادامه کار جادوگر را لغو کند. ما می توانیم متد لغو را با افزودن پارامتر درخواست با نام _cancel فراخوانی کنیم. این متد باید یک شی ModelAndView را برای رندر کردن صفحه لغو برگرداند.

processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors): زمانی این متد فراخوانی می شود که کاربر بخواهد مراحل جادوگر را به پایان برساند. ما می توانید متد اتمام کار جادوگر را با افزودن پارامتر _finish به درخواست، فراخوانی کنیم. این متد تنها زمانی فراخوانی می شود که تمام صفحات با موفقیت تایید شده باشند (که با فراخوانی متد ()validatePage برای همه صفحات انجام می شود).

validatePage(Object command, Errors errors, int page) و validatePage(Object command, Errors errors, int page, boolean finish): متدهای الگویی که در صورت تمایل به اعتبارسنجی باید سربارگذاری شوند. ما در اینجا باید تصمیم بگیریم که چگونه می خواهیم اعتبارسنجی انجام شود. یک گزینه این است که شماره صفحه را به متد ()validate شی Validator بیافزاییم و سپس آن را فراخوانی کنیم.

روند کار یک جادوگر

جریان کار معمولی یک جادوگر و ارتباط آن با AbstractWizardFormController در شکل زیر نشان داده شده است. همانطور که می بینید، به پایان رساندن و یا لغو کار جادوگر به ترتیب به فراخوانی ()processFinish و ()processCancel منجر خواهد شد.

flow of a wizard

تغییرات صفحه، شماره گذاری، و سایر عملیات

جادوگر از صفحات متعددی تشکیل شده است و از این رو نیاز است حالت بین درخواست های HTTP نگه داری شود. مهم تر از آن این است که ما نیاز داریم صفحه ای را که در حال حاضر نشان داده شده است در حافظه داشته باشیم. علاوه بر آن، ما باید اعمالی را که صفحه را تغییر می دهند اجرا کنیم. این بخش به صورت خلاصه در مورد چگونگی تغییر صفحات و اجرای عمل پایان و لغو کار توضیح می دهد.

AbstractWizardFormController شماره صفحه ها را با استفاده از نشست کاربر یا پارامتر درخواست نگه می دارد. ما باید بین این دو حالت بر اساس پروژه ای که کنترلر درون آن واقع شده است، بهترین را انتخاب کنیم. در اغلب موارد ما از نشست استفاده می کنیم، چرا که ثابت می شود نگه داشتن حالت واقعی شی دامنه، بین درخواست های متعدد و با عناصری که کامل پر نشده اند می تواند بدون هیچ زحمتی انجام شود.

به بحث در مورد شماره صفحه برمی گردیم. زمانی که پیشتیابی از نشست غیر فعال است، برای اینکه بتوانیم متدهای را با شماره های صحیح صفحه فراخوانی کنیم (به عنوان مثال متد referenceData() و validatePage()) نیاز است پارامتری را درخواست صفحه HTML خود قرار دهیم که حاوی صفحه فعلی باشد. هنگام ارسال فرم، AbstractWizardFormController به طور خودکار این مقدار را برمی دارد. در واقع، بهتر است این کار انجام شود، زیرا که ما نیاز داریم مطمئن شویم که کنترلر در زمانی که کاربر بر روی دکمه Back کلیک می کند نیز صفحه درستی را انتخاب می کند. استفاده از یک پارامتر در درخواست، در کنار یک مقدار در نشست، تضمین می کند که ما همیشه شماره صفحه درستی را به کنترلر ارسال کنیم. نام پارامتر باید _page و حاوی شماره صفحه جاری باشد.

دقت کنید که شما می توانید شماره صفحه را به عنوان یک صفت در مدل قرار دهید. پارامتر pageAttribute کنترلر را در زمینه[۴] تنظیم کرده (به عنوان مثال، با currentPage) و پس از آن به سادگی آن را مورد استفاده قرار دهید. به عنوان مثل:

 

برای فراخوانی اعمال اتمام و لغو باید پارامتر _finish یا _cancel را در درخواست خود قرار دهید، مانند این:

 

AbstractWizardFormController این مقادیر را برداشته و باعث فراخوانی فرایندهای صحیح می شود. همانطور که می دانید، دکمه های تصویری، به جای نام خود عنصر ورودی، مختصاتی را که در آن نقطه کلیک شده است، به نام عنصر ورودی اضافه می کنند و از این اسامی در ارتباطات استفاده می کنند. <input type=”image” src=”submit.gif” name=”_cancel”> به ارسال پارامترهای _cancel.x و _cancel.y در بسته درخواست منجر خواهد شد. خوشبختانه AbstractWizardFormController این مورد را نیز پشتیبانی می کند.

[۱] Domain Object

[۲] Wizard Forms

[۳] Cancel

[۴] Context

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *