1. 程式人生 > >ssm的一些理解的加強

ssm的一些理解的加強

在秒殺系統結束後,我又回頭去看了看秒殺系統。發現了一個問題

    <servlet>
    <servlet-name>seckill-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置springmvc需要載入的配置檔案
    spring-dao.xml,spring-service.xml,spring-web.xml
    Mybatis->spring->spring-mvc -->
    <init-param>
        <!--需要載入的配置檔案-->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-*.xml</param-value>
    </init-param>
    </servlet>

在整個工程中呢 我們只在web.xml中就只配置了這個mvc上下文,並沒有配置spring上下文啊。在當初學習ssm的時候我記得

官方推薦根據不同的業務模組來劃分不同容器中註冊不同型別的Bean:Spring父容器負責所有其他非@Controller註解的Bean的註冊,而SpringMVC只負責@Controller註解的Bean的註冊。

這就是使我很糾結,導致當時的我認為mvc只是用於一下cotroller的一些註解@Requestmapping。不可以用什麼@Autowired。 

後來翻了翻才知道springmvc也是擁有spring的特性 如依賴注入。說到這裡我還特意查了查spring上下文和springmvc上下文的關係

一、spring上下文和springMVC上下文的關係

首先來看一下整個圖

Spring是父容器,SpringMVC是其子容器,並且在Spring父容器中註冊的Bean對於SpringMVC容器中是可見的,而在SpringMVC容器中註冊的Bean對於Spring父容器中是不可見的,也就是子容器可以看見父容器中的註冊的Bean,反之就不行。

看到這裡你應該也知道秒殺系統的web.xml該怎麼改了吧?

沒錯

  <context-param>
        <param-name>contextConfigLocation </param-name>
        <param-value>classpath:spring/spring-service.xml,
            classpath:spring/spring-dao.xml
        </param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
    <servlet-name>seckill-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置springmvc需要載入的配置檔案
    spring-dao.xml,spring-service.xml,spring-web.xml
    Mybatis->spring->spring-mvc -->
    <init-param>
        <!--需要載入的配置檔案-->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-web.xml</param-value>
    </init-param>
</servlet>

改成這樣,增加了對spring上下文的配置,並且減少了mvc上下文配置檔案的掃描。這樣就達到了官方的推薦的spring springmvc上下文配置要求了

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

再下去就是我對靜態資源訪問的一個問題。

首先

<servlet-mapping>
    <servlet-name>seckill-dispatcher</servlet-name>
   <!--預設匹配所有的請求-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

這裡的/會攔截所有的請求,這裡講的所有請求是包括像.css,.js,.html等等檔案的,SpringMVC 會將他們當成一個普通請求處理,因找不到對應處理器將導致錯誤。

解決方法:配置檔案中添加了如下的語句:

           <mvc:default-servlet-handler/>

<mvc:default-servlet-handler/> 將在 SpringMVC 上下文中定義一個DefaultServletHttpRequestHandler,它會對進入 DispatcherServlet 的請求進行篩查,如果發現是沒有經過對映的請求,就將該請求交由 WEB 應用伺服器預設的 Servlet 處理,如果不是靜態資源的請求,才由DispatcherServlet 繼續處理。

好了就這麼多了=,=keepgoing