溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

springMVC的工作原理和機(jī)制以及配置

發(fā)布時(shí)間:2021-09-17 09:24:19 來(lái)源:億速云 閱讀:146 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“springMVC的工作原理和機(jī)制以及配置”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“springMVC的工作原理和機(jī)制以及配置”吧!

工作原理

下面的是springMVC的工作原理圖:
springMVC的工作原理和機(jī)制以及配置

1、客戶端發(fā)出一個(gè)http請(qǐng)求給web服務(wù)器,web服務(wù)器對(duì)http請(qǐng)求進(jìn)行解析,如果匹配DispatcherServlet的請(qǐng)求映射路徑(在web.xml中指定),web容器將請(qǐng)求轉(zhuǎn)交給DispatcherServlet.

2、DipatcherServlet接收到這個(gè)請(qǐng)求之后將根據(jù)請(qǐng)求的信息(包括URL、Http方法、請(qǐng)求報(bào)文頭和請(qǐng)求參數(shù)Cookie等)以及HandlerMapping的配置找到處理請(qǐng)求的處理器(Handler)。

3-4、DispatcherServlet根據(jù)HandlerMapping找到對(duì)應(yīng)的Handler,將處理權(quán)交給Handler(Handler將具體的處理進(jìn)行封裝),再由具體的HandlerAdapter對(duì)Handler進(jìn)行具體的調(diào)用。

5、Handler對(duì)數(shù)據(jù)處理完成以后將返回一個(gè)ModelAndView()對(duì)象給DispatcherServlet。

6、Handler返回的ModelAndView()只是一個(gè)邏輯視圖并不是一個(gè)正式的視圖,DispatcherSevlet通過(guò)ViewResolver將邏輯視圖轉(zhuǎn)化為真正的視圖View。

7、Dispatcher通過(guò)model解析出ModelAndView()中的參數(shù)進(jìn)行解析最終展現(xiàn)出完整的view并返回給客戶端。

工作機(jī)制是什么

Control的調(diào)用(續(xù))

接著對(duì)于(二)的補(bǔ)充:主要是小結(jié)下Control的處理邏輯的關(guān)鍵操作;

對(duì)于control的處理關(guān)鍵就是:DispatcherServlet的handlerMappings集合中根據(jù)請(qǐng)求的URL匹配每一個(gè)handlerMapping對(duì)象中的某個(gè)handler,匹配成功之后將會(huì)返回這個(gè)handler的處理連接handlerExecutionChain對(duì)象。而這個(gè)handlerExecutionChain對(duì)象中將會(huì)包含用戶自定義的多個(gè)handlerInterceptor對(duì)象。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

     * Return the HandlerExecutionChain for this request.

     * <p>Tries all handler mappings in order.

     * @param request current HTTP request

     * @return the HandlerExecutionChain, or <code>null if no handler could be found

     */

    protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

        for (HandlerMapping hm : this.handlerMappings) {

            if (logger.isTraceEnabled()) {

                logger.trace(

                        "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");

            }

            HandlerExecutionChain handler = hm.getHandler(request);

            if (handler != null) {

                return handler;

            }

        }

        return null;

    }

而對(duì)于handlerInterceptor接口中定義的三個(gè)方法中,preHandler和postHandler分別在handler的執(zhí)行前和執(zhí)行后執(zhí)行,afterCompletion在view渲染完成、在DispatcherServlet返回之前執(zhí)行。

愿意了解更多的技術(shù)知識(shí)分享可參考源碼:http://minglisoft.cn/technology

朋友需要請(qǐng)加球球:2042849237

springmvc.xml的配置                                                                                                                                                

視圖解析器的配置:

<!-- 配置視圖解析器 --> <"org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 使用前綴和后綴 --> <"prefix" "/"></<"suffix" ".jsp"></</<!-- 使用組件掃描的方式可以一次掃描多個(gè)Controller --> <"com.wxisme.ssm.controller">

也可以使用單個(gè)的配置方式,需要指定Controller的全限定名。

<bean name="/queryUser.action" class="com.wxisme.ssm.controller.Controller1"/>

配置注解的處理器適配器和處理器映射器:

