在 Web 項目中使用 Spring 框架,首先要解決在 web 層(這里指 Servlet)中獲取到 Spring容器的問題。只要在 web 層獲取到了 Spring 容器,便可從容器中獲取到 Service 對象。
舉例:springWeb 項目(在 spring-mybatis 基礎上修改)
將spring-mybatis項目中以下內容復制到當前項目中:
● Service層、Dao層全部代碼
● 配置文件applicationContext.xml及jdbc.properties,mybatis.xml
● pom.xml
● 加入servlet ,jsp依賴
在之前原有的pom.xml文件中再加入以下的內容:
<!-- servlet依賴 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp依賴 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
<scope>provided</scope>
</dependency>
Step3:定義 index 頁面
Step4:定義 LoginServlet(重點代碼)
Step5:定義 success 頁面
當表單提交,跳轉到 success.jsp 后,多刷新幾次頁面,查看后臺輸出,發現每刷新一次頁面,就 new 出一個新的 Spring 容器。即,每提交一次請求,就會創建一個新的 Spring 容器。對于一個應用來說,只需要一個 Spring 容器即可。所以,將 Spring 容器的創建語句放在 Servlet 的 doGet()或 doPost()方法中是有問題的。
此時,可以考慮,將 Spring 容器的創建放在 Servlet 進行初始化時進行,即執行 init()方法時執行。并且,Servlet 還是單例多線程的,即一個業務只有一個 Servlet 實例,所有執行該業務的用戶執行的都是這一個 Servlet 實例。這樣,Spring 容器就具有了唯一性了。
但是,Servlet 是一個業務一個 Servlet 實例,即 LoginServlet 只有一個,但還會有StudentServlet、TeacherServlet 等。每個業務都會有一個 Servlet,都會執行自己的 init()方法,也就都會創建一個 Spring 容器了。這樣一來,Spring 容器就又不唯一了。