جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی


HandlerAdapter یک اینترفیسی است که کمک میکند رسیدگی به درخواست های Http را بسیار انعطاف پذیر تر کنیم

HandlerAdapter همراه با HandlerMapping استفاده میشود و باعث ایجاد تناظر بین یک متد و URL میشود و DispatcherServlet با استفاده از Handler Adapter ها تعریف شده متد های کنترلر را اجرا میکند، servlet دیگر آن متد ها را مستقیما اجرا نخواهد کرد و پلی رابط بین خودش و ابجکت های Handler میشود که باعث میشود طراحی غیر وابسته تری داشته باشیم 


نگاهی به ساختار این اینترفیس می اندازیم :

public interface HandlerAdapter {
    boolean supports(Object handler);
     
    ModelAndView handle(
      HttpServletRequest request,
      HttpServletResponse response, 
      Object handler) throws Exception;
     
    long getLastModified(HttpServletRequest request, Object handler);
}


متد supports چک میکند که آیا از handler مورد نظر حمایت میکند یا خیر. این متد باید قبل از اینکه متد handle فراخوانی شود، اجرا شود تا از handler مورد نظر اطمینان کسب کنیم 


متد handle مسئول رسیدگی به درخواست Http خاصی که تعریف کرده ایم است و در آرگومان ورودی دسترسی به HttpServletRequest و HttpServletResponse و خود Handler را داریم و مقدار برگشتی آن از نوع ModelAndView است که هم Model و هم View را در بر میگیرد و مرحله بعد به DispatcherServlet میرسد




برای شروع ابتدا وابستگی های مورد نیاز را به pom پروژه اضافه میکنیم :

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.4.RELEASE</version>
</dependency>


حال با انواه HandlerAdapter آشنا میشویم :


SimpleControllerHandlerAdapter : 


این کلاس Handler Adapter پیش فرض است که توسط Spring MVC ثبت شده است و با کلاس هایی که اینترفیس Controller را پیاده سازی میکنند کار میکند و درخواست موجود را به آنها منتقل میکند

اگر Web Application ما تنها از Controller استفاده کند، Handler Adapter ما نیازی به تنظیمات ندارد و Spring کلاس Handler Adapter را به عنوان کلاس پیش فرض Adapter برای رسیدگی به درخواست ها میشناسد


بیاییم با یک مثال نحوه استفاده آنرا نمایش دهیم:

public class SimpleController implements Controller {
    @Override
    public ModelAndView handleRequest(
      HttpServletRequest request, 
      HttpServletResponse response) throws Exception {
         
        ModelAndView model = new ModelAndView("Greeting");
        model.addObject("message", "Dinesh Madhwal");
        return model;
    }
}

و تنظیمات مورد نیاز در XML :

<beans ...>
    <bean name="/greeting.html"
      class="com.baeldung.spring.controller.SimpleControllerHandlerAdapterExample"/>
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>


در تنظیمات بالا کلاسی داریم با نام SimpleControllerHandlerAdapterExample که اینترفیس Controller را پیاده سازی کرده و روی درخواست هایی با آدرس greeting.html/ ثبت شده است


* اگر در تگ BeanFactory یک Handler Adapter سفارشی تعریف شده باشد آن کلاس بصورت اتوماتیک ثبت نخواهد شد و باید آنرا بصورت صریح در Context ثبت کنیم و اگر ثبت نشود خطایی دریافت خواهیم کرد که مربوط به نداشتن Adapter برای آن Handler مشخص است




SimpleServletHandlerAdapter :


این Handler Adapter به ما امکان استفاده از هر Servlet ای برای کار با DispatcherServlet به عنوان Handler Adapter را میدهد و درخواست ها را از DispatcherServlet دریافت و با فراخوانی متد ()service به درخواست رسیدگی میشود 

Bean هایی که اینترفیس Servlet را پیاده سازی کنند بطور اتوماتیک توسط SimpleServletHandlerAdapter کنترل میشوند ولی باید آنها را ثبت کنیم :

<bean name="simpleServletHandlerAdapter"
  class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />




AnnotationMethodHandlerAdapter :


این کلاس Adapter متد هایی که با RequestMapping@ مشخص شده اند را اجرا میکند. کلاسی که این تناظر را بین متد های RequestMapping@  و کلاس Adapter ما  AnnotationMethodHandlerAdapter  برقرار میکند DefaultAnnotationHandlerMapping نام دارد و هر دوی این کلاس ها بوسیله فریم ورک در ابتدای راه اندازی DispatcherServlet ثبت خواهد شد ولی اگر Handler Adapter دیگری تعریف کرده باشیم نیاز به تنظیمات زیر در کلاس Controller@ دارد :

@Controller
public class AnnotationHandler {
    @RequestMapping("/annotedName")
    public ModelAndView getEmployeeName() {
        ModelAndView model = new ModelAndView("Greeting");        
        model.addObject("message", "Dinesh");       
        return model;  
    }  
}


این تنظیمات را قبلا در بخش های قبلی توضیح داده بودیم ولی باز برای یادآوری نحوه ست کردن View Resolver را در دو حالت نمایش میدهیم :

@ComponentScan("com.baeldung.spring.controller")
@Configuration
@EnableWebMvc
public class ApplicationConfiguration implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/");
        bean.setSuffix(".jsp");
        return bean;
    }
}
<beans ...>
    <context:component-scan base-package="com.baeldung.spring.controller" />
    <bean
      class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
    <bean
      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

و حالت قدیمی تر که در Spring 3.1 باید انجام میشد :

<beans ...>
    <mvc:annotation-driven/>
    <context:component-scan base-package="com.baeldung.spring.controller" />
    <bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>





RequestMappingHandlerAdapter :


این Handler Adapter قدیمی و مربوط به Spring 3.1 بود که منسوخ شده است و جایگزین آن AnnotationMethodHandlerAdaptor میباشد از این رو در حد اشاره از روی آن رد میشویم





HttpRequestHandlerAdapter :


این  Handler Adapter برای Handler هایی استفاده میشود که وظیفه پردازش HttpRequest ها را دارند که اینترفیس HttpRequestHandler را پیاده سازی کرده اند و برای پردازش و ساختن Response تنها متد ()handleRequest را دارند، مقدار برگشتی این متد void است و مانند سایر Adapter ها هیچ ModelAndView ای را تولید نمیکند و کاربرد اصلی آن تولید Response هایی از نوع Binary است 





نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی