中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springmvc框架是怎樣執行的

發布時間:2020-06-02 16:40:48 來源:億速云 閱讀:243 作者:Leah 欄目:編程語言

今天小編給大家分享的是Springmvc框架的執行流程,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,話不多說,一起往下看吧。

先上圖:

Springmvc框架是怎樣執行的

下面結合源代碼和上圖來說明:

一:發送請求到DispatchServlet(中央控制器)

Web.xml配置文件:

<servlet>

 <servlet-name>dispatcherServlet</servlet-name>

 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

 </servlet>

<servlet-mapping>

 <servlet-name>dispatcherServlet</servlet-name>

 <url-pattern>/</url-pattern>

</servlet-mapping>

是不是很熟悉的感覺,沒錯這里就是servlet的配置,只不過這個servlet是系統已經實現好的中央控制器:DispatcherServlet.

二:DispatcherServlet(中央控制器)調用HandlerMapping(處理器映射器)根據請求url找到需要執行的處理器(此處做了簡化實際返回的是執行鏈)

HandlerMapping是一個接口:

public interface HandlerMapping {

 。。。

 

 @Nullable

 HandlerExecutionChain getHandler(HttpServletRequest var1) throws Exception;

}

這個接口里面只有一個方法:getHandler,該方法可以通過傳入的參數請求對象:HttpServletRequest,得到 :HandlerExecutionChain,這里的HandlerExecutionChain里面包括了處理器對象和攔截器。可以簡單的理解為該方法通過request請求對象獲得要執行的處理器(每種HandlerMapping實現類返回的處理器不一定相同,有可能是處理器中的方法,也有可能是處理器本身)。

默認的HandlerMapping實現類是BeanNameUrlHandlerMapping,他的getHandler方法返回的是處理器類, 常用的HandlerMapping實現類有:

RequestMappingHandlerMapping:采用注解方式進行映射,使用最廣泛,也最簡單,只需要在類或方法上加上@RequestMapping()的注解就可以了,它的getHandler方法返回的是處理器類中的方法。

@Controller

public class HelloController {

    @RequestMapping("/sayHello")

    public String sayHello(){

        System.out.println("hello");

        return "success";

    }

}

SimpleUrlHandlerMapping:采用配置文件的方式進行映射,適用性最強,需要在配置文件里面配置,它的getHandler方法返回的是處理器類。

三:DispatcherServlet(中央控制器)通過HandlerAdapter(處理器適配器)調用處理器

因為不同的HandlerMapping實現類返回的處理器格式不是固定的,所以處理請求時需要HandlerAdapter(處理器適配器)做適配。

public interface HandlerAdapter {

//判斷該適配器是否支持傳入的handler(處理器)

 boolean supports(Object handler);

//使用給定的handler處理請求,也就是執行handler

 @Nullable

 ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler) throws Exception;

 

 long getLastModified(HttpServletRequest var1, Object var2);

}

HandlerAdapter也是一個接口,它里面有兩個重要的方法:

boolean supports(Object handler) 這個方法可以判斷該適配器是否支持傳入的handler(處理器)

ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object handler)throws Exception; 這個方法使用給定的handler處理請求,也就是執行handler.

常用的HandlerAdapter實現類是RequestMappingHandlerAdapter,它是和RequestMappingHandlerMapping配合使用的。

在spring mvc的核心配置文件中加上:<mvc:annotation-driven /> 就會自動幫我們注冊RequestMappingHandlerMapping和RequestMappingHandlerAdapter

 

    <!-- 配置spring創建容器時要掃描的包 -->

    <context:component-scan   base-package="cn.xh"></context:component-scan>

    <!-- 配置視圖解析器 -->

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/pages/"></property>

        <property name="suffix" value=".jsp"></property>

    </bean>

 

    <mvc:annotation-driven />

 

下面是網上看到的一套模擬springmvc適配器的代碼:

//定義一個Adapter接口 

public interface HandlerAdapter { 

    public boolean supports(Object handler); 

    public void handle(Object handler); 

} 



//以下是三種Controller實現 

public interface Controller { 



} 



public class HttpController implements Controller{ 

    public void doHttpHandler(){ 

        System.out.println("http..."); 

    } 

} 



public class SimpleController implements Controller{ 

    public void doSimplerHandler(){ 

        System.out.println("simple..."); 

    } 

} 



public class AnnotationController implements Controller{ 

