1、查看當前項目,因此配置文件如上圖所示:
html
啓動項目就進行初始化:java
在啓動Web項目時,容器(好比Tomcat)會讀web.xml配置文件中的兩個節點<listener>和<contex-param>。web
接着容器會建立一個ServletContext(上下文),應用範圍內即整個WEB項目都能使用這個上下文。spring
接着容器會將讀取到<context-param>轉化爲鍵值對,並交給ServletContext。數據庫
容器建立<listener></listener>中的類實例,即建立監聽(備註:listener定義的類能夠是自定義的類但必須須要繼承ServletContextListener)。express
在 監聽的類中會有一個contextInitialized(ServletContextEvent event)初始化方法,在這個方法中能夠經過 event.getServletContext().getInitParameter("contextConfigLocation") 來獲得context-param 設定的值。在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷燬方法.用於關閉應用前釋放資源,好比說數據庫鏈接的關閉。
api
獲得這個context-param的值以後,你就能夠作一些操做了.注意,這個時候你的WEB項目尚未徹底啓動完成.這個動做會比全部的Servlet都要早。tomcat
由上面的初始化過程可知容器對於web.xml的加載過程是context-param >> listener >> fileter >> servletmybatis
<> <>log4jConfigLocation</> 參數 <>classpath:log4j.properties</> 參數值 </> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> 根據參數名進入java源文件,找到對應的執行過程 進入源文件有兩個方法,一個是容器會在應用程序初始化期間調用 contextInitialized() 方法 其實有一個initLogging()方法,在根據參數名找到對應的屬性()。該過程在程序啓動時,就能夠 根據參數名得到你所配置的classpath:log4j.properties值。 另外一個方法contextDestroyed()是當tomcat關閉shutdown的時候調用(簡單的說就是不打印日誌!)
<> <>contextConfigLocation</> 參數名 <> classpath*:spring/applicationContext.xml, classpath:mybatis/mybatis-spring/spring-mybatis.xml, classpath*:spring/applicationContext-ehcache.xml, classpath:captcha/captcha-context.xml </> </> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> servlet上下文須要加載的配置文件,對應的根據參數名能夠在對應的java源文件中找到對應的原理。
<> <>admin</> <>org.springframework.web.servlet.DispatcherServlet</> <> <>contextConfigLocation</> <>/WEB-INF/springMVC-servlet.xml</> </> <>1</> </> <> <>admin</> <>/admin/*</>這裏配置了路徑,點擊請求就加載springMVC -servlet.xml配置文件 </> 是一個程序的入口,用戶發送請求Dispatcher servlet映射處理器而後調用配置文件中的攔截器, 調用處理器相應功能處理方法到Handler好比userController。而後在進行視圖解析、視圖渲染對應 至springMVC-servlet的viewResolver(視圖解析)與viewClass(視圖渲染)
springMVC-servlet.xml配置文件剖析:mvc
<context:component-scan base-package="com.maiqianweng"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan>
上圖的配置,簡單的說是爲了能夠在controller層與service層使用註解的方式直接調用;
</> </>
<mvc:annotation-driven/>至關於註冊了DefaultAnnotationHandlerMapping和 AnnotationMethodHandlerAdapter兩個bean,配置一些messageconverter。即解決了 @Controller註解的使用前提配置。
<mvc:default-servlet-handler/>servlet在找頁面時,走的是dispatcherServlet路線。找不到的時候會報404
加上這個默認的servlet時候,servlet在找不到的時候會去找靜態的內容。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean>
如圖所示,該段配置是對模型視圖名稱的解析,(簡單的說就是在控制層中,須要跳轉的頁面的時候只須要直接寫頁面名稱便可,不須要後綴jsp)
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!--<mvc:exclude-mapping path="/admin/login.html"/>--> <!--<mvc:exclude-mapping path="/admin/user/loginHtml.html"/>--> <mvc:exclude-mapping path="/api/vehicle/"/> <bean class="com.maiqianweng.common.interceptor.AdminContextInterceptor"/> </mvc:interceptor> </mvc:interceptors>
如圖所示,該項目中使用了MVC攔截器,並無攔截靜態資源
Spring沒有總的攔截器。<mvc:interceptors/>會爲每個HandlerMapping,注入一個攔截器。總有一個HandlerMapping是能夠找處處理器的,最多也只找到一個處理器,因此這個攔截器總會被執行的。起到了總攔截器的做用。
<mvc:mapping path="/**"/>
該段是匹配全部路徑被攔截,
<mvc:exclude-mapping path="/api/vehicle/"/> <bean class="com.maiqianweng.common.interceptor.AdminContextInterceptor"/>
該段代碼是不攔截的,<bean>標籤中寫了後臺代碼,具體攔截的內容;當前url等於登陸url是返回true不攔截,反之攔截
未完待續......