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