    public void doAnnotationHandler(){ 

        System.out.println("annotation..."); 

    } 

} 





//下面編寫適配器類 



public class SimpleHandlerAdapter implements HandlerAdapter { 





    public void handle(Object handler) { 

        ((SimpleController)handler).doSimplerHandler(); 

    } 



    public boolean supports(Object handler) { 

        return (handler instanceof SimpleController); 

    } 



} 





public class HttpHandlerAdapter implements HandlerAdapter { 



    public void handle(Object handler) { 

        ((HttpController)handler).doHttpHandler(); 

    } 



    public boolean supports(Object handler) { 

        return (handler instanceof HttpController); 

    } 



} 







public class AnnotationHandlerAdapter implements HandlerAdapter { 



    public void handle(Object handler) { 

        ((AnnotationController)handler).doAnnotationHandler(); 

    } 



    public boolean supports(Object handler) { 



        return (handler instanceof AnnotationController); 

    } 



} 





//模擬一個DispatcherServlet 

import java.util.ArrayList; 

import java.util.List; 





public class DispatchServlet { 



    public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();  



    public DispatchServlet(){ 

        handlerAdapters.add(new AnnotationHandlerAdapter()); 

        handlerAdapters.add(new HttpHandlerAdapter()); 

        handlerAdapters.add(new SimpleHandlerAdapter()); 

    } 





    public void doDispatch(){ 



        //此處模擬SpringMVC從request取handler的對象,僅僅new出,可以出,              

                     //不論實現何種Controller,適配器總能經過適配以后得到想要的結果 

//      HttpController controller = new HttpController(); 

//      AnnotationController controller = new AnnotationController(); 

        SimpleController controller = new SimpleController(); 

        //得到對應適配器 

        HandlerAdapter adapter = getHandler(controller); 

        //通過適配器執行對應的controller對應方法 

        adapter.handle(controller); 



    } 



    public HandlerAdapter getHandler(Controller controller){ 

        for(HandlerAdapter adapter: this.handlerAdapters){ 

            if(adapter.supports(controller)){ 

                return adapter; 

            } 

        } 

        return null; 

    } 



    public static void main(String[] args){ 

        new DispatchServlet().doDispatch(); 

    } 



} 



四:執行處理器,返回ModelAndView給中央控制器

這里的ModelAndView類指的是執行完處理器以后需要在視圖顯示的數據和視圖,Model數據,View視圖這個名字就很清晰的表明了該類的作用。執行處理器后,將數據保存在ModelAndView的Model屬性中,將要顯示的視圖(通常為邏輯視圖名)保存在View屬性中,然后返回,ModelAndView類可以將處理器和視圖渲染之間的緊密聯系解耦和。

@RequestMapping("/findModelAndView")

public ModelAndView findModelAndView(){

    System.out.println("modelAndView");

    ModelAndView md = new ModelAndView();

    User u1 = new User();

    u1.setUid(1);

    u1.setName("zhangsan");

    u1.setAge(23);

    md.addObject("user",u1);

    md.setViewName("aa");

    return md;

}

五:中央控制器調用ViewResolver(視圖解析器)根據處理器返回的ModelAndView中的邏輯視圖名為中央控制器返回一個可用的view實例。

public interface ViewResolver {

 @Nullable

 View resolveViewName(String viewName, Locale var2) throws Exception;

}

接口ViewResolver里面有一個方法:resolveViewName,可以根據邏輯視圖名viewName返回一個View實例。

public interface View {

 void render(@Nullable Map<String, ?> model, HttpServletRequest var2, HttpServletResponse var3) throws Exception;

}

View接口里面有一個方法render,可以將數據model渲染到視圖。

六:中央控制器根據View渲染視圖(將模型填充到視圖),并響應給用戶。

以上就是Springmvc框架的執行流程了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岗巴县| 中超| 灵丘县| 三穗县| 孝昌县| 南丰县| 玉山县| 高邑县| 蒲江县| 平山县| 潜江市| 鹤庆县| 曲麻莱县| 石首市| 新竹县| 十堰市| 比如县| 柏乡县| 五寨县| 浙江省| 始兴县| 海南省| 井陉县| 吉木萨尔县| 新巴尔虎右旗| 德庆县| 高密市| 英山县| 平陆县| 昌黎县| 乐业县| 疏勒县| 鹰潭市| 印江| 新化县| 湾仔区| 平昌县| 金乡县| 吕梁市| 淮北市| 中卫市|