کنترلرها – Spring MVC

Spring انواع کنترلرهای مورد نیازهای شما را برای زمانی که بخواهید نیازهای مهم و مشترکی را در برنامه های کاربردی وب فراهم کنید، تدارک دیده است. به عنوان مثال، از جمله ویژگی های کنترلر موجود در Spring، ایجاد فرم گردش کار، کنترلر فرمان، و کنترلر چند وظیفه ای است. در ادامه به بررسی چند نمونه از مهم ترین کنترلرهای Srping خواهیم پرداخت.

WebContentGenerator

مهم ترین کنترلرهای Spring، اینترفیس org.springframework.web.servlet.support.WebContentGenerator را پیاده سازی کرده اند. WebContentGenerator همچنین به عنوان پایه ای برای WebContentInterceptor استفاده می شود.

AbstractController

پایه ای ترین کنترلر Spring، org.springframework.web.servlet.mvc.AbstractController است. این کلاس، یک پیاده سازی انتزاعی از رابط Controller تهیه می کند. قابلیت مشترکی که در تمام کنترلرها وجود دارد، در اینجا پیاده سازی شده است، و به همراه org.springframework.web.servlet.support.WebContentGenerator، پایه خوبی را برای کنترلرها در تهیه نتیجه نهایی صفحات وب و یا دیگر محتوای مربوط به HTTP ایجاد کرده است. به یاد داشته باشید که شما می توانید در اغلب موارد، کنترلری را استفاده کنید که در سطوح پایین تر سلسله مراتب کنترلرها قرار دارد و رفتار خاصی را پیاده سازی کرده است. با این حال، زمان هایی می رسد که نیاز است شما AbstractController را گسترش دهید. تنها متدی که نیاز به پیاده سازی دارد یک ModelAndView برمی گرداند عبارت است از:

 

 

به یاد داشته باشید که شما همچنین می توانید مقدار null را به عنوان مقدار بازگشتی کنترلر خود قرار دهید، که در آن صورت، Spring فرض را بر این می گذارد که خود شما درخواست را پردازش کرده اید (برای مثال با نوشتن به HttpServletResponse). با این حال، این ویژگی باید با احتیاط استفاده می شود. معمولا نمی خواهیم خروجی HTML را مستقیما در کنترلر خود ایجاد کنید. پیشنهاد می شود زمانی از این ویژگی استفاده کنید که بخواهید کاربر را به یک صفحه دیگری هدایت کنید و قادر نیستید وضعیت را با استفاده از استثنا رسیدگی کنید – و یا شاید، بخواهید در کنترل خود محتوای باینری تولید کنید. (توجه داشته باشید حالت دوم معمولا مورد نیاز نیست و یک view برای این کار انتخاب بهتری است. View تهیه شده توسط Spring می تواند هر نوع محتوا، از جمله انواع محتوای باینری، را که به JSP یا HTML مرتبط نمی شود، پشتیبانی کند.)

UrlFilenameViewController

در ابتدا با کنترل ساده ای آشنا می شویم که منطقی مانند کنترل فرم را ندارد. همانطور که دیدید، یک کنترل باید ModelAndView مناسب پس از پردازش درخواست باز گرداند. View برگردانده شده، برای ارائه پاسخ به کاربر استفاده می شود. مدل، داده مرتبط به درخواست است. در برخی از موارد مدل داده ای مورد نیاز نیست، و شما به سادگی می خواهید یک view را (یک JSP ساده و یا قالب velocity را که هیچ گونه اطلاعات پویا درون آن استفاده نمی شود) پردازش کنید. در این مورد شما می توانید از org.springframework.web.servlet.mvc.UrlFilenameViewController استفاده کنید. این کلاس، نام فایل مجازی موجود در URL را به یک نام view منطقی تبدیل می کند که در ModelAndView قرار خواهد گرفت، و پس از آن توسط هر ViewResolver به کار رفته در پروژه، استفاده می شود. این کنترلر، زمانی مناسب است که نیاز باشد همه درخواست ها از طریق Spring، برای مثال، به JSPهای واقع در دایرکتوری WEB-INF/ برسند.

استفاده از UrlFilenameViewController می تواند به خصوص زمانی مناسب باشد که، مثلا منابع ثابتی مانند صفحات HTML وجود دارند اما هنوز هم نیاز است هر درخواست توسط یک HandlerInterceptor پردازش شود. در هر صورت، سعی کنید صفحات JSP را مستقیما فراخوانی نکنید؛ در اینجا نیز UrlFilenameViewController می تواند به صورتی مناسب ظاهر شود.

به مثال زیر توجه کنید:

 

استفاده از یک InternalResourceResolver در ترکیب با یک UrlFilenameViewController تمام درخواست ها برای فایل های HTML را به JSPهای موجود در دایرکتوری WEB-INF/JSP نگاشت می کند. در این مثال، به هر درخواست یک loggin interceptor اعمال کرده ایم.

ParameterizableViewController

org.springframework.web.servlet.mvc.ParameterizableViewController یک کنترلر ساده است که اجازه می دهد تا یک view با تنظیمات ساده به عنوان نتیجه برگردد. این کلاس متد قالبی به نام ()handleRequestInternal فراهم کرده است که کار واقعی را، که بسیار کم است انجام می دهد. این کنترلر به تنهایی، فقط view ای را برمی گرداند که شما با استفاده از خصیصه viewName پیکربندی کرده اید. البته، شما می توانید کنترلر را گسترش داده و رفتار های مختلف را در متد سربارگذاری شده ()handleRequestInternal اعمال کنید. مزیتی که این کنترلر نسبت به AbstractController دارد این است که view از کنترلر جدا می شود:

 

از یک طریق، شما قادر به پیکربندی view مورد نظر خود، در خارج از کنترلر هستید. اما از سوی دیگر، اگر شما فراموش کنید که به view را پیکربندی کنید، این view “null” خواهد بود که مجاز نیست!

MultiActionController

MultiActionController مولفه ای را فراهم می کند که به شما اجازه می دهد برخی قابلیتهای نگاشت شده به درخواست های مختلف را درون یک کنترلر گروه بندی کنید. به یاد داشته باشید که MultiActionController تنها راه برای جلوگیری از تکرار قابلیت های مشترک نیست. گزینه های دیگر برای قابلیت قابل استفاده مجدد مورد استفاده توسط کنترلرها شامل استفاده آسان از ارث بری است که در آن قابلیت به اشتراک گذاشته شده در کلاس پدر قرار می گیرد.

اعمال متعدد مورد نظر، در یک MultiActionController و به عنوان متدهای درون هر یک کنترلرهای مشتق شده تعریف می شوند. یک مثال:

 

 

MultiActionController تنها در ترکیب با یک MethodNameResolver کار می کند. بر اساس درخواست ورودی HTTP، resolver تصمیم خواهد گرفت که چه متدی را از MultiActionController برای پردازش واقعی و ایجاد یک ModelAndView فراخوانی کند. MethodNameResolverهای ساخته شده، شامل ParameterMethodNameResolver می شوند که به دنبال HttpServletRequest برای یک پارامتر از پیش تعریف شده می گردد و همچنین شامل PropertiesMethodNamesResolver می شوند که با استفاده از نگاشت Properties و عبارت Ant-style برای یافتن نام متد استفاده می کند. پیکربندی یک resolver نام متد در ترکیب با یک MultiActionController به صورت زیر انجام می شود:

 

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

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