هنگامی که از Spring MVC در پروژه های وب سایت پیچیده استفاده می کنیم ، احتمال دارد به شرایطی برخورد کنیم که نیاز باشد زیرساخت های کنترل کننده خود را توسعه دهیم. این کار می تواند به یکی از دو روش زیر انجام پذیرد: گسترش اینترفیس Spring Controller (یا با ارث بری از یکی از زیر کلاس هایی که آن را پیاده سازی می کند)، و یا با نوشتن یک HandlerAdapter جدید. در این بخش گزینه دوم بررسی می شود. این ویژگی، به راستی یک ویژگی زیربنایی Spring MVC است که به دلیل وجود نقاط گسترش زیاد دیگری که توسط چارچوب ارائه شده است، به ندرت در برنامه های معمولی استفاده می شود. با این حال، بهتر است جهت افزایش دانش خود در زمینه چارچوب، این مورد را نیز بررسی کنید.
org.springframework.web.servlet.HandlerAdapter دقیقا مشخص می کند که چه چیزی، چه زمانی و در چه شرایطی در همه کنترلرها اجرا شود. دو HandlerAdapter وجود دارد که در هنگام استفاده از Spring DispatcherServlet به صورت خودکار پشتیبانی می شود. اولی، HandlerAdapter است که از زیرساخت های کنترلر org.springframework.web.servlet.mvc (تمام کلاسهایی که Controller را به ارث برده باشند) پشتیبانی می کند. مورد دوم نیز از org.springframework.web.servlet.mvc.ThrowayControllerHandlerAdapter پشتیبانی می کند.
اینترفیس HandlerAdapter متدهای زیر را دارد:
- boolean supports(Class clzz): مشخص می کند که آیا HandlerAdapter از این نوع از کنترلر پشتیبانی می کند یا خیر. این متد در زیرساخت عمومی Spring Controller، برای تمام کلاس هایی که اینترفیس springframework.web.servlet.mvc.Controller را پیاده سازی کرده باشند، مقدار true برمی گرداند.
- ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler): درخواست واقعی را کنترل می کند. این متد تنها زمانی فراخوانی می شود که HandlerAdapter در خصوص پشتیبانی از این کلاس handler (با استفاده از متدی که بالاتر توضیح داده شد) مقدار true برگرداند. فراخوانی این متد باید مقدار ModelAndView یا null برگرداند. مقدار بازگشتی دوم نشان می دهد که خود کنترلر می خواهد درخواست را پردازش کند.
- long getLastModified(HttpServletRequest request, Object handler): بهتر است در صورتی که تعیین تاریخ آخرین تغییر پشتیبانی نشود، این متد مقدار ۱ برگرداند و اگر این پشتیبانی وجود دارد، مقدار long مناسب را برگرداند. این متد در صورتی فراخوانی می شود که HandlerAdapter، از کلاس handler پشتیبانی کند و به قراردادی که برای متد ()getLastModified وجود دارد، پایبند باشد.
همانطور که قبلا ذکر شد، به طور پیش فرض دو آداپتور کنترلر نصب می شود: ThrowAwayControllerHandlerAdapter و SimpleControllerHandlerAdapter. در صورتی که نیاز باشد، می توان با اضافه کردن آداپتورهای کنترلر اضافی به WebApplicationContext، رفتارهای سفارشی به Spring اضافه کرد. همانند beanهای LocaleResolver یا MultipartResolver، این آداپتورها به طور خودکار توسط Spring استفاده خواهند شد.
در حالی که توصیه می شود از زیرساخت Controller پیش فرض Spring Web MVC استفاده کنید، ممکن است شرایطی به وجود آید که نیاز به سفارشی کردن کنترلر درخواست های خود داشته باشید.