Spring框架入門必備教程-Spring與Web

Spring?與 Web
在Web?項目中使用 Spring?框架,首先要解決在web?層(這里指Servlet)中獲取到 Spring?容器的問題。只要在web?層獲取到了 Spring?容器,便可從容器中獲取到 Service?對象。
Web?項目使用 Spring?的問題
舉例:springWeb?項目(在spring-mybatis?基礎(chǔ)上修改)
Step1:新建一個?Maven?Project?
類型maven-archetype-webapp?
Step2: 復制代碼,配置文件,jar
將spring-mybatis?項目中以下內(nèi)容復制到當前項目中:
(1)?Service?層、Dao?層全部代碼
(2)?配置文件applicationContext.xml?及 jdbc.properties,mybatis.xml
(3)?pom.xml
(4)?加入servlet?,jsp?依賴
在之前原有的pom.xml 文件中再加入以下的內(nèi)容:

Step3:定義 index 頁面

Step4:定義 RegisterServlet(重點代碼)

Step5:定義 success 頁面

Step6:web.xml 注冊Servlet

Step7:運行結(jié)果分析
當表單提交,跳轉(zhuǎn)到success.jsp 后,多刷新幾次頁面,查看后臺輸出,發(fā)現(xiàn)每刷新一次頁面,就new 出一個新的 Spring 容器。即,每提交一次請求, 就會創(chuàng)建一個新的 Spring 容器。對于一個應用來說,只需要一個 Spring 容器即可。所以,將 Spring 容器的創(chuàng)建語句放在Servlet 的doGet()或doPost()方法中是有問題的。

此時,可以考慮,將 Spring?容器的創(chuàng)建放在Servlet?進行初始化時進行, 即執(zhí)行init()方法時執(zhí)行。并且,Servlet?還是單例多線程的,即一個業(yè)務(wù)只有一個 Servlet?實例,所有執(zhí)行該業(yè)務(wù)的用戶執(zhí)行的都是這一個 Servlet?實例。這樣,Spring?容器就具有了唯一性了。
但是,Servlet 是一個業(yè)務(wù)一個 Servlet 實例,即LoginServlet 只有一個, 但還會有StudentServlet、TeacherServlet 等。每個業(yè)務(wù)都會有一個Servlet,都會執(zhí)行自己的 init()方法,也就都會創(chuàng)建一個 Spring 容器了。這樣一來,Spring 容器就又不唯一了。
使用 Spring?的監(jiān)聽器 ContextLoaderListener(掌握)
舉例:springweb-2?項目(在spring-web?項目基礎(chǔ)上修改)
對于Web 應用來說,ServletContext 對象是唯一的,一個Web 應用,只有一個 ServletContext 對象,該對象是在Web 應用裝載時初始化的。若將Spring 容器的創(chuàng)建時機,放在 ServletContext 初始化時,就可以保證 Spring 容器的創(chuàng)建只會執(zhí)行一次,也就保證了 Spring 容器在整個應用中的唯一性。
當 Spring?容器創(chuàng)建好后,在整個應用的生命周期過程中,Spring?容器應該是隨時可以被訪問的。即,Spring 容器應具有全局性。而放入ServletContext?對象的屬性,就具有應用的全局性。所以,將創(chuàng)建好的Spring?容器,以屬性的形式放入到 ServletContext?的空間中,就保證了Spring?容器的全局性。
上述的這些工作,已經(jīng)被封裝在了如下的 Spring?的Jar?包的相關(guān)API?中: spring-web-5.2.5.RELEASE
Step1:maven?依賴 pom.xml

Step2:注冊監(jiān)聽器 ContextLoaderListener
若要在 ServletContext 初始化時創(chuàng)建 Spring 容器,就需要使用監(jiān)聽器接口 ServletContextListener 對 ServletContext 進行監(jiān)聽。在web.xml 中注冊該監(jiān)聽器。

Spring 為該監(jiān)聽器接口定義了一個實現(xiàn)類ContextLoaderListener,完成了兩個很重要的工作:創(chuàng)建容器對象,并將容器對象放入到了 ServletContext 的空間中。
打開ContextLoaderListener 的源碼。看到一共四個方法,兩個是構(gòu)造方法,一個初始化方法,一個銷毀方法。

所以,在這四個方法中較重要的方法應該就是 contextInitialized(), context 初始化方法。

跟蹤initWebApplicationContext()方法,可以看到,在其中創(chuàng)建了容器對象。

并且,將創(chuàng)建好的容器對象放入到了 ServletContext 的空間中,key 為一個 常 量 : WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUT E。

Step3:指定 Spring 配置文件的位置<context-param>
ContextLoaderListener?在對 Spring?容器進行創(chuàng)建時,需要加載 Spring 配 置 文 件 。 其 默 認 的 Spring 配 置 文 件 位 置 與 名 稱 為 :WEB- INF/applicationContext.xml。但,一般會將該配置文件放置于項目的classpath?下,即src?下,所以需要在web.xml?中對 Spring?配置文件的位置及名稱進行指定。

從監(jiān)聽器ContextLoaderListener 的父類ContextLoader 的源碼中可以看到其要讀取的配置文件位置參數(shù)名稱 contextConfigLocation。

Step4:獲取 Spring 容器對象
在 Servlet 中獲取容器對象的常用方式有兩種:
(1)?直接從 ServletContext?中獲取
從對監(jiān)聽器ContextLoaderListener 的源碼分析可知,容器對象在ServletContext 的中存放的key 為WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUT E。所以,可以直接通過 ServletContext 的getAttribute()方法,按照指定的key 將容器對象獲取到。

(2)?通過 WebApplicationContextUtils?獲取
工具類WebApplicationContextUtils 有一個方法專門用于從ServletContext 中 獲 取 Spring 容 器 對 象 : getRequiredWebApplicationContext(ServletContext sc)
調(diào)用Spring 提供的方法獲取容器對象:

查其源碼,看其調(diào)用關(guān)系,就可看到其是從 ServletContext 中讀取的屬性值,即 Spring 容器。

以上兩種方式,無論使用哪種獲取容器對象,刷新success 頁面后,可看到代碼中使用的 Spring 容器均為同一個對象。

最后奉上視頻教程??,視頻觀看效果更佳??!走過路過別忘素質(zhì)三連哦~~