<!-- 注解的處理器適配器 --> <"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- 注解的處理器映射器 --> <"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

也可以使用下面的簡(jiǎn)化配置:

<!-- 配置注解的處理器映射器和處理器適配器 --> <"conversionService"></<<!-- 直接定義攔截所有請(qǐng)求 --> <"com.wxisme.ssm.interceptor.IdentityInterceptor"></<!-- <mvc:interceptor>
            攔截所有路徑的請(qǐng)求   包括子路徑
            <mvc:mapping path="/**"/>
            <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean>
        </mvc:interceptor> --> </<!-- 定義全局異常處理器 --> <!-- 只有一個(gè)全局異常處理器起作用 --> <"exceptionResolver" "com.wxisme.ssm.exception.OverallExceptionResolver"></<!--配置上傳文件數(shù)據(jù)解析器  --> <"multipartResolver" "org.springframework.web.multipart.commons.CommonsMultipartResolver"> <"maxUploadSize"> <</</</<!-- 自定義參數(shù)類型綁定 --> <"conversionService" "org.springframework.format.support.FormattingConversionServiceFactoryBean"> <"converters"> <<!-- 日期類型綁定 --> <"com.wxisme.ssm.controller.converter.DateConverter"/> </</</<"/images/**" "/images/" /> <"/css/**" "/css/" /> <"/js/**" "/js/" /> <"/imgdata/**" "/imgdata/" />

也可以使用默認(rèn),但是需要在web.xml中配置。

<!-- 訪問(wèn)靜態(tài)資源文件 --> <!-- <mvc:default-servlet-handler/> 需要在web.xml中配置-->

完全可以不攔截所有路徑,大可避免這個(gè)問(wèn)題的發(fā)生。

完整的配置大概是這樣的,需要注意xml文件的命名空間,有時(shí)候會(huì)有影響的。

"1.0" encoding="UTF-8"<"http://www.springframework.org/schema/beans" "http://www.w3.org/2001/XMLSchema-instance" "http://www.springframework.org/schema/context" "http://www.springframework.org/schema/mvc" "http://www.springframework.org/schema/jdbc" "http://www.springframework.org/schema/jee" "http://www.springframework.org/schema/aop" "http://www.springframework.org/schema/tx" "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 配置視圖解析器 --> <"org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 使用前綴和后綴 --> <"prefix" "/"></<"suffix" ".jsp"></</<!-- 使用組件掃描的方式可以一次掃描多個(gè)Controller --> <"com.wxisme.ssm.controller"> </<!-- 配置注解的處理器映射器和處理器適配器 --> <"conversionService"></<!-- 自定義參數(shù)類型綁定 --> <"conversionService" "org.springframework.format.support.FormattingConversionServiceFactoryBean"> <"converters"> <<!-- 日期類型綁定 --> <"com.wxisme.ssm.controller.converter.DateConverter"/> </</</<!-- 訪問(wèn)靜態(tài)資源文件 --> <!-- <mvc:default-servlet-handler/> 需要在web.xml中配置--> <"/images/**" "/images/" /> <"/css/**" "/css/" /> <"/js/**" "/js/" /> <"/imgdata/**" "/imgdata/" /> <!-- 定義攔截器 --> <<!-- 直接定義攔截所有請(qǐng)求 --> <"com.wxisme.ssm.interceptor.IdentityInterceptor"></<!-- <mvc:interceptor>
            攔截所有路徑的請(qǐng)求   包括子路徑
            <mvc:mapping path="/**"/>
            <bean class="com.wxisme.ssm.interceptor.IdentityInterceptor"></bean>
        </mvc:interceptor> --> </<!--配置上傳文件數(shù)據(jù)解析器  --> <"multipartResolver" "org.springframework.web.multipart.commons.CommonsMultipartResolver"> <"maxUploadSize"> <</</</<!-- 定義全局異常處理器 --> <!-- 只有一個(gè)全局異常處理器起作用 --> <"exceptionResolver" "com.wxisme.ssm.exception.OverallExceptionResolver"></</beans>

感謝各位的閱讀,以上就是“springMVC的工作原理和機(jī)制以及配置”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)springMVC的工作原理和機(jī)制以及配置這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI