Spring MVC的配置與DispatcherServlet的分析
Spring MVC是一款Web MVC框架,是目前主流的Web MVC框架之一。
Spring MVC工作原理簡單來看如下圖所示:
接下來進行Spring MVC的配置
首先我們配置Spring MVC先要引進相關的jar包
我們需要有一個處理器,即Controller層,並將它配置到ioc中,當用戶訪問一個路徑是,前端控制器攔截後會產生一個handler映射到ioc容器中,如果有匹配的RequestMapping就會訪問這個方法,否則產生404異常。
@Controller public class helloworld { @RequestMapping("hello1.action") public ModelAndView hello(){ ModelAndView mav = new ModelAndView(); mav.addObject("data", "你好"); mav.setViewName("hello"); return mav; } }
並將它掃描到ioc容器中
<context:component-scan base-package="package com.xt.crud"></context:component-scan> <mvc:default-servlet-handler/> <mvc:annotation-driven ></mvc:annotation-driven> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
<mvc:default-servlet-handler/>表示將沒有匹配到Controller的靜態資源的處理交給web容器,例如css,js等
但是當我們把靜態資源的處理交給web容器時,你會發現我們寫的RequestMapping中的路徑無法訪問,這是因為當我們沒有添加這個標簽時,框架默認註冊有
AnnotationMethodHandlerAdapter這個類,他會對spring MVC中的註解進行處理,匹配RequestMapping 中的路徑,但是當我們加了<mvc:default-servlet-handler/>,
前端控制器攔截後會將攔截路徑和資源型請求交給默認的處理器處理,而這個處理器無法處理Controller中的路徑,而<mvc:annotation-driven >會註冊一個RequestMappingHandlerAdapter,
並在默認處理器處理完靜態資源後處理RequestMapping中的路徑。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
可以簡化我們返回視圖層的路徑,比如我們要返回view/success.jsp,配置了以上內容後,我們只需要寫success就可以了。
接下來配置前端控制器(DispatcherServlet),打開web.xml
找到spring-webmvc包下的Dispatcher.class並把它配置到servlet標簽
<servlet> <servlet-name>Dispatchar</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/crud.xml</param-value> </init-param> </servlet>
在配置前端控制器時,我們需要初始化org.springframework.web.servlet.DispatcherServlet中的contextConfigLocation屬性,將他賦值為我們剛才寫的ioc容器的路徑,
這樣他才能將我們的請求與ioc中Controller中的RequestMapping作對比。在servlet標簽中還有一個<load-on-startup></load-on-startup>標簽,它是用來設置多個servlet
攔截的優先級的,數字越小優先級越高,例如<load-on-startup>0</load-on-startup>的servlet會比<load-on-startup>1</load-on-startup>的優先執行。
接下來配置前端控制器的攔截路徑
<servlet-mapping> <servlet-name>Dispatchar</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
/表示攔截所有路徑,包括靜態資源
以上就是前端控制器(DispatcherServlet)的配置過程,下一周會分享spring MVC中的Restful,自動裝箱和重定向
Spring MVC的配置與DispatcherServlet的分析