Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架環境

1、查看當前項目,因此配置文件如上圖所示:
html

啓動項目就進行初始化:java

    1. 在啓動Web項目時,容器(好比Tomcat)會讀web.xml配置文件中的兩個節點<listener>和<contex-param>。web

    2. 接着容器會建立一個ServletContext(上下文),應用範圍內即整個WEB項目都能使用這個上下文。spring

    3. 接着容器會將讀取到<context-param>轉化爲鍵值對,並交給ServletContext。數據庫

    4. 容器建立<listener></listener>中的類實例,即建立監聽(備註:listener定義的類能夠是自定義的類但必須須要繼承ServletContextListener)。express

    5. 在 監聽的類中會有一個contextInitialized(ServletContextEvent event)初始化方法,在這個方法中能夠經過 event.getServletContext().getInitParameter("contextConfigLocation") 來獲得context-param 設定的值。在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷燬方法.用於關閉應用前釋放資源,好比說數據庫鏈接的關閉。
      api

    6. 獲得這個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不攔截,反之攔截

    未完待續......

相關文章
相關標籤/搜索